Initial commit (sort of)
[matches/swarm.git] / src / daemon.c
1 #include "daemon.h"
2 #include "options.h"
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <unistd.h>
6 #include <sys/types.h>
7 #include <sys/stat.h>
8 #include <errno.h>
9 #include <string.h>
10 #include <sys/socket.h>
11 #include <sys/un.h>
12 #include <sys/types.h>
13 #include <sys/stat.h>
14 #include <fcntl.h>
15 #include <errno.h>
16
17 void Daemon_wrapper(Options * o)
18 {
19         int bufsiz = BUFSIZ;
20         int buflen = 0;
21         char * buffer = NULL;
22
23         bool fill_buffer = false;
24
25         char c; char last_c = '\n';
26         int fd = open(DAEMON_FIFO, O_WRONLY);
27         while (read(fileno(stdin), &c, sizeof(char)) != 0)
28         {
29                 if (fill_buffer)
30                 {
31                         buffer[buflen++] = c;
32                         if (c == '\n')
33                         {
34                                 
35                                 //fprintf(stderr, "Buffer is %s", buffer);
36                                 if (write(fd, buffer, buflen*sizeof(char)) <= 0)
37                                         error("Daemon_wrapper", "Couldn't write to daemon fifo %s", DAEMON_FIFO);
38         
39                                 if (strcmp(buffer, "#BARRIER BLOCK#\n") == 0)
40                                 {
41                                         //fprintf(stderr, "Barrier block received");
42                                         FILE * f = fopen(DAEMON_BARRIER_FIFO, "r");
43                                         if (f == NULL)
44                                                 error("Daemon_wrapper", "Couldn't open daemon barrier fifo %s", DAEMON_BARRIER_FIFO);
45                                         for (int i = 0; ; ++i)
46                                         {
47                                                 int c = fgetc(f);
48                                                 if (c == EOF)
49                                                 {
50                                                         buffer[i] = '\0';
51                                                         break;
52                                                 }
53                         
54                                                 buffer[i] = (char)c;                                            
55                                         }
56                                         fclose(f);
57                                         if (strcmp(buffer, "\a") != 0)
58                                                 error("Daemon_wrapper", "Expected to read a single bell from %s; got %s", DAEMON_BARRIER_FIFO, buffer);
59                                 }
60                                 else if (strcmp(buffer, "#EXIT#\n") == 0)
61                                 {
62                                         free(buffer);
63                                         exit(EXIT_SUCCESS);
64                                 }
65                                 
66                                 buflen = 0;
67                                 fill_buffer = NULL;
68                         }
69                         if (buflen >= bufsiz)
70                         {
71                                 bufsiz *= 2;
72                                 buffer = (char*)(realloc(buffer, bufsiz*sizeof(char)));
73                                 if (buffer == NULL)
74                                         error("Daemon_wrapper", "Couldn't resize buffer to size %d : %s", bufsiz, strerror(errno));
75                                         
76                         }
77                         last_c = c;
78                         continue;
79                 }
80
81                 if (c == '#' && last_c == '\n')
82                 {
83                         fill_buffer = true;
84                         if (buffer == NULL)
85                                 buffer = (char*)(calloc(bufsiz, sizeof(char)));
86                         if (buffer == NULL)
87                                 error("Daemon_wrapper", "Couldn't allocate buffer of size %d : %s", bufsiz, strerror(errno));
88
89                         buflen = 0;
90                         buffer[buflen++] = c;
91                 }
92                 else
93                         write(fd, &c, sizeof(char));
94                 
95                 last_c = c;
96         }
97         
98         if (fill_buffer)
99         {
100                 buffer[buflen++] = '\n';
101                 if (write(fd, buffer, buflen*sizeof(char)) <= 0)
102                         error("Daemon_wrapper", "Couldn't write to daemon fifo %s (final write)", DAEMON_FIFO);
103         }
104         else
105         {
106                 c = '\n';
107                 if (write(fd, &c, sizeof(char)) <= 0)
108                         error("Daemon_wrapper", "Couldn't write to daemon fifo %s (final write)", DAEMON_FIFO);
109         }
110
111         if (buffer != NULL)
112                 free(buffer);
113         exit(EXIT_SUCCESS);
114 }

UCC git Repository :: git.ucc.asn.au