Date: Wed, 30 Oct 2013 14:50:00 GMT From: Stefan Neudorf <BM-2cXppXU4T67w7j6NCir9T1WdzBHmFgBnLj@bitmessage.ch> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/183484: [PATCH] usr.bin/limits: make -e work without /proc Message-ID: <201310301450.r9UEo0QR019902@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/183484; it has been noted by GNATS. From: Stefan Neudorf <BM-2cXppXU4T67w7j6NCir9T1WdzBHmFgBnLj@bitmessage.ch> To: bug-followup@freebsd.org Cc: Subject: Re: bin/183484: [PATCH] usr.bin/limits: make -e work without /proc Date: Wed, 30 Oct 2013 15:43:17 +0100 --=-=-= Content-Type: text/plain Stefan Neudorf <BM-2cXppXU4T67w7j6NCir9T1WdzBHmFgBnLj@bitmessage.ch> writes: > if (shell != NULL && stat(shell, &st) != -1) { > struct stat st1; > > mib[0] = CTL_KERN; > mib[1] = KERN_PROC; > mib[2] = KERN_PROC_PATHNAME; > mib[3] = ppid; > len = sizeof(path); > sysctl(mib, 4, path, &len, NULL, 0); > /* $SHELL is actual shell? */ > if (stat(path, &st1) != -1 && memcmp(&st, &st1, sizeof st) == 0) > return getshellbyname(shell); > } > mib[2] = KERN_PROC_PID; > len = sizeof(kp); > sysctl(mib, 4, &kp, &len, NULL, 0); I was a bit too hasty, mib[] may be partially unset. > if (kp.ki_comm != NULL) > return getshellbyname(kp.ki_comm); --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=noprocdir.diff Index: usr.bin/limits/limits.c =================================================================== --- usr.bin/limits/limits.c (revision 257346) +++ usr.bin/limits/limits.c (working copy) @@ -30,6 +30,7 @@ __FBSDID("$FreeBSD$"); #include <sys/types.h> #include <sys/stat.h> #include <sys/sysctl.h> +#include <sys/user.h> #include <sys/param.h> #include <stdlib.h> #include <unistd.h> @@ -704,27 +705,32 @@ getshelltype(void) pid_t ppid = getppid(); if (ppid != 1) { - FILE * fp; + struct kinfo_proc kp; struct stat st; - char procdir[MAXPATHLEN], buf[128]; - int l = sprintf(procdir, "/proc/%ld/", (long)ppid); + char path[MAXPATHLEN]; char * shell = getenv("SHELL"); + int mib[4]; + size_t len; + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[3] = ppid; + if (shell != NULL && stat(shell, &st) != -1) { struct stat st1; - strcpy(procdir+l, "file"); + mib[2] = KERN_PROC_PATHNAME; + len = sizeof(path); + sysctl(mib, 4, path, &len, NULL, 0); /* $SHELL is actual shell? */ - if (stat(procdir, &st1) != -1 && memcmp(&st, &st1, sizeof st) == 0) + if (stat(path, &st1) != -1 && memcmp(&st, &st1, sizeof st) == 0) return getshellbyname(shell); } - strcpy(procdir+l, "status"); - if (stat(procdir, &st) == 0 && (fp = fopen(procdir, "r")) != NULL) { - char * p = fgets(buf, sizeof buf, fp)==NULL ? NULL : strtok(buf, " \t"); - fclose(fp); - if (p != NULL) - return getshellbyname(p); - } + mib[2] = KERN_PROC_PID; + len = sizeof(kp); + sysctl(mib, 4, &kp, &len, NULL, 0); + if (kp.ki_comm != NULL) + return getshellbyname(kp.ki_comm); } return SH_SH; } --=-=-=--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201310301450.r9UEo0QR019902>