2
* binkd.c -- binkd's main
4
* binkd.c is a part of binkd project
6
* Copyright (C) 1996-1998 Dima Maloff, 5047/13
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published by
10
* the Free Software Foundation; either version 2 of the License, or
11
* (at your option) any later version. See COPYING.
15
* $Id: binkd.c,v 2.1 2001/01/15 22:04:52 gul Exp $
18
* Revision 2.1 2001/01/15 22:04:52 gul
19
* Added -D switch (run as daemon)
21
* Revision 2.0 2001/01/10 12:12:37 gul
22
* Binkd is under CVS again
25
* nsoveiko@doe.carleton.ca 1998/12/14
26
* creation of pid_file is now logged and warnings produced
28
* Revision 1.15 1998/05/08 03:35:47 mff
29
* Added -P switch, brushed up error msgs
31
* Revision 1.14 1997/11/03 06:10:39 mff
34
* Revision 1.13 1997/10/23 04:20:53 mff
37
* Revision 1.12 1997/06/16 05:52:07 mff
38
* Added -C, copyright note
40
* Revision 1.10 1997/05/17 08:44:42 mff
41
* Changed cmd line processing a bit
43
* Revision 1.9 1997/03/09 07:16:31 mff
44
* Added command line parsing, support for inetd
46
* Revision 1.8 1997/02/07 06:42:59 mff
47
* Under UNIXs SIGHUP forces binkd to restart
49
* Revision 1.7 1997/02/01 05:55:24 mff
50
* Changed SIGCHLD support
52
* Revision 1.5 1996/12/14 07:00:32 mff
53
* Now we use branch() and set_break_handlers()
55
* Revision 1.3 1996/12/07 12:26:37 mff
56
* SOCKS support by msh
58
* Revision 1.1.1 1996/12/02 18:26:00 ufm
68
#if defined(__IBMC__) || defined(__MSC__)
85
#include "daemonize.h"
89
#include "nt/service.h"
107
int pidcmgr = 0; /* pid for clientmgr */
108
int pidsmgr = 0; /* pid for server */
109
SOCKET inetd_socket = 0;
112
static void chld (int signo)
114
#include "reapchld.inc"
118
#if defined(UNIX) || defined(AMIGA) || (defined(OS2) && defined(HAVE_FORK))
120
static void hup (int signo)
122
Log (2, "got SIGHUP");
131
switch(checkservice())
133
case 1: s="i\0 -i install WindowsNT service\n"; break;
134
case 2: s="u\0 -u UNinstall WindowsNT service\n"; break;
138
printf ("usage: binkd [-Cc"
139
#if defined(HAVE_DAEMON) || defined(HAVE_SETSID) || defined(HAVE_TIOCNOTTY)
142
#if defined(UNIX) || defined(OS2) || defined(AMIGA)
147
"pqsv] [-Pnode] config"
152
#if defined(HAVE_DAEMON) || defined(HAVE_SETSID) || defined(HAVE_TIOCNOTTY)
153
" -D run as daemon\n"
155
" -C exit(3) on config change\n"
156
" -c run client only\n"
157
#if defined(UNIX) || defined(OS2) || defined(AMIGA)
158
" -i run from inetd\n"
162
" -P node poll a node\n"
163
" -p run client only, poll, quit\n"
165
" -s run server only\n"
166
" -v be verbose / dump version and quit\n"
167
" -m disable CRAM-MD5 authorization\n"
169
"Copyright (c) 1996-2000 Dima Maloff and others.\n"
171
"This program is free software; you can redistribute it and/or modify\n"
172
"it under the terms of the GNU General Public License as published by\n"
173
"the Free Software Foundation. See COPYING.\n"
175
"Report bugs to 2:463/68 or binkd-bugs@happy.kiev.ua.\n"
183
/* Command line flags */
184
int inetd_flag = 0; /* Run from inetd (-i) */
185
#if defined(HAVE_DAEMON) || defined(HAVE_SETSID) || defined(HAVE_TIOCNOTTY)
186
int daemon_flag = 0; /* Run as daemon (-D) */
188
int server_flag = 0; /* Run servermgr (-s) */
189
int client_flag = 0; /* Run clientmgr (-c) */
190
int poll_flag = 0; /* Run clientmgr, make all jobs, quit
192
int quiet_flag = 0; /* Be quiet (-q) */
193
int verbose_flag = 0; /* Be verbose / print version (-v) */
194
int checkcfg_flag = 0; /* exit(3) on config change (-C) */
195
int no_MD5 = 0; /* disable MD5 flag (-m) */
199
int main (int argc, char *argv[], char *envp[])
203
/* Config file name */
206
#if defined(HAVE_DAEMON) || defined(HAVE_SETSID) || defined(HAVE_TIOCNOTTY)
210
#if defined(__IBMC__) || defined(__MSC__)
215
service(argc, argv, envp);
217
/* save argv as setproctitle() under some systems will change it */
218
saved_argv = mkargv (argc, argv);
220
for (i = 1; i < argc; ++i)
222
if (argv[i][0] == '-')
224
char *s = argv[i] + 1;
231
/* GNU-style options */
232
if (!strcmp (s + 1, "help"))
235
Log (0, "%s: --%s: unknown command line switch", argv[0], s + 1);
242
#if defined(UNIX) || defined(OS2) || defined(AMIGA)
252
Log (0, "%s: -P: missing requred argument", argv[0]);
256
poll_flag = client_flag = 1;
270
#if defined(HAVE_DAEMON) || defined(HAVE_SETSID) || defined(HAVE_TIOCNOTTY)
273
/* remove this switch from saved_argv */
276
for (j=i; j<argc; j++)
277
saved_argv[j]=saved_argv[j+1];
282
Log (0, "%s: -%c: unknown command line switch", argv[0], *s);
297
if (poll_flag && server_flag)
298
Log (0, "-p and -s cannot be used together");
300
/* No command line options: run both client and server */
301
if (!client_flag && !server_flag)
302
client_flag = server_flag = 1;
304
#if defined(UNIX) || defined(OS2) || defined(AMIGA)
309
if ((inetd_socket = atoi (argv[argc - 1])) == 0)
310
Log (0, "%s: bad socket number", argv[argc - 1]);
313
if ((inetd_socket = _impsockhandle (inetd_socket, 0)) == -1)
314
Log (0, "_impsockhandle: %s", strerror (errno));
319
if (verbose_flag >= 3)
322
/* Init for ftnnode.c */
327
else if (verbose_flag)
329
printf ("Binkd " MYVER " (" __DATE__ " " __TIME__ "%s)\n", get_os_string ());
336
Log (0, "%s: invalid command line: config name must be specified", argv[0]);
346
switch (verbose_flag)
351
percents = printq = 1;
352
loglevel = conlog = 4;
357
percents = printq = 1;
358
loglevel = conlog = 6;
362
print_args (tmp, sizeof (tmp), argc - 1, argv + 1);
363
Log (4, "BEGIN, " MYNAME "/" MYVER "%s", tmp);
366
Log (0, "sock_init: %s", TCPERR ());
371
initsetproctitle (argc, argv, envp);
373
/* Set up break handler, set up exit list if needed */
374
if (!set_break_handlers ())
375
Log (0, "cannot install break handlers");
378
signal (SIGCHLD, chld);
386
for (i = 1; i < argc; ++i)
387
if (argv[i][0] == '-' && argv[i][1] == 'P')
390
poll_node (argv[++i]);
392
poll_node (argv[i] + 2);
395
#if defined(UNIX) || defined(OS2) || defined(AMIGA)
398
protocol (inetd_socket, 0);
399
soclose (inetd_socket);
404
#if defined(HAVE_DAEMON) || defined(HAVE_SETSID) || defined(HAVE_TIOCNOTTY)
408
Log (0, "Only server can be run in the daemon mode");
411
if (saved_argv[0][0] == '/')
416
// Log (6, "Run with relative path, will not chdir to /");
419
if (binkd_daemonize(nochdir) < 0)
420
Log (0, "Cannot daemonize");
425
if (client_flag && !server_flag)
427
#if defined(UNIX) || defined(AMIGA) || (defined(OS2) && defined(HAVE_FORK))
431
signal (SIGHUP, hup);
437
pidsmgr = (int) getpid ();
438
if (client_flag && (pidcmgr = branch (clientmgr, 0, 0)) < 0)
440
Log (0, "cannot branch out");
443
#if defined(UNIX) || defined(AMIGA) || (defined(OS2) && defined(HAVE_FORK))
446
extern SOCKET sockfd;
448
Log (5, "Closing socket # %i", sockfd);
452
print_args (tmp, sizeof (tmp), argc - 1, saved_argv + 1);
453
Log (2, "exec %s%s", saved_argv[0], tmp);
454
if (execv (saved_argv[0], saved_argv) == -1)
455
Log (1, "execv: %s", strerror (errno));
459
signal (SIGHUP, hup);
465
if ( unlink (pid_file) == 0 ) /* successfully unlinked, i.e.
466
an old pid_file was found */
467
Log (1, "unexpected pid_file: %s: unlinked", pid_file);
470
int current_log_level = 1;
473
case ENOENT : /* file not found or null pathname */
474
current_log_level = 8; /* it's ok */
479
Log (current_log_level, "unlink_pid_file: %s: %s", pid_file, strerror (errno));
481
if ( create_sem_file (pid_file) == 0 ) /* could not create pid_file */
482
if (loglevel < 5) /* not logged in create_sem_file() */
483
Log (1, "create_sem_file: %s: %s", pid_file, strerror (errno));