gboolean completion_match(GtkEntryCompletion *completion, const gchar *key, GtkTreeIter *iter, gpointer user_data) { gchar *value; gboolean match = FALSE; gtk_tree_model_get(GTK_TREE_MODEL(completion_model), iter, 0, &value, -1); if (value == NULL) return FALSE; match = match_uri(value, key); g_free(value); return (match); }
/* * Main application. This is where the requests come in and routed. */ void handle_request(void) { bool logged_in = false; char *request_uri; struct timespec stp; struct timespec etp; clock_gettime(CLOCK_REALTIME, &stp); qvars = NULL; avars = NULL; u_files = NULL; set_env_vars(); set_vars(); request_uri = strdupa(env_vars.request_uri); /* Initialise the database connection */ conn = db_conn(); if (!conn) goto out2; /* * Some routes need to come before the login / session stuff as * they can't be logged in and have no session. */ if (match_uri(request_uri, "//")) { /* function call goes here */ goto out2; } if (match_uri(request_uri, "/login/")) { login(); goto out2; } logged_in = is_logged_in(); if (!logged_in) { printf("Location: /login/\r\n\r\n"); goto out2; } /* Logged in, set-up the user_session structure */ set_user_session(); /* Add new url handlers after here */ if (match_uri(request_uri, "/logout/")) { logout(); goto out; } /* Default location */ printf("Location: /login/\r\n\r\n"); out: free_user_session(); out2: free_vars(qvars); free_avars(); free_u_files(); clock_gettime(CLOCK_REALTIME, &etp); d_fprintf(access_log, "Got request from %s for %s (%s), %ums\n", env_vars.remote_addr, request_uri, env_vars.request_method, (unsigned int)((etp.tv_sec * 1000 + etp.tv_nsec / NS_MSEC) - (stp.tv_sec * 1000 + stp.tv_nsec / NS_MSEC))); free_env_vars(); mysql_close(conn); }