| 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 | }
|
|---|