Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 3 Dec 2017 16:50:16 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r326498 - in head: . cddl/contrib/opensolaris/lib/libdtrace/common lib/libproc lib/libproc/tests
Message-ID:  <201712031650.vB3GoGDV056424@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Sun Dec  3 16:50:16 2017
New Revision: 326498
URL: https://svnweb.freebsd.org/changeset/base/326498

Log:
  Add an envp argument to proc_create().
  
  This is needed to support dtrace's -x setenv option.
  
  MFC after:	2 weeks

Modified:
  head/ObsoleteFiles.inc
  head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_proc.c
  head/lib/libproc/Makefile
  head/lib/libproc/libproc.h
  head/lib/libproc/proc_create.c
  head/lib/libproc/tests/proc_test.c

Modified: head/ObsoleteFiles.inc
==============================================================================
--- head/ObsoleteFiles.inc	Sun Dec  3 13:52:35 2017	(r326497)
+++ head/ObsoleteFiles.inc	Sun Dec  3 16:50:16 2017	(r326498)
@@ -38,6 +38,9 @@
 #   xargs -n1 | sort | uniq -d;
 # done
 
+# 20171203: libproc version bump
+OLD_LIBS+=usr/lib/libproc.so.4
+OLD_LIBS+=usr/lib32/libproc.so.4
 # 20171203: new clang import which bumps version from 5.0.0 to 5.0.1.
 OLD_FILES+=usr/lib/clang/5.0.0/include/sanitizer/allocator_interface.h
 OLD_FILES+=usr/lib/clang/5.0.0/include/sanitizer/asan_interface.h

Modified: head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_proc.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_proc.c	Sun Dec  3 13:52:35 2017	(r326497)
+++ head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_proc.c	Sun Dec  3 16:50:16 2017	(r326498)
@@ -967,7 +967,7 @@ dt_proc_create(dtrace_hdl_t *dtp, const char *file, ch
 #ifdef illumos
 	if ((dpr->dpr_proc = Pcreate(file, argv, &err, NULL, 0)) == NULL) {
 #else
-	if ((err = proc_create(file, argv, pcf, child_arg,
+	if ((err = proc_create(file, argv, NULL, pcf, child_arg,
 	    &dpr->dpr_proc)) != 0) {
 #endif
 		return (dt_proc_error(dtp, dpr,

Modified: head/lib/libproc/Makefile
==============================================================================
--- head/lib/libproc/Makefile	Sun Dec  3 13:52:35 2017	(r326497)
+++ head/lib/libproc/Makefile	Sun Dec  3 16:50:16 2017	(r326498)
@@ -37,7 +37,7 @@ CFLAGS+=	-I${SRCTOP}/cddl/contrib/opensolaris/lib/libc
 CFLAGS+=	-DNO_CTF
 .endif
 
-SHLIB_MAJOR=	4
+SHLIB_MAJOR=	5
 
 MAN=
 

Modified: head/lib/libproc/libproc.h
==============================================================================
--- head/lib/libproc/libproc.h	Sun Dec  3 13:52:35 2017	(r326497)
+++ head/lib/libproc/libproc.h	Sun Dec  3 16:50:16 2017	(r326498)
@@ -142,8 +142,8 @@ int	proc_addr2sym(struct proc_handle *, uintptr_t, cha
 int	proc_attach(pid_t pid, int flags, struct proc_handle **pphdl);
 int	proc_continue(struct proc_handle *);
 int	proc_clearflags(struct proc_handle *, int);
-int	proc_create(const char *, char * const *, proc_child_func *, void *,
-	    struct proc_handle **);
+int	proc_create(const char *, char * const *, char * const *,
+	    proc_child_func *, void *, struct proc_handle **);
 int	proc_detach(struct proc_handle *, int);
 int	proc_getflags(struct proc_handle *);
 int	proc_name2sym(struct proc_handle *, const char *, const char *,

Modified: head/lib/libproc/proc_create.c
==============================================================================
--- head/lib/libproc/proc_create.c	Sun Dec  3 13:52:35 2017	(r326497)
+++ head/lib/libproc/proc_create.c	Sun Dec  3 16:50:16 2017	(r326498)
@@ -176,9 +176,10 @@ out:
 }
 
 int
-proc_create(const char *file, char * const *argv, proc_child_func *pcf,
-    void *child_arg, struct proc_handle **pphdl)
+proc_create(const char *file, char * const *argv, char * const *envp,
+    proc_child_func *pcf, void *child_arg, struct proc_handle **pphdl)
 {
+	extern char * const *environ;
 	struct proc_handle *phdl;
 	int error, status;
 	pid_t pid;
@@ -189,8 +190,7 @@ proc_create(const char *file, char * const *argv, proc
 	error = 0;
 	phdl = NULL;
 
-	/* Fork a new process. */
-	if ((pid = vfork()) == -1)
+	if ((pid = fork()) == -1)
 		error = errno;
 	else if (pid == 0) {
 		/* The child expects to be traced. */
@@ -200,18 +200,14 @@ proc_create(const char *file, char * const *argv, proc
 		if (pcf != NULL)
 			(*pcf)(child_arg);
 
-		/* Execute the specified file: */
+		if (envp != NULL)
+			environ = envp;
+
 		execvp(file, argv);
 
-		/* Couldn't execute the file. */
 		_exit(2);
 		/* NOTREACHED */
 	} else {
-		/* The parent owns the process handle. */
-		error = proc_init(pid, 0, PS_IDLE, &phdl);
-		if (error != 0)
-			goto bad;
-
 		/* Wait for the child process to stop. */
 		if (waitpid(pid, &status, WUNTRACED) == -1) {
 			error = errno;
@@ -221,11 +217,15 @@ proc_create(const char *file, char * const *argv, proc
 
 		/* Check for an unexpected status. */
 		if (!WIFSTOPPED(status)) {
-			error = EBUSY;
+			error = ENOENT;
 			DPRINTFX("ERROR: child process %d status 0x%x", pid, status);
 			goto bad;
 		}
-		phdl->status = PS_STOP;
+
+		/* The parent owns the process handle. */
+		error = proc_init(pid, 0, PS_IDLE, &phdl);
+		if (error == 0)
+			phdl->status = PS_STOP;
 
 bad:
 		if (error != 0 && phdl != NULL) {

Modified: head/lib/libproc/tests/proc_test.c
==============================================================================
--- head/lib/libproc/tests/proc_test.c	Sun Dec  3 13:52:35 2017	(r326497)
+++ head/lib/libproc/tests/proc_test.c	Sun Dec  3 16:50:16 2017	(r326498)
@@ -65,7 +65,7 @@ start_prog(const struct atf_tc *tc, bool sig)
 		argv[1] = NULL;
 	}
 
-	error = proc_create(argv[0], argv, NULL, NULL, &phdl);
+	error = proc_create(argv[0], argv, NULL, NULL, NULL, &phdl);
 	ATF_REQUIRE_EQ_MSG(error, 0, "failed to run '%s'", target_prog_file);
 	ATF_REQUIRE(phdl != NULL);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201712031650.vB3GoGDV056424>