Check-in [614c3eb427]
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);