]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/filed/filed.c
Fix DATE problem and minor compile stuff
[bacula/bacula] / bacula / src / filed / filed.c
1 /*
2  *  Bacula File Daemon
3  *
4  *    Kern Sibbald, March MM
5  *
6  *   Version $Id$
7  *
8  */
9 /*
10    Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
11
12    This program is free software; you can redistribute it and/or
13    modify it under the terms of the GNU General Public License as
14    published by the Free Software Foundation; either version 2 of
15    the License, or (at your option) any later version.
16
17    This program is distributed in the hope that it will be useful,
18    but WITHOUT ANY WARRANTY; without even the implied warranty of
19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20    General Public License for more details.
21
22    You should have received a copy of the GNU General Public
23    License along with this program; if not, write to the Free
24    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
25    MA 02111-1307, USA.
26
27  */
28
29 #include "bacula.h"
30 #include "filed.h"
31
32 /* Imported Functions */
33 extern void handle_client_request(void *dir_sock);
34
35 /* Forward referenced functions */
36 void terminate_filed(int sig);
37
38 /* Exported variables */
39
40
41 #ifdef HAVE_CYGWIN
42 int win32_client = 1;
43 #else
44 int win32_client = 0;
45 #endif
46
47
48 #define CONFIG_FILE "./bacula-fd.conf" /* default config file */
49
50 static char *configfile = NULL;
51 static int foreground = 0;
52 static int inetd_request = 0;
53 static workq_t dir_workq;             /* queue of work from Director */
54
55 CLIENT *me;                           /* my resource */
56
57 static void usage()
58 {
59    fprintf(stderr, _(
60 "\nVersion: " VERSION " (" BDATE ")\n\n"
61 "Usage: filed [-f -s] [-c config_file] [-d debug_level] [config_file]\n"  
62 "        -c <file>   use <file> as configuration file\n"
63 "        -dnn        set debug level to nn\n"
64 "        -f          run in foreground (for debugging)\n"
65 "        -i          inetd request\n"
66 "        -s          no signals (for debugging)\n"
67 "        -t          test configuration file and exit\n"
68 "        -?          print this message.\n"
69 "\n"));         
70    exit(1);
71 }
72
73
74 /********************************************************************* 
75  *
76  *  Main Bacula Unix Client Program                        
77  *
78  */
79 #ifdef HAVE_CYGWIN
80 #define main BaculaMain
81 #endif
82 int main (int argc, char *argv[])
83 {
84    int ch;
85    int no_signals = FALSE;
86    int test_config = FALSE;
87    DIRRES *director;
88
89    init_stack_dump();
90    my_name_is(argc, argv, "filed");
91    init_msg(NULL, NULL);
92    daemon_start_time = time(NULL);
93
94    memset(&last_job, 0, sizeof(last_job));
95
96    while ((ch = getopt(argc, argv, "c:d:fist?")) != -1) {
97       switch (ch) {
98          case 'c':                    /* configuration file */
99             if (configfile != NULL) {
100                free(configfile);
101             }
102             configfile = bstrdup(optarg);
103             break;
104
105          case 'd':                    /* debug level */
106             debug_level = atoi(optarg);
107             if (debug_level <= 0) {
108                debug_level = 1; 
109             }
110             break;
111
112          case 'f':                    /* run in foreground */
113             foreground = TRUE;
114             break;
115
116          case 'i':
117             inetd_request = TRUE;
118             break;
119          case 's':
120             no_signals = TRUE;
121             break;
122
123          case 't':
124             test_config = TRUE;
125             break;
126
127          case '?':
128          default:
129             usage();
130
131       }  
132    }
133    argc -= optind;
134    argv += optind;
135
136    if (argc) {
137       if (configfile != NULL)
138          free(configfile);
139       configfile = bstrdup(*argv);
140       argc--; 
141       argv++;
142    }
143    if (argc) {
144       usage();
145    }
146
147    if (!no_signals) {
148       init_signals(terminate_filed);
149    }
150
151    if (configfile == NULL) {
152       configfile = bstrdup(CONFIG_FILE);
153    }
154
155    parse_config(configfile);
156
157    LockRes();
158    director = (DIRRES *)GetNextRes(R_DIRECTOR, NULL);
159    UnlockRes();
160    if (!director) {
161       Emsg1(M_ABORT, 0, _("No Director resource defined in %s\n"),
162          configfile);
163    }
164
165    LockRes();
166    me = (CLIENT *)GetNextRes(R_CLIENT, NULL);
167    UnlockRes();
168    if (!me) {
169       Emsg1(M_ABORT, 0, _("No File daemon resource defined in %s\n\
170 Without that I don't know who I am :-(\n"), configfile);
171    } else {
172       my_name_is(0, NULL, me->hdr.name);
173       if (!me->messages) {
174          LockRes();
175          me->messages = (MSGS *)GetNextRes(R_MSGS, NULL);
176          UnlockRes();
177          if (!me->messages) {
178              Emsg1(M_ABORT, 0, _("No Messages resource defined in %s\n"), configfile);
179          }
180       }
181       close_msg(NULL);                /* close temp message handler */
182       init_msg(NULL, me->messages);   /* open user specified message handler */
183    }
184    working_directory = me->working_directory;
185
186    if (test_config) {
187       terminate_filed(0);
188    }
189
190    if (!foreground &&!inetd_request) {
191       daemon_start();
192       init_stack_dump();              /* set new pid */
193    }
194
195    /* Maximum 1 daemon at a time */
196    create_pid_file(me->pid_directory, "bacula-fd", me->FDport);
197
198 #ifdef BOMB
199    me += 1000000;
200 #endif
201
202    set_thread_concurrency(10);
203
204    start_watchdog();                  /* start watchdog thread */
205
206    if (inetd_request) {
207       /* Socket is on fd 0 */          
208       BSOCK *bs = init_bsock(NULL, 0, "client", "unknown client", me->FDport);
209       handle_client_request((void *)bs);
210    } else {
211       /* Become server, and handle requests */
212       Dmsg1(10, "filed: listening on port %d\n", me->FDport);
213       bnet_thread_server(me->FDaddr, me->FDport, me->MaxConcurrentJobs, 
214                       &dir_workq, handle_client_request);
215    }
216
217    term_msg();
218    exit(0);                           /* should never get here */
219 }
220
221 void terminate_filed(int sig)
222 {
223    stop_watchdog();
224
225    if (configfile != NULL) {
226       free(configfile);
227    }
228    if (debug_level > 5) {
229       print_memory_pool_stats(); 
230    }
231    delete_pid_file(me->pid_directory, "bacula-fd", me->FDport);
232    free_config_resources();
233    term_msg();
234    close_memory_pool();               /* release free memory in pool */
235    sm_dump(False);                    /* dump orphaned buffers */
236    exit(1);
237 }