/* * 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 #include "cupsd.h" #include #ifdef HAVE_NOTIFY_H # include #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; }