Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
52868 views
1
/*
2
* Copyright (c) 2014 Lukasz Marek
3
*
4
* Permission is hereby granted, free of charge, to any person obtaining a copy
5
* of this software and associated documentation files (the "Software"), to deal
6
* in the Software without restriction, including without limitation the rights
7
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
* copies of the Software, and to permit persons to whom the Software is
9
* furnished to do so, subject to the following conditions:
10
*
11
* The above copyright notice and this permission notice shall be included in
12
* all copies or substantial portions of the Software.
13
*
14
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
* THE SOFTWARE.
21
*/
22
23
#include <libavcodec/avcodec.h>
24
#include <libavformat/avformat.h>
25
#include <libavformat/avio.h>
26
27
static const char *type_string(int type)
28
{
29
switch (type) {
30
case AVIO_ENTRY_DIRECTORY:
31
return "<DIR>";
32
case AVIO_ENTRY_FILE:
33
return "<FILE>";
34
case AVIO_ENTRY_BLOCK_DEVICE:
35
return "<BLOCK DEVICE>";
36
case AVIO_ENTRY_CHARACTER_DEVICE:
37
return "<CHARACTER DEVICE>";
38
case AVIO_ENTRY_NAMED_PIPE:
39
return "<PIPE>";
40
case AVIO_ENTRY_SYMBOLIC_LINK:
41
return "<LINK>";
42
case AVIO_ENTRY_SOCKET:
43
return "<SOCKET>";
44
case AVIO_ENTRY_SERVER:
45
return "<SERVER>";
46
case AVIO_ENTRY_SHARE:
47
return "<SHARE>";
48
case AVIO_ENTRY_WORKGROUP:
49
return "<WORKGROUP>";
50
case AVIO_ENTRY_UNKNOWN:
51
default:
52
break;
53
}
54
return "<UNKNOWN>";
55
}
56
57
static int list_op(const char *input_dir)
58
{
59
AVIODirEntry *entry = NULL;
60
AVIODirContext *ctx = NULL;
61
int cnt, ret;
62
char filemode[4], uid_and_gid[20];
63
64
if ((ret = avio_open_dir(&ctx, input_dir, NULL)) < 0) {
65
av_log(NULL, AV_LOG_ERROR, "Cannot open directory: %s.\n", av_err2str(ret));
66
goto fail;
67
}
68
69
cnt = 0;
70
for (;;) {
71
if ((ret = avio_read_dir(ctx, &entry)) < 0) {
72
av_log(NULL, AV_LOG_ERROR, "Cannot list directory: %s.\n", av_err2str(ret));
73
goto fail;
74
}
75
if (!entry)
76
break;
77
if (entry->filemode == -1) {
78
snprintf(filemode, 4, "???");
79
} else {
80
snprintf(filemode, 4, "%3"PRIo64, entry->filemode);
81
}
82
snprintf(uid_and_gid, 20, "%"PRId64"(%"PRId64")", entry->user_id, entry->group_id);
83
if (cnt == 0)
84
av_log(NULL, AV_LOG_INFO, "%-9s %12s %30s %10s %s %16s %16s %16s\n",
85
"TYPE", "SIZE", "NAME", "UID(GID)", "UGO", "MODIFIED",
86
"ACCESSED", "STATUS_CHANGED");
87
av_log(NULL, AV_LOG_INFO, "%-9s %12"PRId64" %30s %10s %s %16"PRId64" %16"PRId64" %16"PRId64"\n",
88
type_string(entry->type),
89
entry->size,
90
entry->name,
91
uid_and_gid,
92
filemode,
93
entry->modification_timestamp,
94
entry->access_timestamp,
95
entry->status_change_timestamp);
96
avio_free_directory_entry(&entry);
97
cnt++;
98
};
99
100
fail:
101
avio_close_dir(&ctx);
102
return ret;
103
}
104
105
static int del_op(const char *url)
106
{
107
int ret = avpriv_io_delete(url);
108
if (ret < 0)
109
av_log(NULL, AV_LOG_ERROR, "Cannot delete '%s': %s.\n", url, av_err2str(ret));
110
return ret;
111
}
112
113
static int move_op(const char *src, const char *dst)
114
{
115
int ret = avpriv_io_move(src, dst);
116
if (ret < 0)
117
av_log(NULL, AV_LOG_ERROR, "Cannot move '%s' into '%s': %s.\n", src, dst, av_err2str(ret));
118
return ret;
119
}
120
121
122
static void usage(const char *program_name)
123
{
124
fprintf(stderr, "usage: %s OPERATION entry1 [entry2]\n"
125
"API example program to show how to manipulate resources "
126
"accessed through AVIOContext.\n"
127
"OPERATIONS:\n"
128
"list list content of the directory\n"
129
"move rename content in directory\n"
130
"del delete content in directory\n",
131
program_name);
132
}
133
134
int main(int argc, char *argv[])
135
{
136
const char *op = NULL;
137
int ret;
138
139
av_log_set_level(AV_LOG_DEBUG);
140
141
if (argc < 2) {
142
usage(argv[0]);
143
return 1;
144
}
145
146
/* register codecs and formats and other lavf/lavc components*/
147
av_register_all();
148
avformat_network_init();
149
150
op = argv[1];
151
if (strcmp(op, "list") == 0) {
152
if (argc < 3) {
153
av_log(NULL, AV_LOG_INFO, "Missing argument for list operation.\n");
154
ret = AVERROR(EINVAL);
155
} else {
156
ret = list_op(argv[2]);
157
}
158
} else if (strcmp(op, "del") == 0) {
159
if (argc < 3) {
160
av_log(NULL, AV_LOG_INFO, "Missing argument for del operation.\n");
161
ret = AVERROR(EINVAL);
162
} else {
163
ret = del_op(argv[2]);
164
}
165
} else if (strcmp(op, "move") == 0) {
166
if (argc < 4) {
167
av_log(NULL, AV_LOG_INFO, "Missing argument for move operation.\n");
168
ret = AVERROR(EINVAL);
169
} else {
170
ret = move_op(argv[2], argv[3]);
171
}
172
} else {
173
av_log(NULL, AV_LOG_INFO, "Invalid operation %s\n", op);
174
ret = AVERROR(EINVAL);
175
}
176
177
avformat_network_deinit();
178
179
return ret < 0 ? 1 : 0;
180
}
181
182