diff usr/src/test/zfs-tests/cmd/chg_usr_exec/chg_usr_exec.c @ 13899:0bcf78798346

3311 Want a test framework for arbitrary OS unit tests 3312 Add a testrunner package for OS unit tests 3313 Add a testrunner package to convert ZFS tests from STF Reviewed by: Matt Ahrens <matthew.ahrens@delphix.com> Reviewed by: Will Guyette <will.guyette@delphix.com> Reviewed by: Dan Kimmel <dan.kimmel@delphix.com> Reviewed by: Adam Leventhal <ahl@delphix.com> Reviewed by: Henrik Mattson <henrik.mattson@delphix.com> Reviewed by: Sonu Pillai <sonu.pillai@delphix.com> Reviewed by: Christopher Siden <chris.siden@delphix.com> Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Richard Lowe <richlowe@richlowe.net> Approved by: Richard Lowe <richlowe@richlowe.net>
author John Wren Kennedy <john.kennedy@delphix.com>
date Wed, 05 Dec 2012 22:04:50 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/test/zfs-tests/cmd/chg_usr_exec/chg_usr_exec.c	Wed Dec 05 22:04:50 2012 -0500
@@ -0,0 +1,77 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <pwd.h>
+
+/* extern int errno = 0; */
+
+int
+main(int argc, char *argv[])
+{
+	char *plogin = NULL;
+	char cmds[BUFSIZ] = { 0 };
+	char sep[] = " ";
+	struct passwd *ppw = NULL;
+	int i, len;
+
+	if (argc < 3 || strlen(argv[1]) == 0) {
+		(void) printf("\tUsage: %s <login> <commands> ...\n", argv[0]);
+		return (1);
+	}
+
+	plogin = argv[1];
+	len = 0;
+	for (i = 2; i < argc; i++) {
+		(void) snprintf(cmds+len, sizeof (cmds)-len,
+		    "%s%s", argv[i], sep);
+		len += strlen(argv[i]) + strlen(sep);
+	}
+
+	if ((ppw = getpwnam(plogin)) == NULL) {
+		perror("getpwnam");
+		return (errno);
+	}
+	if (setgid(ppw->pw_gid) != 0) {
+		perror("setgid");
+		return (errno);
+	}
+	if (setuid(ppw->pw_uid) != 0) {
+		perror("setuid");
+		return (errno);
+	}
+
+	if (execl("/usr/xpg4/bin/sh", "sh",  "-c", cmds, (char *)0) != 0) {
+		perror("execl");
+		return (errno);
+	}
+
+	return (0);
+}