1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * Log file routines for the CUPS scheduler.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright © 2007-2018 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
6*5e7646d2SAndroid Build Coastguard Worker *
7*5e7646d2SAndroid Build Coastguard Worker * Licensed under Apache License v2.0. See the file "LICENSE" for more
8*5e7646d2SAndroid Build Coastguard Worker * information.
9*5e7646d2SAndroid Build Coastguard Worker */
10*5e7646d2SAndroid Build Coastguard Worker
11*5e7646d2SAndroid Build Coastguard Worker /*
12*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers...
13*5e7646d2SAndroid Build Coastguard Worker */
14*5e7646d2SAndroid Build Coastguard Worker
15*5e7646d2SAndroid Build Coastguard Worker #include "cupsd.h"
16*5e7646d2SAndroid Build Coastguard Worker #include <stdarg.h>
17*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_ASL_H
18*5e7646d2SAndroid Build Coastguard Worker # include <asl.h>
19*5e7646d2SAndroid Build Coastguard Worker #elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
20*5e7646d2SAndroid Build Coastguard Worker # define SD_JOURNAL_SUPPRESS_LOCATION
21*5e7646d2SAndroid Build Coastguard Worker # include <systemd/sd-journal.h>
22*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_ASL_H */
23*5e7646d2SAndroid Build Coastguard Worker #include <syslog.h>
24*5e7646d2SAndroid Build Coastguard Worker
25*5e7646d2SAndroid Build Coastguard Worker
26*5e7646d2SAndroid Build Coastguard Worker /*
27*5e7646d2SAndroid Build Coastguard Worker * Constants for log keys from PWG 5110.3 (PWG Common Log Format)...
28*5e7646d2SAndroid Build Coastguard Worker */
29*5e7646d2SAndroid Build Coastguard Worker
30*5e7646d2SAndroid Build Coastguard Worker #define PWG_DeviceUUID "DUU"
31*5e7646d2SAndroid Build Coastguard Worker #define PWG_Event "E"
32*5e7646d2SAndroid Build Coastguard Worker #define PWG_LogNaturalLanguage "NL"
33*5e7646d2SAndroid Build Coastguard Worker #define PWG_Status "S"
34*5e7646d2SAndroid Build Coastguard Worker #define PWG_ServiceURI "URI"
35*5e7646d2SAndroid Build Coastguard Worker #define PWG_UserHost "UH"
36*5e7646d2SAndroid Build Coastguard Worker #define PWG_UserName "UN"
37*5e7646d2SAndroid Build Coastguard Worker #define PWG_UserURI "UU"
38*5e7646d2SAndroid Build Coastguard Worker #define PWG_ServiceIsAcceptingJobs "IAJ"
39*5e7646d2SAndroid Build Coastguard Worker #define PWG_ServiceState "ST"
40*5e7646d2SAndroid Build Coastguard Worker #define PWG_ServiceStateReasons "SR"
41*5e7646d2SAndroid Build Coastguard Worker #define PWG_ServiceUUID "SUU"
42*5e7646d2SAndroid Build Coastguard Worker #define PWG_JobID "JID"
43*5e7646d2SAndroid Build Coastguard Worker #define PWG_JobUUID "JUU"
44*5e7646d2SAndroid Build Coastguard Worker #define PWG_JobImagesCompleted "JIM"
45*5e7646d2SAndroid Build Coastguard Worker #define PWG_JobImpressionsCompleted "JIC"
46*5e7646d2SAndroid Build Coastguard Worker #define PWG_JobDestinationURI "JD"
47*5e7646d2SAndroid Build Coastguard Worker #define PWG_JobState "JS"
48*5e7646d2SAndroid Build Coastguard Worker #define PWG_JobStateReasons "JR"
49*5e7646d2SAndroid Build Coastguard Worker #define PWG_JobAccountingID "JA"
50*5e7646d2SAndroid Build Coastguard Worker #define PWG_JobAcountingUserName "JAUN"
51*5e7646d2SAndroid Build Coastguard Worker #define PWG_JobAccountingUserURI "JAUU"
52*5e7646d2SAndroid Build Coastguard Worker
53*5e7646d2SAndroid Build Coastguard Worker
54*5e7646d2SAndroid Build Coastguard Worker /*
55*5e7646d2SAndroid Build Coastguard Worker * Local globals...
56*5e7646d2SAndroid Build Coastguard Worker */
57*5e7646d2SAndroid Build Coastguard Worker
58*5e7646d2SAndroid Build Coastguard Worker static _cups_mutex_t log_mutex = _CUPS_MUTEX_INITIALIZER;
59*5e7646d2SAndroid Build Coastguard Worker /* Mutex for logging */
60*5e7646d2SAndroid Build Coastguard Worker static size_t log_linesize = 0; /* Size of line for output file */
61*5e7646d2SAndroid Build Coastguard Worker static char *log_line = NULL; /* Line for output file */
62*5e7646d2SAndroid Build Coastguard Worker
63*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_ASL_H
64*5e7646d2SAndroid Build Coastguard Worker static const int log_levels[] = /* ASL levels... */
65*5e7646d2SAndroid Build Coastguard Worker {
66*5e7646d2SAndroid Build Coastguard Worker ASL_LEVEL_EMERG,
67*5e7646d2SAndroid Build Coastguard Worker ASL_LEVEL_EMERG,
68*5e7646d2SAndroid Build Coastguard Worker ASL_LEVEL_ALERT,
69*5e7646d2SAndroid Build Coastguard Worker ASL_LEVEL_CRIT,
70*5e7646d2SAndroid Build Coastguard Worker ASL_LEVEL_ERR,
71*5e7646d2SAndroid Build Coastguard Worker ASL_LEVEL_WARNING,
72*5e7646d2SAndroid Build Coastguard Worker ASL_LEVEL_NOTICE,
73*5e7646d2SAndroid Build Coastguard Worker ASL_LEVEL_INFO,
74*5e7646d2SAndroid Build Coastguard Worker ASL_LEVEL_DEBUG,
75*5e7646d2SAndroid Build Coastguard Worker ASL_LEVEL_DEBUG
76*5e7646d2SAndroid Build Coastguard Worker };
77*5e7646d2SAndroid Build Coastguard Worker #elif defined(HAVE_VSYSLOG) || defined(HAVE_SYSTEMD_SD_JOURNAL_H)
78*5e7646d2SAndroid Build Coastguard Worker static const int log_levels[] = /* SYSLOG levels... */
79*5e7646d2SAndroid Build Coastguard Worker {
80*5e7646d2SAndroid Build Coastguard Worker 0,
81*5e7646d2SAndroid Build Coastguard Worker LOG_EMERG,
82*5e7646d2SAndroid Build Coastguard Worker LOG_ALERT,
83*5e7646d2SAndroid Build Coastguard Worker LOG_CRIT,
84*5e7646d2SAndroid Build Coastguard Worker LOG_ERR,
85*5e7646d2SAndroid Build Coastguard Worker LOG_WARNING,
86*5e7646d2SAndroid Build Coastguard Worker LOG_NOTICE,
87*5e7646d2SAndroid Build Coastguard Worker LOG_INFO,
88*5e7646d2SAndroid Build Coastguard Worker LOG_DEBUG,
89*5e7646d2SAndroid Build Coastguard Worker LOG_DEBUG
90*5e7646d2SAndroid Build Coastguard Worker };
91*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_ASL_H */
92*5e7646d2SAndroid Build Coastguard Worker
93*5e7646d2SAndroid Build Coastguard Worker
94*5e7646d2SAndroid Build Coastguard Worker /*
95*5e7646d2SAndroid Build Coastguard Worker * Local functions...
96*5e7646d2SAndroid Build Coastguard Worker */
97*5e7646d2SAndroid Build Coastguard Worker
98*5e7646d2SAndroid Build Coastguard Worker static int format_log_line(const char *message, va_list ap);
99*5e7646d2SAndroid Build Coastguard Worker
100*5e7646d2SAndroid Build Coastguard Worker
101*5e7646d2SAndroid Build Coastguard Worker /*
102*5e7646d2SAndroid Build Coastguard Worker * 'cupsdCheckLogFile()' - Open/rotate a log file if it needs it.
103*5e7646d2SAndroid Build Coastguard Worker */
104*5e7646d2SAndroid Build Coastguard Worker
105*5e7646d2SAndroid Build Coastguard Worker int /* O - 1 if log file open */
cupsdCheckLogFile(cups_file_t ** lf,const char * logname)106*5e7646d2SAndroid Build Coastguard Worker cupsdCheckLogFile(cups_file_t **lf, /* IO - Log file */
107*5e7646d2SAndroid Build Coastguard Worker const char *logname) /* I - Log filename */
108*5e7646d2SAndroid Build Coastguard Worker {
109*5e7646d2SAndroid Build Coastguard Worker char backname[1024], /* Backup log filename */
110*5e7646d2SAndroid Build Coastguard Worker filename[1024], /* Formatted log filename */
111*5e7646d2SAndroid Build Coastguard Worker *ptr; /* Pointer into filename */
112*5e7646d2SAndroid Build Coastguard Worker const char *logptr; /* Pointer into log filename */
113*5e7646d2SAndroid Build Coastguard Worker
114*5e7646d2SAndroid Build Coastguard Worker
115*5e7646d2SAndroid Build Coastguard Worker /*
116*5e7646d2SAndroid Build Coastguard Worker * See if we have a log file to check...
117*5e7646d2SAndroid Build Coastguard Worker */
118*5e7646d2SAndroid Build Coastguard Worker
119*5e7646d2SAndroid Build Coastguard Worker if (!lf || !logname || !logname[0])
120*5e7646d2SAndroid Build Coastguard Worker return (1);
121*5e7646d2SAndroid Build Coastguard Worker
122*5e7646d2SAndroid Build Coastguard Worker /*
123*5e7646d2SAndroid Build Coastguard Worker * Handle logging to stderr...
124*5e7646d2SAndroid Build Coastguard Worker */
125*5e7646d2SAndroid Build Coastguard Worker
126*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(logname, "stderr"))
127*5e7646d2SAndroid Build Coastguard Worker {
128*5e7646d2SAndroid Build Coastguard Worker *lf = LogStderr;
129*5e7646d2SAndroid Build Coastguard Worker return (1);
130*5e7646d2SAndroid Build Coastguard Worker }
131*5e7646d2SAndroid Build Coastguard Worker
132*5e7646d2SAndroid Build Coastguard Worker /*
133*5e7646d2SAndroid Build Coastguard Worker * Format the filename as needed...
134*5e7646d2SAndroid Build Coastguard Worker */
135*5e7646d2SAndroid Build Coastguard Worker
136*5e7646d2SAndroid Build Coastguard Worker if (!*lf ||
137*5e7646d2SAndroid Build Coastguard Worker (strncmp(logname, "/dev/", 5) && cupsFileTell(*lf) > MaxLogSize &&
138*5e7646d2SAndroid Build Coastguard Worker MaxLogSize > 0))
139*5e7646d2SAndroid Build Coastguard Worker {
140*5e7646d2SAndroid Build Coastguard Worker /*
141*5e7646d2SAndroid Build Coastguard Worker * Handle format strings...
142*5e7646d2SAndroid Build Coastguard Worker */
143*5e7646d2SAndroid Build Coastguard Worker
144*5e7646d2SAndroid Build Coastguard Worker filename[sizeof(filename) - 1] = '\0';
145*5e7646d2SAndroid Build Coastguard Worker
146*5e7646d2SAndroid Build Coastguard Worker if (logname[0] != '/')
147*5e7646d2SAndroid Build Coastguard Worker {
148*5e7646d2SAndroid Build Coastguard Worker strlcpy(filename, ServerRoot, sizeof(filename));
149*5e7646d2SAndroid Build Coastguard Worker strlcat(filename, "/", sizeof(filename));
150*5e7646d2SAndroid Build Coastguard Worker }
151*5e7646d2SAndroid Build Coastguard Worker else
152*5e7646d2SAndroid Build Coastguard Worker filename[0] = '\0';
153*5e7646d2SAndroid Build Coastguard Worker
154*5e7646d2SAndroid Build Coastguard Worker for (logptr = logname, ptr = filename + strlen(filename);
155*5e7646d2SAndroid Build Coastguard Worker *logptr && ptr < (filename + sizeof(filename) - 1);
156*5e7646d2SAndroid Build Coastguard Worker logptr ++)
157*5e7646d2SAndroid Build Coastguard Worker if (*logptr == '%')
158*5e7646d2SAndroid Build Coastguard Worker {
159*5e7646d2SAndroid Build Coastguard Worker /*
160*5e7646d2SAndroid Build Coastguard Worker * Format spec...
161*5e7646d2SAndroid Build Coastguard Worker */
162*5e7646d2SAndroid Build Coastguard Worker
163*5e7646d2SAndroid Build Coastguard Worker logptr ++;
164*5e7646d2SAndroid Build Coastguard Worker if (*logptr == 's')
165*5e7646d2SAndroid Build Coastguard Worker {
166*5e7646d2SAndroid Build Coastguard Worker /*
167*5e7646d2SAndroid Build Coastguard Worker * Insert the server name...
168*5e7646d2SAndroid Build Coastguard Worker */
169*5e7646d2SAndroid Build Coastguard Worker
170*5e7646d2SAndroid Build Coastguard Worker strlcpy(ptr, ServerName, sizeof(filename) - (size_t)(ptr - filename));
171*5e7646d2SAndroid Build Coastguard Worker ptr += strlen(ptr);
172*5e7646d2SAndroid Build Coastguard Worker }
173*5e7646d2SAndroid Build Coastguard Worker else
174*5e7646d2SAndroid Build Coastguard Worker {
175*5e7646d2SAndroid Build Coastguard Worker /*
176*5e7646d2SAndroid Build Coastguard Worker * Otherwise just insert the character...
177*5e7646d2SAndroid Build Coastguard Worker */
178*5e7646d2SAndroid Build Coastguard Worker
179*5e7646d2SAndroid Build Coastguard Worker *ptr++ = *logptr;
180*5e7646d2SAndroid Build Coastguard Worker }
181*5e7646d2SAndroid Build Coastguard Worker }
182*5e7646d2SAndroid Build Coastguard Worker else
183*5e7646d2SAndroid Build Coastguard Worker *ptr++ = *logptr;
184*5e7646d2SAndroid Build Coastguard Worker
185*5e7646d2SAndroid Build Coastguard Worker *ptr = '\0';
186*5e7646d2SAndroid Build Coastguard Worker }
187*5e7646d2SAndroid Build Coastguard Worker
188*5e7646d2SAndroid Build Coastguard Worker /*
189*5e7646d2SAndroid Build Coastguard Worker * See if the log file is open...
190*5e7646d2SAndroid Build Coastguard Worker */
191*5e7646d2SAndroid Build Coastguard Worker
192*5e7646d2SAndroid Build Coastguard Worker if (!*lf)
193*5e7646d2SAndroid Build Coastguard Worker {
194*5e7646d2SAndroid Build Coastguard Worker /*
195*5e7646d2SAndroid Build Coastguard Worker * Nope, open the log file...
196*5e7646d2SAndroid Build Coastguard Worker */
197*5e7646d2SAndroid Build Coastguard Worker
198*5e7646d2SAndroid Build Coastguard Worker if ((*lf = cupsFileOpen(filename, "a")) == NULL)
199*5e7646d2SAndroid Build Coastguard Worker {
200*5e7646d2SAndroid Build Coastguard Worker /*
201*5e7646d2SAndroid Build Coastguard Worker * If the file is in CUPS_LOGDIR then try to create a missing directory...
202*5e7646d2SAndroid Build Coastguard Worker */
203*5e7646d2SAndroid Build Coastguard Worker
204*5e7646d2SAndroid Build Coastguard Worker if (!strncmp(filename, CUPS_LOGDIR, strlen(CUPS_LOGDIR)))
205*5e7646d2SAndroid Build Coastguard Worker {
206*5e7646d2SAndroid Build Coastguard Worker /*
207*5e7646d2SAndroid Build Coastguard Worker * Try updating the permissions of the containing log directory, using
208*5e7646d2SAndroid Build Coastguard Worker * the log file permissions as a basis...
209*5e7646d2SAndroid Build Coastguard Worker */
210*5e7646d2SAndroid Build Coastguard Worker
211*5e7646d2SAndroid Build Coastguard Worker mode_t log_dir_perm = (mode_t)(0300 | LogFilePerm);
212*5e7646d2SAndroid Build Coastguard Worker /* LogFilePerm + owner write/search */
213*5e7646d2SAndroid Build Coastguard Worker if (log_dir_perm & 0040)
214*5e7646d2SAndroid Build Coastguard Worker log_dir_perm |= 0010; /* Add group search */
215*5e7646d2SAndroid Build Coastguard Worker if (log_dir_perm & 0004)
216*5e7646d2SAndroid Build Coastguard Worker log_dir_perm |= 0001; /* Add other search */
217*5e7646d2SAndroid Build Coastguard Worker
218*5e7646d2SAndroid Build Coastguard Worker cupsdCheckPermissions(CUPS_LOGDIR, NULL, log_dir_perm, RunUser, Group, 1, -1);
219*5e7646d2SAndroid Build Coastguard Worker
220*5e7646d2SAndroid Build Coastguard Worker *lf = cupsFileOpen(filename, "a");
221*5e7646d2SAndroid Build Coastguard Worker }
222*5e7646d2SAndroid Build Coastguard Worker
223*5e7646d2SAndroid Build Coastguard Worker if (*lf == NULL)
224*5e7646d2SAndroid Build Coastguard Worker {
225*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
226*5e7646d2SAndroid Build Coastguard Worker sd_journal_print(LOG_ERR, "Unable to open log file \"%s\" - %s", filename, strerror(errno));
227*5e7646d2SAndroid Build Coastguard Worker #else
228*5e7646d2SAndroid Build Coastguard Worker syslog(LOG_ERR, "Unable to open log file \"%s\" - %s", filename, strerror(errno));
229*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
230*5e7646d2SAndroid Build Coastguard Worker
231*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_LOG)
232*5e7646d2SAndroid Build Coastguard Worker cupsdEndProcess(getpid(), 0);
233*5e7646d2SAndroid Build Coastguard Worker
234*5e7646d2SAndroid Build Coastguard Worker return (0);
235*5e7646d2SAndroid Build Coastguard Worker }
236*5e7646d2SAndroid Build Coastguard Worker }
237*5e7646d2SAndroid Build Coastguard Worker
238*5e7646d2SAndroid Build Coastguard Worker if (strncmp(filename, "/dev/", 5))
239*5e7646d2SAndroid Build Coastguard Worker {
240*5e7646d2SAndroid Build Coastguard Worker /*
241*5e7646d2SAndroid Build Coastguard Worker * Change ownership and permissions of non-device logs...
242*5e7646d2SAndroid Build Coastguard Worker */
243*5e7646d2SAndroid Build Coastguard Worker
244*5e7646d2SAndroid Build Coastguard Worker fchown(cupsFileNumber(*lf), RunUser, Group);
245*5e7646d2SAndroid Build Coastguard Worker fchmod(cupsFileNumber(*lf), LogFilePerm);
246*5e7646d2SAndroid Build Coastguard Worker }
247*5e7646d2SAndroid Build Coastguard Worker }
248*5e7646d2SAndroid Build Coastguard Worker
249*5e7646d2SAndroid Build Coastguard Worker /*
250*5e7646d2SAndroid Build Coastguard Worker * Do we need to rotate the log?
251*5e7646d2SAndroid Build Coastguard Worker */
252*5e7646d2SAndroid Build Coastguard Worker
253*5e7646d2SAndroid Build Coastguard Worker if (strncmp(logname, "/dev/", 5) && cupsFileTell(*lf) > MaxLogSize &&
254*5e7646d2SAndroid Build Coastguard Worker MaxLogSize > 0)
255*5e7646d2SAndroid Build Coastguard Worker {
256*5e7646d2SAndroid Build Coastguard Worker /*
257*5e7646d2SAndroid Build Coastguard Worker * Rotate log file...
258*5e7646d2SAndroid Build Coastguard Worker */
259*5e7646d2SAndroid Build Coastguard Worker
260*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(*lf);
261*5e7646d2SAndroid Build Coastguard Worker
262*5e7646d2SAndroid Build Coastguard Worker strlcpy(backname, filename, sizeof(backname));
263*5e7646d2SAndroid Build Coastguard Worker strlcat(backname, ".O", sizeof(backname));
264*5e7646d2SAndroid Build Coastguard Worker
265*5e7646d2SAndroid Build Coastguard Worker unlink(backname);
266*5e7646d2SAndroid Build Coastguard Worker rename(filename, backname);
267*5e7646d2SAndroid Build Coastguard Worker
268*5e7646d2SAndroid Build Coastguard Worker if ((*lf = cupsFileOpen(filename, "a")) == NULL)
269*5e7646d2SAndroid Build Coastguard Worker {
270*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
271*5e7646d2SAndroid Build Coastguard Worker sd_journal_print(LOG_ERR, "Unable to open log file \"%s\" - %s", filename, strerror(errno));
272*5e7646d2SAndroid Build Coastguard Worker
273*5e7646d2SAndroid Build Coastguard Worker #else
274*5e7646d2SAndroid Build Coastguard Worker syslog(LOG_ERR, "Unable to open log file \"%s\" - %s", filename, strerror(errno));
275*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
276*5e7646d2SAndroid Build Coastguard Worker
277*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_LOG)
278*5e7646d2SAndroid Build Coastguard Worker cupsdEndProcess(getpid(), 0);
279*5e7646d2SAndroid Build Coastguard Worker
280*5e7646d2SAndroid Build Coastguard Worker return (0);
281*5e7646d2SAndroid Build Coastguard Worker }
282*5e7646d2SAndroid Build Coastguard Worker
283*5e7646d2SAndroid Build Coastguard Worker /*
284*5e7646d2SAndroid Build Coastguard Worker * Change ownership and permissions of non-device logs...
285*5e7646d2SAndroid Build Coastguard Worker */
286*5e7646d2SAndroid Build Coastguard Worker
287*5e7646d2SAndroid Build Coastguard Worker fchown(cupsFileNumber(*lf), RunUser, Group);
288*5e7646d2SAndroid Build Coastguard Worker fchmod(cupsFileNumber(*lf), LogFilePerm);
289*5e7646d2SAndroid Build Coastguard Worker }
290*5e7646d2SAndroid Build Coastguard Worker
291*5e7646d2SAndroid Build Coastguard Worker return (1);
292*5e7646d2SAndroid Build Coastguard Worker }
293*5e7646d2SAndroid Build Coastguard Worker
294*5e7646d2SAndroid Build Coastguard Worker
295*5e7646d2SAndroid Build Coastguard Worker /*
296*5e7646d2SAndroid Build Coastguard Worker * 'cupsdGetDateTime()' - Returns a pointer to a date/time string.
297*5e7646d2SAndroid Build Coastguard Worker */
298*5e7646d2SAndroid Build Coastguard Worker
299*5e7646d2SAndroid Build Coastguard Worker char * /* O - Date/time string */
cupsdGetDateTime(struct timeval * t,cupsd_time_t format)300*5e7646d2SAndroid Build Coastguard Worker cupsdGetDateTime(struct timeval *t, /* I - Time value or NULL for current */
301*5e7646d2SAndroid Build Coastguard Worker cupsd_time_t format) /* I - Format to use */
302*5e7646d2SAndroid Build Coastguard Worker {
303*5e7646d2SAndroid Build Coastguard Worker struct timeval curtime; /* Current time value */
304*5e7646d2SAndroid Build Coastguard Worker struct tm date; /* Date/time value */
305*5e7646d2SAndroid Build Coastguard Worker static struct timeval last_time = { 0, 0 };
306*5e7646d2SAndroid Build Coastguard Worker /* Last time we formatted */
307*5e7646d2SAndroid Build Coastguard Worker static char s[1024]; /* Date/time string */
308*5e7646d2SAndroid Build Coastguard Worker static const char * const months[12] =/* Months */
309*5e7646d2SAndroid Build Coastguard Worker {
310*5e7646d2SAndroid Build Coastguard Worker "Jan",
311*5e7646d2SAndroid Build Coastguard Worker "Feb",
312*5e7646d2SAndroid Build Coastguard Worker "Mar",
313*5e7646d2SAndroid Build Coastguard Worker "Apr",
314*5e7646d2SAndroid Build Coastguard Worker "May",
315*5e7646d2SAndroid Build Coastguard Worker "Jun",
316*5e7646d2SAndroid Build Coastguard Worker "Jul",
317*5e7646d2SAndroid Build Coastguard Worker "Aug",
318*5e7646d2SAndroid Build Coastguard Worker "Sep",
319*5e7646d2SAndroid Build Coastguard Worker "Oct",
320*5e7646d2SAndroid Build Coastguard Worker "Nov",
321*5e7646d2SAndroid Build Coastguard Worker "Dec"
322*5e7646d2SAndroid Build Coastguard Worker };
323*5e7646d2SAndroid Build Coastguard Worker
324*5e7646d2SAndroid Build Coastguard Worker
325*5e7646d2SAndroid Build Coastguard Worker /*
326*5e7646d2SAndroid Build Coastguard Worker * Make sure we have a valid time...
327*5e7646d2SAndroid Build Coastguard Worker */
328*5e7646d2SAndroid Build Coastguard Worker
329*5e7646d2SAndroid Build Coastguard Worker if (!t)
330*5e7646d2SAndroid Build Coastguard Worker {
331*5e7646d2SAndroid Build Coastguard Worker gettimeofday(&curtime, NULL);
332*5e7646d2SAndroid Build Coastguard Worker t = &curtime;
333*5e7646d2SAndroid Build Coastguard Worker }
334*5e7646d2SAndroid Build Coastguard Worker
335*5e7646d2SAndroid Build Coastguard Worker if (t->tv_sec != last_time.tv_sec ||
336*5e7646d2SAndroid Build Coastguard Worker (LogTimeFormat == CUPSD_TIME_USECS && t->tv_usec != last_time.tv_usec))
337*5e7646d2SAndroid Build Coastguard Worker {
338*5e7646d2SAndroid Build Coastguard Worker last_time = *t;
339*5e7646d2SAndroid Build Coastguard Worker
340*5e7646d2SAndroid Build Coastguard Worker /*
341*5e7646d2SAndroid Build Coastguard Worker * Get the date and time from the UNIX time value, and then format it
342*5e7646d2SAndroid Build Coastguard Worker * into a string. Note that we *can't* use the strftime() function since
343*5e7646d2SAndroid Build Coastguard Worker * it is localized and will seriously confuse automatic programs if the
344*5e7646d2SAndroid Build Coastguard Worker * month names are in the wrong language!
345*5e7646d2SAndroid Build Coastguard Worker *
346*5e7646d2SAndroid Build Coastguard Worker * Also, we use the "timezone" variable that contains the current timezone
347*5e7646d2SAndroid Build Coastguard Worker * offset from GMT in seconds so that we are reporting local time in the
348*5e7646d2SAndroid Build Coastguard Worker * log files. If you want GMT, set the TZ environment variable accordingly
349*5e7646d2SAndroid Build Coastguard Worker * before starting the scheduler.
350*5e7646d2SAndroid Build Coastguard Worker *
351*5e7646d2SAndroid Build Coastguard Worker * (*BSD and Darwin store the timezone offset in the tm structure)
352*5e7646d2SAndroid Build Coastguard Worker */
353*5e7646d2SAndroid Build Coastguard Worker
354*5e7646d2SAndroid Build Coastguard Worker localtime_r(&(t->tv_sec), &date);
355*5e7646d2SAndroid Build Coastguard Worker
356*5e7646d2SAndroid Build Coastguard Worker if (format == CUPSD_TIME_STANDARD)
357*5e7646d2SAndroid Build Coastguard Worker snprintf(s, sizeof(s), "[%02d/%s/%04d:%02d:%02d:%02d %+03ld%02ld]",
358*5e7646d2SAndroid Build Coastguard Worker date.tm_mday, months[date.tm_mon], 1900 + date.tm_year,
359*5e7646d2SAndroid Build Coastguard Worker date.tm_hour, date.tm_min, date.tm_sec,
360*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_TM_GMTOFF
361*5e7646d2SAndroid Build Coastguard Worker date.tm_gmtoff / 3600, (date.tm_gmtoff / 60) % 60);
362*5e7646d2SAndroid Build Coastguard Worker #else
363*5e7646d2SAndroid Build Coastguard Worker timezone / 3600, (timezone / 60) % 60);
364*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_TM_GMTOFF */
365*5e7646d2SAndroid Build Coastguard Worker else
366*5e7646d2SAndroid Build Coastguard Worker snprintf(s, sizeof(s), "[%02d/%s/%04d:%02d:%02d:%02d.%06d %+03ld%02ld]",
367*5e7646d2SAndroid Build Coastguard Worker date.tm_mday, months[date.tm_mon], 1900 + date.tm_year,
368*5e7646d2SAndroid Build Coastguard Worker date.tm_hour, date.tm_min, date.tm_sec, (int)t->tv_usec,
369*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_TM_GMTOFF
370*5e7646d2SAndroid Build Coastguard Worker date.tm_gmtoff / 3600, (date.tm_gmtoff / 60) % 60);
371*5e7646d2SAndroid Build Coastguard Worker #else
372*5e7646d2SAndroid Build Coastguard Worker timezone / 3600, (timezone / 60) % 60);
373*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_TM_GMTOFF */
374*5e7646d2SAndroid Build Coastguard Worker }
375*5e7646d2SAndroid Build Coastguard Worker
376*5e7646d2SAndroid Build Coastguard Worker return (s);
377*5e7646d2SAndroid Build Coastguard Worker }
378*5e7646d2SAndroid Build Coastguard Worker
379*5e7646d2SAndroid Build Coastguard Worker
380*5e7646d2SAndroid Build Coastguard Worker /*
381*5e7646d2SAndroid Build Coastguard Worker * 'cupsdLogFCMessage()' - Log a file checking message.
382*5e7646d2SAndroid Build Coastguard Worker */
383*5e7646d2SAndroid Build Coastguard Worker
384*5e7646d2SAndroid Build Coastguard Worker void
cupsdLogFCMessage(void * context,_cups_fc_result_t result,const char * message)385*5e7646d2SAndroid Build Coastguard Worker cupsdLogFCMessage(
386*5e7646d2SAndroid Build Coastguard Worker void *context, /* I - Printer (if any) */
387*5e7646d2SAndroid Build Coastguard Worker _cups_fc_result_t result, /* I - Check result */
388*5e7646d2SAndroid Build Coastguard Worker const char *message) /* I - Message to log */
389*5e7646d2SAndroid Build Coastguard Worker {
390*5e7646d2SAndroid Build Coastguard Worker cupsd_printer_t *p = (cupsd_printer_t *)context;
391*5e7646d2SAndroid Build Coastguard Worker /* Printer */
392*5e7646d2SAndroid Build Coastguard Worker cupsd_loglevel_t level; /* Log level */
393*5e7646d2SAndroid Build Coastguard Worker
394*5e7646d2SAndroid Build Coastguard Worker
395*5e7646d2SAndroid Build Coastguard Worker if (result == _CUPS_FILE_CHECK_OK)
396*5e7646d2SAndroid Build Coastguard Worker level = CUPSD_LOG_DEBUG2;
397*5e7646d2SAndroid Build Coastguard Worker else
398*5e7646d2SAndroid Build Coastguard Worker level = CUPSD_LOG_ERROR;
399*5e7646d2SAndroid Build Coastguard Worker
400*5e7646d2SAndroid Build Coastguard Worker if (p)
401*5e7646d2SAndroid Build Coastguard Worker {
402*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(level, "%s: %s", p->name, message);
403*5e7646d2SAndroid Build Coastguard Worker
404*5e7646d2SAndroid Build Coastguard Worker if (result == _CUPS_FILE_CHECK_MISSING ||
405*5e7646d2SAndroid Build Coastguard Worker result == _CUPS_FILE_CHECK_WRONG_TYPE)
406*5e7646d2SAndroid Build Coastguard Worker {
407*5e7646d2SAndroid Build Coastguard Worker strlcpy(p->state_message, message, sizeof(p->state_message));
408*5e7646d2SAndroid Build Coastguard Worker
409*5e7646d2SAndroid Build Coastguard Worker if (cupsdSetPrinterReasons(p, "+cups-missing-filter-warning"))
410*5e7646d2SAndroid Build Coastguard Worker cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, p, NULL, "%s", message);
411*5e7646d2SAndroid Build Coastguard Worker }
412*5e7646d2SAndroid Build Coastguard Worker else if (result == _CUPS_FILE_CHECK_PERMISSIONS ||
413*5e7646d2SAndroid Build Coastguard Worker result == _CUPS_FILE_CHECK_RELATIVE_PATH)
414*5e7646d2SAndroid Build Coastguard Worker {
415*5e7646d2SAndroid Build Coastguard Worker strlcpy(p->state_message, message, sizeof(p->state_message));
416*5e7646d2SAndroid Build Coastguard Worker
417*5e7646d2SAndroid Build Coastguard Worker if (cupsdSetPrinterReasons(p, "+cups-insecure-filter-warning"))
418*5e7646d2SAndroid Build Coastguard Worker cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, p, NULL, "%s", message);
419*5e7646d2SAndroid Build Coastguard Worker }
420*5e7646d2SAndroid Build Coastguard Worker }
421*5e7646d2SAndroid Build Coastguard Worker else
422*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(level, "%s", message);
423*5e7646d2SAndroid Build Coastguard Worker }
424*5e7646d2SAndroid Build Coastguard Worker
425*5e7646d2SAndroid Build Coastguard Worker
426*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_GSSAPI
427*5e7646d2SAndroid Build Coastguard Worker /*
428*5e7646d2SAndroid Build Coastguard Worker * 'cupsdLogGSSMessage()' - Log a GSSAPI error...
429*5e7646d2SAndroid Build Coastguard Worker */
430*5e7646d2SAndroid Build Coastguard Worker
431*5e7646d2SAndroid Build Coastguard Worker int /* O - 1 on success, 0 on error */
cupsdLogGSSMessage(int level,OM_uint32 major_status,OM_uint32 minor_status,const char * message,...)432*5e7646d2SAndroid Build Coastguard Worker cupsdLogGSSMessage(
433*5e7646d2SAndroid Build Coastguard Worker int level, /* I - Log level */
434*5e7646d2SAndroid Build Coastguard Worker OM_uint32 major_status, /* I - Major GSSAPI status */
435*5e7646d2SAndroid Build Coastguard Worker OM_uint32 minor_status, /* I - Minor GSSAPI status */
436*5e7646d2SAndroid Build Coastguard Worker const char *message, /* I - printf-style message string */
437*5e7646d2SAndroid Build Coastguard Worker ...) /* I - Additional args as needed */
438*5e7646d2SAndroid Build Coastguard Worker {
439*5e7646d2SAndroid Build Coastguard Worker OM_uint32 err_major_status, /* Major status code for display */
440*5e7646d2SAndroid Build Coastguard Worker err_minor_status; /* Minor status code for display */
441*5e7646d2SAndroid Build Coastguard Worker OM_uint32 msg_ctx; /* Message context */
442*5e7646d2SAndroid Build Coastguard Worker gss_buffer_desc major_status_string = GSS_C_EMPTY_BUFFER,
443*5e7646d2SAndroid Build Coastguard Worker /* Major status message */
444*5e7646d2SAndroid Build Coastguard Worker minor_status_string = GSS_C_EMPTY_BUFFER;
445*5e7646d2SAndroid Build Coastguard Worker /* Minor status message */
446*5e7646d2SAndroid Build Coastguard Worker int ret; /* Return value */
447*5e7646d2SAndroid Build Coastguard Worker char buffer[8192]; /* Buffer for vsnprintf */
448*5e7646d2SAndroid Build Coastguard Worker
449*5e7646d2SAndroid Build Coastguard Worker
450*5e7646d2SAndroid Build Coastguard Worker if (strchr(message, '%'))
451*5e7646d2SAndroid Build Coastguard Worker {
452*5e7646d2SAndroid Build Coastguard Worker /*
453*5e7646d2SAndroid Build Coastguard Worker * Format the message string...
454*5e7646d2SAndroid Build Coastguard Worker */
455*5e7646d2SAndroid Build Coastguard Worker
456*5e7646d2SAndroid Build Coastguard Worker va_list ap; /* Pointer to arguments */
457*5e7646d2SAndroid Build Coastguard Worker
458*5e7646d2SAndroid Build Coastguard Worker va_start(ap, message);
459*5e7646d2SAndroid Build Coastguard Worker vsnprintf(buffer, sizeof(buffer), message, ap);
460*5e7646d2SAndroid Build Coastguard Worker va_end(ap);
461*5e7646d2SAndroid Build Coastguard Worker
462*5e7646d2SAndroid Build Coastguard Worker message = buffer;
463*5e7646d2SAndroid Build Coastguard Worker }
464*5e7646d2SAndroid Build Coastguard Worker
465*5e7646d2SAndroid Build Coastguard Worker msg_ctx = 0;
466*5e7646d2SAndroid Build Coastguard Worker err_major_status = gss_display_status(&err_minor_status,
467*5e7646d2SAndroid Build Coastguard Worker major_status,
468*5e7646d2SAndroid Build Coastguard Worker GSS_C_GSS_CODE,
469*5e7646d2SAndroid Build Coastguard Worker GSS_C_NO_OID,
470*5e7646d2SAndroid Build Coastguard Worker &msg_ctx,
471*5e7646d2SAndroid Build Coastguard Worker &major_status_string);
472*5e7646d2SAndroid Build Coastguard Worker
473*5e7646d2SAndroid Build Coastguard Worker if (!GSS_ERROR(err_major_status))
474*5e7646d2SAndroid Build Coastguard Worker gss_display_status(&err_minor_status, minor_status, GSS_C_MECH_CODE,
475*5e7646d2SAndroid Build Coastguard Worker GSS_C_NULL_OID, &msg_ctx, &minor_status_string);
476*5e7646d2SAndroid Build Coastguard Worker
477*5e7646d2SAndroid Build Coastguard Worker ret = cupsdLogMessage(level, "%s: %s, %s", message,
478*5e7646d2SAndroid Build Coastguard Worker (char *)major_status_string.value,
479*5e7646d2SAndroid Build Coastguard Worker (char *)minor_status_string.value);
480*5e7646d2SAndroid Build Coastguard Worker gss_release_buffer(&err_minor_status, &major_status_string);
481*5e7646d2SAndroid Build Coastguard Worker gss_release_buffer(&err_minor_status, &minor_status_string);
482*5e7646d2SAndroid Build Coastguard Worker
483*5e7646d2SAndroid Build Coastguard Worker return (ret);
484*5e7646d2SAndroid Build Coastguard Worker }
485*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_GSSAPI */
486*5e7646d2SAndroid Build Coastguard Worker
487*5e7646d2SAndroid Build Coastguard Worker
488*5e7646d2SAndroid Build Coastguard Worker /*
489*5e7646d2SAndroid Build Coastguard Worker * 'cupsdLogClient()' - Log a client message.
490*5e7646d2SAndroid Build Coastguard Worker */
491*5e7646d2SAndroid Build Coastguard Worker
492*5e7646d2SAndroid Build Coastguard Worker int /* O - 1 on success, 0 on error */
cupsdLogClient(cupsd_client_t * con,int level,const char * message,...)493*5e7646d2SAndroid Build Coastguard Worker cupsdLogClient(cupsd_client_t *con, /* I - Client connection */
494*5e7646d2SAndroid Build Coastguard Worker int level, /* I - Log level */
495*5e7646d2SAndroid Build Coastguard Worker const char *message, /* I - Printf-style message string */
496*5e7646d2SAndroid Build Coastguard Worker ...) /* I - Additional arguments as needed */
497*5e7646d2SAndroid Build Coastguard Worker {
498*5e7646d2SAndroid Build Coastguard Worker va_list ap, ap2; /* Argument pointers */
499*5e7646d2SAndroid Build Coastguard Worker char clientmsg[1024];/* Format string for client message */
500*5e7646d2SAndroid Build Coastguard Worker int status; /* Formatting status */
501*5e7646d2SAndroid Build Coastguard Worker
502*5e7646d2SAndroid Build Coastguard Worker
503*5e7646d2SAndroid Build Coastguard Worker /*
504*5e7646d2SAndroid Build Coastguard Worker * See if we want to log this message...
505*5e7646d2SAndroid Build Coastguard Worker */
506*5e7646d2SAndroid Build Coastguard Worker
507*5e7646d2SAndroid Build Coastguard Worker if (TestConfigFile || !ErrorLog)
508*5e7646d2SAndroid Build Coastguard Worker return (1);
509*5e7646d2SAndroid Build Coastguard Worker
510*5e7646d2SAndroid Build Coastguard Worker if (level > LogLevel)
511*5e7646d2SAndroid Build Coastguard Worker return (1);
512*5e7646d2SAndroid Build Coastguard Worker
513*5e7646d2SAndroid Build Coastguard Worker /*
514*5e7646d2SAndroid Build Coastguard Worker * Format and write the log message...
515*5e7646d2SAndroid Build Coastguard Worker */
516*5e7646d2SAndroid Build Coastguard Worker
517*5e7646d2SAndroid Build Coastguard Worker if (con)
518*5e7646d2SAndroid Build Coastguard Worker snprintf(clientmsg, sizeof(clientmsg), "[Client %d] %s", con->number,
519*5e7646d2SAndroid Build Coastguard Worker message);
520*5e7646d2SAndroid Build Coastguard Worker else
521*5e7646d2SAndroid Build Coastguard Worker strlcpy(clientmsg, message, sizeof(clientmsg));
522*5e7646d2SAndroid Build Coastguard Worker
523*5e7646d2SAndroid Build Coastguard Worker va_start(ap, message);
524*5e7646d2SAndroid Build Coastguard Worker
525*5e7646d2SAndroid Build Coastguard Worker do
526*5e7646d2SAndroid Build Coastguard Worker {
527*5e7646d2SAndroid Build Coastguard Worker va_copy(ap2, ap);
528*5e7646d2SAndroid Build Coastguard Worker status = format_log_line(clientmsg, ap2);
529*5e7646d2SAndroid Build Coastguard Worker va_end(ap2);
530*5e7646d2SAndroid Build Coastguard Worker }
531*5e7646d2SAndroid Build Coastguard Worker while (status == 0);
532*5e7646d2SAndroid Build Coastguard Worker
533*5e7646d2SAndroid Build Coastguard Worker va_end(ap);
534*5e7646d2SAndroid Build Coastguard Worker
535*5e7646d2SAndroid Build Coastguard Worker if (status > 0)
536*5e7646d2SAndroid Build Coastguard Worker return (cupsdWriteErrorLog(level, log_line));
537*5e7646d2SAndroid Build Coastguard Worker else
538*5e7646d2SAndroid Build Coastguard Worker return (cupsdWriteErrorLog(CUPSD_LOG_ERROR,
539*5e7646d2SAndroid Build Coastguard Worker "Unable to allocate memory for log line."));
540*5e7646d2SAndroid Build Coastguard Worker }
541*5e7646d2SAndroid Build Coastguard Worker
542*5e7646d2SAndroid Build Coastguard Worker
543*5e7646d2SAndroid Build Coastguard Worker /*
544*5e7646d2SAndroid Build Coastguard Worker * 'cupsdLogJob()' - Log a job message.
545*5e7646d2SAndroid Build Coastguard Worker */
546*5e7646d2SAndroid Build Coastguard Worker
547*5e7646d2SAndroid Build Coastguard Worker int /* O - 1 on success, 0 on error */
cupsdLogJob(cupsd_job_t * job,int level,const char * message,...)548*5e7646d2SAndroid Build Coastguard Worker cupsdLogJob(cupsd_job_t *job, /* I - Job */
549*5e7646d2SAndroid Build Coastguard Worker int level, /* I - Log level */
550*5e7646d2SAndroid Build Coastguard Worker const char *message, /* I - Printf-style message string */
551*5e7646d2SAndroid Build Coastguard Worker ...) /* I - Additional arguments as needed */
552*5e7646d2SAndroid Build Coastguard Worker {
553*5e7646d2SAndroid Build Coastguard Worker va_list ap, ap2; /* Argument pointers */
554*5e7646d2SAndroid Build Coastguard Worker char jobmsg[1024]; /* Format string for job message */
555*5e7646d2SAndroid Build Coastguard Worker int status; /* Formatting status */
556*5e7646d2SAndroid Build Coastguard Worker
557*5e7646d2SAndroid Build Coastguard Worker
558*5e7646d2SAndroid Build Coastguard Worker /*
559*5e7646d2SAndroid Build Coastguard Worker * See if we want to log this message...
560*5e7646d2SAndroid Build Coastguard Worker */
561*5e7646d2SAndroid Build Coastguard Worker
562*5e7646d2SAndroid Build Coastguard Worker if (TestConfigFile || !ErrorLog)
563*5e7646d2SAndroid Build Coastguard Worker return (1);
564*5e7646d2SAndroid Build Coastguard Worker
565*5e7646d2SAndroid Build Coastguard Worker if (level > LogLevel && LogDebugHistory <= 0)
566*5e7646d2SAndroid Build Coastguard Worker return (1);
567*5e7646d2SAndroid Build Coastguard Worker
568*5e7646d2SAndroid Build Coastguard Worker /*
569*5e7646d2SAndroid Build Coastguard Worker * Format and write the log message...
570*5e7646d2SAndroid Build Coastguard Worker */
571*5e7646d2SAndroid Build Coastguard Worker
572*5e7646d2SAndroid Build Coastguard Worker if (job)
573*5e7646d2SAndroid Build Coastguard Worker snprintf(jobmsg, sizeof(jobmsg), "[Job %d] %s", job->id, message);
574*5e7646d2SAndroid Build Coastguard Worker else
575*5e7646d2SAndroid Build Coastguard Worker strlcpy(jobmsg, message, sizeof(jobmsg));
576*5e7646d2SAndroid Build Coastguard Worker
577*5e7646d2SAndroid Build Coastguard Worker va_start(ap, message);
578*5e7646d2SAndroid Build Coastguard Worker
579*5e7646d2SAndroid Build Coastguard Worker do
580*5e7646d2SAndroid Build Coastguard Worker {
581*5e7646d2SAndroid Build Coastguard Worker va_copy(ap2, ap);
582*5e7646d2SAndroid Build Coastguard Worker status = format_log_line(jobmsg, ap2);
583*5e7646d2SAndroid Build Coastguard Worker va_end(ap2);
584*5e7646d2SAndroid Build Coastguard Worker }
585*5e7646d2SAndroid Build Coastguard Worker while (status == 0);
586*5e7646d2SAndroid Build Coastguard Worker
587*5e7646d2SAndroid Build Coastguard Worker va_end(ap);
588*5e7646d2SAndroid Build Coastguard Worker
589*5e7646d2SAndroid Build Coastguard Worker if (status > 0)
590*5e7646d2SAndroid Build Coastguard Worker {
591*5e7646d2SAndroid Build Coastguard Worker if (job && level > LogLevel && LogDebugHistory > 0)
592*5e7646d2SAndroid Build Coastguard Worker {
593*5e7646d2SAndroid Build Coastguard Worker /*
594*5e7646d2SAndroid Build Coastguard Worker * Add message to the job history...
595*5e7646d2SAndroid Build Coastguard Worker */
596*5e7646d2SAndroid Build Coastguard Worker
597*5e7646d2SAndroid Build Coastguard Worker cupsd_joblog_t *temp; /* Copy of log message */
598*5e7646d2SAndroid Build Coastguard Worker size_t log_len = strlen(log_line);
599*5e7646d2SAndroid Build Coastguard Worker /* Length of log message */
600*5e7646d2SAndroid Build Coastguard Worker
601*5e7646d2SAndroid Build Coastguard Worker if ((temp = malloc(sizeof(cupsd_joblog_t) + log_len)) != NULL)
602*5e7646d2SAndroid Build Coastguard Worker {
603*5e7646d2SAndroid Build Coastguard Worker temp->time = time(NULL);
604*5e7646d2SAndroid Build Coastguard Worker memcpy(temp->message, log_line, log_len + 1);
605*5e7646d2SAndroid Build Coastguard Worker }
606*5e7646d2SAndroid Build Coastguard Worker
607*5e7646d2SAndroid Build Coastguard Worker if (!job->history)
608*5e7646d2SAndroid Build Coastguard Worker job->history = cupsArrayNew(NULL, NULL);
609*5e7646d2SAndroid Build Coastguard Worker
610*5e7646d2SAndroid Build Coastguard Worker if (job->history && temp)
611*5e7646d2SAndroid Build Coastguard Worker {
612*5e7646d2SAndroid Build Coastguard Worker cupsArrayAdd(job->history, temp);
613*5e7646d2SAndroid Build Coastguard Worker
614*5e7646d2SAndroid Build Coastguard Worker if (cupsArrayCount(job->history) > LogDebugHistory)
615*5e7646d2SAndroid Build Coastguard Worker {
616*5e7646d2SAndroid Build Coastguard Worker /*
617*5e7646d2SAndroid Build Coastguard Worker * Remove excess messages...
618*5e7646d2SAndroid Build Coastguard Worker */
619*5e7646d2SAndroid Build Coastguard Worker
620*5e7646d2SAndroid Build Coastguard Worker temp = cupsArrayFirst(job->history);
621*5e7646d2SAndroid Build Coastguard Worker cupsArrayRemove(job->history, temp);
622*5e7646d2SAndroid Build Coastguard Worker free(temp);
623*5e7646d2SAndroid Build Coastguard Worker }
624*5e7646d2SAndroid Build Coastguard Worker }
625*5e7646d2SAndroid Build Coastguard Worker else if (temp)
626*5e7646d2SAndroid Build Coastguard Worker free(temp);
627*5e7646d2SAndroid Build Coastguard Worker
628*5e7646d2SAndroid Build Coastguard Worker return (1);
629*5e7646d2SAndroid Build Coastguard Worker }
630*5e7646d2SAndroid Build Coastguard Worker else if (level <= LogLevel)
631*5e7646d2SAndroid Build Coastguard Worker {
632*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
633*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(ErrorLog, "syslog"))
634*5e7646d2SAndroid Build Coastguard Worker {
635*5e7646d2SAndroid Build Coastguard Worker cupsd_printer_t *printer = job ? (job->printer ? job->printer : (job->dest ? cupsdFindDest(job->dest) : NULL)) : NULL;
636*5e7646d2SAndroid Build Coastguard Worker static const char * const job_states[] =
637*5e7646d2SAndroid Build Coastguard Worker { /* job-state strings */
638*5e7646d2SAndroid Build Coastguard Worker "Pending",
639*5e7646d2SAndroid Build Coastguard Worker "PendingHeld",
640*5e7646d2SAndroid Build Coastguard Worker "Processing",
641*5e7646d2SAndroid Build Coastguard Worker "ProcessingStopped",
642*5e7646d2SAndroid Build Coastguard Worker "Canceled",
643*5e7646d2SAndroid Build Coastguard Worker "Aborted",
644*5e7646d2SAndroid Build Coastguard Worker "Completed"
645*5e7646d2SAndroid Build Coastguard Worker };
646*5e7646d2SAndroid Build Coastguard Worker
647*5e7646d2SAndroid Build Coastguard Worker if (job)
648*5e7646d2SAndroid Build Coastguard Worker sd_journal_send("MESSAGE=%s", log_line,
649*5e7646d2SAndroid Build Coastguard Worker "PRIORITY=%i", log_levels[level],
650*5e7646d2SAndroid Build Coastguard Worker PWG_Event"=JobStateChanged",
651*5e7646d2SAndroid Build Coastguard Worker PWG_ServiceURI"=%s", printer ? printer->uri : "",
652*5e7646d2SAndroid Build Coastguard Worker PWG_JobID"=%d", job->id,
653*5e7646d2SAndroid Build Coastguard Worker PWG_JobState"=%s", job->state_value < IPP_JSTATE_PENDING ? "" : job_states[job->state_value - IPP_JSTATE_PENDING],
654*5e7646d2SAndroid Build Coastguard Worker PWG_JobImpressionsCompleted"=%d", ippGetInteger(job->impressions, 0),
655*5e7646d2SAndroid Build Coastguard Worker NULL);
656*5e7646d2SAndroid Build Coastguard Worker else
657*5e7646d2SAndroid Build Coastguard Worker sd_journal_send("MESSAGE=%s", log_line,
658*5e7646d2SAndroid Build Coastguard Worker "PRIORITY=%i", log_levels[level],
659*5e7646d2SAndroid Build Coastguard Worker NULL);
660*5e7646d2SAndroid Build Coastguard Worker
661*5e7646d2SAndroid Build Coastguard Worker return (1);
662*5e7646d2SAndroid Build Coastguard Worker }
663*5e7646d2SAndroid Build Coastguard Worker else
664*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
665*5e7646d2SAndroid Build Coastguard Worker
666*5e7646d2SAndroid Build Coastguard Worker return (cupsdWriteErrorLog(level, log_line));
667*5e7646d2SAndroid Build Coastguard Worker }
668*5e7646d2SAndroid Build Coastguard Worker else
669*5e7646d2SAndroid Build Coastguard Worker return (1);
670*5e7646d2SAndroid Build Coastguard Worker }
671*5e7646d2SAndroid Build Coastguard Worker else
672*5e7646d2SAndroid Build Coastguard Worker return (cupsdWriteErrorLog(CUPSD_LOG_ERROR,
673*5e7646d2SAndroid Build Coastguard Worker "Unable to allocate memory for log line."));
674*5e7646d2SAndroid Build Coastguard Worker }
675*5e7646d2SAndroid Build Coastguard Worker
676*5e7646d2SAndroid Build Coastguard Worker
677*5e7646d2SAndroid Build Coastguard Worker /*
678*5e7646d2SAndroid Build Coastguard Worker * 'cupsdLogMessage()' - Log a message to the error log file.
679*5e7646d2SAndroid Build Coastguard Worker */
680*5e7646d2SAndroid Build Coastguard Worker
681*5e7646d2SAndroid Build Coastguard Worker int /* O - 1 on success, 0 on error */
cupsdLogMessage(int level,const char * message,...)682*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(int level, /* I - Log level */
683*5e7646d2SAndroid Build Coastguard Worker const char *message, /* I - printf-style message string */
684*5e7646d2SAndroid Build Coastguard Worker ...) /* I - Additional args as needed */
685*5e7646d2SAndroid Build Coastguard Worker {
686*5e7646d2SAndroid Build Coastguard Worker va_list ap, ap2; /* Argument pointers */
687*5e7646d2SAndroid Build Coastguard Worker int status; /* Formatting status */
688*5e7646d2SAndroid Build Coastguard Worker
689*5e7646d2SAndroid Build Coastguard Worker
690*5e7646d2SAndroid Build Coastguard Worker /*
691*5e7646d2SAndroid Build Coastguard Worker * See if we want to log this message...
692*5e7646d2SAndroid Build Coastguard Worker */
693*5e7646d2SAndroid Build Coastguard Worker
694*5e7646d2SAndroid Build Coastguard Worker if (TestConfigFile && level <= CUPSD_LOG_WARN)
695*5e7646d2SAndroid Build Coastguard Worker {
696*5e7646d2SAndroid Build Coastguard Worker va_start(ap, message);
697*5e7646d2SAndroid Build Coastguard Worker
698*5e7646d2SAndroid Build Coastguard Worker vfprintf(stderr, message, ap);
699*5e7646d2SAndroid Build Coastguard Worker putc('\n', stderr);
700*5e7646d2SAndroid Build Coastguard Worker
701*5e7646d2SAndroid Build Coastguard Worker va_end(ap);
702*5e7646d2SAndroid Build Coastguard Worker
703*5e7646d2SAndroid Build Coastguard Worker return (1);
704*5e7646d2SAndroid Build Coastguard Worker }
705*5e7646d2SAndroid Build Coastguard Worker else if (!ErrorLog && level <= CUPSD_LOG_WARN)
706*5e7646d2SAndroid Build Coastguard Worker {
707*5e7646d2SAndroid Build Coastguard Worker va_start(ap, message);
708*5e7646d2SAndroid Build Coastguard Worker
709*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
710*5e7646d2SAndroid Build Coastguard Worker sd_journal_printv(log_levels[level], message, ap);
711*5e7646d2SAndroid Build Coastguard Worker
712*5e7646d2SAndroid Build Coastguard Worker #elif defined(HAVE_VSYSLOG)
713*5e7646d2SAndroid Build Coastguard Worker vsyslog(LOG_LPR | log_levels[level], message, ap);
714*5e7646d2SAndroid Build Coastguard Worker
715*5e7646d2SAndroid Build Coastguard Worker #else
716*5e7646d2SAndroid Build Coastguard Worker vfprintf(stderr, message, ap);
717*5e7646d2SAndroid Build Coastguard Worker putc('\n', stderr);
718*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
719*5e7646d2SAndroid Build Coastguard Worker
720*5e7646d2SAndroid Build Coastguard Worker va_end(ap);
721*5e7646d2SAndroid Build Coastguard Worker
722*5e7646d2SAndroid Build Coastguard Worker return (1);
723*5e7646d2SAndroid Build Coastguard Worker }
724*5e7646d2SAndroid Build Coastguard Worker else if (level > LogLevel || !ErrorLog)
725*5e7646d2SAndroid Build Coastguard Worker return (1);
726*5e7646d2SAndroid Build Coastguard Worker
727*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
728*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(ErrorLog, "syslog"))
729*5e7646d2SAndroid Build Coastguard Worker {
730*5e7646d2SAndroid Build Coastguard Worker va_start(ap, message);
731*5e7646d2SAndroid Build Coastguard Worker sd_journal_printv(log_levels[level], message, ap);
732*5e7646d2SAndroid Build Coastguard Worker va_end(ap);
733*5e7646d2SAndroid Build Coastguard Worker return (1);
734*5e7646d2SAndroid Build Coastguard Worker }
735*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
736*5e7646d2SAndroid Build Coastguard Worker
737*5e7646d2SAndroid Build Coastguard Worker /*
738*5e7646d2SAndroid Build Coastguard Worker * Format and write the log message...
739*5e7646d2SAndroid Build Coastguard Worker */
740*5e7646d2SAndroid Build Coastguard Worker
741*5e7646d2SAndroid Build Coastguard Worker va_start(ap, message);
742*5e7646d2SAndroid Build Coastguard Worker
743*5e7646d2SAndroid Build Coastguard Worker do
744*5e7646d2SAndroid Build Coastguard Worker {
745*5e7646d2SAndroid Build Coastguard Worker va_copy(ap2, ap);
746*5e7646d2SAndroid Build Coastguard Worker status = format_log_line(message, ap2);
747*5e7646d2SAndroid Build Coastguard Worker va_end(ap2);
748*5e7646d2SAndroid Build Coastguard Worker }
749*5e7646d2SAndroid Build Coastguard Worker while (status == 0);
750*5e7646d2SAndroid Build Coastguard Worker
751*5e7646d2SAndroid Build Coastguard Worker va_end(ap);
752*5e7646d2SAndroid Build Coastguard Worker
753*5e7646d2SAndroid Build Coastguard Worker if (status > 0)
754*5e7646d2SAndroid Build Coastguard Worker return (cupsdWriteErrorLog(level, log_line));
755*5e7646d2SAndroid Build Coastguard Worker else
756*5e7646d2SAndroid Build Coastguard Worker return (cupsdWriteErrorLog(CUPSD_LOG_ERROR,
757*5e7646d2SAndroid Build Coastguard Worker "Unable to allocate memory for log line!"));
758*5e7646d2SAndroid Build Coastguard Worker }
759*5e7646d2SAndroid Build Coastguard Worker
760*5e7646d2SAndroid Build Coastguard Worker
761*5e7646d2SAndroid Build Coastguard Worker /*
762*5e7646d2SAndroid Build Coastguard Worker * 'cupsdLogPage()' - Log a page to the page log file.
763*5e7646d2SAndroid Build Coastguard Worker */
764*5e7646d2SAndroid Build Coastguard Worker
765*5e7646d2SAndroid Build Coastguard Worker int /* O - 1 on success, 0 on error */
cupsdLogPage(cupsd_job_t * job,const char * page)766*5e7646d2SAndroid Build Coastguard Worker cupsdLogPage(cupsd_job_t *job, /* I - Job being printed */
767*5e7646d2SAndroid Build Coastguard Worker const char *page) /* I - Page being printed */
768*5e7646d2SAndroid Build Coastguard Worker {
769*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
770*5e7646d2SAndroid Build Coastguard Worker char buffer[2048], /* Buffer for page log */
771*5e7646d2SAndroid Build Coastguard Worker *bufptr, /* Pointer into buffer */
772*5e7646d2SAndroid Build Coastguard Worker name[256]; /* Attribute name */
773*5e7646d2SAndroid Build Coastguard Worker const char *format, /* Pointer into PageLogFormat */
774*5e7646d2SAndroid Build Coastguard Worker *nameend; /* End of attribute name */
775*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *attr; /* Current attribute */
776*5e7646d2SAndroid Build Coastguard Worker char number[256]; /* Page number */
777*5e7646d2SAndroid Build Coastguard Worker int copies; /* Number of copies */
778*5e7646d2SAndroid Build Coastguard Worker
779*5e7646d2SAndroid Build Coastguard Worker
780*5e7646d2SAndroid Build Coastguard Worker /*
781*5e7646d2SAndroid Build Coastguard Worker * Format the line going into the page log...
782*5e7646d2SAndroid Build Coastguard Worker */
783*5e7646d2SAndroid Build Coastguard Worker
784*5e7646d2SAndroid Build Coastguard Worker if (!PageLogFormat)
785*5e7646d2SAndroid Build Coastguard Worker return (1);
786*5e7646d2SAndroid Build Coastguard Worker
787*5e7646d2SAndroid Build Coastguard Worker strlcpy(number, "1", sizeof(number));
788*5e7646d2SAndroid Build Coastguard Worker copies = 1;
789*5e7646d2SAndroid Build Coastguard Worker sscanf(page, "%255s%d", number, &copies);
790*5e7646d2SAndroid Build Coastguard Worker
791*5e7646d2SAndroid Build Coastguard Worker for (format = PageLogFormat, bufptr = buffer; *format; format ++)
792*5e7646d2SAndroid Build Coastguard Worker {
793*5e7646d2SAndroid Build Coastguard Worker if (*format == '%')
794*5e7646d2SAndroid Build Coastguard Worker {
795*5e7646d2SAndroid Build Coastguard Worker format ++;
796*5e7646d2SAndroid Build Coastguard Worker
797*5e7646d2SAndroid Build Coastguard Worker switch (*format)
798*5e7646d2SAndroid Build Coastguard Worker {
799*5e7646d2SAndroid Build Coastguard Worker case '%' : /* Literal % */
800*5e7646d2SAndroid Build Coastguard Worker if (bufptr < (buffer + sizeof(buffer) - 1))
801*5e7646d2SAndroid Build Coastguard Worker *bufptr++ = '%';
802*5e7646d2SAndroid Build Coastguard Worker break;
803*5e7646d2SAndroid Build Coastguard Worker
804*5e7646d2SAndroid Build Coastguard Worker case 'p' : /* Printer name */
805*5e7646d2SAndroid Build Coastguard Worker strlcpy(bufptr, job->dest, sizeof(buffer) - (size_t)(bufptr - buffer));
806*5e7646d2SAndroid Build Coastguard Worker bufptr += strlen(bufptr);
807*5e7646d2SAndroid Build Coastguard Worker break;
808*5e7646d2SAndroid Build Coastguard Worker
809*5e7646d2SAndroid Build Coastguard Worker case 'j' : /* Job ID */
810*5e7646d2SAndroid Build Coastguard Worker snprintf(bufptr, sizeof(buffer) - (size_t)(bufptr - buffer), "%d", job->id);
811*5e7646d2SAndroid Build Coastguard Worker bufptr += strlen(bufptr);
812*5e7646d2SAndroid Build Coastguard Worker break;
813*5e7646d2SAndroid Build Coastguard Worker
814*5e7646d2SAndroid Build Coastguard Worker case 'u' : /* Username */
815*5e7646d2SAndroid Build Coastguard Worker strlcpy(bufptr, job->username ? job->username : "-", sizeof(buffer) - (size_t)(bufptr - buffer));
816*5e7646d2SAndroid Build Coastguard Worker bufptr += strlen(bufptr);
817*5e7646d2SAndroid Build Coastguard Worker break;
818*5e7646d2SAndroid Build Coastguard Worker
819*5e7646d2SAndroid Build Coastguard Worker case 'T' : /* Date and time */
820*5e7646d2SAndroid Build Coastguard Worker strlcpy(bufptr, cupsdGetDateTime(NULL, LogTimeFormat), sizeof(buffer) - (size_t)(bufptr - buffer));
821*5e7646d2SAndroid Build Coastguard Worker bufptr += strlen(bufptr);
822*5e7646d2SAndroid Build Coastguard Worker break;
823*5e7646d2SAndroid Build Coastguard Worker
824*5e7646d2SAndroid Build Coastguard Worker case 'P' : /* Page number */
825*5e7646d2SAndroid Build Coastguard Worker strlcpy(bufptr, number, sizeof(buffer) - (size_t)(bufptr - buffer));
826*5e7646d2SAndroid Build Coastguard Worker bufptr += strlen(bufptr);
827*5e7646d2SAndroid Build Coastguard Worker break;
828*5e7646d2SAndroid Build Coastguard Worker
829*5e7646d2SAndroid Build Coastguard Worker case 'C' : /* Number of copies */
830*5e7646d2SAndroid Build Coastguard Worker snprintf(bufptr, sizeof(buffer) - (size_t)(bufptr - buffer), "%d", copies);
831*5e7646d2SAndroid Build Coastguard Worker bufptr += strlen(bufptr);
832*5e7646d2SAndroid Build Coastguard Worker break;
833*5e7646d2SAndroid Build Coastguard Worker
834*5e7646d2SAndroid Build Coastguard Worker case '{' : /* {attribute} */
835*5e7646d2SAndroid Build Coastguard Worker if ((nameend = strchr(format, '}')) != NULL && (size_t)(nameend - format - 2) < (sizeof(name) - 1))
836*5e7646d2SAndroid Build Coastguard Worker {
837*5e7646d2SAndroid Build Coastguard Worker /*
838*5e7646d2SAndroid Build Coastguard Worker * Pull the name from inside the brackets...
839*5e7646d2SAndroid Build Coastguard Worker */
840*5e7646d2SAndroid Build Coastguard Worker
841*5e7646d2SAndroid Build Coastguard Worker memcpy(name, format + 1, (size_t)(nameend - format - 1));
842*5e7646d2SAndroid Build Coastguard Worker name[nameend - format - 1] = '\0';
843*5e7646d2SAndroid Build Coastguard Worker
844*5e7646d2SAndroid Build Coastguard Worker format = nameend;
845*5e7646d2SAndroid Build Coastguard Worker
846*5e7646d2SAndroid Build Coastguard Worker attr = ippFindAttribute(job->attrs, name, IPP_TAG_ZERO);
847*5e7646d2SAndroid Build Coastguard Worker if (!attr && !strcmp(name, "job-billing"))
848*5e7646d2SAndroid Build Coastguard Worker {
849*5e7646d2SAndroid Build Coastguard Worker /*
850*5e7646d2SAndroid Build Coastguard Worker * Handle alias "job-account-id" (which was standardized after
851*5e7646d2SAndroid Build Coastguard Worker * "job-billing" was defined for CUPS...
852*5e7646d2SAndroid Build Coastguard Worker */
853*5e7646d2SAndroid Build Coastguard Worker
854*5e7646d2SAndroid Build Coastguard Worker attr = ippFindAttribute(job->attrs, "job-account-id", IPP_TAG_ZERO);
855*5e7646d2SAndroid Build Coastguard Worker }
856*5e7646d2SAndroid Build Coastguard Worker else if (!attr && !strcmp(name, "media"))
857*5e7646d2SAndroid Build Coastguard Worker {
858*5e7646d2SAndroid Build Coastguard Worker /*
859*5e7646d2SAndroid Build Coastguard Worker * Handle alias "media-col" which uses dimensions instead of
860*5e7646d2SAndroid Build Coastguard Worker * names...
861*5e7646d2SAndroid Build Coastguard Worker */
862*5e7646d2SAndroid Build Coastguard Worker
863*5e7646d2SAndroid Build Coastguard Worker attr = ippFindAttribute(job->attrs, "media-col/media-size", IPP_TAG_BEGIN_COLLECTION);
864*5e7646d2SAndroid Build Coastguard Worker }
865*5e7646d2SAndroid Build Coastguard Worker
866*5e7646d2SAndroid Build Coastguard Worker if (attr)
867*5e7646d2SAndroid Build Coastguard Worker {
868*5e7646d2SAndroid Build Coastguard Worker /*
869*5e7646d2SAndroid Build Coastguard Worker * Add the attribute value...
870*5e7646d2SAndroid Build Coastguard Worker */
871*5e7646d2SAndroid Build Coastguard Worker
872*5e7646d2SAndroid Build Coastguard Worker for (i = 0;
873*5e7646d2SAndroid Build Coastguard Worker i < attr->num_values &&
874*5e7646d2SAndroid Build Coastguard Worker bufptr < (buffer + sizeof(buffer) - 1);
875*5e7646d2SAndroid Build Coastguard Worker i ++)
876*5e7646d2SAndroid Build Coastguard Worker {
877*5e7646d2SAndroid Build Coastguard Worker if (i)
878*5e7646d2SAndroid Build Coastguard Worker *bufptr++ = ',';
879*5e7646d2SAndroid Build Coastguard Worker
880*5e7646d2SAndroid Build Coastguard Worker switch (attr->value_tag)
881*5e7646d2SAndroid Build Coastguard Worker {
882*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_INTEGER :
883*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_ENUM :
884*5e7646d2SAndroid Build Coastguard Worker snprintf(bufptr, sizeof(buffer) - (size_t)(bufptr - buffer), "%d", attr->values[i].integer);
885*5e7646d2SAndroid Build Coastguard Worker bufptr += strlen(bufptr);
886*5e7646d2SAndroid Build Coastguard Worker break;
887*5e7646d2SAndroid Build Coastguard Worker
888*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_BOOLEAN :
889*5e7646d2SAndroid Build Coastguard Worker snprintf(bufptr, sizeof(buffer) - (size_t)(bufptr - buffer), "%d", attr->values[i].boolean);
890*5e7646d2SAndroid Build Coastguard Worker bufptr += strlen(bufptr);
891*5e7646d2SAndroid Build Coastguard Worker break;
892*5e7646d2SAndroid Build Coastguard Worker
893*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_TEXTLANG :
894*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_NAMELANG :
895*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_TEXT :
896*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_NAME :
897*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_KEYWORD :
898*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_URI :
899*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_URISCHEME :
900*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_CHARSET :
901*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_LANGUAGE :
902*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_MIMETYPE :
903*5e7646d2SAndroid Build Coastguard Worker strlcpy(bufptr, attr->values[i].string.text, sizeof(buffer) - (size_t)(bufptr - buffer));
904*5e7646d2SAndroid Build Coastguard Worker bufptr += strlen(bufptr);
905*5e7646d2SAndroid Build Coastguard Worker break;
906*5e7646d2SAndroid Build Coastguard Worker
907*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_BEGIN_COLLECTION :
908*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name, "media-size"))
909*5e7646d2SAndroid Build Coastguard Worker {
910*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *x_dimension = ippFindAttribute(ippGetCollection(attr, 0), "x-dimension", IPP_TAG_INTEGER);
911*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *y_dimension = ippFindAttribute(ippGetCollection(attr, 0), "y-dimension", IPP_TAG_INTEGER);
912*5e7646d2SAndroid Build Coastguard Worker /* Media dimensions */
913*5e7646d2SAndroid Build Coastguard Worker
914*5e7646d2SAndroid Build Coastguard Worker if (x_dimension && y_dimension)
915*5e7646d2SAndroid Build Coastguard Worker {
916*5e7646d2SAndroid Build Coastguard Worker pwg_media_t *pwg = pwgMediaForSize(ippGetInteger(x_dimension, 0), ippGetInteger(y_dimension, 0));
917*5e7646d2SAndroid Build Coastguard Worker /* PWG media name */
918*5e7646d2SAndroid Build Coastguard Worker strlcpy(bufptr, pwg->pwg, sizeof(buffer) - (size_t)(bufptr - buffer));
919*5e7646d2SAndroid Build Coastguard Worker break;
920*5e7646d2SAndroid Build Coastguard Worker }
921*5e7646d2SAndroid Build Coastguard Worker }
922*5e7646d2SAndroid Build Coastguard Worker
923*5e7646d2SAndroid Build Coastguard Worker default :
924*5e7646d2SAndroid Build Coastguard Worker strlcpy(bufptr, "???", sizeof(buffer) - (size_t)(bufptr - buffer));
925*5e7646d2SAndroid Build Coastguard Worker bufptr += strlen(bufptr);
926*5e7646d2SAndroid Build Coastguard Worker break;
927*5e7646d2SAndroid Build Coastguard Worker }
928*5e7646d2SAndroid Build Coastguard Worker }
929*5e7646d2SAndroid Build Coastguard Worker }
930*5e7646d2SAndroid Build Coastguard Worker else if (bufptr < (buffer + sizeof(buffer) - 1))
931*5e7646d2SAndroid Build Coastguard Worker *bufptr++ = '-';
932*5e7646d2SAndroid Build Coastguard Worker break;
933*5e7646d2SAndroid Build Coastguard Worker }
934*5e7646d2SAndroid Build Coastguard Worker
935*5e7646d2SAndroid Build Coastguard Worker default :
936*5e7646d2SAndroid Build Coastguard Worker if (bufptr < (buffer + sizeof(buffer) - 2))
937*5e7646d2SAndroid Build Coastguard Worker {
938*5e7646d2SAndroid Build Coastguard Worker *bufptr++ = '%';
939*5e7646d2SAndroid Build Coastguard Worker *bufptr++ = *format;
940*5e7646d2SAndroid Build Coastguard Worker }
941*5e7646d2SAndroid Build Coastguard Worker break;
942*5e7646d2SAndroid Build Coastguard Worker }
943*5e7646d2SAndroid Build Coastguard Worker }
944*5e7646d2SAndroid Build Coastguard Worker else if (bufptr < (buffer + sizeof(buffer) - 1))
945*5e7646d2SAndroid Build Coastguard Worker *bufptr++ = *format;
946*5e7646d2SAndroid Build Coastguard Worker }
947*5e7646d2SAndroid Build Coastguard Worker
948*5e7646d2SAndroid Build Coastguard Worker *bufptr = '\0';
949*5e7646d2SAndroid Build Coastguard Worker
950*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
951*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(PageLog, "syslog"))
952*5e7646d2SAndroid Build Coastguard Worker {
953*5e7646d2SAndroid Build Coastguard Worker static const char * const job_states[] =
954*5e7646d2SAndroid Build Coastguard Worker { /* job-state strings */
955*5e7646d2SAndroid Build Coastguard Worker "Pending",
956*5e7646d2SAndroid Build Coastguard Worker "PendingHeld",
957*5e7646d2SAndroid Build Coastguard Worker "Processing",
958*5e7646d2SAndroid Build Coastguard Worker "ProcessingStopped",
959*5e7646d2SAndroid Build Coastguard Worker "Canceled",
960*5e7646d2SAndroid Build Coastguard Worker "Aborted",
961*5e7646d2SAndroid Build Coastguard Worker "Completed"
962*5e7646d2SAndroid Build Coastguard Worker };
963*5e7646d2SAndroid Build Coastguard Worker
964*5e7646d2SAndroid Build Coastguard Worker sd_journal_send("MESSAGE=%s", buffer,
965*5e7646d2SAndroid Build Coastguard Worker "PRIORITY=%i", LOG_INFO,
966*5e7646d2SAndroid Build Coastguard Worker PWG_Event"=JobStateChanged",
967*5e7646d2SAndroid Build Coastguard Worker PWG_ServiceURI"=%s", job->printer->uri,
968*5e7646d2SAndroid Build Coastguard Worker PWG_JobID"=%d", job->id,
969*5e7646d2SAndroid Build Coastguard Worker PWG_JobState"=%s", job_states[job->state_value - IPP_JSTATE_PENDING],
970*5e7646d2SAndroid Build Coastguard Worker PWG_JobImpressionsCompleted"=%d", ippGetInteger(job->impressions, 0),
971*5e7646d2SAndroid Build Coastguard Worker NULL);
972*5e7646d2SAndroid Build Coastguard Worker return (1);
973*5e7646d2SAndroid Build Coastguard Worker }
974*5e7646d2SAndroid Build Coastguard Worker
975*5e7646d2SAndroid Build Coastguard Worker #elif defined(HAVE_VSYSLOG)
976*5e7646d2SAndroid Build Coastguard Worker /*
977*5e7646d2SAndroid Build Coastguard Worker * See if we are logging pages via syslog...
978*5e7646d2SAndroid Build Coastguard Worker */
979*5e7646d2SAndroid Build Coastguard Worker
980*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(PageLog, "syslog"))
981*5e7646d2SAndroid Build Coastguard Worker {
982*5e7646d2SAndroid Build Coastguard Worker syslog(LOG_INFO, "%s", buffer);
983*5e7646d2SAndroid Build Coastguard Worker
984*5e7646d2SAndroid Build Coastguard Worker return (1);
985*5e7646d2SAndroid Build Coastguard Worker }
986*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
987*5e7646d2SAndroid Build Coastguard Worker
988*5e7646d2SAndroid Build Coastguard Worker /*
989*5e7646d2SAndroid Build Coastguard Worker * Not using syslog; check the log file...
990*5e7646d2SAndroid Build Coastguard Worker */
991*5e7646d2SAndroid Build Coastguard Worker
992*5e7646d2SAndroid Build Coastguard Worker if (!cupsdCheckLogFile(&PageFile, PageLog))
993*5e7646d2SAndroid Build Coastguard Worker return (0);
994*5e7646d2SAndroid Build Coastguard Worker
995*5e7646d2SAndroid Build Coastguard Worker /*
996*5e7646d2SAndroid Build Coastguard Worker * Print a page log entry of the form:
997*5e7646d2SAndroid Build Coastguard Worker *
998*5e7646d2SAndroid Build Coastguard Worker * printer user job-id [DD/MON/YYYY:HH:MM:SS +TTTT] page num-copies \
999*5e7646d2SAndroid Build Coastguard Worker * billing hostname
1000*5e7646d2SAndroid Build Coastguard Worker */
1001*5e7646d2SAndroid Build Coastguard Worker
1002*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(PageFile, "%s\n", buffer);
1003*5e7646d2SAndroid Build Coastguard Worker cupsFileFlush(PageFile);
1004*5e7646d2SAndroid Build Coastguard Worker
1005*5e7646d2SAndroid Build Coastguard Worker return (1);
1006*5e7646d2SAndroid Build Coastguard Worker }
1007*5e7646d2SAndroid Build Coastguard Worker
1008*5e7646d2SAndroid Build Coastguard Worker
1009*5e7646d2SAndroid Build Coastguard Worker /*
1010*5e7646d2SAndroid Build Coastguard Worker * 'cupsdLogRequest()' - Log an HTTP request in Common Log Format.
1011*5e7646d2SAndroid Build Coastguard Worker */
1012*5e7646d2SAndroid Build Coastguard Worker
1013*5e7646d2SAndroid Build Coastguard Worker int /* O - 1 on success, 0 on error */
cupsdLogRequest(cupsd_client_t * con,http_status_t code)1014*5e7646d2SAndroid Build Coastguard Worker cupsdLogRequest(cupsd_client_t *con, /* I - Request to log */
1015*5e7646d2SAndroid Build Coastguard Worker http_status_t code) /* I - Response code */
1016*5e7646d2SAndroid Build Coastguard Worker {
1017*5e7646d2SAndroid Build Coastguard Worker char temp[2048]; /* Temporary string for URI */
1018*5e7646d2SAndroid Build Coastguard Worker static const char * const states[] = /* HTTP client states... */
1019*5e7646d2SAndroid Build Coastguard Worker {
1020*5e7646d2SAndroid Build Coastguard Worker "WAITING",
1021*5e7646d2SAndroid Build Coastguard Worker "OPTIONS",
1022*5e7646d2SAndroid Build Coastguard Worker "GET",
1023*5e7646d2SAndroid Build Coastguard Worker "GET",
1024*5e7646d2SAndroid Build Coastguard Worker "HEAD",
1025*5e7646d2SAndroid Build Coastguard Worker "POST",
1026*5e7646d2SAndroid Build Coastguard Worker "POST",
1027*5e7646d2SAndroid Build Coastguard Worker "POST",
1028*5e7646d2SAndroid Build Coastguard Worker "PUT",
1029*5e7646d2SAndroid Build Coastguard Worker "PUT",
1030*5e7646d2SAndroid Build Coastguard Worker "DELETE",
1031*5e7646d2SAndroid Build Coastguard Worker "TRACE",
1032*5e7646d2SAndroid Build Coastguard Worker "CLOSE",
1033*5e7646d2SAndroid Build Coastguard Worker "STATUS"
1034*5e7646d2SAndroid Build Coastguard Worker };
1035*5e7646d2SAndroid Build Coastguard Worker
1036*5e7646d2SAndroid Build Coastguard Worker
1037*5e7646d2SAndroid Build Coastguard Worker /*
1038*5e7646d2SAndroid Build Coastguard Worker * Filter requests as needed...
1039*5e7646d2SAndroid Build Coastguard Worker */
1040*5e7646d2SAndroid Build Coastguard Worker
1041*5e7646d2SAndroid Build Coastguard Worker if (AccessLogLevel == CUPSD_ACCESSLOG_NONE || !AccessLog)
1042*5e7646d2SAndroid Build Coastguard Worker return (1);
1043*5e7646d2SAndroid Build Coastguard Worker else if (AccessLogLevel < CUPSD_ACCESSLOG_ALL)
1044*5e7646d2SAndroid Build Coastguard Worker {
1045*5e7646d2SAndroid Build Coastguard Worker /*
1046*5e7646d2SAndroid Build Coastguard Worker * Eliminate simple GET, POST, and PUT requests...
1047*5e7646d2SAndroid Build Coastguard Worker */
1048*5e7646d2SAndroid Build Coastguard Worker
1049*5e7646d2SAndroid Build Coastguard Worker if ((con->operation == HTTP_GET &&
1050*5e7646d2SAndroid Build Coastguard Worker strncmp(con->uri, "/admin/conf", 11) &&
1051*5e7646d2SAndroid Build Coastguard Worker strncmp(con->uri, "/admin/log", 10)) ||
1052*5e7646d2SAndroid Build Coastguard Worker (con->operation == HTTP_POST && !con->request &&
1053*5e7646d2SAndroid Build Coastguard Worker strncmp(con->uri, "/admin", 6)) ||
1054*5e7646d2SAndroid Build Coastguard Worker (con->operation != HTTP_GET && con->operation != HTTP_POST &&
1055*5e7646d2SAndroid Build Coastguard Worker con->operation != HTTP_PUT))
1056*5e7646d2SAndroid Build Coastguard Worker return (1);
1057*5e7646d2SAndroid Build Coastguard Worker
1058*5e7646d2SAndroid Build Coastguard Worker if (con->request && con->response &&
1059*5e7646d2SAndroid Build Coastguard Worker (con->response->request.status.status_code < IPP_REDIRECTION_OTHER_SITE ||
1060*5e7646d2SAndroid Build Coastguard Worker con->response->request.status.status_code == IPP_NOT_FOUND))
1061*5e7646d2SAndroid Build Coastguard Worker {
1062*5e7646d2SAndroid Build Coastguard Worker /*
1063*5e7646d2SAndroid Build Coastguard Worker * Check successful requests...
1064*5e7646d2SAndroid Build Coastguard Worker */
1065*5e7646d2SAndroid Build Coastguard Worker
1066*5e7646d2SAndroid Build Coastguard Worker ipp_op_t op = con->request->request.op.operation_id;
1067*5e7646d2SAndroid Build Coastguard Worker static cupsd_accesslog_t standard_ops[] =
1068*5e7646d2SAndroid Build Coastguard Worker {
1069*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ALL, /* reserved */
1070*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ALL, /* reserved */
1071*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Print-Job */
1072*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Print-URI */
1073*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Validate-Job */
1074*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Create-Job */
1075*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Send-Document */
1076*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Send-URI */
1077*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Cancel-Job */
1078*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ALL, /* Get-Job-Attributes */
1079*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ALL, /* Get-Jobs */
1080*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ALL, /* Get-Printer-Attributes */
1081*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Hold-Job */
1082*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Release-Job */
1083*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Restart-Job */
1084*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ALL, /* reserved */
1085*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* Pause-Printer */
1086*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* Resume-Printer */
1087*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* Purge-Jobs */
1088*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* Set-Printer-Attributes */
1089*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Set-Job-Attributes */
1090*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* Get-Printer-Supported-Values */
1091*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Create-Printer-Subscription */
1092*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Create-Job-Subscription */
1093*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ALL, /* Get-Subscription-Attributes */
1094*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ALL, /* Get-Subscriptions */
1095*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Renew-Subscription */
1096*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Cancel-Subscription */
1097*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ALL, /* Get-Notifications */
1098*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Send-Notifications */
1099*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ALL, /* reserved */
1100*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ALL, /* reserved */
1101*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ALL, /* reserved */
1102*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ALL, /* Get-Print-Support-Files */
1103*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* Enable-Printer */
1104*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* Disable-Printer */
1105*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* Pause-Printer-After-Current-Job */
1106*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Hold-New-Jobs */
1107*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Release-Held-New-Jobs */
1108*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* Deactivate-Printer */
1109*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* Activate-Printer */
1110*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* Restart-Printer */
1111*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* Shutdown-Printer */
1112*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* Startup-Printer */
1113*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Reprocess-Job */
1114*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Cancel-Current-Job */
1115*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Suspend-Current-Job */
1116*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Resume-Job */
1117*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* Promote-Job */
1118*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS /* Schedule-Job-After */
1119*5e7646d2SAndroid Build Coastguard Worker };
1120*5e7646d2SAndroid Build Coastguard Worker static cupsd_accesslog_t cups_ops[] =
1121*5e7646d2SAndroid Build Coastguard Worker {
1122*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ALL, /* CUPS-Get-Default */
1123*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ALL, /* CUPS-Get-Printers */
1124*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* CUPS-Add-Modify-Printer */
1125*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* CUPS-Delete-Printer */
1126*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ALL, /* CUPS-Get-Classes */
1127*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* CUPS-Add-Modify-Class */
1128*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* CUPS-Delete-Class */
1129*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* CUPS-Accept-Jobs */
1130*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* CUPS-Reject-Jobs */
1131*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* CUPS-Set-Default */
1132*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* CUPS-Get-Devices */
1133*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_CONFIG, /* CUPS-Get-PPDs */
1134*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* CUPS-Move-Job */
1135*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ACTIONS,/* CUPS-Authenticate-Job */
1136*5e7646d2SAndroid Build Coastguard Worker CUPSD_ACCESSLOG_ALL /* CUPS-Get-PPD */
1137*5e7646d2SAndroid Build Coastguard Worker };
1138*5e7646d2SAndroid Build Coastguard Worker
1139*5e7646d2SAndroid Build Coastguard Worker
1140*5e7646d2SAndroid Build Coastguard Worker if ((op <= IPP_SCHEDULE_JOB_AFTER && standard_ops[op] > AccessLogLevel) ||
1141*5e7646d2SAndroid Build Coastguard Worker (op >= CUPS_GET_DEFAULT && op <= CUPS_GET_PPD &&
1142*5e7646d2SAndroid Build Coastguard Worker cups_ops[op - CUPS_GET_DEFAULT] > AccessLogLevel))
1143*5e7646d2SAndroid Build Coastguard Worker return (1);
1144*5e7646d2SAndroid Build Coastguard Worker }
1145*5e7646d2SAndroid Build Coastguard Worker }
1146*5e7646d2SAndroid Build Coastguard Worker
1147*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
1148*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(AccessLog, "syslog"))
1149*5e7646d2SAndroid Build Coastguard Worker {
1150*5e7646d2SAndroid Build Coastguard Worker sd_journal_print(LOG_INFO, "REQUEST %s - %s \"%s %s HTTP/%d.%d\" %d " CUPS_LLFMT " %s %s", con->http->hostname, con->username[0] != '\0' ? con->username : "-", states[con->operation], _httpEncodeURI(temp, con->uri, sizeof(temp)), con->http->version / 100, con->http->version % 100, code, CUPS_LLCAST con->bytes, con->request ? ippOpString(con->request->request.op.operation_id) : "-", con->response ? ippErrorString(con->response->request.status.status_code) : "-");
1151*5e7646d2SAndroid Build Coastguard Worker return (1);
1152*5e7646d2SAndroid Build Coastguard Worker }
1153*5e7646d2SAndroid Build Coastguard Worker
1154*5e7646d2SAndroid Build Coastguard Worker #elif defined(HAVE_VSYSLOG)
1155*5e7646d2SAndroid Build Coastguard Worker /*
1156*5e7646d2SAndroid Build Coastguard Worker * See if we are logging accesses via syslog...
1157*5e7646d2SAndroid Build Coastguard Worker */
1158*5e7646d2SAndroid Build Coastguard Worker
1159*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(AccessLog, "syslog"))
1160*5e7646d2SAndroid Build Coastguard Worker {
1161*5e7646d2SAndroid Build Coastguard Worker syslog(LOG_INFO,
1162*5e7646d2SAndroid Build Coastguard Worker "REQUEST %s - %s \"%s %s HTTP/%d.%d\" %d " CUPS_LLFMT " %s %s\n",
1163*5e7646d2SAndroid Build Coastguard Worker con->http->hostname, con->username[0] != '\0' ? con->username : "-",
1164*5e7646d2SAndroid Build Coastguard Worker states[con->operation], _httpEncodeURI(temp, con->uri, sizeof(temp)),
1165*5e7646d2SAndroid Build Coastguard Worker con->http->version / 100, con->http->version % 100,
1166*5e7646d2SAndroid Build Coastguard Worker code, CUPS_LLCAST con->bytes,
1167*5e7646d2SAndroid Build Coastguard Worker con->request ?
1168*5e7646d2SAndroid Build Coastguard Worker ippOpString(con->request->request.op.operation_id) : "-",
1169*5e7646d2SAndroid Build Coastguard Worker con->response ?
1170*5e7646d2SAndroid Build Coastguard Worker ippErrorString(con->response->request.status.status_code) : "-");
1171*5e7646d2SAndroid Build Coastguard Worker
1172*5e7646d2SAndroid Build Coastguard Worker return (1);
1173*5e7646d2SAndroid Build Coastguard Worker }
1174*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
1175*5e7646d2SAndroid Build Coastguard Worker
1176*5e7646d2SAndroid Build Coastguard Worker /*
1177*5e7646d2SAndroid Build Coastguard Worker * Not using syslog; check the log file...
1178*5e7646d2SAndroid Build Coastguard Worker */
1179*5e7646d2SAndroid Build Coastguard Worker
1180*5e7646d2SAndroid Build Coastguard Worker if (!cupsdCheckLogFile(&AccessFile, AccessLog))
1181*5e7646d2SAndroid Build Coastguard Worker return (0);
1182*5e7646d2SAndroid Build Coastguard Worker
1183*5e7646d2SAndroid Build Coastguard Worker /*
1184*5e7646d2SAndroid Build Coastguard Worker * Write a log of the request in "common log format"...
1185*5e7646d2SAndroid Build Coastguard Worker */
1186*5e7646d2SAndroid Build Coastguard Worker
1187*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(AccessFile,
1188*5e7646d2SAndroid Build Coastguard Worker "%s - %s %s \"%s %s HTTP/%d.%d\" %d " CUPS_LLFMT " %s %s\n",
1189*5e7646d2SAndroid Build Coastguard Worker con->http->hostname,
1190*5e7646d2SAndroid Build Coastguard Worker con->username[0] != '\0' ? con->username : "-",
1191*5e7646d2SAndroid Build Coastguard Worker cupsdGetDateTime(&(con->start), LogTimeFormat),
1192*5e7646d2SAndroid Build Coastguard Worker states[con->operation],
1193*5e7646d2SAndroid Build Coastguard Worker _httpEncodeURI(temp, con->uri, sizeof(temp)),
1194*5e7646d2SAndroid Build Coastguard Worker con->http->version / 100, con->http->version % 100,
1195*5e7646d2SAndroid Build Coastguard Worker code, CUPS_LLCAST con->bytes,
1196*5e7646d2SAndroid Build Coastguard Worker con->request ?
1197*5e7646d2SAndroid Build Coastguard Worker ippOpString(con->request->request.op.operation_id) : "-",
1198*5e7646d2SAndroid Build Coastguard Worker con->response ?
1199*5e7646d2SAndroid Build Coastguard Worker ippErrorString(con->response->request.status.status_code) :
1200*5e7646d2SAndroid Build Coastguard Worker "-");
1201*5e7646d2SAndroid Build Coastguard Worker
1202*5e7646d2SAndroid Build Coastguard Worker cupsFileFlush(AccessFile);
1203*5e7646d2SAndroid Build Coastguard Worker
1204*5e7646d2SAndroid Build Coastguard Worker return (1);
1205*5e7646d2SAndroid Build Coastguard Worker }
1206*5e7646d2SAndroid Build Coastguard Worker
1207*5e7646d2SAndroid Build Coastguard Worker
1208*5e7646d2SAndroid Build Coastguard Worker /*
1209*5e7646d2SAndroid Build Coastguard Worker * 'cupsdWriteErrorLog()' - Write a line to the ErrorLog.
1210*5e7646d2SAndroid Build Coastguard Worker */
1211*5e7646d2SAndroid Build Coastguard Worker
1212*5e7646d2SAndroid Build Coastguard Worker int /* O - 1 on success, 0 on failure */
cupsdWriteErrorLog(int level,const char * message)1213*5e7646d2SAndroid Build Coastguard Worker cupsdWriteErrorLog(int level, /* I - Log level */
1214*5e7646d2SAndroid Build Coastguard Worker const char *message) /* I - Message string */
1215*5e7646d2SAndroid Build Coastguard Worker {
1216*5e7646d2SAndroid Build Coastguard Worker int ret = 1; /* Return value */
1217*5e7646d2SAndroid Build Coastguard Worker static const char levels[] = /* Log levels... */
1218*5e7646d2SAndroid Build Coastguard Worker {
1219*5e7646d2SAndroid Build Coastguard Worker ' ',
1220*5e7646d2SAndroid Build Coastguard Worker 'X',
1221*5e7646d2SAndroid Build Coastguard Worker 'A',
1222*5e7646d2SAndroid Build Coastguard Worker 'C',
1223*5e7646d2SAndroid Build Coastguard Worker 'E',
1224*5e7646d2SAndroid Build Coastguard Worker 'W',
1225*5e7646d2SAndroid Build Coastguard Worker 'N',
1226*5e7646d2SAndroid Build Coastguard Worker 'I',
1227*5e7646d2SAndroid Build Coastguard Worker 'D',
1228*5e7646d2SAndroid Build Coastguard Worker 'd'
1229*5e7646d2SAndroid Build Coastguard Worker };
1230*5e7646d2SAndroid Build Coastguard Worker
1231*5e7646d2SAndroid Build Coastguard Worker
1232*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
1233*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(ErrorLog, "syslog"))
1234*5e7646d2SAndroid Build Coastguard Worker {
1235*5e7646d2SAndroid Build Coastguard Worker sd_journal_print(log_levels[level], "%s", message);
1236*5e7646d2SAndroid Build Coastguard Worker return (1);
1237*5e7646d2SAndroid Build Coastguard Worker }
1238*5e7646d2SAndroid Build Coastguard Worker
1239*5e7646d2SAndroid Build Coastguard Worker #elif defined(HAVE_VSYSLOG)
1240*5e7646d2SAndroid Build Coastguard Worker /*
1241*5e7646d2SAndroid Build Coastguard Worker * See if we are logging errors via syslog...
1242*5e7646d2SAndroid Build Coastguard Worker */
1243*5e7646d2SAndroid Build Coastguard Worker
1244*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(ErrorLog, "syslog"))
1245*5e7646d2SAndroid Build Coastguard Worker {
1246*5e7646d2SAndroid Build Coastguard Worker syslog(log_levels[level], "%s", message);
1247*5e7646d2SAndroid Build Coastguard Worker return (1);
1248*5e7646d2SAndroid Build Coastguard Worker }
1249*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
1250*5e7646d2SAndroid Build Coastguard Worker
1251*5e7646d2SAndroid Build Coastguard Worker /*
1252*5e7646d2SAndroid Build Coastguard Worker * Not using syslog; check the log file...
1253*5e7646d2SAndroid Build Coastguard Worker */
1254*5e7646d2SAndroid Build Coastguard Worker
1255*5e7646d2SAndroid Build Coastguard Worker _cupsMutexLock(&log_mutex);
1256*5e7646d2SAndroid Build Coastguard Worker
1257*5e7646d2SAndroid Build Coastguard Worker if (!cupsdCheckLogFile(&ErrorFile, ErrorLog))
1258*5e7646d2SAndroid Build Coastguard Worker {
1259*5e7646d2SAndroid Build Coastguard Worker ret = 0;
1260*5e7646d2SAndroid Build Coastguard Worker }
1261*5e7646d2SAndroid Build Coastguard Worker else
1262*5e7646d2SAndroid Build Coastguard Worker {
1263*5e7646d2SAndroid Build Coastguard Worker /*
1264*5e7646d2SAndroid Build Coastguard Worker * Write the log message...
1265*5e7646d2SAndroid Build Coastguard Worker */
1266*5e7646d2SAndroid Build Coastguard Worker
1267*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(ErrorFile, "%c %s %s\n", levels[level],
1268*5e7646d2SAndroid Build Coastguard Worker cupsdGetDateTime(NULL, LogTimeFormat), message);
1269*5e7646d2SAndroid Build Coastguard Worker cupsFileFlush(ErrorFile);
1270*5e7646d2SAndroid Build Coastguard Worker }
1271*5e7646d2SAndroid Build Coastguard Worker
1272*5e7646d2SAndroid Build Coastguard Worker _cupsMutexUnlock(&log_mutex);
1273*5e7646d2SAndroid Build Coastguard Worker
1274*5e7646d2SAndroid Build Coastguard Worker return (ret);
1275*5e7646d2SAndroid Build Coastguard Worker }
1276*5e7646d2SAndroid Build Coastguard Worker
1277*5e7646d2SAndroid Build Coastguard Worker
1278*5e7646d2SAndroid Build Coastguard Worker /*
1279*5e7646d2SAndroid Build Coastguard Worker * 'format_log_line()' - Format a line for a log file.
1280*5e7646d2SAndroid Build Coastguard Worker *
1281*5e7646d2SAndroid Build Coastguard Worker * This function resizes a global string buffer as needed. Each call returns
1282*5e7646d2SAndroid Build Coastguard Worker * a pointer to this buffer, so the contents are only good until the next call
1283*5e7646d2SAndroid Build Coastguard Worker * to format_log_line()...
1284*5e7646d2SAndroid Build Coastguard Worker */
1285*5e7646d2SAndroid Build Coastguard Worker
1286*5e7646d2SAndroid Build Coastguard Worker static int /* O - -1 for fatal, 0 for retry, 1 for success */
format_log_line(const char * message,va_list ap)1287*5e7646d2SAndroid Build Coastguard Worker format_log_line(const char *message, /* I - Printf-style format string */
1288*5e7646d2SAndroid Build Coastguard Worker va_list ap) /* I - Argument list */
1289*5e7646d2SAndroid Build Coastguard Worker {
1290*5e7646d2SAndroid Build Coastguard Worker ssize_t len; /* Length of formatted line */
1291*5e7646d2SAndroid Build Coastguard Worker
1292*5e7646d2SAndroid Build Coastguard Worker
1293*5e7646d2SAndroid Build Coastguard Worker /*
1294*5e7646d2SAndroid Build Coastguard Worker * Allocate the line buffer as needed...
1295*5e7646d2SAndroid Build Coastguard Worker */
1296*5e7646d2SAndroid Build Coastguard Worker
1297*5e7646d2SAndroid Build Coastguard Worker if (!log_linesize)
1298*5e7646d2SAndroid Build Coastguard Worker {
1299*5e7646d2SAndroid Build Coastguard Worker log_linesize = 8192;
1300*5e7646d2SAndroid Build Coastguard Worker log_line = malloc(log_linesize);
1301*5e7646d2SAndroid Build Coastguard Worker
1302*5e7646d2SAndroid Build Coastguard Worker if (!log_line)
1303*5e7646d2SAndroid Build Coastguard Worker return (-1);
1304*5e7646d2SAndroid Build Coastguard Worker }
1305*5e7646d2SAndroid Build Coastguard Worker
1306*5e7646d2SAndroid Build Coastguard Worker /*
1307*5e7646d2SAndroid Build Coastguard Worker * Format the log message...
1308*5e7646d2SAndroid Build Coastguard Worker */
1309*5e7646d2SAndroid Build Coastguard Worker
1310*5e7646d2SAndroid Build Coastguard Worker len = _cups_safe_vsnprintf(log_line, log_linesize, message, ap);
1311*5e7646d2SAndroid Build Coastguard Worker
1312*5e7646d2SAndroid Build Coastguard Worker /*
1313*5e7646d2SAndroid Build Coastguard Worker * Resize the buffer as needed...
1314*5e7646d2SAndroid Build Coastguard Worker */
1315*5e7646d2SAndroid Build Coastguard Worker
1316*5e7646d2SAndroid Build Coastguard Worker if ((size_t)len >= log_linesize && log_linesize < 65536)
1317*5e7646d2SAndroid Build Coastguard Worker {
1318*5e7646d2SAndroid Build Coastguard Worker char *temp; /* Temporary string pointer */
1319*5e7646d2SAndroid Build Coastguard Worker
1320*5e7646d2SAndroid Build Coastguard Worker len ++;
1321*5e7646d2SAndroid Build Coastguard Worker
1322*5e7646d2SAndroid Build Coastguard Worker if (len < 8192)
1323*5e7646d2SAndroid Build Coastguard Worker len = 8192;
1324*5e7646d2SAndroid Build Coastguard Worker else if (len > 65536)
1325*5e7646d2SAndroid Build Coastguard Worker len = 65536;
1326*5e7646d2SAndroid Build Coastguard Worker
1327*5e7646d2SAndroid Build Coastguard Worker temp = realloc(log_line, (size_t)len);
1328*5e7646d2SAndroid Build Coastguard Worker
1329*5e7646d2SAndroid Build Coastguard Worker if (temp)
1330*5e7646d2SAndroid Build Coastguard Worker {
1331*5e7646d2SAndroid Build Coastguard Worker log_line = temp;
1332*5e7646d2SAndroid Build Coastguard Worker log_linesize = (size_t)len;
1333*5e7646d2SAndroid Build Coastguard Worker
1334*5e7646d2SAndroid Build Coastguard Worker return (0);
1335*5e7646d2SAndroid Build Coastguard Worker }
1336*5e7646d2SAndroid Build Coastguard Worker }
1337*5e7646d2SAndroid Build Coastguard Worker
1338*5e7646d2SAndroid Build Coastguard Worker return (1);
1339*5e7646d2SAndroid Build Coastguard Worker }
1340