int server_logic(client_t *c, proto_msg_t *msg) { TRACE_MSG(msg); switch (proto_msg_type(msg)) { case MSG_HELLO: return (handle_hello(c, msg)); case MSG_OP: return (handle_op(c, msg)); case MSG_TEXT: return (handle_text(c, msg)); case MSG_NUM: return (handle_num(c, msg)); default: return (send_text_message(c, "thank you!")); } }
void config_load (const char *cfg_name) { FILE *cfg = fopen (cfg_name, "rt"); char buffer [4096], var [4096], *val; cfg_var *cv; if (!cfg) { perror (cfg_name); return; } while (fgets (buffer, 4096, cfg)) { // Kill comments char *split = strrchr (buffer, '#'); char *cp1 = var, *cp2 = buffer; if (split) *split = '\0'; // remove trailing newline split = strrchr (buffer, '\n'); if (split) *split = '\0'; // Skip leading white space ... cp2 = skip_ws (cp2); // Silently ignore empty lines. if (!*cp2) continue; // search for '=' val = strchr (cp2, '='); if (!val) { fprintf (stderr, "%s: ignoring bad config line starting \"%s\" (missing '='!)\n", cfg_name, buffer); continue; } *val++ = '\0'; // front part basically must be a variable name. // To keep it simple we ignore *all* white space here - even if inside the variable name. while (*cp2) { if (!isspace (*cp2)) *cp1++ = toupper (*cp2); *cp2++; } *cp1 = '\0'; // remove leading and trailing white space off val val = skip_ws (val); if (!*val) { fprintf (stderr, "%s: ignoring bad config line starting \"%s\" (missing value!)\n", cfg_name, buffer); continue; } cp2 = strchr (val, '\0') - 1; while (cp2 > val && isspace (*cp2)) cp2--; cp2 [1] = '\0'; // search the variable for (cv = config; cv->name; cv++) if (strcmp (cv->name, var) == 0) break; if (!cv->name) fprintf (stderr, "%s: ignoring bad config line starting \"%s\" (variable '%s' unknown!)\n", cfg_name, buffer, var); else switch (cv->type) { case NUM: handle_num (var, cv->v_ptr, val); break; case BOOL: handle_bool (var, cv->v_ptr, val); break; case STRING: handle_string (var, cv->v_ptr, val); break; case N_ARRAY: handle_array (var, cv->v_ptr, cv->n_ptr, val); break; } } fclose (cfg); }