Overview
Comment: | Updated to reduce use of malloc/strdup -- current run-time use is only for logging |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: | 614c3eb427073cf22ff2da5bc37157fb610b5568 |
User & Date: | rkeene on 2014-02-11 05:01:40 |
Other Links: | manifest | tags |
Context
2014-02-11
| ||
05:14 | Filed 1.2 check-in: b6fe901824 user: rkeene tags: trunk, 1.2 | |
05:01 | Updated to reduce use of malloc/strdup -- current run-time use is only for logging check-in: 614c3eb427 user: rkeene tags: trunk | |
04:42 | Added note if logging is disabled check-in: 8396a85348 user: rkeene tags: trunk | |
Changes
Modified filed.c from [f8f87f8101] to [491e53c99b].
42 42 struct filed_logging_thread_args { 43 43 FILE *fp; 44 44 }; 45 45 46 46 /* File information */ 47 47 struct filed_fileinfo { 48 48 pthread_mutex_t mutex; 49 - char *path; 49 + char path[FILED_PATH_BUFFER_SIZE]; 50 50 int fd; 51 51 off_t len; 52 52 char *lastmod; 53 53 char lastmod_b[64]; 54 54 const char *type; 55 55 }; 56 56 57 57 /* Request variables */ 58 58 struct filed_http_request { 59 59 /** Buffers **/ 60 60 struct filed_fileinfo fileinfo; 61 - char path_b[FILED_PATH_BUFFER_SIZE]; 62 61 char tmpbuf[1010]; 63 62 64 63 /** HTTP Request information **/ 65 - char *path; /*** Path being requested ***/ 64 + /*** Path being requested ***/ 65 + char path[FILED_PATH_BUFFER_SIZE]; 66 66 67 67 struct { 68 68 struct { 69 69 int present; 70 70 off_t offset; /*** Range start ***/ 71 71 off_t length; /*** Range length ***/ 72 72 } range; ................................................................................ 135 135 /* Initialize cache entries */ 136 136 for (idx = 0; idx < filed_fileinfo_fdcache_size; idx++) { 137 137 mutex_init_ret = pthread_mutex_init(&filed_fileinfo_fdcache[idx].mutex, NULL); 138 138 if (mutex_init_ret != 0) { 139 139 return(1); 140 140 } 141 141 142 - filed_fileinfo_fdcache[idx].path = strdup(""); 142 + filed_fileinfo_fdcache[idx].path[0] = '\0'; 143 143 filed_fileinfo_fdcache[idx].fd = -1; 144 144 filed_fileinfo_fdcache[idx].lastmod = ""; 145 145 filed_fileinfo_fdcache[idx].type = ""; 146 146 } 147 147 148 148 return(0); 149 149 } ................................................................................ 511 511 fd = open(open_path, O_RDONLY | O_LARGEFILE); 512 512 if (fd < 0) { 513 513 pthread_mutex_unlock(&cache->mutex); 514 514 515 515 return(NULL); 516 516 } 517 517 518 - free(cache->path); 519 518 if (cache->fd >= 0) { 520 519 close(cache->fd); 521 520 } 522 521 523 522 len = lseek(fd, 0, SEEK_END); 524 523 lseek(fd, 0, SEEK_SET); 525 524 526 525 cache->fd = fd; 527 526 cache->len = len; 528 - cache->path = strdup(path); 527 + strcpy(cache->path, path); 529 528 cache->type = filed_determine_mimetype(open_path); 530 529 531 530 /* XXX:TODO: Determine */ 532 531 cache->lastmod = filed_format_time(cache->lastmod_b, sizeof(cache->lastmod_b), time(NULL) - 30); 533 532 } else { 534 533 filed_log_msg_debug("Cache hit for idx: %lu: PATH \"%s\"", (unsigned long) cache_idx, path); 535 534 } ................................................................................ 555 554 556 555 return(buffer); 557 556 } 558 557 559 558 /* Process an HTTP request and return the path requested */ 560 559 static struct filed_http_request *filed_get_http_request(FILE *fp, struct filed_http_request *buffer_st) { 561 560 char *method, *path; 562 - char *buffer, *tmpbuffer, *workbuffer, *workbuffer_next; 563 - size_t buffer_len, tmpbuffer_len; 561 + char *buffer, *workbuffer, *workbuffer_next; 562 + size_t buffer_len; 564 563 off_t range_start, range_end, range_length; 565 564 int range_request; 566 565 int fd; 567 566 int i; 568 567 569 568 fd = fileno(fp); 570 569 571 570 range_start = 0; 572 571 range_end = 0; 573 572 range_request = 0; 574 573 range_length = -1; 575 574 576 - buffer = buffer_st->path_b; 577 - buffer_len = sizeof(buffer_st->path_b); 578 - 579 - tmpbuffer = buffer_st->tmpbuf; 580 - tmpbuffer_len = sizeof(buffer_st->tmpbuf); 575 + buffer = buffer_st->tmpbuf; 576 + buffer_len = sizeof(buffer_st->tmpbuf); 581 577 582 578 fgets(buffer, buffer_len, fp); 583 579 584 580 method = buffer; 585 581 586 582 buffer = strchr(buffer, ' '); 587 583 if (buffer == NULL) { ................................................................................ 595 591 596 592 buffer = strchr(buffer, ' '); 597 593 if (buffer != NULL) { 598 594 *buffer = '\0'; 599 595 buffer++; 600 596 } 601 597 598 + /* We only handle the "GET" method */ 599 + if (strcasecmp(method, "get") != 0) { 600 + return(NULL); 601 + } 602 + 603 + /* Note path */ 604 + strcpy(buffer_st->path, path); 605 + 602 606 for (i = 0; i < 100; i++) { 603 - fgets(tmpbuffer, tmpbuffer_len, fp); 607 + buffer = buffer_st->tmpbuf; 608 + fgets(buffer, buffer_len, fp); 604 609 605 - if (strncasecmp(tmpbuffer, "Range: ", 7) == 0) { 606 - workbuffer = tmpbuffer + 7; 610 + if (strncasecmp(buffer, "Range: ", 7) == 0) { 611 + workbuffer = buffer + 7; 607 612 608 613 if (strncasecmp(workbuffer, "bytes=", 6) == 0) { 609 614 workbuffer += 6; 610 615 611 616 range_request = 1; 612 617 613 618 range_start = strtoull(workbuffer, &workbuffer_next, 10); ................................................................................ 620 625 if (*workbuffer != '\r' && *workbuffer != '\n') { 621 626 range_end = strtoull(workbuffer, &workbuffer_next, 10); 622 627 } 623 628 } 624 629 } 625 630 } 626 631 627 - if (memcmp(tmpbuffer, "\r\n", 2) == 0) { 632 + if (memcmp(buffer, "\r\n", 2) == 0) { 628 633 break; 629 634 } 630 635 } 631 636 632 - /* We only handle the "GET" method */ 633 - if (strcasecmp(method, "get") != 0) { 634 - return(NULL); 635 - } 636 - 637 637 /* Determine range */ 638 638 if (range_end != 0) { 639 639 if (range_end <= range_start) { 640 640 return(NULL); 641 641 } 642 642 643 643 range_length = range_end - range_start; ................................................................................ 646 646 (unsigned long long) range_length, 647 647 (unsigned long long) range_end, 648 648 (unsigned long long) range_start 649 649 ); 650 650 } 651 651 652 652 /* Fill up structure to return */ 653 - buffer_st->path = path; 654 653 buffer_st->headers.range.present = range_request; 655 654 buffer_st->headers.range.offset = range_start; 656 655 buffer_st->headers.range.length = range_length; 657 656 658 657 return(buffer_st); 659 658 660 659 /* Make compiler happy */ ................................................................................ 695 694 close(fd); 696 695 697 696 return; 698 697 } 699 698 700 699 request = filed_get_http_request(fp, request); 701 700 702 - if (request == NULL || request->path == NULL) { 701 + if (request == NULL) { 703 702 filed_error_page(fp, date_current, 500); 704 703 705 704 log->buffer[0] = '\0'; 706 705 log->http_code = 500; 707 706 log->reason = "format"; 708 707 709 708 filed_log_entry(log);