PERFORCE change 90004 for review
Todd Miller
millert at FreeBSD.org
Fri Jan 20 14:59:20 GMT 2006
http://perforce.freebsd.org/chv.cgi?CH=90004
Change 90004 by millert at millert_ibook on 2006/01/20 14:58:35
No longer need to include mac.h
Remove useless local variable that shadows one in enclosing scope
Deal with waitpid() returning 0. Code adapted from launchd's
bootstrap.c which already deals with this case.
Affected files ...
.. //depot/projects/trustedbsd/sedarwin7/src/darwin/system_cmds/mach_init.tproj/bootstrap.c#7 edit
Differences ...
==== //depot/projects/trustedbsd/sedarwin7/src/darwin/system_cmds/mach_init.tproj/bootstrap.c#7 (text+ko) ====
@@ -43,7 +43,6 @@
#include <mach/host_info.h>
#include <mach/mach_host.h>
#include <mach/exception.h>
-#include <sys/mac.h>
#import <sys/ioctl.h>
#import <sys/types.h>
@@ -584,8 +583,9 @@
reap_server(server_t *serverp)
{
kern_return_t result;
- pid_t presult;
- int wstatus;
+ mach_port_t old_port;
+ pid_t presult;
+ int wstatus;
/*
* Reap our children.
@@ -593,9 +593,44 @@
do {
presult = waitpid(serverp->pid, &wstatus, WNOHANG);
} while (presult == -1 && errno == EINTR);
- if (presult != serverp->pid) {
- unix_error("waitpid: cmd = %s", serverp->cmd);
- } else if (wstatus) {
+ switch (presult) {
+ case -1:
+ unix_error("waitpid: cmd = %s, pid = %d", serverp->cmd,
+ serverp->pid);
+ break;
+
+ case 0:
+ /* process must have switched mach tasks */
+ old_port = serverp->task_port;
+ mach_port_deallocate(mach_task_self(), old_port);
+ serverp->task_port = MACH_PORT_NULL;
+
+ result = task_for_pid(mach_task_self(), serverp->pid,
+ &serverp->task_port);
+ if (result != KERN_SUCCESS) {
+ kern_error(result,
+ "race getting new server task port for pid[%d]",
+ serverp->pid);
+ break;
+ }
+
+ /* Request dead name notification to tell when new task dies */
+ result = mach_port_request_notification(
+ mach_task_self(),
+ serverp->task_port,
+ MACH_NOTIFY_DEAD_NAME,
+ 0,
+ notify_port,
+ MACH_MSG_TYPE_MAKE_SEND_ONCE,
+ &old_port);
+ if (result != KERN_SUCCESS) {
+ kern_error(result, "race setting up notification for "
+ "new server task port for pid[%d]", serverp->pid);
+ break;
+ }
+ return;
+
+ default:
notice("Server %x in bootstrap %x uid %d: \"%s\": %s %d [pid %d]",
serverp->port, serverp->bootstrap->bootstrap_port,
serverp->uid, serverp->cmd,
@@ -604,6 +639,7 @@
"exited as a result of signal"),
((WIFEXITED(wstatus)) ? WEXITSTATUS(wstatus) : WTERMSIG(wstatus)),
serverp->pid);
+ break;
}
serverp->pid = 0;
@@ -1105,7 +1141,7 @@
np = ((mach_port_destroyed_notification_t *)Request)->not_port.name;
servicep = lookup_service_by_port(np);
if (servicep != NULL) {
- server_t *serverp = servicep->server;
+ serverp = servicep->server;
switch (Request->msgh_id) {
To Unsubscribe: send mail to majordomo at trustedbsd.org
with "unsubscribe trustedbsd-cvs" in the body of the message
More information about the trustedbsd-cvs
mailing list