Corretta cattiva riallocazione su linee multiple, iniziato a inserire
[gapil.git] / sources / FortuneServer.c
1 /* FortuneServer.c
2  * 
3  * Copyright (C) 2002 Simone Piccardi
4  * 
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or (at
8  * your option) any later version.
9  * 
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  * 
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */
19 /****************************************************************
20  *
21  * Program fortuned 
22  * Fortune server
23  *
24  * Author: Simone Piccardi
25  * Aug. 2002
26  *
27  * Usage: fortuned -h give all info
28  *
29  * $Id: FortuneServer.c,v 1.2 2002/08/18 14:38:04 piccardi Exp $
30  *
31  ****************************************************************/
32 /* 
33  * Include needed headers
34  */
35 #include <sys/types.h>   /* predefined types */
36 #include <sys/stat.h>    /*  */
37 #include <unistd.h>      /* include unix standard library */
38 #include <stdio.h>       /* include standard I/O library */
39 #include <stdlib.h>      /* standard library */
40 #include <string.h>      /* ANSI C standard string */
41 #include <errno.h>       /* errorstring */
42 #include <fcntl.h>       /*  */
43
44 #include "macros.h"
45
46 /* Subroutines declaration */
47 void usage(void);
48 int FortuneParse(char *file, char **fortune, int n);
49
50 int main(int argc, char *argv[])
51 {
52 /* Variables definition */
53     int i, n = 0;
54     char *fortunefilename = "/usr/share/games/fortunes/kids";
55     char *fifoname = "/tmp/fortune.fifo";
56     char **fortune;
57     char line[80];
58     int fifo_server, fifo_client;
59     int nread;
60     /*
61      * Input section: decode parameters passed in the calling 
62      * Use getopt function
63      */
64     opterr = 0;                              /* don't want writing to stderr */
65     while ( (i = getopt(argc, argv, "hn:f:")) != -1) {
66         switch (i) {
67         /* 
68          * Handling options 
69          */ 
70         case 'h':  
71             printf("Wrong -h option use\n");
72             usage();
73             return(0);
74             break;
75         case 'f':
76             fortunefilename = optarg;
77             break;
78         case 'n':
79             n = strtol(optarg, NULL, 10);
80             fortune = (char **) calloc(sizeof(*fortune), n);
81             break;
82         case '?':                                    /* unrecognized options */
83             printf("Unrecognized options -%c\n",optopt);
84             usage();
85         default:                                       /* should not reached */
86             usage();
87         }
88     }
89     /* ***********************************************************
90      * 
91      *           Options processing completed
92      *
93      *                Main code beginning
94      * 
95      * ***********************************************************/
96     if (n==0) usage();          /* if no pool depth exit printing usage info */
97     i = FortuneParse(fortunefilename, fortune, n);          /* parse phrases */
98     for (n=0; n<i; n++) debug("%s\n\n", fortune[n]);
99     /* 
100      * Comunication section 
101      */
102     if (mkfifo(fifoname, 0622)) {  /* create well known fifo if does't exist */
103         if (errno!=EEXIST) {
104             perror("Cannot create well known fifo");
105             exit(-1);
106         }
107     }
108     /* Main body: loop over requests */
109     while (1) {
110         fifo_server = open(fifoname, O_RDONLY);      /* open well known fifo */
111         if (fifo_server < 0) {
112             perror("Cannot open well known fifo");
113             exit(-1);
114         }
115         nread = read(fifo_server, line, 79);                 /* read request */
116         line[nread] = 0;
117         debug("%s %d\n", line,nread);
118         n = random() % i;                             /* select random value */
119         debug("fortune[%d]=%s\n", n, fortune[n]);
120         fifo_client = open(line, O_WRONLY);              /* open client fifo */
121         nread = write(fifo_client,                           /* write phrase */
122                       fortune[n], strlen(fortune[n])+1);
123         close(fifo_client);                         /* close well known fifo */
124         close(fifo_server);                             /* close client fifo */
125     }
126 }
127 /*
128  * routine to print usage info and exit
129  */
130 void usage(void) {
131     printf("Elementary fortune server\n");
132     printf("Usage:\n");
133     printf("  fortuned [-h] [-f] -n XXX \n");
134     printf("  -h   print this help\n");
135     printf("  -f filename   set file for fortunes\n");
136     printf("  -n XXX        set pool depth\n");
137     exit(1);
138 }