ina260-zmq-publisher/src/publisher.c
2023-07-15 18:41:58 +02:00

105 lines
No EOL
3 KiB
C

// Weather update server
// Binds PUB socket to tcp://*:5556
// Publishes random weather updates
#include <zmq.h>
#include <assert.h>
#include <time.h>
#include <dirent.h>
#include "utils.h"
// Global:
char *__logdir;
char *__key;
char *__interface;
int __loginterval;
int __port;
void publish(void *publisher, char *filepath, char* client, long int interval);
int main (int argc, char *argv [])
{
if(argc != 6){
printf("Usage: %s <abslogdir> <loginterval> <port> <key> <interface>",argv[0]);
exit(1);
}
//----- Init global variables
__logdir=argv[1];
__loginterval=atoi(argv[2]);
__port=atoi(argv[3]);
__key=argv[4];
__interface=argv[5];
//----- Prepare our context and publisher
void *context = zmq_ctx_new ();
void *publisher = zmq_socket (context, ZMQ_PUB);
char bindto[30];
sprintf(bindto,"tcp://%s:%d",__interface,__port);
int rc = zmq_connect (publisher, bindto);
if(rc!=0){
printf("Failed to bind zmq on %s\n",bindto);
exit(1);
}
//----- Start publisher
struct dirent *de; // Pointer for directory entry
while(1){
int interval=INTERVAL(__loginterval);
int interval_next=INTERVAL_NEXT(__loginterval);
DIR *dr = opendir(__logdir);
while ((de = readdir(dr)) != NULL){
if(strcmp(de->d_name,".") && strcmp(de->d_name,"..")){
char *client=de->d_name;
char logfile[255];
char logfile_next[255];
sprintf(logfile,"%s/%s/%ld",__logdir,client,interval);
sprintf(logfile_next,"%s/%s/%ld",__logdir,client,interval_next);
// As long as next logfile is not available, we should wait
// for sending the current one
printf("Waiting for %s...%s\n",client,logfile_next);
while(!FILE_EXISTS(logfile_next)){
sleep(1);
}
// Send current one
if(FILE_EXISTS(logfile)){
publish(publisher,logfile,client,interval);
//remove(logfile);
}
}
}
closedir(dr);
}
zmq_close (publisher);
zmq_ctx_destroy (context);
return 0;
}
void publish(void *publisher, char *filepath, char* client, long int interval){
printf("Publish!\n");
char buffer[ZMQ_MSG_SIZE];
sprintf(buffer,"%s\n%s\n%s\n%ld\n",ZMQ_TOKEN,__key,client,interval);
int msglen=strlen(buffer);
FILE *fptr;
char * line = NULL;
size_t len = 0;
ssize_t read;
fptr=fopen(filepath,"r");
while ((read = getline(&line, &len, fptr)) != -1) {
if((read+msglen) <ZMQ_MSG_SIZE){
strcat(buffer,line);
msglen+=read;
} else {
zmq_send (publisher, buffer, ZMQ_MSG_SIZE, 0);
sprintf(buffer,"%s\n%s\n%s\n%ld\n",ZMQ_TOKEN,__key,client,interval);
strcat(buffer,line);
msglen=strlen(buffer);
}
}
fclose(fptr);
zmq_send (publisher, buffer, ZMQ_MSG_SIZE, 0);
}