2 * Copyright (c) 2016-2019 S. Gilles <sgilles@math.umd.edu>
4 * Permission to use, copy, modify, and/or distribute this software
5 * for any purpose with or without fee is hereby granted, provided
6 * that the above copyright notice and this permission notice appear
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
13 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
14 * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
15 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
16 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
26 #include <curl/curl.h>
27 #include <yajl_parse.h>
46 write_out_everything(map
*folders
, map
*files
)
51 char **folder_keys
= 0;
52 size_t folder_num
= 0;
57 const char *folder_print_name
= 0;
58 char *printed_files
= 0;
60 map_get_keys(folders
, &folder_keys
, &folder_num
);
61 map_get_keys(files
, &file_keys
, &file_num
);
63 if (!(printed_files
= calloc(file_num
, sizeof *printed_files
))) {
69 for (j
= 0; j
< folder_num
; ++j
) {
70 folder
= map_get(folders
, folder_keys
[j
]);
76 folder_print_name
= folder
[FN_FOL_FULL_NAME
- 1];
78 if (!strncmp(folder_print_name
, "course files", 12)) {
79 folder_print_name
= folder_print_name
+ 12;
81 while (folder_print_name
[0] == '/') {
86 for (k
= 0; k
< file_num
; ++k
) {
87 if (printed_files
[k
]) {
91 file
= map_get(files
, file_keys
[k
]);
97 if (strcmp(file
[FN_FIL_FOL_ID
- 1], folder_keys
[j
])) {
101 if (folder_print_name
[0]) {
102 printf("%s/%s\n", folder_print_name
,
103 file
[FN_FIL_FILENAME
- 1]);
105 printf("%s\n", file
[FN_FIL_FILENAME
- 1]);
108 printed_files
[k
] = 1;
112 for (k
= 0; k
< file_num
; ++k
) {
113 if (printed_files
[k
]) {
117 file
= map_get(files
, file_keys
[j
]);
123 printf("At unknown location: %s\n", file
[FN_FIL_FILENAME
- 1]);
136 main(int argc
, char **argv
)
140 char *auth_token
= 0;
142 const char *fn_folders
[] = {
144 [FN_FOL_ID
] = "id", /* */
145 [FN_FOL_FULL_NAME
] = "full_name", /* */
146 [FN_FOL_END
] = 0 /* */
148 const char *fn_files
[] = {
150 [FN_FIL_ID
] = "id", /* */
151 [FN_FIL_FOL_ID
] = "folder_id", /* */
152 [FN_FIL_FILENAME
] = "filename", /* */
153 [FN_FIL_END
] = 0 /* */
161 setlocale(LC_ALL
, "");
163 while ((opt
= getopt(argc
, argv
, "c:")) != -1) {
175 fprintf(stderr
, "course-id is mandatory\n");
179 curl_global_init(CURL_GLOBAL_DEFAULT
);
181 if (!(url_base
= get_url_base())) {
184 /* Error should have already been printed */
188 if (!(auth_token
= get_auth_token())) {
191 /* Error should have already been printed */
195 len
= snprintf(0, 0, "%s/api/v1/courses/%s/folders", url_base
,
199 ret
= errno
= EOVERFLOW
;
204 if (!(built_uri
= malloc(len
+ 1))) {
210 sprintf(built_uri
, "%s/api/v1/courses/%s/folders", url_base
, course_id
);
212 if ((ret
= key_value_extract(built_uri
, auth_token
, fn_folders
, 0,
219 len
= snprintf(0, 0, "%s/api/v1/courses/%s/files", url_base
, course_id
);
222 ret
= errno
= EOVERFLOW
;
227 if (!(built_uri
= malloc(len
+ 1))) {
233 sprintf(built_uri
, "%s/api/v1/courses/%s/files", url_base
, course_id
);
235 if ((ret
= key_value_extract(built_uri
, auth_token
, fn_files
, 0,
240 if ((ret
= write_out_everything(&folders
, &files
))) {
251 curl_global_cleanup();