feat(feuille.c): accept_loop, better DEBUG mode, some style fixes
This commit is contained in:
parent
2ed08dc596
commit
00e6fe5582
1 changed files with 87 additions and 78 deletions
165
feuille.c
165
feuille.c
|
@ -57,6 +57,7 @@ Settings settings = {
|
||||||
/* functions declarations */
|
/* functions declarations */
|
||||||
static void usage(int exit_code);
|
static void usage(int exit_code);
|
||||||
static void version(void);
|
static void version(void);
|
||||||
|
static void accept_loop(int);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display feuille's basic usage.
|
* Display feuille's basic usage.
|
||||||
|
@ -76,6 +77,83 @@ void version(void)
|
||||||
die(0, "%s %s by Tom MTT. <tom@heimdall.pm>\n", argv0, VERSION);
|
die(0, "%s %s by Tom MTT. <tom@heimdall.pm>\n", argv0, VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void accept_loop(int server)
|
||||||
|
{
|
||||||
|
int pid = getpid();
|
||||||
|
|
||||||
|
/* feed the random number god */
|
||||||
|
srand(time(0) + pid);
|
||||||
|
|
||||||
|
/* accept loop */
|
||||||
|
int connection;
|
||||||
|
while ((connection = accept_connection(server))) {
|
||||||
|
verbose(1, "--- new incoming connection. connection ID: %d:%d ---", pid, time(0));
|
||||||
|
|
||||||
|
char *paste = NULL;
|
||||||
|
char *id = NULL;
|
||||||
|
char *url = NULL;
|
||||||
|
|
||||||
|
/* read paste from connection */
|
||||||
|
verbose(1, "reading paste from incoming connection...");
|
||||||
|
|
||||||
|
if ((paste = read_paste(connection)) != NULL) {
|
||||||
|
/* generate random ID */
|
||||||
|
verbose(1, "done.");
|
||||||
|
verbose(2, "generating a random ID...");
|
||||||
|
|
||||||
|
if ((id = generate_id(settings.id_length)) != NULL) {
|
||||||
|
/* write paste to disk */
|
||||||
|
verbose(2, "done.");
|
||||||
|
verbose(1, "writing paste `%s' to disk...", id);
|
||||||
|
|
||||||
|
if (write_paste(paste, id) == 0) {
|
||||||
|
/* create URL */
|
||||||
|
verbose(1, "done.");
|
||||||
|
verbose(2, "making the right URL...");
|
||||||
|
|
||||||
|
if ((url = create_url(id)) != NULL) {
|
||||||
|
verbose(2, "done.", url);
|
||||||
|
verbose(1, "sending the link to the client...");
|
||||||
|
|
||||||
|
send_response(connection, url);
|
||||||
|
|
||||||
|
verbose(1, "All done.");
|
||||||
|
|
||||||
|
free(url);
|
||||||
|
} else {
|
||||||
|
error("error while making a valid URL.");
|
||||||
|
send_response(connection, "Could not create your paste URL.\nPlease try again later.\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error("error while writing paste to disk.");
|
||||||
|
send_response(connection, "Could not write your paste to disk.\nPlease try again later.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
free(id);
|
||||||
|
} else {
|
||||||
|
error("error while generating a random ID.");
|
||||||
|
send_response(connection, "Could not generate your paste ID.\nPlease try again later.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
free(paste);
|
||||||
|
} else {
|
||||||
|
if (errno == EFBIG)
|
||||||
|
send_response(connection, "Paste too big.\n");
|
||||||
|
|
||||||
|
if (errno == ENOENT)
|
||||||
|
send_response(connection, "Empty paste.\n");
|
||||||
|
|
||||||
|
if (errno == EAGAIN)
|
||||||
|
send_response(connection, "Timeout'd.\n");
|
||||||
|
|
||||||
|
error("error %d while reading paste from incoming connection.", errno);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* close connection */
|
||||||
|
close_connection(connection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Feuille's main function.
|
* Feuille's main function.
|
||||||
* argc: the argument count.
|
* argc: the argument count.
|
||||||
|
@ -293,97 +371,28 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __OpenBSD__ /* OpenBSD-only security measures */
|
#ifdef __OpenBSD__
|
||||||
|
/* OpenBSD-only security measures */
|
||||||
pledge("proc stdio rpath wpath cpath inet", "stdio rpath wpath cpath inet");
|
pledge("proc stdio rpath wpath cpath inet", "stdio rpath wpath cpath inet");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int pid;
|
#ifndef DEBUG
|
||||||
|
|
||||||
#ifndef DEBUG /* do not fork if in DEBUG mode */
|
|
||||||
/* create a thread pool for incoming connections */
|
/* create a thread pool for incoming connections */
|
||||||
verbose(1, "initializing worker pool...");
|
verbose(1, "initializing worker pool...");
|
||||||
|
|
||||||
|
int pid;
|
||||||
for (int i = 1; i <= settings.worker_count; i++) {
|
for (int i = 1; i <= settings.worker_count; i++) {
|
||||||
if ((pid = fork()) == 0) {
|
if ((pid = fork()) == 0) {
|
||||||
verbose(2, " worker n. %d...", i);
|
verbose(2, " worker n. %d...", i);
|
||||||
#endif
|
accept_loop(server);
|
||||||
pid = getpid();
|
|
||||||
|
|
||||||
/* feed the random number god */
|
|
||||||
srand(time(0) + pid);
|
|
||||||
|
|
||||||
/* accept loop */
|
|
||||||
int connection;
|
|
||||||
while ((connection = accept_connection(server))) {
|
|
||||||
verbose(1, "--- new incoming connection. connection ID: %d:%d ---", pid, time(0));
|
|
||||||
|
|
||||||
char *paste = NULL;
|
|
||||||
char *id = NULL;
|
|
||||||
char *url = NULL;
|
|
||||||
|
|
||||||
/* read paste from connection */
|
|
||||||
verbose(1, "reading paste from incoming connection...");
|
|
||||||
|
|
||||||
if ((paste = read_paste(connection)) != NULL) {
|
|
||||||
/* generate random ID */
|
|
||||||
verbose(1, "done.");
|
|
||||||
verbose(2, "generating a random ID...");
|
|
||||||
|
|
||||||
if ((id = generate_id(settings.id_length)) != NULL) {
|
|
||||||
/* write paste to disk */
|
|
||||||
verbose(2, "done.");
|
|
||||||
verbose(1, "writing paste `%s' to disk...", id);
|
|
||||||
|
|
||||||
if (write_paste(paste, id) == 0) {
|
|
||||||
/* create URL */
|
|
||||||
verbose(1, "done.");
|
|
||||||
verbose(2, "making the right URL...");
|
|
||||||
|
|
||||||
if ((url = create_url(id)) != NULL) {
|
|
||||||
verbose(2, "done.", url);
|
|
||||||
verbose(1, "sending the link to the client...");
|
|
||||||
|
|
||||||
send_response(connection, url);
|
|
||||||
|
|
||||||
verbose(1, "All done.");
|
|
||||||
|
|
||||||
free(url);
|
|
||||||
} else {
|
|
||||||
error("error while making a valid URL.");
|
|
||||||
send_response(connection, "Could not create your paste URL.\nPlease try again later.\n");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
error("error while writing paste to disk.");
|
|
||||||
send_response(connection, "Could not write your paste to disk.\nPlease try again later.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
free(id);
|
|
||||||
} else {
|
|
||||||
error("error while generating a random ID.");
|
|
||||||
send_response(connection, "Could not generate your paste ID.\nPlease try again later.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
free(paste);
|
|
||||||
} else {
|
|
||||||
if (errno == EFBIG)
|
|
||||||
send_response(connection, "Paste too big.\n");
|
|
||||||
|
|
||||||
if (errno == ENOENT)
|
|
||||||
send_response(connection, "Empty paste.\n");
|
|
||||||
|
|
||||||
if (errno == EAGAIN)
|
|
||||||
send_response(connection, "Timeout'd.\n");
|
|
||||||
|
|
||||||
error("error %d while reading paste from incoming connection.", errno);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* close connection */
|
|
||||||
close_connection(connection);
|
|
||||||
}
|
|
||||||
#ifndef DEBUG
|
|
||||||
} else if (pid < 0)
|
} else if (pid < 0)
|
||||||
die(errno, "Could not initialize worker n. %d: %s\n", i, strerror(errno));
|
die(errno, "Could not initialize worker n. %d: %s\n", i, strerror(errno));
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
/* do not create a thread pool if in DEBUG mode */
|
||||||
|
verbose(1, "running in DEBUG mode, won't create a worker pool.");
|
||||||
|
accept_loop(server);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
Reference in a new issue