summaryrefslogtreecommitdiff
path: root/comsat/comsat.c
diff options
context:
space:
mode:
authorAlain Magloire <alainm@gnu.org>2001-11-11 19:25:36 +0000
committerAlain Magloire <alainm@gnu.org>2001-11-11 19:25:36 +0000
commit5a79e104e2b745587db5532ec730d1c99384d111 (patch)
tree25b0adce0ddba835a83bb6bf8fa5b27363654fdb /comsat/comsat.c
parent97f85b62fc75c81e4fc409594f7020369c2fb896 (diff)
downloadmailutils-5a79e104e2b745587db5532ec730d1c99384d111.tar.gz
mailutils-5a79e104e2b745587db5532ec730d1c99384d111.tar.bz2
Most daemon will share the same code to daemonize(), we use
a generic one, lib/daemon.c, so any bug fix will impact the others and reduce maintainance/duplication. * lib/Makefile.am: Addition daemon.c * lib/daemon.c: New file. * pop3d/pop3d.c (pop3d_daemon_init): Use lib/daemon.c:daemon() code instead. * imap4d/imap4d.c (imap4d_daemon_init): Use lib/daemon.c:daemon code instead. * comstat/comstat.c (comstat_daemon_init): Use lib/daemon.c:daemon code instead. Remove trailing spaces.
Diffstat (limited to 'comsat/comsat.c')
-rw-r--r--comsat/comsat.c79
1 files changed, 24 insertions, 55 deletions
diff --git a/comsat/comsat.c b/comsat/comsat.c
index 6d554ccc2..cdb092ce2 100644
--- a/comsat/comsat.c
+++ b/comsat/comsat.c
@@ -21,7 +21,7 @@
#ifndef PATH_DEV
# define PATH_DEV "/dev"
-#endif
+#endif
#ifndef PATH_TTY_PFX
# define PATH_TTY_PFX PATH_DEV
#endif
@@ -96,7 +96,7 @@ main(int argc, char **argv)
{
int c;
char *config_file = NULL;
-
+
while ((c = getopt_long (argc, argv, short_options, long_options, NULL))
!= -1)
{
@@ -171,7 +171,7 @@ sig_hup (int sig)
syslog (LOG_ERR, "can't restart: not started with absolute pathname");
else
execvp (xargv[0], xargv);
-
+
signal (sig, sig_hup);
}
@@ -185,7 +185,7 @@ comsat_init ()
list_append (bookie, path_record);
gethostname (hostname, sizeof hostname);
-
+
/* Set signal handlers */
signal (SIGTTOU, SIG_IGN);
signal (SIGCHLD, SIG_IGN);
@@ -196,46 +196,15 @@ comsat_init ()
static void
comsat_daemon_init (void)
{
- pid_t pid;
-
- pid = fork ();
- if (pid == -1)
- {
- perror ("fork failed:");
- exit (EXIT_FAILURE);
- }
- else if (pid > 0)
- exit (EXIT_SUCCESS); /* Parent exits. */
-
- /* Child: */
- signal (SIGHUP, sig_hup);
+ extern int daemon (int, int);
- setsid (); /* Become session leader. */
-
- /* The second fork is to guarantee that the daemon cannot acquire a
- controlling terminal. */
- pid = fork ();
- if (pid == -1)
+ /* Become a daemon. Take care to close inherited fds and to hold
+ first three one, in, out, err. Do not do the chdir("/"). */
+ if (daemon (1, 0) < 0)
{
- perror("fork failed");
+ perror ("failed to become a daemon:");
exit (EXIT_FAILURE);
}
- else if (pid > 0)
- exit (EXIT_SUCCESS); /* Parent exits. */
-
- /* Close inherited file descriptors. */
- {
- size_t i, fdmax;
-#if defined(HAVE_SYSCONF) && defined(_SC_OPEN_MAX)
- fdmax = sysconf(_SC_OPEN_MAX);
-#elif defined(HAVE_GETDTABLESIZE)
- fdmax = getdtablesize ();*/
-#else
- fdmax = 64;
-#endif
- for (i = 0; i < fdmax; ++i)
- close (i);
- }
}
unsigned maxrequests = 16; /* Maximum number of request allowed per
@@ -256,14 +225,14 @@ comsat_daemon (int port)
unsigned overflow_count = 0; /* Number of overflows achieved during
the current interval */
time_t now;
-
+
fd = socket (AF_INET, SOCK_DGRAM, 0);
if (fd == -1)
{
syslog (LOG_CRIT, "socket: %m");
exit (1);
}
-
+
memset (&local_sin, 0, sizeof local_sin);
local_sin.sin_family = AF_INET;
local_sin.sin_addr.s_addr = INADDR_ANY; /*FIXME*/
@@ -276,13 +245,13 @@ comsat_daemon (int port)
}
syslog (LOG_NOTICE, "GNU comsat started");
-
+
last_request_time = last_overflow_time = time (NULL);
while (1)
{
fd_set fdset;
int rc;
-
+
FD_ZERO (&fdset);
FD_SET (fd, &fdset);
rc = select (fd+1, &fdset, NULL, NULL, NULL);
@@ -316,7 +285,7 @@ comsat_daemon (int port)
overflow_count = 0;
last_overflow_time = time (NULL);
}
-
+
if (now - last_request_time <= request_control_interval)
reqcount++;
else
@@ -341,7 +310,7 @@ comsat_main (int fd)
char *p, *endp;
size_t offset;
char *path = NULL;
-
+
len = sizeof sin_from;
rdlen = recvfrom (fd, buffer, sizeof buffer, 0,
(struct sockaddr*)&sin_from, &len);
@@ -359,9 +328,9 @@ comsat_main (int fd)
inet_ntoa (sin_from.sin_addr));
return 1;
}
-
+
syslog (LOG_INFO, "%d bytes from %s", rdlen, inet_ntoa (sin_from.sin_addr));
-
+
buffer[rdlen] = 0;
/* Parse the buffer */
@@ -399,7 +368,7 @@ comsat_main (int fd)
syslog (LOG_ERR, "fork: %m");
return 1;
}
-
+
if (pid > 0)
{
struct timeval tv;
@@ -408,7 +377,7 @@ comsat_main (int fd)
select (0, NULL, NULL, NULL, &tv);
kill (pid, SIGKILL); /* Just in case the child is hung */
return 0;
- }
+ }
/* Child: do actual I/O */
notify_user (buffer, tty, path, offset);
@@ -420,7 +389,7 @@ get_newline_str (FILE *fp)
{
#if defined(OPOST) && defined(ONLCR)
struct termios tbuf;
-
+
tcgetattr (fileno (fp), &tbuf);
if ((tbuf.c_oflag & OPOST) && (tbuf.c_oflag & ONLCR))
return "\n";
@@ -484,7 +453,7 @@ notify_user (char *user, char *device, char *path, off_t offset)
path, strerror (status));
return;
}
-
+
/* Read headers */
size -= offset;
blurb = malloc (size + 1);
@@ -514,7 +483,7 @@ notify_user (char *user, char *device, char *path, off_t offset)
mailbox_set_stream (tmp, stream);
mailbox_messages_count (tmp, &count);
mailbox_get_message (tmp, 1, &msg);
-
+
run_user_action (fp, cr, msg);
fclose (fp);
}
@@ -624,7 +593,7 @@ mailbox_path (const char *user)
{
struct passwd *pw;
char *mailbox_name;
-
+
pw = mu_getpwnam (user);
if (!pw)
{
@@ -638,7 +607,7 @@ mailbox_path (const char *user)
+ strlen (pw->pw_name) + 1, 1);
sprintf (mailbox_name, "%s/%s", _PATH_MAILDIR, pw->pw_name);
}
- else
+ else
{
mailbox_name = calloc (strlen (pw->pw_dir) + strlen ("/INBOX"), 1);
sprintf (mailbox_name, "%s/INBOX", pw->pw_dir);

Return to:

Send suggestions and report system problems to the System administrator.