char * get_mime_type(struct htdx_t *htdx, char *ext_name) { struct mime_type_t *mime_type; mime_type = mime_types_get(htdx, ext_name); if (mime_type) { htdx->mime_types = mime_type; return mime_type->type; } else { mime_type = mime_types_get(htdx, "*"); if (mime_type) { return mime_type->type; } } return ""; }
int mime_type_assign(struct htdx_t *htdx, char *ext_name, char *type) { if (!strlen(ext_name)) { return 0; } if (strlen(type)) { struct mime_type_t *mime_type; mime_type = mime_types_get(htdx, ext_name); if (mime_type) { /* to update */ free(mime_type->type); mime_type->type = x_strlwr(strdup(type)); return 1; } else { /* new */ mime_types_add(htdx, ext_name, type); return 1; } } else { /* to delete */ return mime_types_del(htdx, ext_name); } }
char *mime_types_get_by_filename(char *filename, int len, cache *c) { char ext[17]; int ext_len = 0; ext[16] = '\0'; while (--len) { if (ext_len < 16) { ext[15-ext_len] = filename[len]; ++ext_len; } if (filename[len] == '.') { break; } } char *extension = &ext; extension = extension + (16-ext_len); return mime_types_get(extension, ext_len, c); }
int mime_types_del(struct htdx_t *htdx, char *ext_name) { struct mime_type_t *mime_type; mime_type = mime_types_get(htdx, ext_name); if (mime_type) { if (mime_type == mime_type->next) { // only one htdx->mime_types = NULL; } else { if (mime_type == htdx->mime_types) { // the first htdx->mime_types = mime_type->next; } mime_type->prev->next = mime_type->next; mime_type->next->prev = mime_type->prev; } free(mime_type->ext_name); free(mime_type->type); free(mime_type); return 1; } else { return 0; } }