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