summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Adrien Schildknecht <adrien+dev@schischi.me>2013-07-02 03:23:13 +0200
committerGravatar Adrien Schildknecht <adrien+dev@schischi.me>2013-07-02 03:23:13 +0200
commit671ac6b5da6289a4c7e625fc9b93e87d57d29138 (patch)
tree3c6ef77481983403ca4dd10250ec25b041f23814
parent535c64ad555976fc45c9eee5129460bc74f35582 (diff)
handle empty cwd (bsd)
-rw-r--r--xcwd.c25
1 files changed, 12 insertions, 13 deletions
diff --git a/xcwd.c b/xcwd.c
index 7d1a1aa..4483c89 100644
--- a/xcwd.c
+++ b/xcwd.c
@@ -192,14 +192,14 @@ static processes_t getProcesses(void)
kp = malloc(len);
error = sysctl(name, 4, kp, &len, NULL, 0);
count = len / sizeof(*kp);
- p->ps = malloc(sizeof(struct proc_s) * count);
+ p->ps = calloc(count, sizeof(struct proc_s));
p->n = count;
unsigned int i;
for(i = 0; i < count; ++i) {
struct kinfo_file *files, *kif;
int cnt, j;
- if(kp[i].ki_fd == NULL)
+ if(kp[i].ki_fd == NULL || kp[i].ki_pid == 0)
continue;
files = kinfo_getfile(kp[i].ki_pid, &cnt);
for(j = 0; j < cnt; ++j) {
@@ -210,8 +210,8 @@ static processes_t getProcesses(void)
p->ps[i].ppid = kp[i].ki_ppid;
strncpy(p->ps[i].name, kp[i].ki_tdname, 32);
strncpy(p->ps[i].cwd, kif->kf_path, MAXPATHLEN);
- LOG("\t%-20s\tpid=%6ld\tppid=%6ld\n", p->ps[j].name, p->ps[j].pid,
- p->ps[j].ppid);
+ LOG("\t%-20s\tpid=%6ld\tppid=%6ld\n", p->ps[i].name, p->ps[i].pid,
+ p->ps[i].ppid);
}
}
@@ -247,10 +247,11 @@ static int readPath(struct proc_s *proc)
return 1;
}
-static void cwdOfDeepestChild(processes_t p, long pid)
+static int cwdOfDeepestChild(processes_t p, long pid)
{
int i;
- struct proc_s key = {.ppid = pid}, *res = NULL, *lastRes = NULL;
+ struct proc_s key = { .pid = pid, .ppid = pid},
+ *res = NULL, *lastRes = NULL;
do {
if(res) {
@@ -262,16 +263,16 @@ static void cwdOfDeepestChild(processes_t p, long pid)
} while(res);
if(!lastRes) {
- readPath(&key);
- return;
+ return readPath(&key);
}
for(i = 0; lastRes != p->ps && (lastRes - i)->ppid == lastRes->ppid; ++i)
if(readPath((lastRes - i)))
- return;
+ return 1;
for(i = 1; lastRes != p->ps + p->n && (lastRes + i)->ppid == lastRes->ppid; ++i)
if(readPath((lastRes + i)))
- return;
+ return 1;
+ return 0;
}
int getHomeDirectory()
@@ -322,9 +323,7 @@ int main(int argc, const char *argv[])
if (size != 0)
free(strings);
}
- if (pid != -1)
- cwdOfDeepestChild(p, pid);
- else {
+ if (pid == -1 || !cwdOfDeepestChild(p, pid)) {
LOG("%s", "getenv $HOME...\n");
fprintf(stdout, "%s\n", getenv("HOME"));
}