Go to the documentation of this file.
21 #include <sys/param.h>
33 #define LOGFILE_BUF_LEN 65536
36 rotate(
const char *path,
int rotate_count)
46 if (stat(path, &sb) == 0)
47 if (S_ISREG(sb.st_mode) == 0)
51 for (i = rotate_count; i > 1;) {
53 snprintf(from,
MAXPATHLEN,
"%s.%d", path, i - 1);
55 #if _SQUID_OS2_ || _SQUID_WINDOWS_
58 fprintf(stderr,
"WARNING: remove '%s' failure: %s\n", to,
xstrerr(xerrno));
61 if (rename(from, to) < 0 && errno != ENOENT) {
63 fprintf(stderr,
"WARNING: rename '%s' to '%s' failure: %s\n", from, to,
xstrerr(xerrno));
66 if (rotate_count > 0) {
68 #if _SQUID_OS2_ || _SQUID_WINDOWS_
71 fprintf(stderr,
"WARNING: remove '%s' failure: %s\n", to,
xstrerr(xerrno));
74 if (rename(path, to) < 0 && errno != ENOENT) {
76 fprintf(stderr,
"WARNING: rename %s to %s failure: %s\n", path, to,
xstrerr(xerrno));
93 main(
int argc,
char *argv[])
98 int rotate_count = 10;
102 printf(
"Error: usage: %s <logfile>\n", argv[0]);
105 fp = fopen(argv[1],
"a");
110 setbuf(stdout,
nullptr);
115 t =
xopen(_PATH_DEVNULL, O_RDWR);
123 if (buf[1] !=
'\0') {
124 fprintf(fp,
"%s", buf + 1);
126 int err = ferror(fp);
132 if (err == EFBIG || err == ENOSPC) {
133 fprintf(stderr,
"WARNING: %s writing %s. Attempting to recover via a log rotation.\n",
xstrerr(err),argv[1]);
135 rotate(argv[1], rotate_count);
136 fp = fopen(argv[1],
"a");
141 fprintf(fp,
"%s", buf + 1);
153 rotate(argv[1], rotate_count);
154 fp = fopen(argv[1],
"a");
166 rotate_count = atoi(buf + 1);
170 do_buffer = (buf[1] ==
'1');
177 fprintf(fp,
"%s", buf);
const char * xstrerr(int error)
int main(int argc, char *argv[])
int xopen(const char *filename, int oflag, int pmode=0)
POSIX open(2) equivalent.
int xclose(int fd)
POSIX close(2) equivalent.
static void rotate(const char *path, int rotate_count)