Merge pull request #56 from wuruilong01/master
[prads.git] / src / shm-client.c
blobbcb7164c0c22dedcca4dbb347f84e2ab2c32070a
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <signal.h>
6 #include <sys/ipc.h>
7 #include <sys/shm.h>
8 #include <sys/types.h>
9 #include <errno.h>
11 #include "output-plugins/log_ringbuffer.h"
13 int shm_id;
15 // -------
17 void sighandler(int sig)
19 printf("cleaning up\n");
20 if (shmctl(shm_id, IPC_RMID, NULL) == -1)
21 perror("shmctl");
23 exit(0);
26 int init_ringbuffer(struct log_ringbuffer **rb) {
27 key_t key;
28 void *buffer;
30 key = ftok("/etc/prads/prads.conf", 'R');
31 shm_id = shmget(key, sizeof(struct log_ringbuffer), 0644 | 0);
32 if (shm_id == -1) {
33 printf("Could not open ringbuffer. Is prads running?\n");
34 exit(1);
37 buffer = shmat(shm_id, (void *)0, 0);
38 if (buffer == (char*)-1) {
39 perror("shmat");
40 exit(1);
43 *rb = buffer;
45 return 0;
48 int main(int argc, char *argv[])
50 int rc;
51 int tail = 0;
52 struct log_ringbuffer *ringbuffer;
54 if ((rc = init_ringbuffer(&ringbuffer)) != 0) {
55 fprintf(stderr, "Could not initialize ringbuffer\n");
56 return rc;
59 signal(SIGINT, &sighandler);
60 signal(SIGTERM, &sighandler);
61 tail = ringbuffer->head;
63 for(;;) {
64 while (tail != ringbuffer->head) {
65 printf("%s\n", ringbuffer->items[tail].text);
67 tail = (tail == (RINGBUFFER_ITEMS -1)) ? 0 : tail+1;
70 usleep(50000);
73 return rc;