/* * logger -- read and log utility * * Reads from an input and arranges to write the result on the system * log. */ int main(int argc, char **argv) { int ch, logflags, pri; char *tag, buf[1024]; char *usock = NULL; char *udpserver = NULL; char *udpport = NULL; int LogSock = -1; static const struct option longopts[] = { { "id", no_argument, 0, 'i' }, { "stderr", no_argument, 0, 's' }, { "file", required_argument, 0, 'f' }, { "priority", required_argument, 0, 'p' }, { "tag", required_argument, 0, 't' }, { "socket", required_argument, 0, 'u' }, { "udp", no_argument, 0, 'd' }, { "server", required_argument, 0, 'n' }, { "port", required_argument, 0, 'P' }, { "version", no_argument, 0, 'V' }, { "help", no_argument, 0, 'h' }, { NULL, 0, 0, 0 } }; setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); atexit(close_stdout); tag = NULL; pri = LOG_NOTICE; logflags = 0; while ((ch = getopt_long(argc, argv, "f:ip:st:u:dn:P:Vh", longopts, NULL)) != -1) { switch((char)ch) { case 'f': /* file to log */ if (freopen(optarg, "r", stdin) == NULL) err(EXIT_FAILURE, _("file %s"), optarg); break; case 'i': /* log process id also */ logflags |= LOG_PID; break; case 'p': /* priority */ pri = pencode(optarg); break; case 's': /* log to standard error */ logflags |= LOG_PERROR; break; case 't': /* tag */ tag = optarg; break; case 'u': /* unix socket */ usock = optarg; break; case 'd': optd = 1; /* use datagrams */ break; case 'n': /* udp socket */ optd = 1; /* use datagrams because udp */ udpserver = optarg; break; case 'P': /* change udp port */ udpport = optarg; break; case 'V': printf(_("%s from %s\n"), program_invocation_short_name, PACKAGE_STRING); exit(EXIT_SUCCESS); case 'h': usage(stdout); case '?': default: usage(stderr); } } argc -= optind; argv += optind; /* setup for logging */ if (!usock && !udpserver) openlog(tag ? tag : getlogin(), logflags, 0); else if (udpserver) LogSock = udpopenlog(udpserver,udpport); else LogSock = myopenlog(usock); /* log input line if appropriate */ if (argc > 0) { register char *p, *endp; size_t len; for (p = buf, endp = buf + sizeof(buf) - 2; *argv;) { len = strlen(*argv); if (p + len > endp && p > buf) { if (!usock && !udpserver) syslog(pri, "%s", buf); else mysyslog(LogSock, logflags, pri, tag, buf); p = buf; } if (len > sizeof(buf) - 1) { if (!usock && !udpserver) syslog(pri, "%s", *argv++); else mysyslog(LogSock, logflags, pri, tag, *argv++); } else { if (p != buf) *p++ = ' '; memmove(p, *argv++, len); *(p += len) = '\0'; } } if (p != buf) { if (!usock && !udpserver) syslog(pri, "%s", buf); else mysyslog(LogSock, logflags, pri, tag, buf); } } else { while (fgets(buf, sizeof(buf), stdin) != NULL) { /* glibc is buggy and adds an additional newline, so we have to remove it here until glibc is fixed */ int len = strlen(buf); if (len > 0 && buf[len - 1] == '\n') buf[len - 1] = '\0'; if (!usock && !udpserver) syslog(pri, "%s", buf); else mysyslog(LogSock, logflags, pri, tag, buf); } } if (!usock && !udpserver) closelog(); else close(LogSock); return EXIT_SUCCESS; }
/* * logger -- read and log utility * Reads from an input and arranges to write the result on the system log. */ int main (int argc, char **argv) { int ch, logflags, pri; char *tag, buf[MAX_LINE]; char *usock = NULL; long timeout_ms = 100; long timeout_sec; long timeout_usec; int indent_mode = 0; char *udpserver = NULL; int LogSock = -1; long tmpport; static const struct option longopts[] = { { "id", no_argument, 0, 'i' }, { "stderr", no_argument, 0, 's' }, { "file", required_argument, 0, 'f' }, { "priority", required_argument, 0, 'p' }, { "tag", required_argument, 0, 't' }, { "socket", required_argument, 0, 'u' }, { "udp", no_argument, 0, 'd' }, { "server", required_argument, 0, 'n' }, { "port", required_argument, 0, 'P' }, { "indent", required_argument, 0, 'I' }, { "version", no_argument, 0, 'V' }, { "help", no_argument, 0, 'h' }, { NULL, 0, 0, 0 } }; tag = NULL; pri = LOG_NOTICE; logflags = 0; while ((ch = getopt_long(argc, argv, "f:ip:st:u:dI:n:P:Vh", longopts, NULL)) != -1) { switch((char) ch) { case 'f': /* file to log */ if (freopen(optarg, "r", stdin) == NULL) err(EXIT_FAILURE, "file %s", optarg); break; case 'i': /* log process id also */ logflags |= LOG_PID; break; case 'p': /* priority */ pri = pencode(optarg); break; case 's': /* log to standard error */ logflags |= LOG_PERROR; break; case 't': /* tag */ tag = optarg; break; case 'u': /* unix socket */ usock = optarg; break; case 'd': optd = 1; /* use datagrams */ break; case 'n': /* udp socket */ optd = 1; /* use datagrams because udp */ udpserver = optarg; break; case 'P': /* change udp port */ tmpport = strtol_or_err(optarg, "failed to parse port number"); if (tmpport < 0 || 65535 < tmpport) { errx(EXIT_FAILURE, "port `%ld' out of range", tmpport); } udpport = (int) tmpport; break; case 'V': printf("%s %s\n", PROGRAM_NAME, PROGRAM_VERSION); exit(EXIT_SUCCESS); case 'I': indent_mode = 1; timeout_ms = strtol_or_err(optarg, "failed to parse timeout number"); if (timeout_ms < 1) { errx(EXIT_FAILURE, "Invalid value for timeout %li", timeout_ms); } break; case 'h': usage(stdout); case '?': default: usage(stderr); } } argc -= optind; argv += optind; /* setup for logging */ if (!usock && !udpserver) { openlog(tag ? tag : getlogin(), logflags, 0); } else if (udpserver) { LogSock = udpopenlog(udpserver, udpport); } else { LogSock = myopenlog(usock); } (void) fclose(stdout); /* log input line if appropriate */ if (argc > 0) { char *p, *endp; size_t len; for (p = buf, endp = buf + sizeof(buf) - 2; *argv;) { len = strlen(*argv); if (p + len > endp && p > buf) { if (!usock && !udpserver) { syslog(pri, "%s", buf); } else { mysyslog(LogSock, logflags, pri, tag, buf); } p = buf; } if (len > sizeof(buf) - 1) { if (!usock && !udpserver) { syslog(pri, "%s", *argv++); } else { mysyslog(LogSock, logflags, pri, tag, *argv++); } } else { if (p != buf) { *p++ = ' '; } memmove(p, *argv++, len); *(p += len) = '\0'; } } if (p != buf) { if (!usock && !udpserver) { syslog(pri, "%s", buf); } else { mysyslog(LogSock, logflags, pri, tag, buf); } } } else if (indent_mode) { int len; timeout_sec = timeout_ms / 1000; timeout_usec = (timeout_ms % 1000) * 1000; while ((len = readBlock(buf, MAX_LINE, timeout_sec, timeout_usec)) != EOF) { //fprintf(stderr, "Got buf %i\n", len); if (len > 0 && buf[len - 1] == '\n') { buf[len - 1] = '\0'; } if (!usock && !udpserver) { syslog(pri, "%s", buf); } else { mysyslog(LogSock, logflags, pri, tag, buf); } } } else { while (fgets(buf, sizeof(buf), stdin) != NULL) { /* glibc is buggy and adds an additional newline, so we have to remove it here until glibc is fixed */ int len = strlen(buf); if (len > 0 && buf[len - 1] == '\n') { buf[len - 1] = '\0'; } if (!usock && !udpserver) { syslog(pri, "%s", buf); } else { mysyslog(LogSock, logflags, pri, tag, buf); } } } if (!usock && !udpserver) { closelog(); } else { close(LogSock); } return EXIT_SUCCESS; }