sysvinit-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/2] Fix bootlogd not printing to console without console= in cmd


From: Alexander Vickberg
Subject: [PATCH 2/2] Fix bootlogd not printing to console without console= in cmdline
Date: Wed, 15 Dec 2021 17:43:40 +0100

If user doesn't supply console= in cmdline but instead for example specifies
'stdout-path' in device tree bootlogd fails to detect which tty to use. This
patch brings back methods for detecting current console that were removed in
commit 986bee6.

It also introduces chdir_int helper function used to suppress warnings of
type '-Wunused-result' in findtty().

Signed-off-by: Alexander Vickberg <wickbergster@gmail.com>
---
 src/bootlogd.c | 66 +++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 49 insertions(+), 17 deletions(-)

diff --git a/src/bootlogd.c b/src/bootlogd.c
index 10d7c0e..aae66ad 100644
--- a/src/bootlogd.c
+++ b/src/bootlogd.c
@@ -106,12 +106,25 @@ void handler(int sig)
 }
 
 /*
- *     Scan /dev and find the device name.
+ *     chdir with error message on fail.
  */
-/*
-This function does not appear to be called anymore. Commenting it
-out for now, can probably be removed entirely in the future.
+static int chdir_int(const char *path)
+{
+       int ret;
+
+       if ((ret = chdir(path)) != 0) {
+               const char *msgprefix = "bootlogd: %s";
+               char msg[PATH_MAX + sizeof(msgprefix)];
+               snprintf(msg, sizeof(msg), msgprefix, path);
+               perror(msg);
+       }
+
+       return ret;
+}
 
+/*
+ *     Scan /dev and find the device name.
+ */
 static int findtty(char *res, const char *startdir, int rlen, dev_t dev)
 {
        DIR             *dir;
@@ -120,13 +133,8 @@ static int findtty(char *res, const char *startdir, int 
rlen, dev_t dev)
        int             r = -1;
        char *olddir = getcwd(NULL, 0);
 
-       if (chdir(startdir) < 0 || (dir = opendir(".")) == NULL) {
-               int msglen = strlen(startdir) + 11;
-               char *msg = malloc(msglen);
-               snprintf(msg, msglen, "bootlogd: %s", startdir);
-               perror(msg);
-               free(msg);
-               chdir(olddir);
+       if (chdir_int(startdir) < 0 || (dir = opendir(".")) == NULL) {
+               chdir_int(olddir);
                return -1;
        }
        while ((ent = readdir(dir)) != NULL) {
@@ -141,7 +149,7 @@ static int findtty(char *res, const char *startdir, int 
rlen, dev_t dev)
                        free(path);
                        if (0 == r) {
                                closedir(dir);
-                               chdir(olddir);
+                               chdir_int(olddir);
                                return 0;
                        }
                        continue;
@@ -152,22 +160,21 @@ static int findtty(char *res, const char *startdir, int 
rlen, dev_t dev)
                        if ( (int) (strlen(ent->d_name) + strlen(startdir) + 1) 
>= rlen) {
                                fprintf(stderr, "bootlogd: console device name 
too long\n");
                                closedir(dir);
-                               chdir(olddir);
+                               chdir_int(olddir);
                                return -1;
                        } else {
                                snprintf(res, rlen, "%s/%s", startdir, 
ent->d_name);
                                closedir(dir);
-                               chdir(olddir);
+                               chdir_int(olddir);
                                return 0;
                        }
                }
        }
        closedir(dir);
 
-       chdir(olddir);
+       chdir_int(olddir);
        return r;
 }
-*/
 
 /*
  *     For some reason, openpty() in glibc sometimes doesn't
@@ -269,7 +276,7 @@ int isconsole(char *s, char *res, int rlen)
 int consolenames(struct real_cons *cons, int max_consoles)
 {
 #ifdef TIOCGDEV
-       /* This appears to be unused.  unsigned int     kdev; */
+       unsigned int    kdev;
 #endif
        struct stat     st, st2;
        char            buf[KERNEL_COMMAND_LENGTH];
@@ -340,6 +347,31 @@ dontuse:
                p--;
        }
 
+       if (num_consoles > 0) return num_consoles;
+#endif
+
+       fstat(0, &st);
+       if (major(st.st_rdev) != 5 || minor(st.st_rdev) != 1) {
+               /*
+                *      Old kernel, can find real device easily.
+                */
+               int r = findtty(cons[num_consoles].name, "/dev", 
sizeof(cons[num_consoles].name), st.st_rdev);
+               if (!r)
+                       num_consoles++;
+       }
+
+       if (num_consoles > 0) return num_consoles;
+
+#ifdef TIOCGDEV
+# ifndef  ENOIOCTLCMD
+#  define ENOIOCTLCMD  515
+# endif
+       if (ioctl(0, TIOCGDEV, &kdev) == 0) {
+               int r = findtty(cons[num_consoles].name, "/dev", 
sizeof(cons[num_consoles].name), (dev_t)kdev);
+               if (!r)
+                       num_consoles++;
+       }
+
        if (num_consoles > 0) return num_consoles;
 #endif
 
-- 
2.25.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]