summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremie Koenig <jk@jk.fr.eu.org>2010-08-17 22:20:32 +0000
committerJeremie Koenig <jk@jk.fr.eu.org>2010-08-30 14:14:49 +0200
commit2fb5b93b4cd56fd68b525371ba63b0933b61d03a (patch)
tree77f3674f76f45e68116d69c5fee74fcd386e041d
parentc62d5ff73ceaad21bb0784ed6098d307a625b10d (diff)
Fetch process information and reject the non-existing ones
* process.c, process.h (process_make_node): Make static, include a procinfo structure into the node information. (process_lookup_pid): New function, replaces process_make_node as the outer interface, returns an error for non-existing processes. * proclist.c (proclist_lookup): Convert to the new interface.
-rw-r--r--process.c34
-rw-r--r--process.h10
-rw-r--r--proclist.c12
3 files changed, 48 insertions, 8 deletions
diff --git a/process.c b/process.c
index 90ea511..612ed49 100644
--- a/process.c
+++ b/process.c
@@ -7,6 +7,7 @@
struct process_node {
process_t procserv;
pid_t pid;
+ struct procinfo info;
};
@@ -57,8 +58,8 @@ process_argz_make_node (void *dir_hook, void *entry_hook)
}
-struct node *
-process_make_node (process_t procserv, pid_t pid)
+static struct node *
+process_make_node (process_t procserv, pid_t pid, const struct procinfo *info)
{
static const struct procfs_dir_entry entries[] = {
{ "cmdline", process_argz_make_node, proc_getprocargs, },
@@ -73,7 +74,34 @@ process_make_node (process_t procserv, pid_t pid)
pn->procserv = procserv;
pn->pid = pid;
+ memcpy (&pn->info, info, sizeof pn->info);
- return procfs_dir_make_node (entries, pn, free);
+ return procfs_dir_make_node (entries, pn, process_cleanup);
}
+error_t
+process_lookup_pid (process_t procserv, pid_t pid, struct node **np)
+{
+ procinfo_t info;
+ size_t info_sz;
+ data_t tw;
+ size_t tw_sz;
+ int flags;
+ error_t err;
+
+ tw_sz = info_sz = 0, flags = 0;
+ err = proc_getprocinfo (procserv, pid, &flags, &info, &info_sz, &tw, &tw_sz);
+ if (err == ESRCH)
+ return ENOENT;
+ if (err)
+ return EIO;
+
+ assert (info_sz * sizeof *info >= sizeof (struct procinfo));
+ *np = process_make_node (procserv, pid, (struct procinfo *) info);
+ vm_deallocate (mach_task_self (), (vm_address_t) info, info_sz);
+
+ if (! *np)
+ return ENOMEM;
+
+ return 0;
+}
diff --git a/process.h b/process.h
index 8ca7c85..abdaaa3 100644
--- a/process.h
+++ b/process.h
@@ -1,2 +1,8 @@
-struct node *
-process_make_node (process_t procserv, pid_t pid);
+#include <hurd.h>
+
+/* Create a node for a directory representing information available at
+ the proc server PROC for the given PID. On success, returns the
+ newly created node in *NP. */
+error_t
+process_lookup_pid (process_t proc, pid_t pid, struct node **np);
+
diff --git a/proclist.c b/proclist.c
index 148e4bc..75b61a2 100644
--- a/proclist.c
+++ b/proclist.c
@@ -52,12 +52,18 @@ proclist_lookup (void *hook, const char *name, struct node **np)
char *endp;
pid_t pid;
+ /* Self-lookups should not end up here. */
+ assert (name[0]);
+
+ /* No leading zeros allowed */
+ if (name[0] == '0' && name[1])
+ return ENOENT;
+
pid = strtol (name, &endp, 10);
- if (name[0] == '0' || !name[0] || *endp)
+ if (*endp)
return ENOENT;
- *np = process_make_node (pl->process, pid);
- return *np ? 0 : ENOMEM;
+ return process_lookup_pid (pl->process, pid, np);
}
struct node *