nix-worker: put the pid of the caller in argv[1]

This is useful for debugging.
This commit is contained in:
Eelco Dolstra 2012-03-05 19:19:29 +01:00
parent 2b4964f319
commit 1d487dc6a6
3 changed files with 25 additions and 2 deletions

View file

@ -287,7 +287,7 @@ static void * oomHandler(size_t requested)
int exitCode = 0; int exitCode = 0;
char * * argvSaved = 0;
} }
@ -298,6 +298,8 @@ int main(int argc, char * * argv)
{ {
using namespace nix; using namespace nix;
argvSaved = argv;
/* If we're setuid, then we need to take some security precautions /* If we're setuid, then we need to take some security precautions
right away. */ right away. */
if (argc == 0) abort(); if (argc == 0) abort();

View file

@ -56,6 +56,8 @@ struct RemoveTempRoots
/* Exit code of the program. */ /* Exit code of the program. */
extern int exitCode; extern int exitCode;
extern char * * argvSaved;
} }

View file

@ -753,8 +753,21 @@ static void daemonLoop()
throw SysError("accepting connection"); throw SysError("accepting connection");
} }
printMsg(lvlInfo, format("accepted connection %1%") % remote); /* Get the identity of the caller, if possible. */
uid_t clientUid = -1;
pid_t clientPid = -1;
#if defined(SO_PEERCRED)
ucred cred;
socklen_t credLen = sizeof(cred);
if (getsockopt(remote, SOL_SOCKET, SO_PEERCRED, &cred, &credLen) != -1) {
clientPid = cred.pid;
clientUid = cred.uid;
}
#endif
printMsg(lvlInfo, format("accepted connection from pid %1%, uid %2%") % clientPid % clientUid);
/* Fork a child to handle the connection. */ /* Fork a child to handle the connection. */
pid_t child; pid_t child;
child = fork(); child = fork();
@ -774,6 +787,12 @@ static void daemonLoop()
/* Restore normal handling of SIGCHLD. */ /* Restore normal handling of SIGCHLD. */
setSigChldAction(false); setSigChldAction(false);
/* For debugging, stuff the pid into argv[1]. */
if (clientPid != -1 && argvSaved[1]) {
string processName = int2String(clientPid);
strncpy(argvSaved[1], processName.c_str(), strlen(argvSaved[1]));
}
/* Since the daemon can be long-running, the /* Since the daemon can be long-running, the
settings may have changed. So force a reload. */ settings may have changed. So force a reload. */
reloadSettings(); reloadSettings();