Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/openzfs/tests/zfs-tests/cmd/chg_usr_exec.c
48529 views
1
// SPDX-License-Identifier: CDDL-1.0
2
/*
3
* CDDL HEADER START
4
*
5
* The contents of this file are subject to the terms of the
6
* Common Development and Distribution License (the "License").
7
* You may not use this file except in compliance with the License.
8
*
9
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10
* or https://opensource.org/licenses/CDDL-1.0.
11
* See the License for the specific language governing permissions
12
* and limitations under the License.
13
*
14
* When distributing Covered Code, include this CDDL HEADER in each
15
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16
* If applicable, add the following below this CDDL HEADER, with the
17
* fields enclosed by brackets "[]" replaced with your own identifying
18
* information: Portions Copyright [yyyy] [name of copyright owner]
19
*
20
* CDDL HEADER END
21
*/
22
23
/*
24
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
25
* Use is subject to license terms.
26
*/
27
28
#include <stdio.h>
29
#include <stdlib.h>
30
#include <unistd.h>
31
#include <string.h>
32
#include <errno.h>
33
#include <pwd.h>
34
35
#define EXECSHELL "/bin/sh"
36
37
int
38
main(int argc, char *argv[])
39
{
40
char *plogin = NULL;
41
char cmds[BUFSIZ] = { 0 };
42
char sep[] = " ";
43
struct passwd *ppw = NULL;
44
int i, len;
45
46
if (argc < 3 || strlen(argv[1]) == 0) {
47
(void) printf("\tUsage: %s <login> <commands> ...\n", argv[0]);
48
return (1);
49
}
50
51
plogin = argv[1];
52
len = 0;
53
for (i = 2; i < argc; i++) {
54
(void) snprintf(cmds+len, sizeof (cmds)-len,
55
"%s%s", argv[i], sep);
56
len += strlen(argv[i]) + strlen(sep);
57
}
58
59
if ((ppw = getpwnam(plogin)) == NULL) {
60
perror("getpwnam");
61
return (errno);
62
}
63
if (setgid(ppw->pw_gid) != 0) {
64
perror("setgid");
65
return (errno);
66
}
67
if (setuid(ppw->pw_uid) != 0) {
68
perror("setuid");
69
return (errno);
70
}
71
72
if (execl(EXECSHELL, "sh", "-c", cmds, (char *)NULL) != 0) {
73
perror("execl: " EXECSHELL);
74
return (errno);
75
}
76
77
return (0);
78
}
79
80