• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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