Справочник по консольным командам Toybox для Android 12


  Ver.0.8.4     Ver.0.8.9     Pending  

Путь: Toys/Pending, команды версии: Ver.4     Ver.9


klogd

Комментарии в файле klogd.c :

usage: klogd [-n] [-c N]

  • -c N Печатать на консоль сообщения более срочные, чем предыдущие N (1-8)"
  • -n Выполнять на переднем плане

  • usage: klogd [-n] [-c N]

  • -c N Print to console messages more urgent than prio N (1-8)"
  • -n Run in foreground

  • Исходный текст в файле klogd.c

    #define FOR_klogd
    #include "toys.h"
    #include <signal.h>
    #include <sys/klog.h>
    GLOBALS(
      long level;
    
      int fd;
    )
    
    static void set_log_level(int level)
    {   
      if (CFG_KLOGD_SOURCE_RING_BUFFER)
        klogctl(8, NULL, level);
      else {
        FILE *fptr = xfopen("/proc/sys/kernel/printk", "w");
        fprintf(fptr, "%u\n", level);
        fclose(fptr);
        fptr = NULL;
      }
    }
    
    static void handle_signal(int sig)
    {
      if (CFG_KLOGD_SOURCE_RING_BUFFER) {
        klogctl(7, NULL, 0); 
        klogctl(0, NULL, 0);
      } else {
        set_log_level(7);
        xclose(TT.fd);
      }
      syslog(LOG_NOTICE,"KLOGD: Daemon exiting......");
      exit(1);
    }
    
    /*
     * Read kernel ring buffer in local buff and keep track of
     * "used" amount to track next read to start.
     */
    void klogd_main(void)
    {
      int prio, size, used = 0;
      char *start, *line_start, msg_buffer[16348]; //LOG_LINE_LENGTH - Ring buffer size
    
      sigatexit(handle_signal);
      if (toys.optflags & FLAG_c) set_log_level(TT.level);    //set log level
      if (!(toys.optflags & FLAG_n)) daemon(0, 0);            //Make it daemon
    
      if (CFG_KLOGD_SOURCE_RING_BUFFER) {
        syslog(LOG_NOTICE, "KLOGD: started with Kernel ring buffer as log source\n");
        klogctl(1, NULL, 0);
      } else {
        TT.fd = xopenro("/proc/kmsg"); //_PATH_KLOG in paths.h
        syslog(LOG_NOTICE, "KLOGD: started with /proc/kmsg as log source\n");
      }
      openlog("Kernel", 0, LOG_KERN);    //open connection to system logger..
    
      while(1) {
        start = msg_buffer + used; //start updated for re-read.
        if (CFG_KLOGD_SOURCE_RING_BUFFER) {
          size = klogctl(2, start, sizeof(msg_buffer) - used - 1);
        } else {
          size = xread(TT.fd, start, sizeof(msg_buffer) - used - 1);
        }
        if (size < 0) perror_exit("error reading file:");
        start[size] = '\0';  //Ensure last line to be NUL terminated.
        if (used) start = msg_buffer;
        while(start) {
          if ((line_start = strsep(&start, "\n")) != NULL && start != NULL) used = 0;
          else {                            //Incomplete line, copy it to start of buff.
            used = strlen(line_start);
            strcpy(msg_buffer, line_start);
            if (used < (sizeof(msg_buffer) - 1)) break;
            used = 0; //we have buffer full, log it as it is.
          }
          prio = LOG_INFO;  //we dont know priority, mark it INFO
          if (*line_start == '<') {  //we have new line to syslog
            line_start++;
            if (line_start) prio = (int)strtoul(line_start, &line_start, 10);
            if (*line_start == '>') line_start++;
          }
          if (*line_start) syslog(prio, "%s", line_start);
        }
      }
    }