1 /* 2 * Main header file for the CUPS scheduler. 3 * 4 * Copyright © 2020-2024 by OpenPrinting. 5 * Copyright © 2007-2018 by Apple Inc. 6 * Copyright © 1997-2007 by Easy Software Products, all rights reserved. 7 * 8 * Licensed under Apache License v2.0. See the file "LICENSE" for more 9 * information. 10 */ 11 12 13 /* 14 * Include necessary headers. 15 */ 16 17 #include <cups/cups-private.h> 18 #include <cups/file-private.h> 19 #include <cups/ppd-private.h> 20 21 #include <limits.h> 22 #include <time.h> 23 #include <signal.h> 24 #include <fcntl.h> 25 #include <math.h> 26 #include <sys/types.h> 27 #include <sys/time.h> 28 #include <sys/stat.h> 29 #include <sys/wait.h> 30 31 #ifdef _WIN32 32 # include <direct.h> 33 #else 34 # include <unistd.h> 35 #endif /* _WIN32 */ 36 37 #include "mime.h" 38 39 #if defined(HAVE_CDSASSL) 40 # include <CoreFoundation/CoreFoundation.h> 41 #endif /* HAVE_CDSASSL */ 42 43 44 /* 45 * Some OS's don't have hstrerror(), most notably Solaris... 46 */ 47 48 #ifndef HAVE_HSTRERROR 49 # ifdef hstrerror 50 # undef hstrerror 51 # endif /* hstrerror */ 52 # define hstrerror cups_hstrerror 53 54 extern const char *cups_hstrerror(int); 55 #endif /* !HAVE_HSTRERROR */ 56 57 58 /* 59 * Common constants. 60 */ 61 62 #ifndef FALSE 63 # define FALSE 0 64 # define TRUE (!FALSE) 65 #endif /* !FALSE */ 66 67 68 /* 69 * Implementation limits... 70 */ 71 72 #define MAX_ENV 100 /* Maximum number of environment strings */ 73 #define MAX_USERPASS 33 /* Maximum size of username/password */ 74 #define MAX_FILTERS 20 /* Maximum number of filters */ 75 #define MAX_SYSTEM_GROUPS 32 /* Maximum number of system groups */ 76 77 78 /* 79 * Defaults... 80 */ 81 82 #define DEFAULT_HISTORY INT_MAX /* Preserve job history? */ 83 #define DEFAULT_FILES 86400 /* Preserve job files? */ 84 #define DEFAULT_TIMEOUT 300 /* Timeout during requests/updates */ 85 #define DEFAULT_KEEPALIVE 30 /* Timeout between requests */ 86 87 88 /* 89 * Global variable macros... 90 */ 91 92 #ifdef _MAIN_C_ 93 # define VAR 94 # define VALUE(x) =x 95 # define VALUE2(x,y) ={x,y} 96 #else 97 # define VAR extern 98 # define VALUE(x) 99 # define VALUE2(x,y) 100 #endif /* _MAIN_C */ 101 102 103 /* 104 * Base types... 105 */ 106 107 typedef struct cupsd_client_s cupsd_client_t; 108 typedef struct cupsd_job_s cupsd_job_t; 109 typedef struct cupsd_printer_s cupsd_printer_t; 110 111 112 /* 113 * Other stuff for the scheduler... 114 */ 115 116 #include "sysman.h" 117 #include "statbuf.h" 118 #include "cert.h" 119 #include "auth.h" 120 #include "client.h" 121 #include "policy.h" 122 #include "printers.h" 123 #include "classes.h" 124 #include "job.h" 125 #include "colorman.h" 126 #include "conf.h" 127 #include "banners.h" 128 #include "dirsvc.h" 129 #include "network.h" 130 #include "subscriptions.h" 131 132 133 /* 134 * Reload types... 135 */ 136 137 #define RELOAD_NONE 0 /* No reload needed */ 138 #define RELOAD_ALL 1 /* Reload everything */ 139 #define RELOAD_CUPSD 2 /* Reload only cupsd.conf */ 140 141 142 /* 143 * Select callback function type... 144 */ 145 146 typedef void (*cupsd_selfunc_t)(void *data); 147 148 149 /* 150 * Globals... 151 */ 152 153 VAR int TestConfigFile VALUE(0); 154 /* Test the cupsd.conf file? */ 155 VAR int MaxFDs VALUE(0); 156 /* Maximum number of files */ 157 158 VAR time_t ReloadTime VALUE(0); 159 /* Time of reload request... */ 160 VAR int NeedReload VALUE(RELOAD_ALL), 161 /* Need to load configuration? */ 162 DoingShutdown VALUE(0); 163 /* Shutting down the scheduler? */ 164 VAR void *DefaultProfile VALUE(0); 165 /* Default security profile */ 166 167 #ifdef HAVE_ONDEMAND 168 VAR int OnDemand VALUE(0); 169 /* Launched on demand */ 170 #endif /* HAVE_ONDEMAND */ 171 172 173 /* 174 * Prototypes... 175 */ 176 177 /* env.c */ 178 extern void cupsdInitEnv(void); 179 extern int cupsdLoadEnv(char *envp[], int envmax); 180 extern void cupsdSetEnv(const char *name, const char *value); 181 extern void cupsdSetEnvf(const char *name, const char *value, ...) _CUPS_FORMAT(2, 3); 182 extern void cupsdUpdateEnv(void); 183 184 /* file.c */ 185 extern void cupsdCleanFiles(const char *path, const char *pattern); 186 extern int cupsdCloseCreatedConfFile(cups_file_t *fp, 187 const char *filename); 188 extern void cupsdClosePipe(int *fds); 189 extern cups_file_t *cupsdCreateConfFile(const char *filename, mode_t mode); 190 extern cups_file_t *cupsdOpenConfFile(const char *filename); 191 extern int cupsdOpenPipe(int *fds); 192 extern int cupsdRemoveFile(const char *filename); 193 extern int cupsdUnlinkOrRemoveFile(const char *filename); 194 195 /* main.c */ 196 extern int cupsdAddString(cups_array_t **a, const char *s); 197 extern void cupsdCheckProcess(void); 198 extern void cupsdClearString(char **s); 199 extern void cupsdFreeStrings(cups_array_t **a); 200 extern void cupsdHoldSignals(void); 201 extern char *cupsdMakeUUID(const char *name, int number, 202 char *buffer, size_t bufsize); 203 extern void cupsdReleaseSignals(void); 204 extern void cupsdSetString(char **s, const char *v); 205 extern void cupsdSetStringf(char **s, const char *f, ...) 206 __attribute__ ((__format__ (__printf__, 2, 3))); 207 208 /* process.c */ 209 extern void *cupsdCreateProfile(int job_id, int allow_networking); 210 extern void cupsdDestroyProfile(void *profile); 211 extern int cupsdEndProcess(int pid, int force); 212 extern const char *cupsdFinishProcess(int pid, char *name, size_t namelen, int *job_id); 213 extern int cupsdStartProcess(const char *command, char *argv[], 214 char *envp[], int infd, int outfd, 215 int errfd, int backfd, int sidefd, 216 int root, void *profile, 217 cupsd_job_t *job, int *pid); 218 219 /* select.c */ 220 extern int cupsdAddSelect(int fd, cupsd_selfunc_t read_cb, 221 cupsd_selfunc_t write_cb, void *data); 222 extern int cupsdDoSelect(long timeout); 223 #ifdef CUPSD_IS_SELECTING 224 extern int cupsdIsSelecting(int fd); 225 #endif /* CUPSD_IS_SELECTING */ 226 extern void cupsdRemoveSelect(int fd); 227 extern void cupsdStartSelect(void); 228 extern void cupsdStopSelect(void); 229 230 /* server.c */ 231 extern void cupsdStartServer(void); 232 extern void cupsdStopServer(void); 233