* University of Maryland at College Park
*/
/*
- * $Id: logfile.c,v 1.17.4.1.4.2.2.3 2003/01/01 23:28:56 martinea Exp $
+ * $Id: logfile.c,v 1.31 2006/06/01 14:54:39 martinea Exp $
*
* common log file writing routine
*/
#include "amanda.h"
#include "arglist.h"
+#include "util.h"
#include "conffile.h"
#include "logfile.h"
"ERROR", "WARNING", "INFO", "SUMMARY", /* information messages */
"START", "FINISH", /* start/end of a run */
"DISK", /* disk */
- "SUCCESS", "FAIL", "STRANGE", /* the end of a dump */
+ "SUCCESS", "PARTIAL", "FAIL", "STRANGE", /* the end of a dump */
+ "CHUNK", "CHUNKSUCCESS", /* ... continued */
"STATS", /* statistics */
"MARKER", /* marker for reporter */
"CONT" /* continuation line; special */
};
char *program_str[] = {
- "UNKNOWN", "planner", "driver", "amreport", "dumper", "taper", "amflush"
+ "UNKNOWN", "planner", "driver", "amreport", "dumper", "chunker",
+ "taper", "amflush"
};
int curlinenum;
*/
/* local functions */
-static void open_log P((void));
-static void close_log P((void));
+static void open_log(void);
+static void close_log(void);
-void logerror(msg)
-char *msg;
+void
+logerror(
+ char * msg)
{
log_add(L_FATAL, "%s", msg);
}
+
+printf_arglist_function2(char *log_genstring, logtype_t, typ, char *, pname, char *, format)
+{
+ va_list argp;
+ char *leader = NULL;
+ char linebuf[STR_SIZE];
+
+
+ /* format error message */
+
+ if((int)typ <= (int)L_BOGUS || (int)typ > (int)L_MARKER) typ = L_BOGUS;
+
+ if(multiline > 0) {
+ leader = stralloc(" "); /* continuation line */
+ } else {
+ leader = vstralloc(logtype_str[(int)typ], " ", pname, " ", NULL);
+ }
+
+ arglist_start(argp, format);
+ vsnprintf(linebuf, SIZEOF(linebuf)-1, format, argp);
+ /* -1 to allow for '\n' */
+ arglist_end(argp);
+ return(vstralloc(leader, linebuf, "\n", NULL));
+}
+
printf_arglist_function1(void log_add, logtype_t, typ, char *, format)
{
va_list argp;
int saved_errout;
char *leader = NULL;
char linebuf[STR_SIZE];
- int l, n, s;
+ size_t n;
/* format error message */
}
arglist_start(argp, format);
- ap_vsnprintf(linebuf, sizeof(linebuf)-1, format, argp);
+ vsnprintf(linebuf, SIZEOF(linebuf)-1, format, argp);
/* -1 to allow for '\n' */
arglist_end(argp);
if(multiline == -1) open_log();
- for(l = 0, n = strlen(leader); l < n; l += s) {
- if((s = write(logfd, leader + l, n - l)) < 0) {
- error("log file write error: %s", strerror(errno));
- }
+ if (fullwrite(logfd, leader, strlen(leader)) < 0) {
+ error("log file write error: %s", strerror(errno));
+ /*NOTREACHED*/
}
amfree(leader);
if(n == 0 || linebuf[n-1] != '\n') linebuf[n++] = '\n';
linebuf[n] = '\0';
- for(l = 0; l < n; l += s) {
- if((s = write(logfd, linebuf + l, n - l)) < 0) {
- error("log file write error: %s", strerror(errno));
- }
+ if (fullwrite(logfd, linebuf, n) < 0) {
+ error("log file write error: %s", strerror(errno));
+ /*NOTREACHED*/
}
if(multiline != -1) multiline++;
erroutput_type = saved_errout;
}
-void log_start_multiline()
+void
+log_start_multiline(void)
{
assert(multiline == -1);
}
-void log_end_multiline()
+void
+log_end_multiline(void)
{
assert(multiline != -1);
multiline = -1;
}
-void log_rename(datestamp)
-char *datestamp;
+void
+log_rename(
+ char * datestamp)
{
char *conf_logdir;
char *logfile;
logfile = vstralloc(conf_logdir, "/log", NULL);
for(seq = 0; 1; seq++) { /* if you've got MAXINT files in your dir... */
- ap_snprintf(seq_str, sizeof(seq_str), "%d", seq);
+ snprintf(seq_str, SIZEOF(seq_str), "%u", seq);
fname = newvstralloc(fname,
logfile,
".", datestamp,
if(stat(fname, &statbuf) == -1 && errno == ENOENT) break;
}
- if(rename(logfile, fname) != 0) {
+ if(rename(logfile, fname) == -1) {
error("could not rename \"%s\" to \"%s\": %s",
logfile, fname, strerror(errno));
+ /*NOTREACHED*/
}
amfree(fname);
}
-static void open_log()
+static void
+open_log(void)
{
char *conf_logdir;
if(logfd == -1) {
error("could not open log file %s: %s", logfile, strerror(errno));
+ /*NOTREACHED*/
}
- if(amflock(logfd, "log") == -1)
+ if(amflock(logfd, "log") == -1) {
error("could not lock log file %s: %s", logfile, strerror(errno));
+ /*NOTREACHED*/
+ }
}
-static void close_log()
+static void
+close_log(void)
{
- if(amfunlock(logfd, "log") == -1)
+ if(amfunlock(logfd, "log") == -1) {
error("could not unlock log file %s: %s", logfile, strerror(errno));
+ /*NOTREACHED*/
+ }
- if(close(logfd) == -1)
+ if(close(logfd) == -1) {
error("close log file: %s", strerror(errno));
+ /*NOTREACHED*/
+ }
logfd = -1;
amfree(logfile);
}
-int get_logline(logf)
-FILE *logf;
+int
+get_logline(
+ FILE * logf)
{
static char *logline = NULL;
char *logstr, *progstr;
int ch;
amfree(logline);
- if((logline = agets(logf)) == NULL) return 0;
+ while ((logline = agets(logf)) != NULL) {
+ if (logline[0] != '\0')
+ break;
+ amfree(logline);
+ }
+ if (logline == NULL) return 0;
curlinenum++;
s = logline;
ch = *s++;