MINOR: spoa-server: Load files
Declare files to be executed at the begining and execute it. The binding between the engine and the file is done throught the extension.
This commit is contained in:
parent
892f6647c1
commit
8b9a73bac0
|
@ -99,6 +99,23 @@ bool debug = false;
|
||||||
pthread_key_t worker_id;
|
pthread_key_t worker_id;
|
||||||
static struct ps *ps_list = NULL;
|
static struct ps *ps_list = NULL;
|
||||||
static struct ps_message *ps_messages = NULL;
|
static struct ps_message *ps_messages = NULL;
|
||||||
|
static int nfiles = 0;
|
||||||
|
static char **files = NULL;
|
||||||
|
|
||||||
|
static inline void add_file(const char *file)
|
||||||
|
{
|
||||||
|
nfiles++;
|
||||||
|
files = realloc(files, sizeof(*files) * nfiles);
|
||||||
|
if (files == NULL) {
|
||||||
|
fprintf(stderr, "Out of memory error\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
files[nfiles - 1] = strdup(file);
|
||||||
|
if (files[nfiles - 1] == NULL) {
|
||||||
|
fprintf(stderr, "Out of memory error\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ps_register(struct ps *ps)
|
void ps_register(struct ps *ps)
|
||||||
{
|
{
|
||||||
|
@ -963,6 +980,8 @@ spoa_worker(void *data)
|
||||||
int *info = (int *)data;
|
int *info = (int *)data;
|
||||||
int csock, lsock = info[0];
|
int csock, lsock = info[0];
|
||||||
struct ps *ps;
|
struct ps *ps;
|
||||||
|
int i;
|
||||||
|
int len;
|
||||||
|
|
||||||
signal(SIGPIPE, SIG_IGN);
|
signal(SIGPIPE, SIG_IGN);
|
||||||
pthread_setspecific(worker_id, &info[1]);
|
pthread_setspecific(worker_id, &info[1]);
|
||||||
|
@ -971,6 +990,20 @@ spoa_worker(void *data)
|
||||||
for (ps = ps_list; ps != NULL; ps = ps->next)
|
for (ps = ps_list; ps != NULL; ps = ps->next)
|
||||||
ps->init_worker(&w);
|
ps->init_worker(&w);
|
||||||
|
|
||||||
|
/* Load files */
|
||||||
|
for (i = 0; i < nfiles; i++) {
|
||||||
|
len = strlen(files[i]);
|
||||||
|
for (ps = ps_list; ps != NULL; ps = ps->next)
|
||||||
|
if (strcmp(files[i] + len - strlen(ps->ext), ps->ext) == 0)
|
||||||
|
break;
|
||||||
|
if (ps == NULL) {
|
||||||
|
LOG("Can't load file \"%s\"\n", files[i]);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (!ps->load_file(&w, files[i]))
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
socklen_t sz = sizeof(client);
|
socklen_t sz = sizeof(client);
|
||||||
|
|
||||||
|
@ -1040,11 +1073,13 @@ int process_create(pid_t *pid, void *(*ps)(void *), void *data)
|
||||||
static void
|
static void
|
||||||
usage(char *prog)
|
usage(char *prog)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Usage: %s [-h] [-d] [-p <port>] [-n <num-workers>]\n", prog);
|
fprintf(stderr, "Usage: %s [-h] [-d] [-p <port>] [-n <num-workers>] -f <file>\n", prog);
|
||||||
fprintf(stderr, " -h Print this message\n");
|
fprintf(stderr, " -h Print this message\n");
|
||||||
fprintf(stderr, " -d Enable the debug mode\n");
|
fprintf(stderr, " -d Enable the debug mode\n");
|
||||||
fprintf(stderr, " -p <port> Specify the port to listen on (default: 12345)\n");
|
fprintf(stderr, " -p <port> Specify the port to listen on (default: 12345)\n");
|
||||||
fprintf(stderr, " -n <num-workers> Specify the number of workers (default: 5)\n");
|
fprintf(stderr, " -n <num-workers> Specify the number of workers (default: 5)\n");
|
||||||
|
fprintf(stderr, " -f <file> Specify the file whoch contains the processing code.\n");
|
||||||
|
fprintf(stderr, " This argument can specified more than once.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -1060,7 +1095,7 @@ main(int argc, char **argv)
|
||||||
|
|
||||||
nbworkers = NUM_WORKERS;
|
nbworkers = NUM_WORKERS;
|
||||||
port = DEFAULT_PORT;
|
port = DEFAULT_PORT;
|
||||||
while ((opt = getopt(argc, argv, "hdn:p:")) != -1) {
|
while ((opt = getopt(argc, argv, "hdn:p:f:")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'h':
|
case 'h':
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
|
@ -1074,6 +1109,9 @@ main(int argc, char **argv)
|
||||||
case 'p':
|
case 'p':
|
||||||
port = atoi(optarg);
|
port = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
case 'f':
|
||||||
|
add_file(optarg);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
|
|
@ -90,6 +90,7 @@ struct ps {
|
||||||
char *ext;
|
char *ext;
|
||||||
int (*init_worker)(struct worker *w);
|
int (*init_worker)(struct worker *w);
|
||||||
int (*exec_message)(struct worker *w, void *ref, int nargs, struct spoe_kv *args);
|
int (*exec_message)(struct worker *w, void *ref, int nargs, struct spoe_kv *args);
|
||||||
|
int (*load_file)(struct worker *w, const char *file);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ps_message {
|
struct ps_message {
|
||||||
|
|
Loading…
Reference in New Issue