/*
* Scan /dev and find the device name.
- * Side-effect: directory is changed to /dev
- *
- * FIXME: scan subdirectories for devfs support ?
*/
-int findtty(char *res, int rlen, dev_t dev)
+static int findtty(char *res, const char *startdir, int rlen, dev_t dev)
{
DIR *dir;
struct dirent *ent;
struct stat st;
- int r = 0;
-
- if (chdir("/dev") < 0 || (dir = opendir(".")) == NULL) {
- perror("bootlogd: /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);
return -1;
}
while ((ent = readdir(dir)) != NULL) {
if (lstat(ent->d_name, &st) != 0)
continue;
+ if (S_ISDIR(st.st_mode)
+ && 0 != strcmp(".", ent->d_name)
+ && 0 != strcmp("..", ent->d_name)) {
+ char *path = malloc(rlen);
+ snprintf(path, rlen, "%s/%s", startdir, ent->d_name);
+ r = findtty(res, path, rlen, dev);
+ free(path);
+ if (0 == r) { /* device found, return */
+ closedir(dir);
+ chdir(olddir);
+ return 0;
+ }
+ continue;
+ }
if (!S_ISCHR(st.st_mode))
continue;
if (st.st_rdev == dev) {
- break;
+ if (strlen(ent->d_name) + strlen(startdir) + 1 >= rlen) {
+ fprintf(stderr, "bootlogd: console device name too long\n");
+ closedir(dir);
+ chdir(olddir);
+ return -1;
+ } else {
+ snprintf(res, rlen, "%s/%s", startdir, ent->d_name);
+ closedir(dir);
+ chdir(olddir);
+ return 0;
+ }
}
}
- if (ent == NULL) {
- fprintf(stderr, "bootlogd: cannot find console device "
- "%d:%d in /dev\n", major(dev), minor(dev));
- r = -1;
- } else if (strlen(ent->d_name) + 5 >= rlen) {
- fprintf(stderr, "bootlogd: console device name too long\n");
- r = -1;
- } else
- snprintf(res, rlen, "/dev/%s", ent->d_name);
closedir(dir);
+ chdir(olddir);
return r;
}
}
if (found) break;
}
- if (found < 0) return -1;
+ if (!found) return -1;
if (name) strcpy(name, tty);
/*
* Old kernel, can find real device easily.
*/
- return findtty(res, rlen, st.st_rdev);
+ int r = findtty(res, "/dev", rlen, st.st_rdev);
+ if (0 != r)
+ fprintf(stderr, "bootlogd: cannot find console device "
+ "%d:%d under /dev\n", major(st.st_rdev), minor(st.st_rdev));
+ return r;
}
#ifdef TIOCGDEV
- if (ioctl(0, TIOCGDEV, &kdev) == 0)
- return findtty(res, rlen, (dev_t)kdev);
+ if (ioctl(0, TIOCGDEV, &kdev) == 0) {
+ int r = findtty(res, "/dev", rlen, (dev_t)kdev);
+ if (0 != r)
+ fprintf(stderr, "bootlogd: cannot find console device "
+ "%d:%d under /dev\n", major(kdev), minor(kdev));
+ return r;
+ }
if (errno != ENOIOCTLCMD) return -1;
#endif
break;
case '\n':
didnl = 1;
- dosync = syncalot;
+ dosync = 1;
break;
case '\t':
line.pos += (line.pos / 8 + 1) * 8;
- if (line.pos >= sizeof(line.buf))
+ if (line.pos >= (int)sizeof(line.buf))
line.pos = sizeof(line.buf) - 1;
break;
case 32 ... 127:
len--;
tlen = strlen(tmp);
- if (tlen && (line.pos + tlen < sizeof(line.buf))) {
+ if (tlen && (line.pos + tlen < (int)sizeof(line.buf))) {
memcpy(line.buf + line.pos, tmp, tlen);
line.pos += tlen;
}
if (dosync) {
fflush(fp);
- fdatasync(fileno(fp));
+ if (syncalot) {
+ fdatasync(fileno(fp));
+ }
}
outptr += olen;
else
todo = endptr - outptr;
if (fp && todo)
- writelog(fp, outptr, todo);
+ writelog(fp, (unsigned char *)outptr, todo);
}
if (fp) {