lack the program core, most util functions here

more_to_read
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 <stdlib.h>
void
ohshit(int rvalue, const char* str) {
fprintf(stderr, "%s\n", str);
exit(rvalue);
}
// CHANNELS
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);
if(todel != NULL) {
LIST_REMOVE(todel, entries);
srv_process_free (todel);
pubsubd_channel_free (todel);
free (todel);
todel = NULL;
}
@ -41,18 +35,22 @@ struct channel * pubsubd_channel_copy (struct channel *c)
return copy;
}
void pubsubd_channel_free (struct channel * c)
{
}
struct channel * pubsubd_channel_get (struct channels *chans, struct channel *c)
{
struct channel * np = NULL;
LIST_FOREACH(np, chans, entries) {
if (pubsubd_channels_eq (np, c))
if (pubsubd_channel_eq (np, c))
return np;
}
return NULL;
}
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);
}
@ -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); }
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)
return NULL;
@ -74,8 +72,15 @@ struct app_list_elm * pubsubd_app_list_elm_copy (struct app_list_elm *ale)
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
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)
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;
LIST_FOREACH(np, chans, entries) {
if(srv_process_eq (np, p)) {
if(pubsubd_subscriber_eq (np, p)) {
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)
{
if (todel == NULL)
return NULL;
return;
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;
data[0][i] = msg->type; i++;
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->datalen, sizeof(size_t)); i += sizeof(size_t);
memcpy (data[0][i], msg->data, msg->datalen); i += msg->datalen;
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->datalen, sizeof(size_t)); i += sizeof(size_t);
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)
@ -149,7 +154,7 @@ void pubsubd_msg_unserialize (struct pubsub_msg *msg, const char *data, size_t l
return;
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);
msg->chan = malloc (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
struct channel {
unsigned char *chan;
char *chan;
size_t chanlen;
LIST_ENTRY(channel) entries;
};
void pubsubd_channels_init (struct channels *chans);
struct channel * pubsubd_channel_copy (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;
};
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 *);
struct app_list_elm * pubsubd_subscriber_get (const struct app_list_head *
, const struct app_list_elm *);
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_free (struct app_list_elm *todel);

View File

@ -12,10 +12,10 @@ main(int argc, char* argv[])
{
struct service srv;
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
if (service_create (&srv))
if (srv_create (&srv))
ohshit(1, "service_create error");
struct channels chans;
@ -23,45 +23,18 @@ main(int argc, char* argv[])
for (;;) {
struct process proc;
int proc_count, i;
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);
srv_get_new_process (&proc, &srv);
process_print (&proc);
}
// 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");
return EXIT_SUCCESS;
}
/*
* main loop
*
* opens the application pipes,
* reads then writes the same message,
* then closes the pipes
*/
#if 0
void main_loop (const struct service *srv)
{
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);
}
}
#endif