summaryrefslogtreecommitdiffstats
path: root/lib/consoles.c
diff options
context:
space:
mode:
authorKarel Zak2012-11-09 12:44:00 +0100
committerKarel Zak2012-11-09 12:48:33 +0100
commitb25343bbbcfbaef9d24f2b53e7b0c122c5a26413 (patch)
treee6837795927f22d98f050bd8e963131e5ac47285 /lib/consoles.c
parentlib/consoles: TIOCGDEV code refactoring (diff)
downloadkernel-qcow2-util-linux-b25343bbbcfbaef9d24f2b53e7b0c122c5a26413.tar.gz
kernel-qcow2-util-linux-b25343bbbcfbaef9d24f2b53e7b0c122c5a26413.tar.xz
kernel-qcow2-util-linux-b25343bbbcfbaef9d24f2b53e7b0c122c5a26413.zip
lib/consoles: add debug messages
- may be enabled by CONSOLES_DEBUG env. variable Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'lib/consoles.c')
-rw-r--r--lib/consoles.c67
1 files changed, 59 insertions, 8 deletions
diff --git a/lib/consoles.c b/lib/consoles.c
index 206efecff..11b7d738d 100644
--- a/lib/consoles.c
+++ b/lib/consoles.c
@@ -57,6 +57,24 @@
#define alignof(type) ((sizeof(type)+(sizeof(void*)-1)) & ~(sizeof(void*)-1))
+static int consoles_debug;
+#define DBG(x) do { \
+ if (consoles_debug) { \
+ fputs("consoles debug: ", stderr); \
+ x; \
+ } \
+ } while (0)
+
+static inline void __attribute__ ((__format__ (__printf__, 1, 2)))
+dbgprint(const char *mesg, ...)
+{
+ va_list ap;
+ va_start(ap, mesg);
+ vfprintf(stderr, mesg, ap);
+ va_end(ap);
+ fputc('\n', stderr);
+}
+
/*
* Read and allocate one line from file,
* the caller has to free the result
@@ -68,6 +86,8 @@ char *oneline(const char *file)
char *ret = NULL;
size_t len = 0;
+ DBG(dbgprint("reading %s", file));
+
if (!(fp = fopen(file, "re")))
return NULL;
if (getline(&ret, &len, fp) >= 0) {
@@ -145,6 +165,8 @@ char* scandev(DIR *dir, dev_t comparedev)
struct dirent *dent;
int fd;
+ DBG(dbgprint("scanning /dev for %u:%u", major(comparedev), minor(comparedev)));
+
fd = dirfd(dir);
rewinddir(dir);
while ((dent = readdir(dir))) {
@@ -189,6 +211,8 @@ int append_console(struct console **list, char * name)
struct console *restrict tail;
struct console *last;
+ DBG(dbgprint("appenging %s", name));
+
if (posix_memalign((void*)&tail, sizeof(void*), alignof(typeof(struct console))) != 0)
return -ENOMEM;
@@ -228,10 +252,13 @@ static int detect_consoles_from_proc(struct console **consoles)
FILE *fc = NULL;
int maj, min, rc = 1;
- fc = fopen("/proc/consoles", "re");
- if (!fc)
- return 2;
+ DBG(dbgprint("trying /proc"));
+ fc = fopen("/proc/consoles", "re");
+ if (!fc) {
+ rc = 2;
+ goto done;
+ }
dir = opendir("/dev");
if (!dir)
goto done;
@@ -257,6 +284,7 @@ done:
closedir(dir);
if (fc)
fclose(fc);
+ DBG(dbgprint("[/proc rc=%d]", rc));
return rc;
}
@@ -273,9 +301,13 @@ static int detect_consoles_from_sysfs(struct console **consoles)
DIR *dir = NULL;
int rc = 1;
+ DBG(dbgprint("trying /sys"));
+
attrib = actattr("console");
- if (!attrib)
- return 2;
+ if (!attrib) {
+ rc = 2;
+ goto done;
+ }
words = attrib;
@@ -312,6 +344,7 @@ done:
free(attrib);
if (dir)
closedir(dir);
+ DBG(dbgprint("[/sys rc=%d]", rc));
return rc;
}
@@ -320,12 +353,16 @@ static int detect_consoles_from_cmdline(struct console **consoles)
{
char *cmdline, *words, *token;
dev_t comparedev;
- DIR *dir;
+ DIR *dir = NULL;
int rc = 1, fd;
+ DBG(dbgprint("trying kernel cmdline"));
+
cmdline = oneline("/proc/cmdline");
- if (!cmdline)
- return 2;
+ if (!cmdline) {
+ rc = 2;
+ goto done;
+ }
words= cmdline;
dir = opendir("/dev");
@@ -394,6 +431,7 @@ done:
if (dir)
closedir(dir);
free(cmdline);
+ DBG(dbgprint("[kernel cmdline rc=%d]", rc));
return rc;
}
@@ -408,6 +446,8 @@ static int detect_consoles_from_tiocgdev(struct console **consoles,
dev_t comparedev;
DIR *dir = NULL;
+ DBG(dbgprint("trying tiocgdev"));
+
if (!device || !*device)
fd = dup(fallback);
else
@@ -447,6 +487,7 @@ static int detect_consoles_from_tiocgdev(struct console **consoles,
done:
if (fd >= 0)
close(fd);
+ DBG(dbgprint("[tiocgdev rc=%d]", rc));
return rc;
#endif
return 2;
@@ -467,6 +508,8 @@ int detect_consoles(const char *device, int fallback, struct console **consoles)
int fd, reconnect = 0, rc;
dev_t comparedev = 0;
+ consoles_debug = getenv("CONSOLES_DEBUG") ? 1 : 0;
+
if (!device || !*device)
fd = dup(fallback);
else {
@@ -474,6 +517,9 @@ int detect_consoles(const char *device, int fallback, struct console **consoles)
reconnect = 1;
}
+ DBG(dbgprint("detection started [device=%s, fallback=%d]",
+ device, fallback));
+
if (fd >= 0) {
DIR *dir;
char *name;
@@ -481,6 +527,7 @@ int detect_consoles(const char *device, int fallback, struct console **consoles)
#ifdef TIOCGDEV
unsigned int devnum;
#endif
+ DBG(dbgprint("trying device/fallback file descriptor"));
if (fstat(fd, &st) < 0) {
close(fd);
@@ -590,7 +637,9 @@ console:
if (rc == 1)
goto fallback; /* detection error */
+ DBG(dbgprint("detection success [rc=%d]", reconnect));
return reconnect;
+
#endif /* __linux __ */
fallback:
@@ -610,6 +659,8 @@ fallback:
if (*consoles)
(*consoles)->fd = fallback;
}
+
+ DBG(dbgprint("detection done by fallback [rc=%d]", reconnect));
return reconnect;
}