xref: /aosp_15_r20/external/libcups/scheduler/statbuf.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * Status buffer routines for the CUPS scheduler.
3*5e7646d2SAndroid Build Coastguard Worker  *
4*5e7646d2SAndroid Build Coastguard Worker  * Copyright 2007-2014 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker  * Copyright 1997-2006 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 information.
8*5e7646d2SAndroid Build Coastguard Worker  */
9*5e7646d2SAndroid Build Coastguard Worker 
10*5e7646d2SAndroid Build Coastguard Worker /*
11*5e7646d2SAndroid Build Coastguard Worker  * Include necessary headers...
12*5e7646d2SAndroid Build Coastguard Worker  */
13*5e7646d2SAndroid Build Coastguard Worker 
14*5e7646d2SAndroid Build Coastguard Worker #include "cupsd.h"
15*5e7646d2SAndroid Build Coastguard Worker #include <stdarg.h>
16*5e7646d2SAndroid Build Coastguard Worker 
17*5e7646d2SAndroid Build Coastguard Worker 
18*5e7646d2SAndroid Build Coastguard Worker /*
19*5e7646d2SAndroid Build Coastguard Worker  * 'cupsdStatBufDelete()' - Destroy a status buffer.
20*5e7646d2SAndroid Build Coastguard Worker  */
21*5e7646d2SAndroid Build Coastguard Worker 
22*5e7646d2SAndroid Build Coastguard Worker void
cupsdStatBufDelete(cupsd_statbuf_t * sb)23*5e7646d2SAndroid Build Coastguard Worker cupsdStatBufDelete(cupsd_statbuf_t *sb)	/* I - Status buffer */
24*5e7646d2SAndroid Build Coastguard Worker {
25*5e7646d2SAndroid Build Coastguard Worker  /*
26*5e7646d2SAndroid Build Coastguard Worker   * Range check input...
27*5e7646d2SAndroid Build Coastguard Worker   */
28*5e7646d2SAndroid Build Coastguard Worker 
29*5e7646d2SAndroid Build Coastguard Worker   if (!sb)
30*5e7646d2SAndroid Build Coastguard Worker     return;
31*5e7646d2SAndroid Build Coastguard Worker 
32*5e7646d2SAndroid Build Coastguard Worker  /*
33*5e7646d2SAndroid Build Coastguard Worker   * Close the status pipe and free memory used...
34*5e7646d2SAndroid Build Coastguard Worker   */
35*5e7646d2SAndroid Build Coastguard Worker 
36*5e7646d2SAndroid Build Coastguard Worker   close(sb->fd);
37*5e7646d2SAndroid Build Coastguard Worker 
38*5e7646d2SAndroid Build Coastguard Worker   free(sb);
39*5e7646d2SAndroid Build Coastguard Worker }
40*5e7646d2SAndroid Build Coastguard Worker 
41*5e7646d2SAndroid Build Coastguard Worker 
42*5e7646d2SAndroid Build Coastguard Worker /*
43*5e7646d2SAndroid Build Coastguard Worker  * 'cupsdStatBufNew()' - Create a new status buffer.
44*5e7646d2SAndroid Build Coastguard Worker  */
45*5e7646d2SAndroid Build Coastguard Worker 
46*5e7646d2SAndroid Build Coastguard Worker cupsd_statbuf_t	*			/* O - New status buffer */
cupsdStatBufNew(int fd,const char * prefix,...)47*5e7646d2SAndroid Build Coastguard Worker cupsdStatBufNew(int        fd,		/* I - File descriptor of pipe */
48*5e7646d2SAndroid Build Coastguard Worker                 const char *prefix,	/* I - Printf-style prefix string */
49*5e7646d2SAndroid Build Coastguard Worker 		...)			/* I - Additional args as needed */
50*5e7646d2SAndroid Build Coastguard Worker {
51*5e7646d2SAndroid Build Coastguard Worker   cupsd_statbuf_t	*sb;		/* New status buffer */
52*5e7646d2SAndroid Build Coastguard Worker   va_list		ap;		/* Argument list */
53*5e7646d2SAndroid Build Coastguard Worker 
54*5e7646d2SAndroid Build Coastguard Worker 
55*5e7646d2SAndroid Build Coastguard Worker  /*
56*5e7646d2SAndroid Build Coastguard Worker   * Range check input...
57*5e7646d2SAndroid Build Coastguard Worker   */
58*5e7646d2SAndroid Build Coastguard Worker 
59*5e7646d2SAndroid Build Coastguard Worker   if (fd < 0)
60*5e7646d2SAndroid Build Coastguard Worker     return (NULL);
61*5e7646d2SAndroid Build Coastguard Worker 
62*5e7646d2SAndroid Build Coastguard Worker  /*
63*5e7646d2SAndroid Build Coastguard Worker   * Allocate the status buffer...
64*5e7646d2SAndroid Build Coastguard Worker   */
65*5e7646d2SAndroid Build Coastguard Worker 
66*5e7646d2SAndroid Build Coastguard Worker   if ((sb = calloc(1, sizeof(cupsd_statbuf_t))) != NULL)
67*5e7646d2SAndroid Build Coastguard Worker   {
68*5e7646d2SAndroid Build Coastguard Worker    /*
69*5e7646d2SAndroid Build Coastguard Worker     * Assign the file descriptor...
70*5e7646d2SAndroid Build Coastguard Worker     */
71*5e7646d2SAndroid Build Coastguard Worker 
72*5e7646d2SAndroid Build Coastguard Worker     sb->fd = fd;
73*5e7646d2SAndroid Build Coastguard Worker 
74*5e7646d2SAndroid Build Coastguard Worker    /*
75*5e7646d2SAndroid Build Coastguard Worker     * Format the prefix string, if any.  This is usually "[Job 123]"
76*5e7646d2SAndroid Build Coastguard Worker     * or "[Sub 123]", and so forth.
77*5e7646d2SAndroid Build Coastguard Worker     */
78*5e7646d2SAndroid Build Coastguard Worker 
79*5e7646d2SAndroid Build Coastguard Worker     if (prefix)
80*5e7646d2SAndroid Build Coastguard Worker     {
81*5e7646d2SAndroid Build Coastguard Worker      /*
82*5e7646d2SAndroid Build Coastguard Worker       * Printf-style prefix string...
83*5e7646d2SAndroid Build Coastguard Worker       */
84*5e7646d2SAndroid Build Coastguard Worker 
85*5e7646d2SAndroid Build Coastguard Worker       va_start(ap, prefix);
86*5e7646d2SAndroid Build Coastguard Worker       vsnprintf(sb->prefix, sizeof(sb->prefix), prefix, ap);
87*5e7646d2SAndroid Build Coastguard Worker       va_end(ap);
88*5e7646d2SAndroid Build Coastguard Worker     }
89*5e7646d2SAndroid Build Coastguard Worker     else
90*5e7646d2SAndroid Build Coastguard Worker     {
91*5e7646d2SAndroid Build Coastguard Worker      /*
92*5e7646d2SAndroid Build Coastguard Worker       * No prefix string...
93*5e7646d2SAndroid Build Coastguard Worker       */
94*5e7646d2SAndroid Build Coastguard Worker 
95*5e7646d2SAndroid Build Coastguard Worker       sb->prefix[0] = '\0';
96*5e7646d2SAndroid Build Coastguard Worker     }
97*5e7646d2SAndroid Build Coastguard Worker   }
98*5e7646d2SAndroid Build Coastguard Worker 
99*5e7646d2SAndroid Build Coastguard Worker   return (sb);
100*5e7646d2SAndroid Build Coastguard Worker }
101*5e7646d2SAndroid Build Coastguard Worker 
102*5e7646d2SAndroid Build Coastguard Worker 
103*5e7646d2SAndroid Build Coastguard Worker /*
104*5e7646d2SAndroid Build Coastguard Worker  * 'cupsdStatBufUpdate()' - Update the status buffer.
105*5e7646d2SAndroid Build Coastguard Worker  */
106*5e7646d2SAndroid Build Coastguard Worker 
107*5e7646d2SAndroid Build Coastguard Worker char *					/* O - Line from buffer, "", or NULL */
cupsdStatBufUpdate(cupsd_statbuf_t * sb,int * loglevel,char * line,int linelen)108*5e7646d2SAndroid Build Coastguard Worker cupsdStatBufUpdate(
109*5e7646d2SAndroid Build Coastguard Worker     cupsd_statbuf_t *sb,		/* I - Status buffer */
110*5e7646d2SAndroid Build Coastguard Worker     int             *loglevel,		/* O - Log level */
111*5e7646d2SAndroid Build Coastguard Worker     char            *line,		/* I - Line buffer */
112*5e7646d2SAndroid Build Coastguard Worker     int             linelen)		/* I - Size of line buffer */
113*5e7646d2SAndroid Build Coastguard Worker {
114*5e7646d2SAndroid Build Coastguard Worker   int		bytes;			/* Number of bytes read */
115*5e7646d2SAndroid Build Coastguard Worker   char		*lineptr,		/* Pointer to end of line in buffer */
116*5e7646d2SAndroid Build Coastguard Worker 		*message;		/* Pointer to message text */
117*5e7646d2SAndroid Build Coastguard Worker 
118*5e7646d2SAndroid Build Coastguard Worker 
119*5e7646d2SAndroid Build Coastguard Worker  /*
120*5e7646d2SAndroid Build Coastguard Worker   * Check if the buffer already contains a full line...
121*5e7646d2SAndroid Build Coastguard Worker   */
122*5e7646d2SAndroid Build Coastguard Worker 
123*5e7646d2SAndroid Build Coastguard Worker   if ((lineptr = strchr(sb->buffer, '\n')) == NULL)
124*5e7646d2SAndroid Build Coastguard Worker   {
125*5e7646d2SAndroid Build Coastguard Worker    /*
126*5e7646d2SAndroid Build Coastguard Worker     * No, read more data...
127*5e7646d2SAndroid Build Coastguard Worker     */
128*5e7646d2SAndroid Build Coastguard Worker 
129*5e7646d2SAndroid Build Coastguard Worker     if ((bytes = read(sb->fd, sb->buffer + sb->bufused, (size_t)(CUPSD_SB_BUFFER_SIZE - sb->bufused - 1))) > 0)
130*5e7646d2SAndroid Build Coastguard Worker     {
131*5e7646d2SAndroid Build Coastguard Worker       sb->bufused += bytes;
132*5e7646d2SAndroid Build Coastguard Worker       sb->buffer[sb->bufused] = '\0';
133*5e7646d2SAndroid Build Coastguard Worker 
134*5e7646d2SAndroid Build Coastguard Worker      /*
135*5e7646d2SAndroid Build Coastguard Worker       * Guard against a line longer than the max buffer size...
136*5e7646d2SAndroid Build Coastguard Worker       */
137*5e7646d2SAndroid Build Coastguard Worker 
138*5e7646d2SAndroid Build Coastguard Worker       if ((lineptr = strchr(sb->buffer, '\n')) == NULL &&
139*5e7646d2SAndroid Build Coastguard Worker           sb->bufused == (CUPSD_SB_BUFFER_SIZE - 1))
140*5e7646d2SAndroid Build Coastguard Worker 	lineptr = sb->buffer + sb->bufused;
141*5e7646d2SAndroid Build Coastguard Worker     }
142*5e7646d2SAndroid Build Coastguard Worker     else if (bytes < 0 && errno == EINTR)
143*5e7646d2SAndroid Build Coastguard Worker     {
144*5e7646d2SAndroid Build Coastguard Worker      /*
145*5e7646d2SAndroid Build Coastguard Worker       * Return an empty line if we are interrupted...
146*5e7646d2SAndroid Build Coastguard Worker       */
147*5e7646d2SAndroid Build Coastguard Worker 
148*5e7646d2SAndroid Build Coastguard Worker       *loglevel = CUPSD_LOG_NONE;
149*5e7646d2SAndroid Build Coastguard Worker       line[0]   = '\0';
150*5e7646d2SAndroid Build Coastguard Worker 
151*5e7646d2SAndroid Build Coastguard Worker       return (line);
152*5e7646d2SAndroid Build Coastguard Worker     }
153*5e7646d2SAndroid Build Coastguard Worker     else
154*5e7646d2SAndroid Build Coastguard Worker     {
155*5e7646d2SAndroid Build Coastguard Worker      /*
156*5e7646d2SAndroid Build Coastguard Worker       * End-of-file, so use the whole buffer...
157*5e7646d2SAndroid Build Coastguard Worker       */
158*5e7646d2SAndroid Build Coastguard Worker 
159*5e7646d2SAndroid Build Coastguard Worker       lineptr  = sb->buffer + sb->bufused;
160*5e7646d2SAndroid Build Coastguard Worker       *lineptr = '\0';
161*5e7646d2SAndroid Build Coastguard Worker     }
162*5e7646d2SAndroid Build Coastguard Worker 
163*5e7646d2SAndroid Build Coastguard Worker    /*
164*5e7646d2SAndroid Build Coastguard Worker     * Final check for end-of-file...
165*5e7646d2SAndroid Build Coastguard Worker     */
166*5e7646d2SAndroid Build Coastguard Worker 
167*5e7646d2SAndroid Build Coastguard Worker     if (sb->bufused == 0 && bytes == 0)
168*5e7646d2SAndroid Build Coastguard Worker       lineptr = NULL;
169*5e7646d2SAndroid Build Coastguard Worker   }
170*5e7646d2SAndroid Build Coastguard Worker 
171*5e7646d2SAndroid Build Coastguard Worker   if (!lineptr)
172*5e7646d2SAndroid Build Coastguard Worker   {
173*5e7646d2SAndroid Build Coastguard Worker    /*
174*5e7646d2SAndroid Build Coastguard Worker     * End of file...
175*5e7646d2SAndroid Build Coastguard Worker     */
176*5e7646d2SAndroid Build Coastguard Worker 
177*5e7646d2SAndroid Build Coastguard Worker     *loglevel = CUPSD_LOG_NONE;
178*5e7646d2SAndroid Build Coastguard Worker     line[0]   = '\0';
179*5e7646d2SAndroid Build Coastguard Worker 
180*5e7646d2SAndroid Build Coastguard Worker     return (NULL);
181*5e7646d2SAndroid Build Coastguard Worker   }
182*5e7646d2SAndroid Build Coastguard Worker 
183*5e7646d2SAndroid Build Coastguard Worker  /*
184*5e7646d2SAndroid Build Coastguard Worker   * Terminate the line and process it...
185*5e7646d2SAndroid Build Coastguard Worker   */
186*5e7646d2SAndroid Build Coastguard Worker 
187*5e7646d2SAndroid Build Coastguard Worker   *lineptr++ = '\0';
188*5e7646d2SAndroid Build Coastguard Worker 
189*5e7646d2SAndroid Build Coastguard Worker  /*
190*5e7646d2SAndroid Build Coastguard Worker   * Figure out the logging level...
191*5e7646d2SAndroid Build Coastguard Worker   */
192*5e7646d2SAndroid Build Coastguard Worker 
193*5e7646d2SAndroid Build Coastguard Worker   if (!strncmp(sb->buffer, "EMERG:", 6))
194*5e7646d2SAndroid Build Coastguard Worker   {
195*5e7646d2SAndroid Build Coastguard Worker     *loglevel = CUPSD_LOG_EMERG;
196*5e7646d2SAndroid Build Coastguard Worker     message   = sb->buffer + 6;
197*5e7646d2SAndroid Build Coastguard Worker   }
198*5e7646d2SAndroid Build Coastguard Worker   else if (!strncmp(sb->buffer, "ALERT:", 6))
199*5e7646d2SAndroid Build Coastguard Worker   {
200*5e7646d2SAndroid Build Coastguard Worker     *loglevel = CUPSD_LOG_ALERT;
201*5e7646d2SAndroid Build Coastguard Worker     message   = sb->buffer + 6;
202*5e7646d2SAndroid Build Coastguard Worker   }
203*5e7646d2SAndroid Build Coastguard Worker   else if (!strncmp(sb->buffer, "CRIT:", 5))
204*5e7646d2SAndroid Build Coastguard Worker   {
205*5e7646d2SAndroid Build Coastguard Worker     *loglevel = CUPSD_LOG_CRIT;
206*5e7646d2SAndroid Build Coastguard Worker     message   = sb->buffer + 5;
207*5e7646d2SAndroid Build Coastguard Worker   }
208*5e7646d2SAndroid Build Coastguard Worker   else if (!strncmp(sb->buffer, "ERROR:", 6))
209*5e7646d2SAndroid Build Coastguard Worker   {
210*5e7646d2SAndroid Build Coastguard Worker     *loglevel = CUPSD_LOG_ERROR;
211*5e7646d2SAndroid Build Coastguard Worker     message   = sb->buffer + 6;
212*5e7646d2SAndroid Build Coastguard Worker   }
213*5e7646d2SAndroid Build Coastguard Worker   else if (!strncmp(sb->buffer, "WARNING:", 8))
214*5e7646d2SAndroid Build Coastguard Worker   {
215*5e7646d2SAndroid Build Coastguard Worker     *loglevel = CUPSD_LOG_WARN;
216*5e7646d2SAndroid Build Coastguard Worker     message   = sb->buffer + 8;
217*5e7646d2SAndroid Build Coastguard Worker   }
218*5e7646d2SAndroid Build Coastguard Worker   else if (!strncmp(sb->buffer, "NOTICE:", 7))
219*5e7646d2SAndroid Build Coastguard Worker   {
220*5e7646d2SAndroid Build Coastguard Worker     *loglevel = CUPSD_LOG_NOTICE;
221*5e7646d2SAndroid Build Coastguard Worker     message   = sb->buffer + 7;
222*5e7646d2SAndroid Build Coastguard Worker   }
223*5e7646d2SAndroid Build Coastguard Worker   else if (!strncmp(sb->buffer, "INFO:", 5))
224*5e7646d2SAndroid Build Coastguard Worker   {
225*5e7646d2SAndroid Build Coastguard Worker     *loglevel = CUPSD_LOG_INFO;
226*5e7646d2SAndroid Build Coastguard Worker     message   = sb->buffer + 5;
227*5e7646d2SAndroid Build Coastguard Worker   }
228*5e7646d2SAndroid Build Coastguard Worker   else if (!strncmp(sb->buffer, "DEBUG:", 6))
229*5e7646d2SAndroid Build Coastguard Worker   {
230*5e7646d2SAndroid Build Coastguard Worker     *loglevel = CUPSD_LOG_DEBUG;
231*5e7646d2SAndroid Build Coastguard Worker     message   = sb->buffer + 6;
232*5e7646d2SAndroid Build Coastguard Worker   }
233*5e7646d2SAndroid Build Coastguard Worker   else if (!strncmp(sb->buffer, "DEBUG2:", 7))
234*5e7646d2SAndroid Build Coastguard Worker   {
235*5e7646d2SAndroid Build Coastguard Worker     *loglevel = CUPSD_LOG_DEBUG2;
236*5e7646d2SAndroid Build Coastguard Worker     message   = sb->buffer + 7;
237*5e7646d2SAndroid Build Coastguard Worker   }
238*5e7646d2SAndroid Build Coastguard Worker   else if (!strncmp(sb->buffer, "PAGE:", 5))
239*5e7646d2SAndroid Build Coastguard Worker   {
240*5e7646d2SAndroid Build Coastguard Worker     *loglevel = CUPSD_LOG_PAGE;
241*5e7646d2SAndroid Build Coastguard Worker     message   = sb->buffer + 5;
242*5e7646d2SAndroid Build Coastguard Worker   }
243*5e7646d2SAndroid Build Coastguard Worker   else if (!strncmp(sb->buffer, "STATE:", 6))
244*5e7646d2SAndroid Build Coastguard Worker   {
245*5e7646d2SAndroid Build Coastguard Worker     *loglevel = CUPSD_LOG_STATE;
246*5e7646d2SAndroid Build Coastguard Worker     message   = sb->buffer + 6;
247*5e7646d2SAndroid Build Coastguard Worker   }
248*5e7646d2SAndroid Build Coastguard Worker   else if (!strncmp(sb->buffer, "JOBSTATE:", 9))
249*5e7646d2SAndroid Build Coastguard Worker   {
250*5e7646d2SAndroid Build Coastguard Worker     *loglevel = CUPSD_LOG_JOBSTATE;
251*5e7646d2SAndroid Build Coastguard Worker     message   = sb->buffer + 9;
252*5e7646d2SAndroid Build Coastguard Worker   }
253*5e7646d2SAndroid Build Coastguard Worker   else if (!strncmp(sb->buffer, "ATTR:", 5))
254*5e7646d2SAndroid Build Coastguard Worker   {
255*5e7646d2SAndroid Build Coastguard Worker     *loglevel = CUPSD_LOG_ATTR;
256*5e7646d2SAndroid Build Coastguard Worker     message   = sb->buffer + 5;
257*5e7646d2SAndroid Build Coastguard Worker   }
258*5e7646d2SAndroid Build Coastguard Worker   else if (!strncmp(sb->buffer, "PPD:", 4))
259*5e7646d2SAndroid Build Coastguard Worker   {
260*5e7646d2SAndroid Build Coastguard Worker     *loglevel = CUPSD_LOG_PPD;
261*5e7646d2SAndroid Build Coastguard Worker     message   = sb->buffer + 4;
262*5e7646d2SAndroid Build Coastguard Worker   }
263*5e7646d2SAndroid Build Coastguard Worker   else
264*5e7646d2SAndroid Build Coastguard Worker   {
265*5e7646d2SAndroid Build Coastguard Worker     *loglevel = CUPSD_LOG_DEBUG;
266*5e7646d2SAndroid Build Coastguard Worker     message   = sb->buffer;
267*5e7646d2SAndroid Build Coastguard Worker   }
268*5e7646d2SAndroid Build Coastguard Worker 
269*5e7646d2SAndroid Build Coastguard Worker  /*
270*5e7646d2SAndroid Build Coastguard Worker   * Skip leading whitespace in the message...
271*5e7646d2SAndroid Build Coastguard Worker   */
272*5e7646d2SAndroid Build Coastguard Worker 
273*5e7646d2SAndroid Build Coastguard Worker   while (isspace(*message & 255))
274*5e7646d2SAndroid Build Coastguard Worker     message ++;
275*5e7646d2SAndroid Build Coastguard Worker 
276*5e7646d2SAndroid Build Coastguard Worker  /*
277*5e7646d2SAndroid Build Coastguard Worker   * Send it to the log file as needed...
278*5e7646d2SAndroid Build Coastguard Worker   */
279*5e7646d2SAndroid Build Coastguard Worker 
280*5e7646d2SAndroid Build Coastguard Worker   if (sb->prefix[0])
281*5e7646d2SAndroid Build Coastguard Worker   {
282*5e7646d2SAndroid Build Coastguard Worker     if (*loglevel > CUPSD_LOG_NONE &&
283*5e7646d2SAndroid Build Coastguard Worker 	(*loglevel != CUPSD_LOG_INFO || LogLevel >= CUPSD_LOG_DEBUG))
284*5e7646d2SAndroid Build Coastguard Worker     {
285*5e7646d2SAndroid Build Coastguard Worker      /*
286*5e7646d2SAndroid Build Coastguard Worker       * General status message; send it to the error_log file...
287*5e7646d2SAndroid Build Coastguard Worker       */
288*5e7646d2SAndroid Build Coastguard Worker 
289*5e7646d2SAndroid Build Coastguard Worker       if (message[0] == '[')
290*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(*loglevel, "%s", message);
291*5e7646d2SAndroid Build Coastguard Worker       else
292*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(*loglevel, "%s %s", sb->prefix, message);
293*5e7646d2SAndroid Build Coastguard Worker     }
294*5e7646d2SAndroid Build Coastguard Worker     else if (*loglevel < CUPSD_LOG_NONE && LogLevel >= CUPSD_LOG_DEBUG)
295*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_DEBUG2, "%s %s", sb->prefix, sb->buffer);
296*5e7646d2SAndroid Build Coastguard Worker   }
297*5e7646d2SAndroid Build Coastguard Worker 
298*5e7646d2SAndroid Build Coastguard Worker  /*
299*5e7646d2SAndroid Build Coastguard Worker   * Copy the message to the line buffer...
300*5e7646d2SAndroid Build Coastguard Worker   */
301*5e7646d2SAndroid Build Coastguard Worker 
302*5e7646d2SAndroid Build Coastguard Worker   strlcpy(line, message, (size_t)linelen);
303*5e7646d2SAndroid Build Coastguard Worker 
304*5e7646d2SAndroid Build Coastguard Worker  /*
305*5e7646d2SAndroid Build Coastguard Worker   * Copy over the buffer data we've used up...
306*5e7646d2SAndroid Build Coastguard Worker   */
307*5e7646d2SAndroid Build Coastguard Worker 
308*5e7646d2SAndroid Build Coastguard Worker   if (lineptr < sb->buffer + sb->bufused)
309*5e7646d2SAndroid Build Coastguard Worker     _cups_strcpy(sb->buffer, lineptr);
310*5e7646d2SAndroid Build Coastguard Worker 
311*5e7646d2SAndroid Build Coastguard Worker   sb->bufused -= lineptr - sb->buffer;
312*5e7646d2SAndroid Build Coastguard Worker 
313*5e7646d2SAndroid Build Coastguard Worker   if (sb->bufused < 0)
314*5e7646d2SAndroid Build Coastguard Worker     sb->bufused = 0;
315*5e7646d2SAndroid Build Coastguard Worker 
316*5e7646d2SAndroid Build Coastguard Worker   return (line);
317*5e7646d2SAndroid Build Coastguard Worker }
318