$NetBSD: patch-bf,v 1.7 2018/01/01 06:56:01 ryoon Exp $ --- lib/procMgr/procMgrPosix.c.orig 2017-12-15 19:09:51.000000000 +0000 +++ lib/procMgr/procMgrPosix.c @@ -27,7 +27,7 @@ // pull in setresuid()/setresgid() if possible #define _GNU_SOURCE #include -#if !defined(__FreeBSD__) && !defined(sun) && !defined(__APPLE__) +#if !defined(__FreeBSD__) && !defined(sun) && !defined(__APPLE__) && !defined(__NetBSD__) #include #endif #if !defined(sun) && !defined(__APPLE__) @@ -53,7 +53,7 @@ // Pull in PAGE_SIZE/PAGE_SHIFT defines ahead of vm_basic_defs.h # include #endif -#if defined (__FreeBSD__) +#if defined (__FreeBSD__) || defined(__NetBSD__) #include #include #include @@ -136,7 +136,7 @@ Bool ProcMgr_PromoteEffectiveToReal(void #ifdef sun #define BASH_PATH "/usr/bin/bash" #else -#define BASH_PATH "/bin/bash" +#define BASH_PATH "@PREFIX@/bin/bash" #endif @@ -614,7 +614,7 @@ abort: *---------------------------------------------------------------------- */ -#if defined(__FreeBSD__) +#if defined(__FreeBSD__) || defined(__NetBSD__) ProcMgrProcInfoArray * ProcMgr_ListProcesses(void) { @@ -622,7 +622,11 @@ ProcMgr_ListProcesses(void) ProcMgrProcInfo procInfo; Bool failed = TRUE; static kvm_t *kd; +#if defined(__NetBSD__) + struct kinfo_proc2 *kp; +#else struct kinfo_proc *kp; +#endif char errbuf[_POSIX2_LINE_MAX]; int i; int nentries=-1; @@ -645,7 +649,12 @@ ProcMgr_ListProcesses(void) /* * Get the list of process info structs */ +#if defined(__NetBSD__) + int elemsize = sizeof(struct kinfo_proc2); + kp = kvm_getproc2(kd, KERN_PROC_ALL, flag, elemsize, &nentries); +#else kp = kvm_getprocs(kd, KERN_PROC_PROC, flag, &nentries); +#endif if (kp == NULL || nentries <= 0) { Warning("%s: failed to get proc infos with error: %s\n", __FUNCTION__, kvm_geterr(kd)); @@ -673,14 +682,26 @@ ProcMgr_ListProcesses(void) /* * Store the pid of the process. */ +#if defined(__NetBSD__) + procInfo.procId = kp->p_pid; +#else procInfo.procId = kp->ki_pid; +#endif /* * Store the owner of the process. */ +#if defined(__NetBSD__) + pwd = getpwuid(kp->p_uid); +#else pwd = getpwuid(kp->ki_uid); +#endif procInfo.procOwner = (NULL == pwd) +#if defined(__NetBSD__) + ? Str_SafeAsprintf(NULL, "%d", (int) kp->p_uid) +#else ? Str_SafeAsprintf(NULL, "%d", (int) kp->ki_uid) +#endif : Unicode_Alloc(pwd->pw_name, STRING_ENCODING_DEFAULT); /* @@ -688,15 +709,24 @@ ProcMgr_ListProcesses(void) * maximum allowed size, then we can save it right now. Else we shall * need to try and parse it from the entire command line. */ +#if defined(__NetBSD__) + if (strlen(kp->p_comm) + 1 < sizeof kp->p_comm) { + procInfo.procCmdName = Unicode_Alloc(kp->p_comm, STRING_ENCODING_DEFAULT); +#else if (strlen(kp->ki_comm) + 1 < sizeof kp->ki_comm) { procInfo.procCmdName = Unicode_Alloc(kp->ki_comm, STRING_ENCODING_DEFAULT); +#endif cmdNameLookup = FALSE; } /* * Store the command line string of the process. */ +#if defined(__NetBSD__) + cmdLineTemp = kvm_getargv2(kd, kp, 0); +#else cmdLineTemp = kvm_getargv(kd, kp, 0); +#endif if (cmdLineTemp != NULL) { /* * Flatten the argument list to get cmd & all params. @@ -752,9 +782,15 @@ ProcMgr_ListProcesses(void) procInfo.procCmdLine = DynBuf_Detach(&dbuf); DynBuf_Destroy(&dbuf); } else { +#if defined(__NetBSD__) + procInfo.procCmdLine = Unicode_Alloc(kp->p_comm, STRING_ENCODING_DEFAULT); + if (cmdNameLookup) { + procInfo.procCmdName = Unicode_Alloc(kp->p_comm, STRING_ENCODING_DEFAULT); +#else procInfo.procCmdLine = Unicode_Alloc(kp->ki_comm, STRING_ENCODING_DEFAULT); if (cmdNameLookup) { procInfo.procCmdName = Unicode_Alloc(kp->ki_comm, STRING_ENCODING_DEFAULT); +#endif cmdNameLookup = FALSE; } } @@ -762,7 +798,11 @@ ProcMgr_ListProcesses(void) /* * Store the start time of the process */ +#if defined(__NetBSD__) + procInfo.procStartTime = kp->p_rtime_sec; +#else procInfo.procStartTime = kp->ki_start.tv_sec; +#endif /* * Store the process info pointer into a list buffer. @@ -792,7 +832,7 @@ abort: return procList; } -#endif // defined(__FreeBSD__) +#endif // defined(__NetBSD__) #if defined(__APPLE__) @@ -2152,7 +2192,7 @@ ProcMgr_Free(ProcMgr_AsyncProc *asyncPro free(asyncProc); } -#if defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__) +#if defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__) || defined(__NetBSD__) /* *---------------------------------------------------------------------- @@ -2234,7 +2274,7 @@ ProcMgr_ImpersonateUserStart(const char // first change group #if defined(USERWORLD) ret = Id_SetREGid(ppw->pw_gid, ppw->pw_gid); -#elif defined(__APPLE__) +#elif defined(__APPLE__) || defined(__NetBSD__) ret = setegid(ppw->pw_gid); #else ret = setresgid(ppw->pw_gid, ppw->pw_gid, root_gid); @@ -2253,7 +2293,7 @@ ProcMgr_ImpersonateUserStart(const char // now user #if defined(USERWORLD) ret = Id_SetREUid(ppw->pw_uid, ppw->pw_uid); -#elif defined(__APPLE__) +#elif defined(__APPLE__) || defined(__NetBSD__) ret = seteuid(ppw->pw_uid); #else ret = setresuid(ppw->pw_uid, ppw->pw_uid, 0); @@ -2315,7 +2355,7 @@ ProcMgr_ImpersonateUserStop(void) // first change back user #if defined(USERWORLD) ret = Id_SetREUid(ppw->pw_uid, ppw->pw_uid); -#elif defined(__APPLE__) +#elif defined(__APPLE__) || defined(__NetBSD__) ret = seteuid(ppw->pw_uid); #else ret = setresuid(ppw->pw_uid, ppw->pw_uid, 0); @@ -2328,7 +2368,7 @@ ProcMgr_ImpersonateUserStop(void) // now group #if defined(USERWORLD) ret = Id_SetREGid(ppw->pw_gid, ppw->pw_gid); -#elif defined(__APPLE__) +#elif defined(__APPLE__) || defined(__NetBSD__) ret = setegid(ppw->pw_gid); #else ret = setresgid(ppw->pw_gid, ppw->pw_gid, ppw->pw_gid);