|
17 | 17 | #include <pwd.h> |
18 | 18 | #include <grp.h> |
19 | 19 | #include <sys/stat.h> |
| 20 | +#include <syslog.h> |
20 | 21 |
|
21 | 22 | #include "configuration.h" |
22 | 23 | #include "version.h" |
|
39 | 40 | #define CFG_GROUP "group" |
40 | 41 | #define CFG_QUIET "quiet" |
41 | 42 | #define CFG_SYSLOG "syslog" |
| 43 | +#define CFG_SYSLOG_FACILITY "syslog-facility" |
| 44 | +#define CFG_PARAM_SYSLOG_FACILITY 11015 |
42 | 45 | #define CFG_DAEMON "daemon" |
43 | 46 | #define CFG_WRITE_IP "write-ip" |
44 | 47 | #define CFG_WRITE_PROXY "write-proxy" |
@@ -137,6 +140,7 @@ stud_config * config_new (void) { |
137 | 140 |
|
138 | 141 | r->QUIET = 0; |
139 | 142 | r->SYSLOG = 0; |
| 143 | + r->SYSLOG_FACILITY = LOG_DAEMON; |
140 | 144 | r->TCP_KEEPALIVE_TIME = 3600; |
141 | 145 | r->DAEMONIZE = 0; |
142 | 146 | r->PREFER_SERVER_CIPHERS = 0; |
@@ -620,6 +624,47 @@ void config_param_validate (char *k, char *v, stud_config *cfg, char *file, int |
620 | 624 | else if (strcmp(k, CFG_SYSLOG) == 0) { |
621 | 625 | r = config_param_val_bool(v, &cfg->SYSLOG); |
622 | 626 | } |
| 627 | + else if (strcmp(k, CFG_SYSLOG_FACILITY) == 0) { |
| 628 | + r = 1; |
| 629 | + if (!strcmp(v, "auth") || !strcmp(v, "authpriv")) |
| 630 | + cfg->SYSLOG_FACILITY = LOG_AUTHPRIV; |
| 631 | + else if (!strcmp(v, "cron")) |
| 632 | + cfg->SYSLOG_FACILITY = LOG_CRON; |
| 633 | + else if (!strcmp(v, "daemon")) |
| 634 | + cfg->SYSLOG_FACILITY = LOG_DAEMON; |
| 635 | + else if (!strcmp(v, "ftp")) |
| 636 | + cfg->SYSLOG_FACILITY = LOG_FTP; |
| 637 | + else if (!strcmp(v, "local0")) |
| 638 | + cfg->SYSLOG_FACILITY = LOG_LOCAL0; |
| 639 | + else if (!strcmp(v, "local1")) |
| 640 | + cfg->SYSLOG_FACILITY = LOG_LOCAL1; |
| 641 | + else if (!strcmp(v, "local2")) |
| 642 | + cfg->SYSLOG_FACILITY = LOG_LOCAL2; |
| 643 | + else if (!strcmp(v, "local3")) |
| 644 | + cfg->SYSLOG_FACILITY = LOG_LOCAL3; |
| 645 | + else if (!strcmp(v, "local4")) |
| 646 | + cfg->SYSLOG_FACILITY = LOG_LOCAL4; |
| 647 | + else if (!strcmp(v, "local5")) |
| 648 | + cfg->SYSLOG_FACILITY = LOG_LOCAL5; |
| 649 | + else if (!strcmp(v, "local6")) |
| 650 | + cfg->SYSLOG_FACILITY = LOG_LOCAL6; |
| 651 | + else if (!strcmp(v, "local7")) |
| 652 | + cfg->SYSLOG_FACILITY = LOG_LOCAL7; |
| 653 | + else if (!strcmp(v, "lpr")) |
| 654 | + cfg->SYSLOG_FACILITY = LOG_LPR; |
| 655 | + else if (!strcmp(v, "mail")) |
| 656 | + cfg->SYSLOG_FACILITY = LOG_MAIL; |
| 657 | + else if (!strcmp(v, "news")) |
| 658 | + cfg->SYSLOG_FACILITY = LOG_NEWS; |
| 659 | + else if (!strcmp(v, "user")) |
| 660 | + cfg->SYSLOG_FACILITY = LOG_USER; |
| 661 | + else if (!strcmp(v, "uucp")) |
| 662 | + cfg->SYSLOG_FACILITY = LOG_UUCP; |
| 663 | + else { |
| 664 | + config_error_set("Invalid facility '%s'.", v); |
| 665 | + r = 0; |
| 666 | + } |
| 667 | + } |
623 | 668 | else if (strcmp(k, CFG_DAEMON) == 0) { |
624 | 669 | r = config_param_val_bool(v, &cfg->DAEMONIZE); |
625 | 670 | } |
@@ -748,6 +793,48 @@ char * config_disp_hostport (char *host, char *port) { |
748 | 793 | return tmp_buf; |
749 | 794 | } |
750 | 795 |
|
| 796 | +const char * config_disp_log_facility (int facility) { |
| 797 | + switch (facility) |
| 798 | + { |
| 799 | + case LOG_AUTHPRIV: |
| 800 | + return "authpriv"; |
| 801 | + case LOG_CRON: |
| 802 | + return "cron"; |
| 803 | + case LOG_DAEMON: |
| 804 | + return "daemon"; |
| 805 | + case LOG_FTP: |
| 806 | + return "ftp"; |
| 807 | + case LOG_LOCAL0: |
| 808 | + return "local0"; |
| 809 | + case LOG_LOCAL1: |
| 810 | + return "local1"; |
| 811 | + case LOG_LOCAL2: |
| 812 | + return "local2"; |
| 813 | + case LOG_LOCAL3: |
| 814 | + return "local3"; |
| 815 | + case LOG_LOCAL4: |
| 816 | + return "local4"; |
| 817 | + case LOG_LOCAL5: |
| 818 | + return "local5"; |
| 819 | + case LOG_LOCAL6: |
| 820 | + return "local6"; |
| 821 | + case LOG_LOCAL7: |
| 822 | + return "local7"; |
| 823 | + case LOG_LPR: |
| 824 | + return "lpr"; |
| 825 | + case LOG_MAIL: |
| 826 | + return "mail"; |
| 827 | + case LOG_NEWS: |
| 828 | + return "news"; |
| 829 | + case LOG_USER: |
| 830 | + return "user"; |
| 831 | + case LOG_UUCP: |
| 832 | + return "uucp"; |
| 833 | + default: |
| 834 | + return "UNKNOWN"; |
| 835 | + } |
| 836 | +} |
| 837 | + |
751 | 838 | void config_print_usage_fd (char *prog, stud_config *cfg, FILE *out) { |
752 | 839 | if (out == NULL) out = stderr; |
753 | 840 | fprintf(out, "Usage: %s [OPTIONS] PEM\n\n", basename(prog)); |
@@ -806,6 +893,7 @@ void config_print_usage_fd (char *prog, stud_config *cfg, FILE *out) { |
806 | 893 | fprintf(out, "LOGGING:\n"); |
807 | 894 | fprintf(out, " -q --quiet Be quiet; emit only error messages\n"); |
808 | 895 | fprintf(out, " -s --syslog Send log message to syslog in addition to stderr/stdout\n"); |
| 896 | + fprintf(out, " --syslog-facility=FACILITY Syslog facility to use (Default: \"%s\")\n", config_disp_log_facility(cfg->SYSLOG_FACILITY)); |
809 | 897 | fprintf(out, "\n"); |
810 | 898 | fprintf(out, "OTHER OPTIONS:\n"); |
811 | 899 | fprintf(out, " --daemon Fork into background and become a daemon (Default: %s)\n", config_disp_bool(cfg->DAEMONIZE)); |
@@ -968,6 +1056,12 @@ void config_print_default (FILE *fd, stud_config *cfg) { |
968 | 1056 | fprintf(fd, FMT_STR, CFG_SYSLOG, config_disp_bool(cfg->SYSLOG)); |
969 | 1057 | fprintf(fd, "\n"); |
970 | 1058 |
|
| 1059 | + fprintf(fd, "# Syslog facility to use\n"); |
| 1060 | + fprintf(fd, "#\n"); |
| 1061 | + fprintf(fd, "# type: string\n"); |
| 1062 | + fprintf(fd, FMT_QSTR, CFG_SYSLOG_FACILITY, config_disp_log_facility(cfg->SYSLOG_FACILITY)); |
| 1063 | + fprintf(fd, "\n"); |
| 1064 | + |
971 | 1065 | fprintf(fd, "# Run as daemon\n"); |
972 | 1066 | fprintf(fd, "#\n"); |
973 | 1067 | fprintf(fd, "# type: boolean\n"); |
@@ -1032,6 +1126,7 @@ void config_parse_cli(int argc, char **argv, stud_config *cfg) { |
1032 | 1126 | { CFG_GROUP, 1, NULL, 'g' }, |
1033 | 1127 | { CFG_QUIET, 0, NULL, 'q' }, |
1034 | 1128 | { CFG_SYSLOG, 0, NULL, 's' }, |
| 1129 | + { CFG_SYSLOG_FACILITY, 1, NULL, CFG_PARAM_SYSLOG_FACILITY }, |
1035 | 1130 | { CFG_DAEMON, 0, &cfg->DAEMONIZE, 1 }, |
1036 | 1131 | { CFG_WRITE_IP, 0, &cfg->WRITE_IP_OCTET, 1 }, |
1037 | 1132 | { CFG_WRITE_PROXY, 0, &cfg->WRITE_PROXY_LINE, 1 }, |
@@ -1066,6 +1161,9 @@ void config_parse_cli(int argc, char **argv, stud_config *cfg) { |
1066 | 1161 | exit(0); |
1067 | 1162 | break; |
1068 | 1163 | #endif |
| 1164 | + case CFG_PARAM_SYSLOG_FACILITY: |
| 1165 | + config_param_validate(CFG_SYSLOG_FACILITY, optarg, cfg, NULL, 0); |
| 1166 | + break; |
1069 | 1167 | case 'c': |
1070 | 1168 | config_param_validate(CFG_CIPHERS, optarg, cfg, NULL, 0); |
1071 | 1169 | break; |
|
0 commit comments