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", NULL); 145 } 146 else { 147 fprintf(stderr," Not a good pag value\n"); 148 } 149 } 150 }