From 498b4857e2a39b251382ff3adc1a92ba0c345016 Mon Sep 17 00:00:00 2001 From: Luka Vandervelden Date: Sat, 28 May 2016 19:34:23 +0200 Subject: [PATCH] pubsub wip --- Makefile | 59 ++++++++++++++++++++++++++++--- project.zsh | 6 ++++ pubsub/list.c | 48 +++++++++++++++++++++++++ pubsub/pubsubd.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 200 insertions(+), 4 deletions(-) create mode 100644 pubsub/list.c create mode 100644 pubsub/pubsubd.c diff --git a/Makefile b/Makefile index 95f6fdc..c42b8dc 100644 --- a/Makefile +++ b/Makefile @@ -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' diff --git a/project.zsh b/project.zsh index 7251764..902b96e 100644 --- a/project.zsh +++ b/project.zsh @@ -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" + diff --git a/pubsub/list.c b/pubsub/list.c new file mode 100644 index 0000000..a6ea98f --- /dev/null +++ b/pubsub/list.c @@ -0,0 +1,48 @@ +#include + +#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); +} + diff --git a/pubsub/pubsubd.c b/pubsub/pubsubd.c new file mode 100644 index 0000000..e278f3e --- /dev/null +++ b/pubsub/pubsubd.c @@ -0,0 +1,91 @@ +#include + +#include + +#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; +} +