diff --git a/clients/c/Makefile b/clients/c/Makefile index 3d8522f..1d11246 100644 --- a/clients/c/Makefile +++ b/clients/c/Makefile @@ -1,13 +1,25 @@ CC ?= gcc -CFLAGS ?= -Wall -Werror -I/usr/local/include -fpic -LDFLAGS ?= -Wall -L/usr/local/lib -L. +CFLAGS ?= -Wall -Werror -I/usr/local/include -fpic -O +LDFLAGS ?= -Wall -L/usr/local/lib -L. -O LIBS ?= -lcurl -ljansson +all: libcosmopolite.so + test: test.o libcosmopolite.so $(CC) $(LDFLAGS) -o test test.o -lcosmopolite $(LIBS) + ./test libcosmopolite.so: cosmopolite.o $(CC) -shared $(LDFLAGS) -o libcosmopolite.so cosmopolite.o $(LIBS) -%.o: %.c +%.o: %.c *.h $(CC) -c $(CFLAGS) $< -o $@ + +install: libcosmopolite.so cosmopolite.h + cp libcosmopolite.so /usr/local/lib + cp cosmopolite.h /usr/local/include + chown root /usr/local/lib/libcosmopolite.so /usr/local/include/cosmopolite.h + chmod 0644 /usr/local/lib/libcosmopolite.so /usr/local/include/cosmopolite.h + +clean: + rm -f test libcosmopolite.so *.o diff --git a/clients/c/cosmopolite.c b/clients/c/cosmopolite.c index 5b9850d..b9739a0 100644 --- a/clients/c/cosmopolite.c +++ b/clients/c/cosmopolite.c @@ -180,7 +180,7 @@ static void cosmo_handle_message(cosmo *instance, json_t *event) { assert(!pthread_mutex_unlock(&instance->lock)); if (instance->callbacks.message) { - instance->callbacks.message(event); + instance->callbacks.message(event, instance->passthrough); } } @@ -435,7 +435,7 @@ json_t *cosmo_get_last_message(cosmo *instance, json_t *subject) { return ret; } -cosmo *cosmo_create(const char *base_url, const char *client_id, const cosmo_callbacks *callbacks) { +cosmo *cosmo_create(const char *base_url, const char *client_id, const cosmo_callbacks *callbacks, void *passthrough) { curl_global_init(CURL_GLOBAL_DEFAULT); srandomdev(); @@ -446,6 +446,7 @@ cosmo *cosmo_create(const char *base_url, const char *client_id, const cosmo_cal cosmo_uuid(instance->instance_id); memcpy(&instance->callbacks, callbacks, sizeof(instance->callbacks)); + instance->passthrough = passthrough; assert(!pthread_mutex_init(&instance->lock, NULL)); assert(!pthread_cond_init(&instance->cond, NULL)); diff --git a/clients/c/cosmopolite.h b/clients/c/cosmopolite.h index 5086089..5d1c830 100644 --- a/clients/c/cosmopolite.h +++ b/clients/c/cosmopolite.h @@ -9,13 +9,14 @@ #define COSMO_UUID_SIZE 37 typedef struct { - void (*message)(const json_t *); + void (*message)(const json_t *, void *); } cosmo_callbacks; typedef struct { char client_id[COSMO_UUID_SIZE]; char instance_id[COSMO_UUID_SIZE]; cosmo_callbacks callbacks; + void *passthrough; pthread_mutex_t lock; pthread_cond_t cond; @@ -31,7 +32,7 @@ typedef struct { void cosmo_uuid(char *uuid); -cosmo *cosmo_create(const char *base_url, const char *client_id, const cosmo_callbacks *callbacks); +cosmo *cosmo_create(const char *base_url, const char *client_id, const cosmo_callbacks *callbacks, void *passthrough); void cosmo_shutdown(cosmo *instance); const char *cosmo_current_profile(cosmo *instance); diff --git a/clients/c/test.c b/clients/c/test.c index ca40b08..8ba3405 100644 --- a/clients/c/test.c +++ b/clients/c/test.c @@ -2,7 +2,7 @@ #include "cosmopolite.h" -void on_message(const json_t *message) { +void on_message(const json_t *message, void *passthrough) { printf("new message: %lld\n", json_integer_value(json_object_get(message, "id"))); } @@ -14,7 +14,7 @@ int main(int argc, char *argv[]) { .message = on_message }; - cosmo *instance = cosmo_create("https://playground.cosmopolite.org/cosmopolite", client_id, &callbacks); + cosmo *instance = cosmo_create("https://playground.cosmopolite.org/cosmopolite", client_id, &callbacks, NULL); json_t *subject = cosmo_subject("foobar", NULL, NULL); cosmo_subscribe(instance, subject, -1, 0); json_decref(subject);