Archived
3
0

lack the program core, most util functions here

This commit is contained in:
Philippe PITTOLI 2016-06-06 02:25:28 +02:00
parent 3ccb174850
commit f0dbecd67f
3 changed files with 37 additions and 54 deletions

View File

@ -1,12 +1,6 @@
#include "pubsubd.h" #include "pubsubd.h"
#include <stdlib.h> #include <stdlib.h>
void
ohshit(int rvalue, const char* str) {
fprintf(stderr, "%s\n", str);
exit(rvalue);
}
// CHANNELS // CHANNELS
void pubsubd_channels_init (struct channels *chans) { LIST_INIT(chans); } void pubsubd_channels_init (struct channels *chans) { LIST_INIT(chans); }
@ -27,7 +21,7 @@ pubsubd_channels_del (struct channels *chans, struct channel *c)
struct channel *todel = pubsubd_channel_get (chans, c); struct channel *todel = pubsubd_channel_get (chans, c);
if(todel != NULL) { if(todel != NULL) {
LIST_REMOVE(todel, entries); LIST_REMOVE(todel, entries);
srv_process_free (todel); pubsubd_channel_free (todel);
free (todel); free (todel);
todel = NULL; todel = NULL;
} }
@ -41,18 +35,22 @@ struct channel * pubsubd_channel_copy (struct channel *c)
return copy; return copy;
} }
void pubsubd_channel_free (struct channel * c)
{
}
struct channel * pubsubd_channel_get (struct channels *chans, struct channel *c) struct channel * pubsubd_channel_get (struct channels *chans, struct channel *c)
{ {
struct channel * np = NULL; struct channel * np = NULL;
LIST_FOREACH(np, chans, entries) { LIST_FOREACH(np, chans, entries) {
if (pubsubd_channels_eq (np, c)) if (pubsubd_channel_eq (np, c))
return np; return np;
} }
return NULL; return NULL;
} }
int int
pubsubd_channels_eq (const struct channel *c1, const struct channel *c2) pubsubd_channel_eq (const struct channel *c1, const struct channel *c2)
{ {
return (strncmp (c1->chan, c2->chan, c1->chanlen) == 0); return (strncmp (c1->chan, c2->chan, c1->chanlen) == 0);
} }
@ -61,7 +59,7 @@ pubsubd_channels_eq (const struct channel *c1, const struct channel *c2)
void pubsubd_subscriber_init (struct app_list_head *chans) { LIST_INIT(chans); } void pubsubd_subscriber_init (struct app_list_head *chans) { LIST_INIT(chans); }
struct app_list_elm * pubsubd_app_list_elm_copy (struct app_list_elm *ale) struct app_list_elm * pubsubd_app_list_elm_copy (const struct app_list_elm *ale)
{ {
if (ale == NULL) if (ale == NULL)
return NULL; return NULL;
@ -74,8 +72,15 @@ struct app_list_elm * pubsubd_app_list_elm_copy (struct app_list_elm *ale)
return n; return n;
} }
int
pubsubd_subscriber_eq (const struct app_list_elm *ale1, const struct app_list_elm *ale2)
{
return srv_process_eq (ale1->p, ale2->p);
}
void void
pubsubd_subscriber_add (struct app_list_head *alh, struct app_list_elm *ale) pubsubd_subscriber_add (struct app_list_head *alh, const struct app_list_elm *ale)
{ {
if(!alh || !ale) if(!alh || !ale)
return; return;
@ -89,7 +94,7 @@ pubsubd_subscriber_get (const struct app_list_head *chans, const struct app_list
{ {
struct app_list_elm *np, *res = NULL; struct app_list_elm *np, *res = NULL;
LIST_FOREACH(np, chans, entries) { LIST_FOREACH(np, chans, entries) {
if(srv_process_eq (np, p)) { if(pubsubd_subscriber_eq (np, p)) {
res = np; res = np;
} }
} }
@ -119,7 +124,7 @@ void pubsubd_app_list_elm_create (struct app_list_elm *ale, struct process *p)
void pubsubd_app_list_elm_free (struct app_list_elm *todel) void pubsubd_app_list_elm_free (struct app_list_elm *todel)
{ {
if (todel == NULL) if (todel == NULL)
return NULL; return;
srv_process_free (todel->p); srv_process_free (todel->p);
} }
@ -137,10 +142,10 @@ void pubsubd_msg_serialize (const struct pubsub_msg *msg, char **data, size_t *l
size_t i = 0; size_t i = 0;
data[0][i] = msg->type; i++; data[0][i] = msg->type; i++;
memcpy (data[0][i], msg->chanlen, sizeof(size_t)); i += sizeof(size_t); memcpy (&data[0][i], &msg->chanlen, sizeof(size_t)); i += sizeof(size_t);
memcpy (data[0][i], msg->chan, msg->chanlen); i += msg->chanlen; memcpy (&data[0][i], msg->chan, msg->chanlen); i += msg->chanlen;
memcpy (data[0][i], msg->datalen, sizeof(size_t)); i += sizeof(size_t); memcpy (&data[0][i], &msg->datalen, sizeof(size_t)); i += sizeof(size_t);
memcpy (data[0][i], msg->data, msg->datalen); i += msg->datalen; memcpy (&data[0][i], msg->data, msg->datalen); i += msg->datalen;
} }
void pubsubd_msg_unserialize (struct pubsub_msg *msg, const char *data, size_t len) void pubsubd_msg_unserialize (struct pubsub_msg *msg, const char *data, size_t len)
@ -149,7 +154,7 @@ void pubsubd_msg_unserialize (struct pubsub_msg *msg, const char *data, size_t l
return; return;
size_t i = 0; size_t i = 0;
msg->type = data[0][i]; i++; msg->type = data[i]; i++;
memcpy (&msg->chanlen, data + i, sizeof(size_t)); i += sizeof(size_t); memcpy (&msg->chanlen, data + i, sizeof(size_t)); i += sizeof(size_t);
msg->chan = malloc (msg->chanlen); msg->chan = malloc (msg->chanlen);
memcpy (msg->chan, data + i, msg->chanlen); i += msg->chanlen; memcpy (msg->chan, data + i, msg->chanlen); i += msg->chanlen;

View File

@ -33,11 +33,12 @@ LIST_HEAD(channels, channel);
// element of the list // element of the list
struct channel { struct channel {
unsigned char *chan; char *chan;
size_t chanlen; size_t chanlen;
LIST_ENTRY(channel) entries; LIST_ENTRY(channel) entries;
}; };
void pubsubd_channels_init (struct channels *chans);
struct channel * pubsubd_channel_copy (struct channel *c); struct channel * pubsubd_channel_copy (struct channel *c);
struct channel * pubsubd_channel_get (struct channels *chans, struct channel *c); struct channel * pubsubd_channel_get (struct channels *chans, struct channel *c);
@ -55,13 +56,16 @@ struct app_list_elm {
LIST_ENTRY(app_list_elm) entries; LIST_ENTRY(app_list_elm) entries;
}; };
void pubsubd_subscriber_add (const struct app_list_head * int
pubsubd_subscriber_eq (const struct app_list_elm *, const struct app_list_elm *);
void pubsubd_subscriber_add (struct app_list_head *
, const struct app_list_elm *); , const struct app_list_elm *);
struct app_list_elm * pubsubd_subscriber_get (const struct app_list_head * struct app_list_elm * pubsubd_subscriber_get (const struct app_list_head *
, const struct app_list_elm *); , const struct app_list_elm *);
void pubsubd_subscriber_del (struct app_list_head *al, struct app_list_elm *p); void pubsubd_subscriber_del (struct app_list_head *al, struct app_list_elm *p);
struct app_list_elm * pubsubd_app_list_elm_copy (struct app_list_elm *ale); struct app_list_elm * pubsubd_app_list_elm_copy (const struct app_list_elm *ale);
void pubsubd_app_list_elm_create (struct app_list_elm *ale, struct process *p); void pubsubd_app_list_elm_create (struct app_list_elm *ale, struct process *p);
void pubsubd_app_list_elm_free (struct app_list_elm *todel); void pubsubd_app_list_elm_free (struct app_list_elm *todel);

View File

@ -12,10 +12,10 @@ main(int argc, char* argv[])
{ {
struct service srv; struct service srv;
srv_init (&srv, PUBSUB_SERVICE_NAME); srv_init (&srv, PUBSUB_SERVICE_NAME);
printf ("Listening on %s.\n", srv->spath); printf ("Listening on %s.\n", srv.spath);
// creates the service named pipe, that listens to client applications // creates the service named pipe, that listens to client applications
if (service_create (&srv)) if (srv_create (&srv))
ohshit(1, "service_create error"); ohshit(1, "service_create error");
struct channels chans; struct channels chans;
@ -23,45 +23,18 @@ main(int argc, char* argv[])
for (;;) { for (;;) {
struct process proc; struct process proc;
int proc_count, i; srv_get_new_process (&proc, &srv);
process_print (&proc);
service_get_new_process (&proc, &srv);
printf("> %i proc\n", proc_count);
for (i = 0; i < proc_count; i++) {
size_t message_size = BUFSIZ;
char buffer[BUFSIZ];
process_print(proc + i);
if (process_read (&proc[i], &buffer, &message_size))
ohshit(1, "process_read error");
printf(": %s\n", buffer);
}
service_free_processes(&proc, proc_count);
} }
// the application will shut down, and remove the service named pipe // the application will shut down, and remove the service named pipe
if (service_close (s_path)) if (srv_close (&srv))
ohshit(1, "service_close error"); ohshit(1, "service_close error");
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
#if 0
/*
* main loop
*
* opens the application pipes,
* reads then writes the same message,
* then closes the pipes
*/
void main_loop (const struct service *srv) void main_loop (const struct service *srv)
{ {
int ret; int ret;
@ -106,3 +79,4 @@ void main_loop (const struct service *srv)
printf ("\033[32mStill \033[31m%d\033[32m applications to serve\n",cnt); printf ("\033[32mStill \033[31m%d\033[32m applications to serve\n",cnt);
} }
} }
#endif