aboutsummaryrefslogtreecommitdiff
path: root/cforum.c
blob: 900465a2d46b226980d943b4c278c31583aa5974 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <err.h>
#include <sqlite3.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "ctl.h"	/* Controllers. */
#include "db.h"		/* Database functions. Defines global variable db. */
#include "err.h"	/* HTTP errors. */
#include "site.h"	/* Site settings. Defines global struct site. */
#include "query.h"	/* Query functions. Defines global struct query. */

#define MAXMSG 300

int
main(int argc, char *argv[])
{
	char msg[MAXMSG], *p, *v;
	int attid, postid, userid;
	sqlite3_stmt *stmt;
	struct att *att;
	
	/*
	 * The database is opened or a server error is generated.
	 * In the rest of the program, the database is always
	 * assumed to be opened.
	 */
	if(sqlite3_open("db", &db) != SQLITE_OK){
		snprintf(msg, MAXMSG,
		    "The database could not be opened: %s\n",
		    sqlite3_errmsg(db));
		srverr(msg);
		sqlite3_close(db);
		return 1;
	}
	
	/*
	 * The site name is retrieved from the database. This early on,
	 * it is appropriate to die with a server error on failure.
	 */
	if(sqlite3_prepare(db,
	    "SELECT value FROM settings WHERE key = 'name'",
	    -1, &stmt, 0) != SQLITE_OK){
		snprintf(msg, MAXMSG,
		    "The site name could not be retrieved: %s\n",
		    sqlite3_errmsg(db));
		srverr(msg);
		sqlite3_close(db);
		return 1;
	}
	if(sqlite3_step(stmt) == SQLITE_ROW)
		site.name = strdup((char *)sqlite3_column_text(stmt, 0));
	else{
		snprintf(msg, MAXMSG, "The site name is not set.\n");
		srverr(msg);
		sqlite3_finalize(stmt);
		sqlite3_close(db);
		return 1;
	}
	sqlite3_finalize(stmt);
	
	/*
	if(!(att = malloc(sizeof(struct att))))
		err(1, "malloc");
	att->post = 1;
	att->name = strdup("example2");
	att->description = NULL;
	att->mime = strdup("text/html");
	att->data = strdup("Hello!");
	att->bytes = strlen(att->data)+1;
	
	fprintf(stderr, "[add] %d %s\n",
	    addatt(att), sqlite3_errmsg(db));
	free(att);
	*/
	
	/*
	 * The global struct query is set, or the program dies.
	 * From now on, query is assumed to be set.
	 */
	setquery();
	
	/* Handle empty request. */
	if(!*query.string){
		showfront();
		goto end;
	}
	
	/* Parse query string. */
	attid = postid = userid = 0;
	while(p = nextparam(GET, 128)){
		v = split(p);
		if(!attid && strcmp(p, "att") == 0)
			attid = atoi(v);
		else if(!postid && strcmp(p, "post") == 0)
			postid = atoi(v);
		else if(!userid && strcmp(p, "user") == 0)
			userid = atoi(v);
	}
	
	/* Handle request. */
	if(attid)
		showatt(attid);
	else if(postid)
		showpost(postid);
	else if(userid)
		showuser(userid);
	else
		showfront();
	
end:
	sqlite3_close(db);
	return 0;
}