int main (int argc, char const * argv []) { static char const * optv [] = { "write a message to the system logging facility", "[message]", "b:def:i:p:ns:t", "b s\tidentity is the basename of s ", "e\techo messages on stderr", "f s\tmessage filename", "i s\tidentity string", "p s\tpriority in facility.severity format", "n\tinclude PID number", "d\tuse datagrams", "s s\tsocket filename", "t\tsend test messages", (char const *) (0) }; char message [TEXTLINE_MAX]; char * bp = message; char const * socketname = (char *) (0); char const * identity = (char *) (0); int priority = SYSLOG_USER | SYSLOG_INFO; code_t sockettype = SOCK_STREAM; flag_t options = (flag_t) (0); file_t fd = (file_t) (-1); int c; while (~ (c = getoptv (argc, argv, optv))) { switch (c) { case 'b': for (identity = optarg; * optarg != (char) (0); optarg++) { if (* optarg == PATH_C_EXTENDER) { identity = optarg + 1; } } break; case 'd': sockettype = SOCK_DGRAM; break; case 'e': _setbits (options, SYSLOG_PERROR); break; case 'f': if (freopen (optarg, "rb", stdin) == (FILE *) (0)) { error (1, errno, "%s", optarg); } break; case 'i': identity = optarg; break; case 'n': _setbits (options, SYSLOG_PROCESS); break; case 'p': priority = syslog_encode (optarg); break; case 's': socketname = optarg; break; case 't': mysyslogtest (priority); exit (0); default: break; } } argc -= optind; argv += optind; fclose (stdout); if (socketname) { fd = myopenlog (socketname, sockettype); } else { openlog (identity, options, priority); } if (! argc) { while ((c = getc (stdin)) != EOF) { if (nobreak (c)) { if ((unsigned) (bp - message) < STRLEN (message)) { * bp++ = c; } } else { * bp = (char) (0); if (socketname) { mysyslog (fd, options, priority, identity, message); } else { syslog (priority, "%s", message); } bp = message; } } } else { for (bp = message; (argc) && (* argv); * bp++ = ' ') { char const * string; for (string = * argv; * string; string++) { if ((unsigned) (bp - message) < STRLEN (message)) { * bp++ = * string; } } argc--; argv++; } if (bp > message) { bp--; } * bp = (char) (0); if (socketname) { mysyslog (fd, options, priority, identity, message); } else { syslog (priority, "%s", message); } } if (socketname) { close (fd); } else { closelog (); } exit (0); }
/* * 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; }