pubsub wip

more_to_read
Luka Vandervelden 2016-05-28 19:34:23 +02:00
parent 99cd9b22de
commit 498b4857e2
4 changed files with 200 additions and 4 deletions

View File

@ -15,7 +15,7 @@ LDFLAGS :=
Q := @
all: libposj init-connection open-read-close-fifo open-write-close-fifo service-test
all: libposj init-connection open-read-close-fifo open-write-close-fifo service-test pubsub/pubsubd
libposj: libposj.so libposj.a
@:
@ -93,6 +93,23 @@ service-test.uninstall:
@echo ' [RM] $(BINDIR)/service-test'
$(Q)rm -f '$(DESTDIR)$(BINDIR)/service-test'
pubsub/pubsubd: pubsub/list.o pubsub/pubsubd.o
@echo ' [LD] pubsub/pubsubd'
$(Q)$(CC) -o pubsub/pubsubd $(LDFLAGS) pubsub/list.o pubsub/pubsubd.o libposj.a
pubsub/pubsubd.install: pubsub/pubsubd
@echo ' [IN] $(BINDIR)/pubsubd'
$(Q)mkdir -p '$(DESTDIR)$(BINDIR)'
$(Q)install -m0755 pubsub/pubsubd $(DESTDIR)$(BINDIR)/pubsubd
pubsub/pubsubd.clean: pubsub/list.o.clean pubsub/pubsubd.o.clean
@echo ' [RM] pubsub/pubsubd'
$(Q)rm -f pubsub/pubsubd
pubsub/pubsubd.uninstall:
@echo ' [RM] $(BINDIR)/pubsubd'
$(Q)rm -f '$(DESTDIR)$(BINDIR)/pubsubd'
libposj.so: lib/communication.o
@echo ' [LD] libposj.so'
$(Q)$(CC) -o libposj.so -shared $(LDFLAGS) lib/communication.o
@ -199,6 +216,30 @@ service-test.o.clean:
service-test.o.uninstall:
pubsub/list.o: pubsub/list.c pubsub/list.h
@echo ' [CC] pubsub/list.o'
$(Q)$(CC) $(CFLAGS) -I lib -c pubsub/list.c -I lib -o pubsub/list.o
pubsub/list.o.install:
pubsub/list.o.clean:
@echo ' [RM] pubsub/list.o'
$(Q)rm -f pubsub/list.o
pubsub/list.o.uninstall:
pubsub/pubsubd.o: pubsub/pubsubd.c
@echo ' [CC] pubsub/pubsubd.o'
$(Q)$(CC) $(CFLAGS) -I lib -c pubsub/pubsubd.c -I lib -o pubsub/pubsubd.o
pubsub/pubsubd.o.install:
pubsub/pubsubd.o.clean:
@echo ' [RM] pubsub/pubsubd.o'
$(Q)rm -f pubsub/pubsubd.o
pubsub/pubsubd.o.uninstall:
$(DESTDIR)$(PREFIX):
@echo ' [DIR] $(PREFIX)'
$(Q)mkdir -p $(DESTDIR)$(PREFIX)
@ -214,12 +255,12 @@ $(DESTDIR)$(SHAREDIR):
$(DESTDIR)$(INCLUDEDIR):
@echo ' [DIR] $(INCLUDEDIR)'
$(Q)mkdir -p $(DESTDIR)$(INCLUDEDIR)
install: subdirs.install libposj.install init-connection.install open-read-close-fifo.install open-write-close-fifo.install service-test.install libposj.so.install libposj.a.install init-connection.o.install lib/communication.o.install open-read-close-fifo.o.install lib/communication.o.install open-write-close-fifo.o.install lib/communication.o.install service-test.o.install lib/communication.o.install lib/communication.o.install lib/communication.o.install
install: subdirs.install libposj.install init-connection.install open-read-close-fifo.install open-write-close-fifo.install service-test.install pubsub/pubsubd.install libposj.so.install libposj.a.install init-connection.o.install lib/communication.o.install open-read-close-fifo.o.install lib/communication.o.install open-write-close-fifo.o.install lib/communication.o.install service-test.o.install lib/communication.o.install pubsub/list.o.install pubsub/pubsubd.o.install lib/communication.o.install lib/communication.o.install
@:
subdirs.install:
uninstall: subdirs.uninstall libposj.uninstall init-connection.uninstall open-read-close-fifo.uninstall open-write-close-fifo.uninstall service-test.uninstall libposj.so.uninstall libposj.a.uninstall init-connection.o.uninstall lib/communication.o.uninstall open-read-close-fifo.o.uninstall lib/communication.o.uninstall open-write-close-fifo.o.uninstall lib/communication.o.uninstall service-test.o.uninstall lib/communication.o.uninstall lib/communication.o.uninstall lib/communication.o.uninstall
uninstall: subdirs.uninstall libposj.uninstall init-connection.uninstall open-read-close-fifo.uninstall open-write-close-fifo.uninstall service-test.uninstall pubsub/pubsubd.uninstall libposj.so.uninstall libposj.a.uninstall init-connection.o.uninstall lib/communication.o.uninstall open-read-close-fifo.o.uninstall lib/communication.o.uninstall open-write-close-fifo.o.uninstall lib/communication.o.uninstall service-test.o.uninstall lib/communication.o.uninstall pubsub/list.o.uninstall pubsub/pubsubd.o.uninstall lib/communication.o.uninstall lib/communication.o.uninstall
@:
subdirs.uninstall:
@ -229,7 +270,7 @@ test: all subdirs subdirs.test
subdirs.test:
clean: libposj.clean init-connection.clean open-read-close-fifo.clean open-write-close-fifo.clean service-test.clean libposj.so.clean libposj.a.clean init-connection.o.clean lib/communication.o.clean open-read-close-fifo.o.clean lib/communication.o.clean open-write-close-fifo.o.clean lib/communication.o.clean service-test.o.clean lib/communication.o.clean lib/communication.o.clean lib/communication.o.clean
clean: libposj.clean init-connection.clean open-read-close-fifo.clean open-write-close-fifo.clean service-test.clean pubsub/pubsubd.clean libposj.so.clean libposj.a.clean init-connection.o.clean lib/communication.o.clean open-read-close-fifo.o.clean lib/communication.o.clean open-write-close-fifo.o.clean lib/communication.o.clean service-test.o.clean lib/communication.o.clean pubsub/list.o.clean pubsub/pubsubd.o.clean lib/communication.o.clean lib/communication.o.clean
distclean: clean
@ -245,11 +286,14 @@ $(PACKAGE)-$(VERSION).tar.gz: distdir
@echo ' [TAR] $(PACKAGE)-$(VERSION).tar.gz'
$(Q)tar czf $(PACKAGE)-$(VERSION).tar.gz \
$(PACKAGE)-$(VERSION)/init-connection.c \
$(PACKAGE)-$(VERSION)/pubsub/list.c \
$(PACKAGE)-$(VERSION)/pubsub/pubsubd.c \
$(PACKAGE)-$(VERSION)/service-test.c \
$(PACKAGE)-$(VERSION)/open-write-close-fifo.c \
$(PACKAGE)-$(VERSION)/open-read-close-fifo.c \
$(PACKAGE)-$(VERSION)/lib/communication.c \
$(PACKAGE)-$(VERSION)/libposj.a \
$(PACKAGE)-$(VERSION)/pubsub/list.h \
$(PACKAGE)-$(VERSION)/lib/communication.h
dist-xz: $(PACKAGE)-$(VERSION).tar.xz
@ -257,11 +301,14 @@ $(PACKAGE)-$(VERSION).tar.xz: distdir
@echo ' [TAR] $(PACKAGE)-$(VERSION).tar.xz'
$(Q)tar cJf $(PACKAGE)-$(VERSION).tar.xz \
$(PACKAGE)-$(VERSION)/init-connection.c \
$(PACKAGE)-$(VERSION)/pubsub/list.c \
$(PACKAGE)-$(VERSION)/pubsub/pubsubd.c \
$(PACKAGE)-$(VERSION)/service-test.c \
$(PACKAGE)-$(VERSION)/open-write-close-fifo.c \
$(PACKAGE)-$(VERSION)/open-read-close-fifo.c \
$(PACKAGE)-$(VERSION)/lib/communication.c \
$(PACKAGE)-$(VERSION)/libposj.a \
$(PACKAGE)-$(VERSION)/pubsub/list.h \
$(PACKAGE)-$(VERSION)/lib/communication.h
dist-bz2: $(PACKAGE)-$(VERSION).tar.bz2
@ -269,11 +316,14 @@ $(PACKAGE)-$(VERSION).tar.bz2: distdir
@echo ' [TAR] $(PACKAGE)-$(VERSION).tar.bz2'
$(Q)tar cjf $(PACKAGE)-$(VERSION).tar.bz2 \
$(PACKAGE)-$(VERSION)/init-connection.c \
$(PACKAGE)-$(VERSION)/pubsub/list.c \
$(PACKAGE)-$(VERSION)/pubsub/pubsubd.c \
$(PACKAGE)-$(VERSION)/service-test.c \
$(PACKAGE)-$(VERSION)/open-write-close-fifo.c \
$(PACKAGE)-$(VERSION)/open-read-close-fifo.c \
$(PACKAGE)-$(VERSION)/lib/communication.c \
$(PACKAGE)-$(VERSION)/libposj.a \
$(PACKAGE)-$(VERSION)/pubsub/list.h \
$(PACKAGE)-$(VERSION)/lib/communication.h
help:
@ -304,6 +354,7 @@ help:
@echo ' - open-read-close-fifobinary'
@echo ' - open-write-close-fifobinary'
@echo ' - service-test binary'
@echo ' - pubsub/pubsubdbinary'
@echo ''
@echo 'Makefile options:'
@echo ' - gnu: true'

View File

@ -16,3 +16,9 @@ for i in *.c; do
ldflags[${i%.c}]="libposj.a"
done
targets+=(pubsub/pubsubd)
type[pubsub/pubsubd]=binary
sources[pubsub/pubsubd]="pubsub/list.c pubsub/pubsubd.c"
cflags[pubsub/pubsubd]="-I lib"
ldflags[pubsub/pubsubd]="libposj.a"

48
pubsub/list.c Normal file
View File

@ -0,0 +1,48 @@
#include <stdlib.h>
#include "list.h"
List*
list_new(size_t element_size)
{
List* l = malloc(sizeof(*l));
l->element_size = element_size;
l->head = NULL;
l->tail = NULL;
l->length = 0;
return l;
}
void*
list_append(List* l)
{
struct link* link = malloc(sizeof(*link) + l->element_size);
link->next = l->tail;
l->tail = link;
if (!l->head)
l->tail = link;
l->length++;
return (void*) link->value;
}
void
list_free(List* l)
{
struct link* next;
struct link* link;
for (link = l->head; link; link = next) {
next = link->next;
free(link);
}
free(l);
}

91
pubsub/pubsubd.c Normal file
View File

@ -0,0 +1,91 @@
#include <stdlib.h>
#include <communication.h>
#include "list.h"
typedef struct {
int test;
} Publisher;
typedef struct {
int test;
} Subscriber;
const char* service_name = "pubsub";
void
ohshit(int rvalue, const char* str) {
fprintf(stderr, "%s\n", str);
exit(rvalue);
}
int
main(int argc, char* argv[])
{
List* subscribers;
List* publishers;
int r;
char s_path[PATH_MAX];
int s_pipe;
(void) argc;
(void) argv;
service_path(s_path, service_name);
printf("Listening on %s.\n", s_path);
if ((r = service_create(s_path)))
ohshit(1, "service_create error");
publishers = list_new(sizeof(Publisher));
subscribers = list_new(sizeof(Subscriber));
if (!publishers && !subscribers)
ohshit(1, "out of memory, already...");
/* ?!?!?!?!? */
mkfifo(s_path, S_IRUSR);
s_pipe = open(s_path, S_IRUSR);
for (;;) {
struct process* proc;
int proc_count, i;
service_get_new_processes(&proc, &proc_count, s_pipe);
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 ((r = process_read(&proc[i], &buffer, &message_size))) {
ohshit(1, "process_read error");
}
printf(": %s\n", buffer);
}
service_free_processes(&proc, proc_count);
break;
}
close(s_pipe);
list_free(publishers);
list_free(subscribers);
service_close(s_path);
return 0;
}