/*
- * "$Id: client.c,v 1.91.2.45 2003/03/07 19:25:48 mike Exp $"
+ * "$Id: client.c,v 1.91.2.46 2003/03/10 15:05:52 mike Exp $"
*
* Client routines for the Common UNIX Printing System (CUPS) scheduler.
*
root[1024], /* CUPS_SERVERROOT environment variable */
query_string[10240]; /* QUERY_STRING env variable */
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
- sigset_t oldmask, /* POSIX signal masks */
- newmask;
struct sigaction action; /* POSIX signal handler */
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
* Block signals before forking...
*/
-#ifdef HAVE_SIGSET
- sighold(SIGTERM);
-#elif defined(HAVE_SIGACTION)
- sigemptyset(&newmask);
- sigaddset(&newmask, SIGTERM);
- sigprocmask(SIG_BLOCK, &newmask, &oldmask);
-#endif /* HAVE_SIGSET */
-
- IgnoreChildSignals();
+ HoldSignals();
/*
* Then execute the command...
#ifdef HAVE_SIGSET
sigset(SIGTERM, SIG_DFL);
-
- sigrelse(SIGTERM);
+ sigset(SIGCHLD, SIG_DFL);
#elif defined(HAVE_SIGACTION)
memset(&action, 0, sizeof(action));
action.sa_handler = SIG_DFL;
sigaction(SIGTERM, &action, NULL);
-
- sigprocmask(SIG_SETMASK, &oldmask, NULL);
+ sigaction(SIGCHLD, &action, NULL);
#else
signal(SIGTERM, SIG_DFL);
+ signal(SIGCHLD, SIG_DFL);
#endif /* HAVE_SIGSET */
+ ReleaseSignals();
+
/*
* Execute the pipe program; if an error occurs, exit with status 1...
*/
close(fds[1]);
}
-#ifdef HAVE_SIGSET
- sigrelse(SIGTERM);
-#elif defined(HAVE_SIGACTION)
- sigprocmask(SIG_SETMASK, &oldmask, NULL);
-#endif /* HAVE_SIGSET */
-
- CatchChildSignals();
+ ReleaseSignals();
return (pid);
}
/*
- * End of "$Id: client.c,v 1.91.2.45 2003/03/07 19:25:48 mike Exp $".
+ * End of "$Id: client.c,v 1.91.2.46 2003/03/10 15:05:52 mike Exp $".
*/
/*
- * "$Id: cupsd.h,v 1.28.2.15 2003/02/12 19:32:29 mike Exp $"
+ * "$Id: cupsd.h,v 1.28.2.16 2003/03/10 15:05:53 mike Exp $"
*
* Main header file for the Common UNIX Printing System (CUPS) scheduler.
*
extern void CatchChildSignals(void);
extern void ClearString(char **s);
+extern void HoldSignals(void);
extern void IgnoreChildSignals(void);
extern void LoadDevices(const char *d);
extern void LoadPPDs(const char *d);
+extern void ReleaseSignals(void);
extern void SetString(char **s, const char *v);
extern void SetStringf(char **s, const char *f, ...);
extern void StartServer(void);
/*
- * End of "$Id: cupsd.h,v 1.28.2.15 2003/02/12 19:32:29 mike Exp $".
+ * End of "$Id: cupsd.h,v 1.28.2.16 2003/03/10 15:05:53 mike Exp $".
*/
/*
- * "$Id: job.c,v 1.124.2.50 2003/03/07 19:25:49 mike Exp $"
+ * "$Id: job.c,v 1.124.2.51 2003/03/10 15:05:53 mike Exp $"
*
* Job management routines for the Common UNIX Printing System (CUPS).
*
{
int fd; /* Looping var */
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
- sigset_t oldmask, /* POSIX signal masks */
- newmask;
struct sigaction action; /* POSIX signal handler */
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
* Block signals before forking...
*/
-#ifdef HAVE_SIGSET
- sighold(SIGTERM);
-#elif defined(HAVE_SIGACTION)
- sigemptyset(&newmask);
- sigaddset(&newmask, SIGTERM);
- sigprocmask(SIG_BLOCK, &newmask, &oldmask);
-#endif /* HAVE_SIGSET */
-
- IgnoreChildSignals();
+ HoldSignals();
if ((*pid = fork()) == 0)
{
#ifdef HAVE_SIGSET
sigset(SIGTERM, SIG_DFL);
sigset(SIGCHLD, SIG_DFL);
-
- sigrelse(SIGTERM);
#elif defined(HAVE_SIGACTION)
memset(&action, 0, sizeof(action));
action.sa_handler = SIG_DFL;
sigaction(SIGTERM, &action, NULL);
-
- sigprocmask(SIG_SETMASK, &oldmask, NULL);
+ sigaction(SIGCHLD, &action, NULL);
#else
signal(SIGTERM, SIG_DFL);
+ signal(SIGCHLD, SIG_DFL);
#endif /* HAVE_SIGSET */
+ ReleaseSignals();
+
/*
* Execute the command; if for some reason this doesn't work,
* return the error code...
*pid = 0;
}
-#ifdef HAVE_SIGSET
- sigrelse(SIGTERM);
-#elif defined(HAVE_SIGACTION)
- sigprocmask(SIG_SETMASK, &oldmask, NULL);
-#endif /* HAVE_SIGSET */
-
- CatchChildSignals();
+ ReleaseSignals();
return (*pid);
}
/*
- * End of "$Id: job.c,v 1.124.2.50 2003/03/07 19:25:49 mike Exp $".
+ * End of "$Id: job.c,v 1.124.2.51 2003/03/10 15:05:53 mike Exp $".
*/
/*
- * "$Id: log.c,v 1.19.2.9 2003/03/04 15:34:57 mike Exp $"
+ * "$Id: log.c,v 1.19.2.10 2003/03/10 15:05:54 mike Exp $"
*
* Log file routines for the Common UNIX Printing System (CUPS).
*
if (level > LogLevel)
return (1);
+ HoldSignals();
+
#ifdef HAVE_VSYSLOG
/*
* See if we are logging errors via syslog...
vsyslog(syslevels[level], message, ap);
va_end(ap);
+ ReleaseSignals();
+
return (1);
}
#endif /* HAVE_VSYSLOG */
*/
if (!check_log_file(&ErrorFile, ErrorLog))
+ {
+ ReleaseSignals();
+
return (0);
-
+ }
+
/*
* Print the log level and date/time...
*/
fflush(ErrorFile);
+ ReleaseSignals();
+
return (1);
}
hostname = ippFindAttribute(job->attrs, "job-originating-host-name",
IPP_TAG_ZERO);
+ HoldSignals();
+
#ifdef HAVE_VSYSLOG
/*
* See if we are logging pages via syslog...
job->id, page, billing ? billing->values[0].string.text : "-",
hostname->values[0].string.text);
+ ReleaseSignals();
+
return (1);
}
#endif /* HAVE_VSYSLOG */
*/
if (!check_log_file(&PageFile, PageLog))
+ {
+ ReleaseSignals();
+
return (0);
+ }
/*
* Print a page log entry of the form:
hostname->values[0].string.text);
fflush(PageFile);
+ ReleaseSignals();
+
return (1);
}
};
+ HoldSignals();
+
#ifdef HAVE_VSYSLOG
/*
* See if we are logging accesses via syslog...
con->http.version / 100, con->http.version % 100,
code, con->bytes);
+ ReleaseSignals();
+
return (1);
}
#endif /* HAVE_VSYSLOG */
*/
if (!check_log_file(&AccessFile, AccessLog))
+ {
+ ReleaseSignals();
+
return (0);
+ }
/*
* Write a log of the request in "common log format"...
code, con->bytes);
fflush(AccessFile);
+ ReleaseSignals();
+
return (1);
}
/*
- * End of "$Id: log.c,v 1.19.2.9 2003/03/04 15:34:57 mike Exp $".
+ * End of "$Id: log.c,v 1.19.2.10 2003/03/10 15:05:54 mike Exp $".
*/
/*
- * "$Id: main.c,v 1.57.2.35 2003/03/07 19:25:50 mike Exp $"
+ * "$Id: main.c,v 1.57.2.36 2003/03/10 15:05:54 mike Exp $"
*
* Scheduler main loop for the Common UNIX Printing System (CUPS).
*
*
* main() - Main entry for the CUPS scheduler.
* CatchChildSignals() - Catch SIGCHLD signals...
+ * HoldSignals() - Hold child and termination signals.
* IgnoreChildSignals() - Ignore SIGCHLD signals...
+ * ReleaseSignals() - Release signals for delivery.
* SetString() - Set a string value.
* SetStringf() - Set a formatted string value.
* sigchld_handler() - Handle 'child' signals from old processes.
static void usage(void);
+/*
+ * Local globals...
+ */
+
+#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
+static sigset_t oldmask; /* Old POSIX signal mask */
+#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
+
+
/*
* 'main()' - Main entry for the CUPS scheduler.
*/
-int /* O - Exit status */
-main(int argc, /* I - Number of command-line arguments */
- char *argv[]) /* I - Command-line arguments */
+int /* O - Exit status */
+main(int argc, /* I - Number of command-line arguments */
+ char *argv[]) /* I - Command-line arguments */
{
int i; /* Looping var */
char *opt; /* Option character */
#else
signal(SIGCLD, sigchld_handler); /* No, SIGCLD isn't a typo... */
#endif /* HAVE_SIGSET */
-
-#if defined(HAVE_WAITPID) || defined(HAVE_WAIT3)
- sigchld_handler(SIGCHLD);
-#endif /* HAVE_WAITPID || HAVE_WAIT3 */
}
}
+/*
+ * 'HoldSignals()' - Hold child and termination signals.
+ */
+
+void
+HoldSignals(void)
+{
+#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
+ sigset_t newmask; /* New POSIX signal mask */
+#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
+
+
+#ifdef HAVE_SIGSET
+ sighold(SIGTERM);
+ sighold(SIGCHLD);
+#elif defined(HAVE_SIGACTION)
+ sigemptyset(&newmask);
+ sigaddset(&newmask, SIGTERM);
+ sigaddset(&newmask, SIGCHLD);
+ sigprocmask(SIG_BLOCK, &newmask, &oldmask);
+#endif /* HAVE_SIGSET */
+}
+
+
/*
* 'IgnoreChildSignals()' - Ignore SIGCHLD signals...
*
struct sigaction action; /* Actions for POSIX signals */
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
+
#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
sigset(SIGCHLD, SIG_DFL);
#elif defined(HAVE_SIGACTION)
}
+/*
+ * 'ReleaseSignals()' - Release signals for delivery.
+ */
+
+void
+ReleaseSignals(void)
+{
+#ifdef HAVE_SIGSET
+ sigrelse(SIGTERM);
+ sigrelse(SIGCHLD);
+#elif defined(HAVE_SIGACTION)
+ sigprocmask(SIG_SETMASK, &oldmask, NULL);
+#endif /* HAVE_SIGSET */
+}
+
+
/*
* 'SetString()' - Set a string value.
*/
/*
- * End of "$Id: main.c,v 1.57.2.35 2003/03/07 19:25:50 mike Exp $".
+ * End of "$Id: main.c,v 1.57.2.36 2003/03/10 15:05:54 mike Exp $".
*/