static void klogd_signal(int sig ATTRIBUTE_UNUSED) { klogctl(7, NULL, 0); klogctl(0, NULL, 0); syslog(LOG_NOTICE, "klogd: exiting"); kill_myself_with_sig(sig); }
static void klogd_close(void) { /* FYI: cmd 7 is equivalent to setting console_loglevel to 7 * via klogctl(8, NULL, 7). */ klogctl(7, NULL, 0); /* "7 -- Enable printk's to console" */ klogctl(0, NULL, 0); /* "0 -- Close the log. Currently a NOP" */ }
/* get the kernel log aka dmesg */ static void getKlog(FILE* f) { fprintf(f, "\n\ndmesg\n\n"); ssize_t len = klogctl(10, NULL, 0); /* read ring buffer size */ if (len == -1) { fprintf(f, "Error reading klog %d - %m\n", errno); return; } else if(len == 0) { return; } std::vector<char> buf(len, 0); len = klogctl(4, &buf[0], len); /* read and clear ring buffer */ if (len == -1) { fprintf(f, "Error reading klog %d - %m\n", errno); return; } buf.resize(len); fprintf(f, "%s\n", &buf[0]); }
void LogAudit::logDmesg() { int len = klogctl(KLOG_SIZE_BUFFER, NULL, 0); if (len <= 0) { return; } len++; char buf[len]; int rc = klogctl(KLOG_READ_ALL, buf, len); buf[len - 1] = '\0'; for(char *tok = buf; (rc >= 0) && ((tok = strtok(tok, "\r\n"))); tok = NULL) { char *audit = strstr(tok, " audit("); if (!audit) { continue; } *audit++ = '\0'; char *type = strstr(tok, "type="); if (type) { rc = logPrint("%s %s", type, audit); } else { rc = logPrint("%s", audit); } } }
static void doKlogd(const int console_log_level) { int priority = LOG_INFO; char log_buffer[4096]; int i, n, lastc; char *start; openlog("kernel", 0, LOG_KERN); /* Set up sig handlers */ signal(SIGINT, klogd_signal); signal(SIGKILL, klogd_signal); signal(SIGTERM, klogd_signal); signal(SIGHUP, SIG_IGN); /* "Open the log. Currently a NOP." */ klogctl(1, NULL, 0); /* Set level of kernel console messaging.. */ if (console_log_level != -1) klogctl(8, NULL, console_log_level); syslog(LOG_NOTICE, "klogd started: " BB_BANNER); while (1) { /* Use kernel syscalls */ memset(log_buffer, '\0', sizeof(log_buffer)); n = klogctl(2, log_buffer, sizeof(log_buffer)); if (n < 0) { if (errno == EINTR) continue; syslog(LOG_ERR, "klogd: Error return from sys_sycall: %d - %m.\n", errno); exit(EXIT_FAILURE); } /* klogctl buffer parsing modelled after code in dmesg.c */ start = &log_buffer[0]; lastc = '\0'; for (i = 0; i < n; i++) { if (lastc == '\0' && log_buffer[i] == '<') { priority = 0; i++; while (isdigit(log_buffer[i])) { priority = priority * 10 + (log_buffer[i] - '0'); i++; } if (log_buffer[i] == '>') i++; start = &log_buffer[i]; } if (log_buffer[i] == '\n') { log_buffer[i] = '\0'; /* zero terminate this message */ syslog(priority, "%s", start); start = &log_buffer[i + 1]; priority = LOG_INFO; } lastc = log_buffer[i]; } } }
static void klogd_signal(int sig ATTRIBUTE_UNUSED) { klogctl(7, NULL, 0); klogctl(0, 0, 0); syslog(LOG_NOTICE, "Kernel log daemon exiting"); exit(EXIT_SUCCESS); }
static void klogd_signal(int sig) { klogctl(7, NULL, 0); klogctl(0, 0, 0); //logMessage(0, "Kernel log daemon exiting."); syslog_msg(LOG_SYSLOG, LOG_NOTICE, "Kernel log daemon exiting."); exit(TRUE); }
static void klogd_signal(int sig) { klogctl(7, NULL, 0); klogctl(0, 0, 0); /* logMessage(0, "Kernel log daemon exiting."); */ syslog(LOG_NOTICE, "Kernel log daemon exiting."); exit(EXIT_SUCCESS); }
static void doKlogd (void) { int priority = LOG_INFO; char log_buffer[4096]; int i, n, lastc; char *start; /* Set up sig handlers */ signal(SIGINT, klogd_signal); signal(SIGKILL, klogd_signal); signal(SIGTERM, klogd_signal); signal(SIGHUP, SIG_IGN); /* "Open the log. Currently a NOP." */ klogctl(1, NULL, 0); syslog_msg(LOG_DAEMON, 0, "klogd started: " BB_BANNER); while (1) { /* Use kernel syscalls */ memset(log_buffer, '\0', sizeof(log_buffer)); n = klogctl(2, log_buffer, sizeof(log_buffer)); if (n < 0) { char message[80]; if (errno == EINTR) continue; snprintf(message, 79, "klogd: Error return from sys_sycall: %d - %s.\n", errno, strerror(errno)); syslog_msg(LOG_DAEMON, LOG_SYSLOG | LOG_ERR, message); exit(1); } /* klogctl buffer parsing modelled after code in dmesg.c */ start=&log_buffer[0]; lastc='\0'; for (i=0; i<n; i++) { if (lastc == '\0' && log_buffer[i] == '<') { priority = 0; i++; while (isdigit(log_buffer[i])) { priority = priority*10+(log_buffer[i]-'0'); i++; } if (log_buffer[i] == '>') i++; start = &log_buffer[i]; } if (log_buffer[i] == '\n') { log_buffer[i] = '\0'; /* zero terminate this message */ syslog_msg(LOG_DAEMON, LOG_KERN | priority, start); start = &log_buffer[i+1]; priority = LOG_INFO; } lastc = log_buffer[i]; } } }
static void klogd_signal(int sig) { /* FYI: cmd 7 is equivalent to setting console_loglevel to 7 * via klogctl(8, NULL, 7). */ klogctl(7, NULL, 0); /* "7 -- Enable printk's to console" */ klogctl(0, NULL, 0); /* "0 -- Close the log. Currently a NOP" */ syslog(LOG_NOTICE, "klogd: exiting"); kill_myself_with_sig(sig); }
static char *get_klog_buff(int *klen) { int ret, len = klogctl(10, NULL, 0); char *buff = malloc(len); assert(buff && klen); ret = klogctl(3, buff, len); assert(ret >= 0); *klen = ret; return buff; }
int dmesg_main(int argc ATTRIBUTE_UNUSED, char **argv) { int len; char *buf; char *size, *level; unsigned flags = getopt32(argv, "cs:n:", &size, &level); enum { OPT_c = 1<<0, OPT_s = 1<<1, OPT_n = 1<<2 }; if (flags & OPT_n) { if (klogctl(8, NULL, xatoul_range(level, 0, 10))) bb_perror_msg_and_die("klogctl"); return EXIT_SUCCESS; } len = (flags & OPT_s) ? xatoul_range(size, 2, INT_MAX) : 16384; buf = xmalloc(len); len = klogctl(3 + (flags & OPT_c), buf, len); if (len < 0) bb_perror_msg_and_die("klogctl"); if (len == 0) return EXIT_SUCCESS; /* Skip <#> at the start of lines, and make sure we end with a newline. */ if (ENABLE_FEATURE_DMESG_PRETTY) { int last = '\n'; int in = 0; do { if (last == '\n' && buf[in] == '<') in += 3; else { last = buf[in++]; bb_putchar(last); } } while (in < len); if (last != '\n') bb_putchar('\n'); } else { full_write(STDOUT_FILENO, buf, len); if (buf[len-1] != '\n') bb_putchar('\n'); } if (ENABLE_FEATURE_CLEAN_UP) free(buf); return EXIT_SUCCESS; }
int dmesg_main(int argc, char **argv) { char *buffer; char *p; ssize_t ret; int n, op, klog_buf_len; klog_buf_len = klogctl(KLOG_SIZE_BUFFER, 0, 0); if (klog_buf_len <= 0) { klog_buf_len = FALLBACK_KLOG_BUF_LEN; } buffer = (char *)malloc(klog_buf_len + 1); if (!buffer) { perror("malloc"); return EXIT_FAILURE; } p = buffer; if((argc == 2) && (!strcmp(argv[1],"-c"))) { op = KLOG_READ_CLEAR; } else { op = KLOG_READ_ALL; } n = klogctl(op, buffer, klog_buf_len); if (n < 0) { perror("klogctl"); return EXIT_FAILURE; } buffer[n] = '\0'; while((ret = write(STDOUT_FILENO, p, n))) { if (ret == -1) { if (errno == EINTR) continue; perror("write"); return EXIT_FAILURE; } p += ret; n -= ret; } return 0; }
static void read_dmesg(void) { int size; if (dmesg_content) return; size = klogctl(10, NULL, 0); if (size <= 0) return; dmesg_content = calloc(size + 1, 1); klogctl(3, dmesg_content, size); }
int set_dmesg_loglevel(int fd, int level) { if (klogctl(8, NULL, level) == -1) return sockerror(fd, "klogctl(8)"); return sockprint(fd, "dmesg loglevel set to %d\r\n", level); }
/* sets up and launches syslog */ static void startSyslog(void) { int conf_fd; int ret; char addr[128]; char forwardtcp[] = "*.* @@"; /* update the config file with command line arguments first */ getSyslog(addr); if (strlen(addr) > 0) { conf_fd = open("/etc/rsyslog.conf", O_WRONLY|O_APPEND); if (conf_fd < 0) { printf("error opening /etc/rsyslog.conf: %d\n", errno); printf("syslog forwarding will not be enabled\n"); sleep(5); } else { ret = write(conf_fd, forwardtcp, strlen(forwardtcp)); ret = write(conf_fd, addr, strlen(addr)); ret = write(conf_fd, "\n", 1); close(conf_fd); } } /* rsyslog is going to take care of things, so disable console logging */ klogctl(8, NULL, 1); /* now we really start the daemon. */ int status; status = system("/sbin/rsyslogd -c 4"); if (status < 0 || !WIFEXITED(status) || WEXITSTATUS(status) != 0) { printf("Unable to start syslog daemon.\n"); fatal_error(1); } }
static int nvram_restore_defaults(void) { struct nvram_pair *np; int restore_defaults; /* Restore defaults if told to or OS has changed */ restore_defaults = !nvram_match("restore_defaults", "0"); /* check asus-wrt NVRAM content (sorry, but many params is incompatible) */ if (!restore_defaults) { if (nvram_get("buildno") && nvram_get("buildinfo") && nvram_get("extendno")) restore_defaults = 1; } if (restore_defaults) nvram_clear(); /* Restore defaults */ for (np = router_defaults; np->name; np++) { if (restore_defaults || !nvram_get(np->name)) { nvram_set(np->name, np->value); } } klogctl(8, NULL, nvram_get_int("console_loglevel")); /* load static values */ nvram_modem_type = nvram_get_int("modem_type"); nvram_modem_rule = nvram_get_int("modem_rule"); nvram_nf_nat_type = nvram_get_int("nf_nat_type"); nvram_ipv6_type = get_ipv6_type(); return restore_defaults; }
/* open the kernel log - will be called inside the willRun() imklog * entry point. -- rgerhards, 2008-04-09 */ rsRetVal klogWillRunPrePrivDrop(modConfData_t *pModConf) { char errmsg[2048]; int r; DEFiRet; fklog = open((char*)GetPath(pModConf), O_RDONLY, 0); if (fklog < 0) { imklogLogIntMsg(LOG_ERR, "imklog: cannot open kernel log (%s): %s.", GetPath(pModConf), rs_strerror_r(errno, errmsg, sizeof(errmsg))); ABORT_FINALIZE(RS_RET_ERR_OPEN_KLOG); } # ifdef OS_LINUX /* Set level of kernel console messaging.. */ if(pModConf->console_log_level != -1) { r = klogctl(8, NULL, pModConf->console_log_level); if(r != 0) { imklogLogIntMsg(LOG_WARNING, "imklog: cannot set console log level: %s", rs_strerror_r(errno, errmsg, sizeof(errmsg))); /* make sure we do not try to re-set! */ pModConf->console_log_level = -1; } } # endif /* #ifdef OS_LINUX */ finalize_it: RETiRet; }
static void console_level(int level) { #if !(defined __GLIBC__ && __GLIBC__ >= 2) syslog(8,0,level); #else klogctl(8, 0, level); #endif }
static bool dump_kernel_log(const char *file) { int len = klogctl(KLOG_SIZE_BUFFER, nullptr, 0); if (len < 0) { LOGE("Failed to get kernel log buffer size: %s", strerror(errno)); return false; } char *buf = (char *) malloc(len); if (!buf) { LOGE("Failed to allocate %d bytes: %s", len, strerror(errno)); return false; } auto free_buf = util::finally([&] { free(buf); }); len = klogctl(KLOG_READ_ALL, buf, len); if (len < 0) { LOGE("Failed to read kernel log buffer: %s", strerror(errno)); return false; } autoclose::file fp(autoclose::fopen(file, "wb")); if (!fp) { LOGE("%s: Failed to open for writing: %s", file, strerror(errno)); return false; } if (len > 0) { if (fwrite(buf, len, 1, fp.get()) != 1) { LOGE("%s: Failed to write data: %s", file, strerror(errno)); return false; } if (buf[len - 1] != '\n') { if (fputc('\n', fp.get()) == EOF) { LOGE("%s: Failed to write data: %s", file, strerror(errno)); return false; } } } return true; }
int main() { char* buf; int r; r = klogctl(SYSLOG_ACTION_SIZE_BUFFER, 0, 0); if (r < 0) { perror("SYSLOG_ACTION_SIZE_BUFFER"); return 1; } printf("size=%d\n", r); buf = malloc(r); r = klogctl(SYSLOG_ACTION_READ_ALL, buf, r); if (r < 0) { perror("SYSLOG_ACTION_SIZE_BUFFER"); return 1; } puts(buf); }
int main(int argc, char** argv) { int number_of_unread_characters; #if defined HAVE_KLOGCTL number_of_unread_characters = klogctl(9, 0, 0); #endif fprintf(stderr, "Done.\n"); return 0 * number_of_unread_characters; }
bool mmap_syslog(char** buffer, int* size) { *size = klogctl(SYSLOG_ACTION_SIZE_BUFFER, 0, 0); if (*size == -1) { dprintf("[-] klogctl(SYSLOG_ACTION_SIZE_BUFFER)\n"); return false; } *size = (*size / getpagesize() + 1) * getpagesize(); *buffer = (char*)mmap(NULL, *size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); *size = klogctl(SYSLOG_ACTION_READ_ALL, &((*buffer)[0]), *size); if (*size == -1) { dprintf("[-] klogctl(SYSLOG_ACTION_READ_ALL)\n"); return false; } return true; }
void start_sysinit(void) { char buf[PATH_MAX]; struct stat tmp_stat; time_t tm = 0; if (!nvram_match("disable_watchdog", "1")) eval("watchdog"); /* * Setup console */ cprintf("sysinit() klogctl\n"); klogctl(8, NULL, atoi(nvram_safe_get("console_loglevel"))); cprintf("sysinit() get router\n"); int brand = getRouterBrand(); /* * network drivers */ insmod("ag7100_mod"); int s; struct ifreq ifr; if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW))) { char eabuf[32]; strncpy(ifr.ifr_name, "eth0", IFNAMSIZ); ioctl(s, SIOCGIFHWADDR, &ifr); char macaddr[32]; strcpy(macaddr, ether_etoa((unsigned char *)ifr.ifr_hwaddr.sa_data, eabuf)); nvram_set("et0macaddr", macaddr); nvram_set("et0macaddr_safe", macaddr); close(s); } #ifdef HAVE_MADWIFI_MIMO // insmod("ath_pci", "autocreate=none"); insmod("ath_mimo_pci"); #endif // eval ("ifconfig", "wifi0", "up"); /* * Set a sane date */ stime(&tm); nvram_set("wl0_ifname", "ath0"); return; cprintf("done\n"); }
static void readDmesg(LogAudit* al, LogKlog* kl) { if (!al && !kl) { return; } int rc = klogctl(KLOG_SIZE_BUFFER, nullptr, 0); if (rc <= 0) { return; } // Margin for additional input race or trailing nul ssize_t len = rc + 1024; std::unique_ptr<char[]> buf(new char[len]); rc = klogctl(KLOG_READ_ALL, buf.get(), len); if (rc <= 0) { return; } if (rc < len) { len = rc + 1; } buf[--len] = '\0'; if (kl && kl->isMonotonic()) { kl->synchronize(buf.get(), len); } ssize_t sublen; for (char *ptr = nullptr, *tok = buf.get(); (rc >= 0) && !!(tok = android::log_strntok_r(tok, len, ptr, sublen)); tok = nullptr) { if ((sublen <= 0) || !*tok) continue; if (al) { rc = al->log(tok, sublen); } if (kl) { rc = kl->log(tok, sublen); } } }
void start_sysinit(void) { char buf[PATH_MAX]; struct stat tmp_stat; time_t tm = 0; eval("/bin/tar", "-xzf", "/dev/mtdblock/2", "-C", "/"); FILE *in = fopen("/tmp/nvram/nvram.db", "rb"); if (in != NULL) { fclose(in); eval("/usr/sbin/convertnvram"); eval("/sbin/mtd", "erase", "nvram"); nvram_commit(); } if (!nvram_match("disable_watchdog", "1")) eval("watchdog"); /* * Setup console */ cprintf("sysinit() klogctl\n"); klogctl(8, NULL, atoi(nvram_safe_get("console_loglevel"))); cprintf("sysinit() get router\n"); int brand = getRouterBrand(); /* * network drivers */ detect_wireless_devices(); struct ifreq ifr; int s; if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW))) { char eabuf[32]; strncpy(ifr.ifr_name, "eth0", IFNAMSIZ); ioctl(s, SIOCGIFHWADDR, &ifr); nvram_set("et0macaddr_safe", ether_etoa((unsigned char *)ifr.ifr_hwaddr.sa_data, eabuf)); nvram_set("et0macaddr", ether_etoa((unsigned char *)ifr.ifr_hwaddr.sa_data, eabuf)); close(s); } /* * Set a sane date */ stime(&tm); nvram_set("wl0_ifname", "ath0"); return; }
/* to be called in the module's AfterRun entry point * rgerhards, 2008-04-09 */ rsRetVal klogAfterRun(modConfData_t *pModConf) { DEFiRet; if(fklog != -1) close(fklog); # ifdef OS_LINUX /* Turn on logging of messages to console, but only if a log level was speficied */ if(pModConf->console_log_level != -1) klogctl(7, NULL, 0); # endif RETiRet; }
static jbyteArray android_net_wifi_readKernelLog(JNIEnv *env, jclass cls) { JNIHelper helper(env); ALOGV("Reading kernel logs"); int size = klogctl(/* SYSLOG_ACTION_SIZE_BUFFER */ 10, 0, 0); if (size < 1) { ALOGD("no kernel logs"); return helper.newByteArray(0).detach(); } char *buf = (char *)malloc(size); if (buf == NULL) { ALOGD("can't allocate temporary storage"); return helper.newByteArray(0).detach(); } int read = klogctl(/* SYSLOG_ACTION_READ_ALL */ 3, buf, size); if (read < 0) { ALOGD("can't read logs - %d", read); free(buf); return helper.newByteArray(0).detach(); } else { ALOGV("read %d bytes", read); } if (read != size) { ALOGV("read %d bytes, expecting %d", read, size); } JNIObject<jbyteArray> result = helper.newByteArray(read); if (result.isNull()) { ALOGD("can't allocate array"); free(buf); return result.detach(); } helper.setByteArrayRegion(result, 0, read, (jbyte*)buf); free(buf); return result.detach(); }
static void readDmesg(LogAudit *al, LogKlog *kl) { if (!al && !kl) { return; } int rc = klogctl(KLOG_SIZE_BUFFER, NULL, 0); if (rc <= 0) { return; } size_t len = rc + 1024; // Margin for additional input race or trailing nul std::unique_ptr<char []> buf(new char[len]); rc = klogctl(KLOG_READ_ALL, buf.get(), len); if (rc <= 0) { return; } if ((size_t)rc < len) { len = rc + 1; } buf[--len] = '\0'; if (kl && kl->isMonotonic()) { kl->synchronize(buf.get(), len); } size_t sublen; for (char *ptr = NULL, *tok = buf.get(); (rc >= 0) && ((tok = log_strntok_r(tok, &len, &ptr, &sublen))); tok = NULL) { if (al) { rc = al->log(tok, sublen); } if (kl) { rc = kl->log(tok, sublen); } } }
int main(int argc, char *argv[]) { char *password; int port = DEFAULT_LISTEN_PORT; parameters_t pars; struct sched_param sched_par; openlog("tcpconsole", LOG_CONS|LOG_NDELAY|LOG_NOWAIT|LOG_PID, LOG_DAEMON); if (getuid()) error_exit("This program must be invoked with root-rights."); password = read_password("/etc/tcpconsole.pw"); if (signal(SIGTERM, SIG_IGN) == SIG_ERR) error_exit("signal(SIGTERM) failed"); if (signal(SIGHUP, SIG_IGN) == SIG_ERR) error_exit("signal(SIGHUP) failed"); pars.sysrq_fd = open_file("/proc/sysrq-trigger", O_WRONLY); pars.vcsa0_fd = open_file("/dev/vcsa", O_RDONLY); if (setpriority(PRIO_PROCESS, 0, -10) == -1) error_exit("Setpriority failed"); if (nice(-20) == -1) error_exit("Failed to set nice-value to -20"); if (mlockall(MCL_CURRENT) == -1 || mlockall(MCL_FUTURE) == -1) error_exit("Failed to lock program in core"); memset(&sched_par, 0x00, sizeof(sched_par)); sched_par.sched_priority = sched_get_priority_max(SCHED_RR); if (sched_setscheduler(0, SCHED_RR, &sched_par) == -1) error_exit("Failed to set scheduler properties for this process"); syslog(LOG_INFO, "tcpconsole started"); write_pidfile("/var/run/tcpconsole.pid"); if ((pars.dmesg_buffer_size = klogctl(10, NULL, 0)) == -1) error_exit("klogctl(10) failed"); pars.dmesg_buffer = (char *)malloc(pars.dmesg_buffer_size + 1); if (!pars.dmesg_buffer) error_exit("malloc failure"); listen_on_socket(port, &pars, password); return 1; }