sys-warnings-and-unused-variables-cleanup-20010606
[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 <afs/param.h>
11 #include <afsconfig.h>
12 #ifdef  AFS_AIX32_ENV
13 #include <signal.h>
14 #endif
15 #include <stdio.h>
16 #include <stdlib.h>
17 #ifndef AFS_NT40_ENV
18 #include <unistd.h>
19 #endif
20 #ifdef HAVE_STRING_H
21 #include <string.h>
22 #endif
23 #include <pwd.h>
24 #ifdef AFS_KERBEROS_ENV
25 #include <sys/types.h>
26 #include <sys/stat.h>
27 #endif
28
29 #include "AFS_component_version_number.c"
30
31 extern afs_int32 setpag();
32
33 int main(argc, argv)
34 int argc;
35 char **argv;
36 {
37         struct passwd *pwe;
38         int uid, gid;
39         char *shell = "/bin/sh";
40
41 #ifdef  AFS_AIX32_ENV
42     /*
43      * The following signal action for AIX is necessary so that in case of a 
44      * crash (i.e. core is generated) we can include the user's data section 
45      * in the core dump. Unfortunately, by default, only a partial core is
46      * generated which, in many cases, isn't too useful.
47      */
48     struct sigaction nsa;
49     
50     sigemptyset(&nsa.sa_mask);
51     nsa.sa_handler = SIG_DFL;
52     nsa.sa_flags = SA_FULLDUMP;
53     sigaction(SIGSEGV, &nsa, NULL);
54 #endif
55         gid = getgid();
56         uid = getuid();
57         pwe = getpwuid(uid);
58         if (pwe == 0) {
59                 fprintf(stderr, "Intruder alert.\n");
60         } else {
61 /*              shell = pwe->pw_shell; */
62         }
63         if (setpag() == -1) {
64                 perror("setpag");
65         }
66 #ifdef AFS_KERBEROS_ENV
67         ktc_newpag();
68 #endif
69         (void) setuid(uid);
70         (void) setgid(gid);
71         argv[0] = shell;
72         execvp(shell, argv);
73         perror(shell);
74         fprintf(stderr, "No shell\n");
75         exit(1);
76 }
77
78
79 #ifdef AFS_KERBEROS_ENV
80 /* stolen from auth/ktc.c */
81
82 static afs_uint32 curpag()
83 {
84     afs_uint32 groups[30];
85     afs_uint32 g0, g1;
86     afs_uint32 h, l, ret;
87
88     if (getgroups(30, groups) < 2) return 0;
89
90     g0 = groups[0] & 0xffff;
91     g1 = groups[1] & 0xffff;
92     g0 -= 0x3f00;
93     g1 -= 0x3f00;
94     if ((g0 < 0xc000) && (g1 < 0xc000)) {
95         l = ((g0 & 0x3fff) << 14) | (g1 & 0x3fff);
96         h = (g0 >> 14);
97         h = (g1 >> 14) + h + h + h;
98         ret = ((h << 28) | l);
99         /* Additional testing */
100         if (((ret >> 24) & 0xff) == 'A')
101             return ret;
102         else
103             return -1;
104     }
105     return -1;
106 }
107
108 ktc_newpag()
109 {
110     extern char **environ;
111
112     afs_uint32 pag;
113     struct stat sbuf;
114     char fname[256], *prefix = "/ticket/";
115     int numenv;
116     char **newenv, **senv, **denv;
117
118     if (stat("/ticket", &sbuf) == -1) {
119         prefix = "/tmp/tkt";
120     }
121
122     pag = curpag() & 0xffffffff;
123     if (pag == -1) {
124         sprintf(fname, "%s%d", prefix, getuid());
125     }
126     else {
127         sprintf(fname, "%sp%ld", prefix, pag);
128     }
129 /*    ktc_set_tkt_string(fname); */
130
131     for (senv=environ, numenv=0; *senv; senv++) numenv++;
132     newenv = (char **)malloc((numenv+2) * sizeof(char *));
133
134     for (senv=environ, denv=newenv; *senv; *senv++) {
135         if (strncmp(*senv, "KRBTKFILE=", 10) != 0) *denv++ = *senv;
136     }
137
138     *denv = malloc(10 + strlen(fname) + 1);
139     strcpy(*denv, "KRBTKFILE=");
140     strcat(*denv, fname);
141     *++denv = 0;
142     environ = newenv;
143 }
144
145 #endif
146
147