• Home
  • Raw
  • Download

Lines Matching +full:upload +full:- +full:dir

2  * libwebsockets - small server side websockets and web server implementation
4 * Copyright (C) 2010 - 2020 Andy Green <andy@warmcat.com>
102 "upload",
118 return (int)(p2->mtime - p1->mtime); in de_mtime_sort()
124 if (pss->vhd->lwsac_head) in start_sending_dir()
125 lwsac_reference(pss->vhd->lwsac_head); in start_sending_dir()
126 pss->lwsac_head = pss->vhd->lwsac_head; in start_sending_dir()
127 pss->dire = pss->vhd->dire_head; in start_sending_dir()
128 pss->filelist_version = pss->vhd->filelist_version; in start_sending_dir()
129 pss->first = 1; in start_sending_dir()
143 DIR *dir[3]; in scan_upload_dir() local
145 initial = strlen(vhd->upload_dir) + 1; in scan_upload_dir()
146 lws_strncpy(subdir[sp], vhd->upload_dir, sizeof(subdir[sp])); in scan_upload_dir()
147 dir[sp] = opendir(vhd->upload_dir); in scan_upload_dir()
148 if (!dir[sp]) { in scan_upload_dir()
149 lwsl_err("%s: Unable to walk upload dir '%s'\n", __func__, in scan_upload_dir()
150 vhd->upload_dir); in scan_upload_dir()
151 return -1; in scan_upload_dir()
155 de = readdir(dir[sp]); in scan_upload_dir()
157 closedir(dir[sp]); in scan_upload_dir()
163 sp--; in scan_upload_dir()
175 de->d_name); in scan_upload_dir()
178 if (de->d_name[strlen(de->d_name) - 1] == '~') in scan_upload_dir()
189 if (!strcmp(de->d_name, ".") || in scan_upload_dir()
190 !strcmp(de->d_name, "..")) in scan_upload_dir()
193 if (sp == LWS_ARRAY_SIZE(dir)) { in scan_upload_dir()
194 lwsl_err("%s: Skipping too-deep subdir %s\n", in scan_upload_dir()
196 sp--; in scan_upload_dir()
199 lws_strncpy(subdir[sp], de->d_name, sizeof(subdir[sp])); in scan_upload_dir()
200 dir[sp] = opendir(filepath); in scan_upload_dir()
201 if (!dir[sp]) { in scan_upload_dir()
218 dire->next = NULL; in scan_upload_dir()
219 dire->size = (unsigned long long)s.st_size; in scan_upload_dir()
220 dire->mtime = s.st_mtime; in scan_upload_dir()
221 dire->user[0] = '\0'; in scan_upload_dir()
224 lws_strncpy(dire->user, subdir[1], sizeof(dire->user)); in scan_upload_dir()
231 lws_list_ptr_insert(&sorted_head, &dire->next, de_mtime_sort); in scan_upload_dir()
235 if (vhd->lwsac_head) in scan_upload_dir()
236 lwsac_detach(&vhd->lwsac_head); in scan_upload_dir()
239 vhd->lwsac_head = lwsac_head; in scan_upload_dir()
241 vhd->dire_head = lp_to_dir_entry(sorted_head, next); in scan_upload_dir()
243 vhd->dire_head = NULL; in scan_upload_dir()
245 vhd->filelist_version++; in scan_upload_dir()
249 lws_start_foreach_llp(struct pss_deaddrop **, ppss, vhd->pss_head) { in scan_upload_dir()
251 lws_callback_on_writable((*ppss)->wsi); in scan_upload_dir()
258 closedir(dir[sp--]); in scan_upload_dir()
260 return -1; in scan_upload_dir()
276 lws_urldecode(filename2, filename, sizeof(filename2) - 1); in file_upload_cb()
278 if (pss->user[0]) { in file_upload_cb()
279 lws_filename_purify_inplace(pss->user); in file_upload_cb()
280 lws_snprintf(pss->filename, sizeof(pss->filename), in file_upload_cb()
281 "%s/%s", pss->vhd->upload_dir, pss->user); in file_upload_cb()
282 if (mkdir(pss->filename in file_upload_cb()
288 lws_snprintf(pss->filename, sizeof(pss->filename), in file_upload_cb()
289 "%s/%s/%s~", pss->vhd->upload_dir, in file_upload_cb()
290 pss->user, filename2); in file_upload_cb()
292 lws_snprintf(pss->filename, sizeof(pss->filename), in file_upload_cb()
293 "%s/%s~", pss->vhd->upload_dir, filename2); in file_upload_cb()
294 lwsl_notice("%s: filename '%s'\n", __func__, pss->filename); in file_upload_cb()
296 pss->fd = (lws_filefd_type)(long long)lws_open(pss->filename, in file_upload_cb()
298 if (pss->fd == LWS_INVALID_FILE) { in file_upload_cb()
299 pss->response_code = HTTP_STATUS_INTERNAL_SERVER_ERROR; in file_upload_cb()
301 pss->filename, errno); in file_upload_cb()
302 return -1; in file_upload_cb()
309 pss->file_length += (unsigned int)len; in file_upload_cb()
312 if (pss->file_length > pss->vhd->max_size) { in file_upload_cb()
313 pss->response_code = in file_upload_cb()
315 close((int)(lws_intptr_t)pss->fd); in file_upload_cb()
316 pss->fd = LWS_INVALID_FILE; in file_upload_cb()
317 unlink(pss->filename); in file_upload_cb()
319 return -1; in file_upload_cb()
322 if (pss->fd != LWS_INVALID_FILE) { in file_upload_cb()
323 n = (int)write((int)(lws_intptr_t)pss->fd, buf, (unsigned int)len); in file_upload_cb()
326 lws_set_timeout(pss->wsi, PENDING_TIMEOUT_HTTP_CONTENT, 30); in file_upload_cb()
332 if (pss->fd != LWS_INVALID_FILE) in file_upload_cb()
333 close((int)(lws_intptr_t)pss->fd); in file_upload_cb()
336 lws_strncpy(filename2, pss->filename, sizeof(filename2)); in file_upload_cb()
337 filename2[strlen(filename2) - 1] = '\0'; in file_upload_cb()
338 if (rename(pss->filename, filename2) < 0) in file_upload_cb()
341 pss->fd = LWS_INVALID_FILE; in file_upload_cb()
342 pss->response_code = HTTP_STATUS_OK; in file_upload_cb()
343 scan_upload_dir(pss->vhd); in file_upload_cb()
362 p = (unsigned char *)pss->result + LWS_PRE; in format_result()
364 end = p + sizeof(pss->result) - LWS_PRE - 1; in format_result()
368 "<meta charset=utf-8 http-equiv=\"Content-Language\" " in format_result()
386 *end = &buf[sizeof(buf) - 1]; in callback_deaddrop()
404 vhd->context = lws_get_context(wsi); in callback_deaddrop()
405 vhd->vh = lws_get_vhost(wsi); in callback_deaddrop()
406 vhd->protocol = lws_get_protocol(wsi); in callback_deaddrop()
407 vhd->max_size = 20 * 1024 * 1024; /* default without pvo */ in callback_deaddrop()
409 if (!lws_pvo_get_str(in, "max-size", &cp)) in callback_deaddrop()
410 vhd->max_size = (unsigned long long)atoll(cp); in callback_deaddrop()
411 if (lws_pvo_get_str(in, "upload-dir", &vhd->upload_dir)) { in callback_deaddrop()
412 lwsl_warn("%s: requires 'upload-dir' pvo\n", __func__); in callback_deaddrop()
418 lwsl_notice(" deaddrop: vh %s, upload dir %s, max size %llu\n", in callback_deaddrop()
419 lws_get_vhost_name(vhd->vh), vhd->upload_dir, in callback_deaddrop()
420 vhd->max_size); in callback_deaddrop()
425 lwsac_free(&vhd->lwsac_head); in callback_deaddrop()
428 /* WS-related */ in callback_deaddrop()
431 pss->vhd = vhd; in callback_deaddrop()
432 pss->wsi = wsi; in callback_deaddrop()
434 pss->pss_list = vhd->pss_head; in callback_deaddrop()
435 vhd->pss_head = pss; in callback_deaddrop()
437 m = lws_hdr_copy(wsi, pss->user, sizeof(pss->user), in callback_deaddrop()
441 __func__, pss->user); in callback_deaddrop()
443 pss->user[0] = '\0'; in callback_deaddrop()
450 if (pss->lwsac_head) in callback_deaddrop()
451 lwsac_unreference(&pss->lwsac_head); in callback_deaddrop()
454 ppss, vhd->pss_head) { in callback_deaddrop()
456 *ppss = pss->pss_list; in callback_deaddrop()
463 /* we get this kind of thing {"del":"agreen/no-entry.svg"} */ in callback_deaddrop()
472 n = (int)(((void *)cp - in)) - 8; in callback_deaddrop()
474 if ((int)strlen(pss->user) != n || in callback_deaddrop()
475 memcmp(pss->user, ((const char *)in) + 8, (unsigned int)n)) { in callback_deaddrop()
478 __func__, pss->user, in callback_deaddrop()
490 lws_snprintf((char *)buf, sizeof(buf), "%s/%s", vhd->upload_dir, in callback_deaddrop()
503 if (pss->lwsac_head && !pss->dire) in callback_deaddrop()
507 if (pss->first) { in callback_deaddrop()
510 vhd->max_size); in callback_deaddrop()
515 while (m-- && pss->dire) { in callback_deaddrop()
521 pss->first ? ' ' : ',', in callback_deaddrop()
522 (const char *)&pss->dire[1], in callback_deaddrop()
523 pss->dire->size, in callback_deaddrop()
524 (unsigned long long)pss->dire->mtime, in callback_deaddrop()
525 !strcmp(pss->user, pss->dire->user) && in callback_deaddrop()
526 pss->user[0]); in callback_deaddrop()
527 pss->first = 0; in callback_deaddrop()
528 pss->dire = lp_to_dir_entry(pss->dire->next, next); in callback_deaddrop()
531 if (!pss->dire) { in callback_deaddrop()
534 if (pss->lwsac_head) { in callback_deaddrop()
535 lwsac_unreference(&pss->lwsac_head); in callback_deaddrop()
536 pss->lwsac_head = NULL; in callback_deaddrop()
542 !pss->dire)); in callback_deaddrop()
547 if (pss->dire) { in callback_deaddrop()
555 if (pss->filelist_version != pss->vhd->filelist_version) { in callback_deaddrop()
564 /* POST-related */ in callback_deaddrop()
569 if (!pss->spa) { in callback_deaddrop()
570 pss->vhd = vhd; in callback_deaddrop()
571 pss->wsi = wsi; in callback_deaddrop()
572 pss->spa = lws_spa_create(wsi, param_names, in callback_deaddrop()
575 if (!pss->spa) in callback_deaddrop()
576 return -1; in callback_deaddrop()
578 pss->filename[0] = '\0'; in callback_deaddrop()
579 pss->file_length = 0; in callback_deaddrop()
581 pss->response_code = HTTP_STATUS_SERVICE_UNAVAILABLE; in callback_deaddrop()
583 m = lws_hdr_copy(wsi, pss->user, sizeof(pss->user), in callback_deaddrop()
586 lwsl_info("basic auth user: %s\n", pss->user); in callback_deaddrop()
588 pss->user[0] = '\0'; in callback_deaddrop()
592 if (lws_spa_process(pss->spa, in, (int)len)) { in callback_deaddrop()
595 lws_spa_finalize(pss->spa); in callback_deaddrop()
597 pss->completed = 1; in callback_deaddrop()
604 lws_spa_finalize(pss->spa); in callback_deaddrop()
606 pss->completed = 1; in callback_deaddrop()
611 if (!pss->completed) in callback_deaddrop()
614 p = (unsigned char *)pss->result + LWS_PRE; in callback_deaddrop()
616 end = p + sizeof(pss->result) - LWS_PRE - 1; in callback_deaddrop()
618 if (!pss->sent_headers) { in callback_deaddrop()
622 (unsigned int)pss->response_code, in callback_deaddrop()
643 pss->sent_headers = 1; in callback_deaddrop()
648 if (!pss->sent_body) { in callback_deaddrop()
653 pss->sent_body = 1; in callback_deaddrop()
664 if (pss->spa) { in callback_deaddrop()
665 lws_spa_destroy(pss->spa); in callback_deaddrop()
666 pss->spa = NULL; in callback_deaddrop()
682 return -1; in callback_deaddrop()
689 "lws-deaddrop", \