#include "cupsd.h"
#include <stdarg.h>
cupsd_statbuf_t *
cupsdStatBufNew(int fd,
const char *prefix,
...)
{
cupsd_statbuf_t *sb;
va_list ap;
if (fd < 0)
return (NULL);
if ((sb = calloc(1, sizeof(cupsd_statbuf_t))) != NULL)
{
sb->fd = fd;
if (prefix)
{
va_start(ap, prefix);
vsnprintf(sb->prefix, sizeof(sb->prefix), prefix, ap);
va_end(ap);
}
else
{
sb->prefix[0] = '\0';
}
}
return (sb);
}
void
cupsdStatBufDelete(cupsd_statbuf_t *sb)
{
if (!sb)
return;
close(sb->fd);
free(sb);
}
char *
cupsdStatBufUpdate(cupsd_statbuf_t *sb,
int *loglevel,
char *line,
int linelen)
{
int bytes;
char *lineptr,
*message;
if ((lineptr = strchr(sb->buffer, '\n')) == NULL)
{
if ((bytes = read(sb->fd, sb->buffer + sb->bufused,
CUPSD_SB_BUFFER_SIZE - sb->bufused - 1)) > 0)
{
sb->bufused += bytes;
sb->buffer[sb->bufused] = '\0';
if ((lineptr = strchr(sb->buffer, '\n')) == NULL &&
sb->bufused == (CUPSD_SB_BUFFER_SIZE - 1))
lineptr = sb->buffer + sb->bufused;
}
else if (bytes < 0 && errno == EINTR)
{
*loglevel = CUPSD_LOG_NONE;
line[0] = '\0';
return (line);
}
else
{
lineptr = sb->buffer + sb->bufused;
*lineptr = '\0';
}
if (sb->bufused == 0 && bytes == 0)
lineptr = NULL;
}
if (!lineptr)
{
*loglevel = CUPSD_LOG_NONE;
line[0] = '\0';
return (NULL);
}
*lineptr++ = '\0';
if (!strncmp(sb->buffer, "EMERG:", 6))
{
*loglevel = CUPSD_LOG_EMERG;
message = sb->buffer + 6;
}
else if (!strncmp(sb->buffer, "ALERT:", 6))
{
*loglevel = CUPSD_LOG_ALERT;
message = sb->buffer + 6;
}
else if (!strncmp(sb->buffer, "CRIT:", 5))
{
*loglevel = CUPSD_LOG_CRIT;
message = sb->buffer + 5;
}
else if (!strncmp(sb->buffer, "ERROR:", 6))
{
*loglevel = CUPSD_LOG_ERROR;
message = sb->buffer + 6;
}
else if (!strncmp(sb->buffer, "WARNING:", 8))
{
*loglevel = CUPSD_LOG_WARN;
message = sb->buffer + 8;
}
else if (!strncmp(sb->buffer, "NOTICE:", 7))
{
*loglevel = CUPSD_LOG_NOTICE;
message = sb->buffer + 7;
}
else if (!strncmp(sb->buffer, "INFO:", 5))
{
*loglevel = CUPSD_LOG_INFO;
message = sb->buffer + 5;
}
else if (!strncmp(sb->buffer, "DEBUG:", 6))
{
*loglevel = CUPSD_LOG_DEBUG;
message = sb->buffer + 6;
}
else if (!strncmp(sb->buffer, "DEBUG2:", 7))
{
*loglevel = CUPSD_LOG_DEBUG2;
message = sb->buffer + 7;
}
else if (!strncmp(sb->buffer, "PAGE:", 5))
{
*loglevel = CUPSD_LOG_PAGE;
message = sb->buffer + 5;
}
else if (!strncmp(sb->buffer, "STATE:", 6))
{
*loglevel = CUPSD_LOG_STATE;
message = sb->buffer + 6;
}
else if (!strncmp(sb->buffer, "ATTR:", 5))
{
*loglevel = CUPSD_LOG_ATTR;
message = sb->buffer + 5;
}
else
{
*loglevel = CUPSD_LOG_DEBUG;
message = sb->buffer;
}
while (isspace(*message & 255))
message ++;
if (*loglevel > CUPSD_LOG_NONE &&
(*loglevel != CUPSD_LOG_INFO || LogLevel == CUPSD_LOG_DEBUG2))
{
if (message[0] == '[')
cupsdLogMessage(*loglevel, "%s", message);
else
cupsdLogMessage(*loglevel, "%s %s", sb->prefix, message);
}
else if (*loglevel < CUPSD_LOG_NONE && LogLevel == CUPSD_LOG_DEBUG2)
cupsdLogMessage(CUPSD_LOG_DEBUG2, "%s %s", sb->prefix, sb->buffer);
strlcpy(line, message, linelen);
if (lineptr < sb->buffer + sb->bufused)
_cups_strcpy(sb->buffer, lineptr);
sb->bufused -= lineptr - sb->buffer;
if (sb->bufused < 0)
sb->bufused = 0;
return (line);
}