 3e00ddf50d
			
		
	
	3e00ddf50d
	
	
	
		
			
			git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@9089 ec53bebd-3082-4978-b11e-865c3cabbd6b
		
			
				
	
	
		
			151 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Test the k5dcepag routine by setting a pag, and 
 | |
|  * and execing a shell under this pag. 
 | |
|  * 
 | |
|  * This allows you to join a PAG which was created  
 | |
|  * earlier by some other means. 
 | |
|  * for example k5dcecon
 | |
|  * 
 | |
|  * Must be run as root for testing only. 
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <sys/stat.h>
 | |
| #include <sys/wait.h>
 | |
| #include <fcntl.h>
 | |
| #include <signal.h>
 | |
| #include <setjmp.h>
 | |
| #include <errno.h>
 | |
| 
 | |
| #define POSIX_SETJMP
 | |
| #define POSIX_SIGNALS
 | |
| 
 | |
| #ifdef POSIX_SIGNALS
 | |
| typedef struct sigaction handler;
 | |
| #define handler_init(H,F)       (sigemptyset(&(H).sa_mask), \
 | |
|                      (H).sa_flags=0, \
 | |
|                      (H).sa_handler=(F))
 | |
| #define handler_swap(S,NEW,OLD)     sigaction(S, &NEW, &OLD)
 | |
| #define handler_set(S,OLD)      sigaction(S, &OLD, NULL)
 | |
| #else
 | |
| typedef sigtype (*handler)();
 | |
| #define handler_init(H,F)       ((H) = (F))
 | |
| #define handler_swap(S,NEW,OLD)     ((OLD) = signal ((S), (NEW)))
 | |
| 
 | |
| #define handler_set(S,OLD)      (signal ((S), (OLD)))
 | |
| #endif
 | |
| 
 | |
| typedef void sigtype;
 | |
| 
 | |
| /*
 | |
|  * We could include the dcedfs/syscall.h which should have these
 | |
|  * numbers, but it has extra baggage. So for
 | |
|  * simplicity sake now, we define these here.
 | |
|  */
 | |
| 
 | |
| 
 | |
| #define AFSCALL_SETPAG 2
 | |
| #define AFSCALL_GETPAG 11
 | |
| 
 | |
| #if defined(sun)
 | |
| #define AFS_SYSCALL  72
 | |
| 
 | |
| #elif defined(hpux)
 | |
| /* assume HPUX 10 +  or is it 50 */
 | |
| #define AFS_SYSCALL 326
 | |
| 
 | |
| #elif defined(_AIX)
 | |
| #define DPAGAIX "dpagaix"
 | |
| /* #define DPAGAIX "/krb5/sbin/dpagaix" */
 | |
| 
 | |
| #elif defined(sgi) || defined(_sgi)
 | |
| #define AFS_SYSCALL  206+1000
 | |
| 
 | |
| #else
 | |
| #define AFS_SYSCALL (Unknown_DFS_AFS_SYSCALL)
 | |
| #endif
 | |
| 
 | |
| static sigjmp_buf setpag_buf;
 | |
| 
 | |
| static sigtype mysig()
 | |
| {
 | |
|   siglongjmp(setpag_buf, 1);
 | |
| }
 | |
| 
 | |
| 
 | |
| int  krb5_dfs_newpag(new_pag)
 | |
|   int new_pag;
 | |
| {
 | |
|   handler sa1, osa1;
 | |
|   handler sa2, osa2;
 | |
|   int pag = -1;
 | |
| 
 | |
|   handler_init (sa1, mysig);
 | |
|   handler_init (sa2, mysig);
 | |
|   handler_swap (SIGSYS, sa1, osa1);
 | |
|   handler_swap (SIGSEGV, sa2, osa2);
 | |
|  
 | |
|   if (sigsetjmp(setpag_buf, 1) == 0) {
 | |
| #if defined(_AIX)
 | |
|     int (*dpagaix)(int, int, int, int, int, int);
 | |
| 
 | |
|     if (dpagaix = load(DPAGAIX, 0, 0)) 
 | |
|       pag = (*dpagaix)(AFSCALL_SETPAG, new_pag, 0, 0, 0, 0);
 | |
| #else
 | |
|     pag = syscall(AFS_SYSCALL,AFSCALL_SETPAG, new_pag, 0, 0, 0, 0);
 | |
| #endif
 | |
|     handler_set (SIGSYS, osa1);
 | |
|     handler_set (SIGSEGV, osa2);
 | |
|     return(pag);
 | |
|   }
 | |
| 
 | |
|   fprintf(stderr,"Setpag failed with a system error\n");
 | |
|   /* syscall failed! return 0 */
 | |
|   handler_set (SIGSYS, osa1);
 | |
|   handler_set (SIGSEGV, osa2);
 | |
|   return(-1);
 | |
| }
 | |
| 
 | |
| main(argc, argv)
 | |
| 	int argc;
 | |
| 	char *argv[];
 | |
| {
 | |
|   extern int optind;
 | |
|   extern char *optarg;
 | |
|   int rv;
 | |
|   int rc;
 | |
|   unsigned int pag;
 | |
|   unsigned int newpag = 0;
 | |
|   char ccname[256];
 | |
|   int nflag = 0;
 | |
|   
 | |
|   while((rv = getopt(argc,argv,"n:")) != -1) {
 | |
|     switch(rv) {
 | |
|      case 'n':
 | |
|        nflag++;
 | |
|        sscanf(optarg,"%8x",&newpag);
 | |
|        break;
 | |
|      default:
 | |
|        printf("Usage: k5dcepagt -n pag \n");
 | |
|        exit(1);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (nflag) {
 | |
|     fprintf (stderr,"calling k5dcepag newpag=%8.8x\n",newpag);
 | |
|     pag = krb5_dfs_newpag(newpag);
 | |
| 
 | |
|     fprintf (stderr,"PAG returned = %8.8x\n",pag);
 | |
|     if ((pag != 0) && (pag != -1)) {
 | |
|       sprintf (ccname,
 | |
|         "FILE:/opt/dcelocal/var/security/creds/dcecred_%8.8x", 
 | |
|         pag);
 | |
|       esetenv("KRB5CCNAME",ccname,1);
 | |
|       execl("/bin/csh","csh",0);
 | |
|     }
 | |
|     else {
 | |
|       fprintf(stderr," Not a good pag value\n");
 | |
|     }
 | |
|   }
 | |
| }
 |