You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
193 lines
3.1 KiB
193 lines
3.1 KiB
/*
|
|
* Server start/stop routines for the CUPS scheduler.
|
|
*
|
|
* Copyright 2007-2019 by Apple Inc.
|
|
* Copyright 1997-2006 by Easy Software Products, all rights reserved.
|
|
*
|
|
* Licensed under Apache License v2.0. See the file "LICENSE" for more information.
|
|
*/
|
|
|
|
/*
|
|
* Include necessary headers...
|
|
*/
|
|
|
|
#include <cups/http-private.h>
|
|
#include "cupsd.h"
|
|
#include <grp.h>
|
|
#ifdef HAVE_NOTIFY_H
|
|
# include <notify.h>
|
|
#endif /* HAVE_NOTIFY_H */
|
|
|
|
|
|
/*
|
|
* Local globals...
|
|
*/
|
|
|
|
static int started = 0; /* Did we start the server already? */
|
|
|
|
|
|
/*
|
|
* 'cupsdStartServer()' - Start the server.
|
|
*/
|
|
|
|
void
|
|
cupsdStartServer(void)
|
|
{
|
|
/*
|
|
* Create the default security profile...
|
|
*/
|
|
|
|
DefaultProfile = cupsdCreateProfile(0, 1);
|
|
|
|
#ifdef HAVE_SANDBOX_H
|
|
if (!DefaultProfile && UseSandboxing && Sandboxing != CUPSD_SANDBOXING_OFF)
|
|
{
|
|
/*
|
|
* Failure to create the sandbox profile means something really bad has
|
|
* happened and we need to shutdown immediately.
|
|
*/
|
|
|
|
return;
|
|
}
|
|
#endif /* HAVE_SANDBOX_H */
|
|
|
|
/*
|
|
* Start color management (as needed)...
|
|
*/
|
|
|
|
cupsdStartColor();
|
|
|
|
/*
|
|
* Startup all the networking stuff...
|
|
*/
|
|
|
|
cupsdStartListening();
|
|
cupsdStartBrowsing();
|
|
|
|
/*
|
|
* Create a pipe for CGI processes...
|
|
*/
|
|
|
|
if (cupsdOpenPipe(CGIPipes))
|
|
cupsdLogMessage(CUPSD_LOG_ERROR,
|
|
"cupsdStartServer: Unable to create pipes for CGI status!");
|
|
else
|
|
{
|
|
CGIStatusBuffer = cupsdStatBufNew(CGIPipes[0], "[CGI]");
|
|
|
|
cupsdAddSelect(CGIPipes[0], (cupsd_selfunc_t)cupsdUpdateCGI, NULL, NULL);
|
|
}
|
|
|
|
/*
|
|
* Mark that the server has started and printers and jobs may be changed...
|
|
*/
|
|
|
|
LastEvent = CUPSD_EVENT_PRINTER_CHANGED | CUPSD_EVENT_JOB_STATE_CHANGED |
|
|
CUPSD_EVENT_SERVER_STARTED;
|
|
started = 1;
|
|
|
|
cupsdSetBusyState(0);
|
|
}
|
|
|
|
|
|
/*
|
|
* 'cupsdStopServer()' - Stop the server.
|
|
*/
|
|
|
|
void
|
|
cupsdStopServer(void)
|
|
{
|
|
if (!started)
|
|
return;
|
|
|
|
/*
|
|
* Stop color management (as needed)...
|
|
*/
|
|
|
|
cupsdStopColor();
|
|
|
|
/*
|
|
* Close all network clients...
|
|
*/
|
|
|
|
cupsdCloseAllClients();
|
|
cupsdStopListening();
|
|
cupsdStopBrowsing();
|
|
cupsdStopAllNotifiers();
|
|
cupsdDeleteAllCerts();
|
|
|
|
if (Clients)
|
|
{
|
|
cupsArrayDelete(Clients);
|
|
Clients = NULL;
|
|
}
|
|
|
|
/*
|
|
* Close the pipe for CGI processes...
|
|
*/
|
|
|
|
if (CGIPipes[0] >= 0)
|
|
{
|
|
cupsdRemoveSelect(CGIPipes[0]);
|
|
|
|
cupsdStatBufDelete(CGIStatusBuffer);
|
|
close(CGIPipes[1]);
|
|
|
|
CGIPipes[0] = -1;
|
|
CGIPipes[1] = -1;
|
|
}
|
|
|
|
/*
|
|
* Close all log files...
|
|
*/
|
|
|
|
if (AccessFile != NULL)
|
|
{
|
|
if (AccessFile != LogStderr)
|
|
cupsFileClose(AccessFile);
|
|
|
|
AccessFile = NULL;
|
|
}
|
|
|
|
if (ErrorFile != NULL)
|
|
{
|
|
if (ErrorFile != LogStderr)
|
|
cupsFileClose(ErrorFile);
|
|
|
|
ErrorFile = NULL;
|
|
}
|
|
|
|
if (PageFile != NULL)
|
|
{
|
|
if (PageFile != LogStderr)
|
|
cupsFileClose(PageFile);
|
|
|
|
PageFile = NULL;
|
|
}
|
|
|
|
/*
|
|
* Delete the default security profile...
|
|
*/
|
|
|
|
cupsdDestroyProfile(DefaultProfile);
|
|
DefaultProfile = NULL;
|
|
|
|
/*
|
|
* Expire subscriptions and clean out old jobs...
|
|
*/
|
|
|
|
cupsdExpireSubscriptions(NULL, NULL);
|
|
|
|
if (JobHistoryUpdate)
|
|
cupsdCleanJobs();
|
|
|
|
/*
|
|
* Write out any dirty files...
|
|
*/
|
|
|
|
if (DirtyFiles)
|
|
cupsdCleanDirty();
|
|
|
|
started = 0;
|
|
}
|