remove gcc34
[dragonfly.git] / crypto / heimdal-0.6.3 / appl / dceutils / testpag.c
1 /* Test the k5dcepag routine by setting a pag, and 
2  * and execing a shell under this pag. 
3  * 
4  * This allows you to join a PAG which was created  
5  * earlier by some other means. 
6  * for example k5dcecon
7  * 
8  * Must be run as root for testing only. 
9  *
10  */
11
12 #include <stdio.h>
13 #include <sys/stat.h>
14 #include <sys/wait.h>
15 #include <fcntl.h>
16 #include <signal.h>
17 #include <setjmp.h>
18 #include <errno.h>
19
20 #define POSIX_SETJMP
21 #define POSIX_SIGNALS
22
23 #ifdef POSIX_SIGNALS
24 typedef struct sigaction handler;
25 #define handler_init(H,F)       (sigemptyset(&(H).sa_mask), \
26                      (H).sa_flags=0, \
27                      (H).sa_handler=(F))
28 #define handler_swap(S,NEW,OLD)     sigaction(S, &NEW, &OLD)
29 #define handler_set(S,OLD)      sigaction(S, &OLD, NULL)
30 #else
31 typedef sigtype (*handler)();
32 #define handler_init(H,F)       ((H) = (F))
33 #define handler_swap(S,NEW,OLD)     ((OLD) = signal ((S), (NEW)))
34
35 #define handler_set(S,OLD)      (signal ((S), (OLD)))
36 #endif
37
38 typedef void sigtype;
39
40 /*
41  * We could include the dcedfs/syscall.h which should have these
42  * numbers, but it has extra baggage. So for
43  * simplicity sake now, we define these here.
44  */
45
46
47 #define AFSCALL_SETPAG 2
48 #define AFSCALL_GETPAG 11
49
50 #if defined(sun)
51 #define AFS_SYSCALL  72
52
53 #elif defined(hpux)
54 /* assume HPUX 10 +  or is it 50 */
55 #define AFS_SYSCALL 326
56
57 #elif defined(_AIX)
58 #define DPAGAIX "dpagaix"
59 /* #define DPAGAIX "/krb5/sbin/dpagaix" */
60
61 #elif defined(sgi) || defined(_sgi)
62 #define AFS_SYSCALL  206+1000
63
64 #else
65 #define AFS_SYSCALL (Unknown_DFS_AFS_SYSCALL)
66 #endif
67
68 static sigjmp_buf setpag_buf;
69
70 static sigtype mysig()
71 {
72   siglongjmp(setpag_buf, 1);
73 }
74
75
76 int  krb5_dfs_newpag(new_pag)
77   int new_pag;
78 {
79   handler sa1, osa1;
80   handler sa2, osa2;
81   int pag = -1;
82
83   handler_init (sa1, mysig);
84   handler_init (sa2, mysig);
85   handler_swap (SIGSYS, sa1, osa1);
86   handler_swap (SIGSEGV, sa2, osa2);
87  
88   if (sigsetjmp(setpag_buf, 1) == 0) {
89 #if defined(_AIX)
90     int (*dpagaix)(int, int, int, int, int, int);
91
92     if (dpagaix = load(DPAGAIX, 0, 0)) 
93       pag = (*dpagaix)(AFSCALL_SETPAG, new_pag, 0, 0, 0, 0);
94 #else
95     pag = syscall(AFS_SYSCALL,AFSCALL_SETPAG, new_pag, 0, 0, 0, 0);
96 #endif
97     handler_set (SIGSYS, osa1);
98     handler_set (SIGSEGV, osa2);
99     return(pag);
100   }
101
102   fprintf(stderr,"Setpag failed with a system error\n");
103   /* syscall failed! return 0 */
104   handler_set (SIGSYS, osa1);
105   handler_set (SIGSEGV, osa2);
106   return(-1);
107 }
108
109 main(argc, argv)
110         int argc;
111         char *argv[];
112 {
113   extern int optind;
114   extern char *optarg;
115   int rv;
116   int rc;
117   unsigned int pag;
118   unsigned int newpag = 0;
119   char ccname[256];
120   int nflag = 0;
121   
122   while((rv = getopt(argc,argv,"n:")) != -1) {
123     switch(rv) {
124      case 'n':
125        nflag++;
126        sscanf(optarg,"%8x",&newpag);
127        break;
128      default:
129        printf("Usage: k5dcepagt -n pag \n");
130        exit(1);
131     }
132   }
133
134   if (nflag) {
135     fprintf (stderr,"calling k5dcepag newpag=%8.8x\n",newpag);
136     pag = krb5_dfs_newpag(newpag);
137
138     fprintf (stderr,"PAG returned = %8.8x\n",pag);
139     if ((pag != 0) && (pag != -1)) {
140       sprintf (ccname,
141         "FILE:/opt/dcelocal/var/security/creds/dcecred_%8.8x", 
142         pag);
143       esetenv("KRB5CCNAME",ccname,1);
144       execl("/bin/csh","csh",0);
145     }
146     else {
147       fprintf(stderr," Not a good pag value\n");
148     }
149   }
150 }