e0a93e9210c247fca34d0aef9fd8bc27354d0127
[openafs.git] / src / sys / pagsh.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #include <afsconfig.h>
11 #include <afs/param.h>
12
13 RCSID
14     ("$Header$");
15
16 #ifdef  AFS_AIX32_ENV
17 #include <signal.h>
18 #ifdef AFS_AIX51_ENV
19 #include <sys/cred.h>
20 #endif
21 #endif
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <limits.h>
25 #ifndef AFS_NT40_ENV
26 #include <unistd.h>
27 #endif
28 #include <string.h>
29 #include <pwd.h>
30 #ifdef AFS_KERBEROS_ENV
31 #include <sys/types.h>
32 #include <sys/stat.h>
33 #endif
34
35 #include "AFS_component_version_number.c"
36
37 extern afs_int32 setpag();
38
39 int
40 main(int argc, char *argv[])
41 {
42     struct passwd *pwe;
43     int uid, gid;
44     char *shell = "/bin/sh";
45
46 #ifdef  AFS_AIX32_ENV
47     /*
48      * The following signal action for AIX is necessary so that in case of a 
49      * crash (i.e. core is generated) we can include the user's data section 
50      * in the core dump. Unfortunately, by default, only a partial core is
51      * generated which, in many cases, isn't too useful.
52      */
53     struct sigaction nsa;
54
55     sigemptyset(&nsa.sa_mask);
56     nsa.sa_handler = SIG_DFL;
57     nsa.sa_flags = SA_FULLDUMP;
58     sigaction(SIGSEGV, &nsa, NULL);
59 #endif
60     gid = getgid();
61     uid = getuid();
62     pwe = getpwuid(uid);
63     if (pwe == 0) {
64         fprintf(stderr, "Intruder alert.\n");
65     } else {
66 /*              shell = pwe->pw_shell; */
67     }
68     if (setpag() == -1) {
69         perror("setpag");
70     }
71 #ifdef AFS_KERBEROS_ENV
72     ktc_newpag();
73 #endif
74     (void)setuid(uid);
75     (void)setgid(gid);
76     argv[0] = shell;
77     execvp(shell, argv);
78     perror(shell);
79     fprintf(stderr, "No shell\n");
80     exit(1);
81 }
82
83
84 #ifdef AFS_KERBEROS_ENV
85 /* stolen from auth/ktc.c */
86
87 static afs_uint32
88 curpag(void)
89 {
90 #if defined(AFS_AIX51_ENV)
91     afs_int32 pag;
92
93     if (get_pag(PAG_AFS, &pag) < 0 || pag == 0)
94         pag = -1;
95     return pag;
96 #else
97     afs_uint32 groups[NGROUPS_MAX];
98     afs_uint32 g0, g1;
99     afs_uint32 h, l, ret;
100
101     if (getgroups(sizeof groups / sizeof groups[0], groups) < 2)
102         return 0;
103
104     g0 = groups[0] & 0xffff;
105     g1 = groups[1] & 0xffff;
106     g0 -= 0x3f00;
107     g1 -= 0x3f00;
108     if ((g0 < 0xc000) && (g1 < 0xc000)) {
109         l = ((g0 & 0x3fff) << 14) | (g1 & 0x3fff);
110         h = (g0 >> 14);
111         h = (g1 >> 14) + h + h + h;
112         ret = ((h << 28) | l);
113         /* Additional testing */
114         if (((ret >> 24) & 0xff) == 'A')
115             return ret;
116         else
117             return -1;
118     }
119     return -1;
120 #endif
121 }
122
123 int
124 ktc_newpag(void)
125 {
126     extern char **environ;
127
128     afs_uint32 pag;
129     struct stat sbuf;
130     char fname[256], *prefix = "/ticket/";
131     char fname5[256], *prefix5 = "FILE:/ticket/krb5cc_";
132     int numenv;
133     char **newenv, **senv, **denv;
134
135     if (stat("/ticket", &sbuf) == -1) {
136         prefix = "/tmp/tkt";
137         prefix5 = "FILE:/tmp/krb5cc_";
138     }
139
140     pag = curpag() & 0xffffffff;
141     if (pag == -1) {
142         sprintf(fname, "%s%d", prefix, getuid());
143         sprintf(fname5, "%s%d", prefix5, getuid());
144     } else {
145         sprintf(fname, "%sp%ld", prefix, pag);
146         sprintf(fname5, "%sp%ld", prefix5, pag);
147     }
148 /*    ktc_set_tkt_string(fname); */
149
150     for (senv = environ, numenv = 0; *senv; senv++)
151         numenv++;
152     newenv = (char **)malloc((numenv + 2) * sizeof(char *));
153
154     for (senv = environ, denv = newenv; *senv; *senv++) {
155         if (strncmp(*senv, "KRBTKFILE=", 10) != 0 &&
156                 strncmp(*senv, "KRB5CCNAME=", 11) != 0)
157             *denv++ = *senv;
158     }
159
160     *denv = malloc(10+11 + strlen(fname) + strlen(fname5) + 2);
161     strcpy(*denv, "KRBTKFILE=");
162     strcat(*denv, fname);
163     *(denv+1) = *denv + strlen(*denv) + 1;
164     denv++;
165     strcpy(*denv, "KRB5CCNAME=");
166     strcat(*denv, fname5);
167     *++denv = 0;
168     environ = newenv;
169 }
170
171 #endif