void load_properties(hashmap *map, FILE *file) { int temp = 0; int key_done = 0, done = 0; char key[BUFFER_SIZE]; char value[BUFFER_SIZE]; memset(key, '\0', BUFFER_SIZE); memset(value, '\0', BUFFER_SIZE); register unsigned int i = 0; while (!done) { temp = fgetc(file); switch (temp) { case EOF: done = 1; // break; case NL: value[i] = '\0'; if (strlen(key) > 0) { char *data = malloc(strlen(value) + 1); strcpy(data, value); hm_set(map, key, data); } memset(key, '\0', BUFFER_SIZE); memset(value, '\0', BUFFER_SIZE); key_done = 0; i = 0; break; case SEPARATOR: key[i] = '\0'; i = 0; key_done = 1; break; case ' ': case '\t': if (i == 0) break; // break; default: if (key_done) value[i++] = temp; else key[i++] = temp; break; } } }
static int cbif_service_db_set_(void* cbif_handle, const char* key, void* val, void** old_val) { if (cbif_handle && key) { struct connection_st* conn = cbif_handle; if (! conn->db) { conn->db = hm_init(0); if (! conn->db) { return -1; } } return hm_set(conn->db, key, val, old_val); } return -1; }
int rehash ( hashmap_t *oldhm ) { int curfactor = 1; int i; hashmap_t *newhm; entry_t *tmp; curfactor = oldhm->capacity / INITIAL_SIZE; newhm = hm_init ( ++curfactor ); for ( i = 0; i < oldhm->capacity; i++ ) { if ( oldhm->buckets[i] != NULL ) { tmp = oldhm->buckets[i]->entries; do { hm_set ( newhm, tmp->key, tmp->value ); } while ( ( tmp = tmp->next ) != NULL ); } } return EXIT_SUCCESS; }
static int on_each_read_record(const struct jbxm_initconf_st* iconf, struct jbxm_callback_if_st* cbif) { assert(iconf); assert(cbif); assert(cbif->type == JBXM_CBT_EACH_RRECORD); assert(cbif->io_area->avail > 0); struct UserData_st* ud = dbGET(cbif, "user-data"); assert(ud); // available cbif->io_area->buff[0 to cbif->io_area->avail] + '\0' if (ud->bodylen) { // ヘッダの取得は終了し、Content-Length の指定があるので溜め込む struct varmem_st* vm = new_varmem((size_t)cbif->io_area->avail); assert(vm); memcpy(vm->bytes, cbif->io_area->buff, (size_t)cbif->io_area->avail); void* ok = ll_add_tail(ud->body_chunks, vm); assert(ok); ud->body_chunks_sumlen += (size_t)cbif->io_area->avail; return 0; } // HTTP ヘッダの収集 char* buff = (char*)cbif->io_area->buff; ljbx_chomp(buff); // [if buff is string] PRINT("read [%.*s]", (int)cbif->io_area->avail, buff); if (! *buff) { // 空行 if (! ud->method) { // リクエストが設定されていない間は無視 return 0; } //PRINT("headers\n--->>"); //hm_foreach(ud->headers, print_header_, NULL); //PRINT("\n---<<"); const char* clen = hm_get(ud->headers, "content-length"); if (clen) { // add check digit !! const int bodylen = atoi(clen); if (bodylen > 0) { // BODY を収集する ud->bodylen = (size_t)bodylen; } else { if (bodylen) { // bodylen < 0 ud->response = http_CreateError(400); } else { // bodylen == 0 ud->response = http_CreateResponse(ud); } } } else { ud->response = http_CreateResponse(ud); } if (ud->response) { cbif->flow->next_events = EPOLLOUT | EPOLLET; } return 0; } if (ud->method) { // リクエストは解決しているので残りは ud->headers に追加 char* key = NULL; char* val = NULL; int ns = sscanf(buff, "%m[^:]: %m[^\r\n]", &key, &val); if (ns == 2) { ljbx_strtolower(key); void* old_val = NULL; hm_set(ud->headers, key, val, &old_val); free(old_val); // 重複は後勝ち } else { free(val); } free(key); } else { // リクエストを解決 char* method = NULL; char* path = NULL; int major = 0; int minor = 0; int ns = sscanf(buff, "%m[A-Z] %ms HTTP/%d.%d", &method, &path, &major, &minor); if (ns < 2) { free(method); free(path); ud->response = http_CreateError(400); cbif->flow->next_events = EPOLLOUT | EPOLLET; return 0; } ud->method = method; ud->path = path; ud->version.major = major; ud->version.minor = minor; } // set cbif->flow->next_events if necessary return 0; }