1*7dd7cddfSDavid du Colombier #include <sys/types.h> 2*7dd7cddfSDavid du Colombier #include <sys/stat.h> 3*7dd7cddfSDavid du Colombier #include <fcntl.h> 4*7dd7cddfSDavid du Colombier #include <stdio.h> 5*7dd7cddfSDavid du Colombier 6*7dd7cddfSDavid du Colombier #define NETCHLEN 16 /* max network challenge length */ 7*7dd7cddfSDavid du Colombier 8*7dd7cddfSDavid du Colombier char * argv0; 9*7dd7cddfSDavid du Colombier int debug; 10*7dd7cddfSDavid du Colombier int delete; 11*7dd7cddfSDavid du Colombier 12*7dd7cddfSDavid du Colombier char * root = "/n/emelie"; 13*7dd7cddfSDavid du Colombier char * user; 14*7dd7cddfSDavid du Colombier char file[64]; 15*7dd7cddfSDavid du Colombier char challenge[NETCHLEN]; 16*7dd7cddfSDavid du Colombier char response[NETCHLEN]; 17*7dd7cddfSDavid du Colombier 18*7dd7cddfSDavid du Colombier void 19*7dd7cddfSDavid du Colombier usage(void) 20*7dd7cddfSDavid du Colombier { 21*7dd7cddfSDavid du Colombier printf("usage: %s [-d] username\n", argv0); 22*7dd7cddfSDavid du Colombier exit(1); 23*7dd7cddfSDavid du Colombier } 24*7dd7cddfSDavid du Colombier 25*7dd7cddfSDavid du Colombier void 26*7dd7cddfSDavid du Colombier main(int argc, char **argv) 27*7dd7cddfSDavid du Colombier { 28*7dd7cddfSDavid du Colombier int fd, n; 29*7dd7cddfSDavid du Colombier 30*7dd7cddfSDavid du Colombier for(argv0=*argv++,--argc; argc>0; ++argv,--argc){ 31*7dd7cddfSDavid du Colombier if(argv[0][0] != '-' || argv[0][1] == '-') 32*7dd7cddfSDavid du Colombier break; 33*7dd7cddfSDavid du Colombier switch(argv[0][1]){ 34*7dd7cddfSDavid du Colombier case 'D': 35*7dd7cddfSDavid du Colombier ++debug; 36*7dd7cddfSDavid du Colombier break; 37*7dd7cddfSDavid du Colombier case 'd': 38*7dd7cddfSDavid du Colombier ++delete; 39*7dd7cddfSDavid du Colombier break; 40*7dd7cddfSDavid du Colombier case 'r': 41*7dd7cddfSDavid du Colombier root = argv[0][2] ? &argv[0][2] : (--argc, *++argv); 42*7dd7cddfSDavid du Colombier break; 43*7dd7cddfSDavid du Colombier default: 44*7dd7cddfSDavid du Colombier usage(); 45*7dd7cddfSDavid du Colombier break; 46*7dd7cddfSDavid du Colombier } 47*7dd7cddfSDavid du Colombier } 48*7dd7cddfSDavid du Colombier if(argc != 1) 49*7dd7cddfSDavid du Colombier usage(); 50*7dd7cddfSDavid du Colombier user = argv[0]; 51*7dd7cddfSDavid du Colombier sprintf(file, "%s/#%s", root, user); 52*7dd7cddfSDavid du Colombier if(debug) 53*7dd7cddfSDavid du Colombier printf("debug=%d, file=%s\n", debug, file); 54*7dd7cddfSDavid du Colombier if(delete){ 55*7dd7cddfSDavid du Colombier fd = creat(file, 0600); 56*7dd7cddfSDavid du Colombier if(fd < 0){ 57*7dd7cddfSDavid du Colombier perror(file); 58*7dd7cddfSDavid du Colombier exit(1); 59*7dd7cddfSDavid du Colombier } 60*7dd7cddfSDavid du Colombier exit(0); 61*7dd7cddfSDavid du Colombier } 62*7dd7cddfSDavid du Colombier fd = open(file, 2); 63*7dd7cddfSDavid du Colombier if(fd < 0){ 64*7dd7cddfSDavid du Colombier perror(file); 65*7dd7cddfSDavid du Colombier exit(1); 66*7dd7cddfSDavid du Colombier } 67*7dd7cddfSDavid du Colombier n = read(fd, challenge, NETCHLEN); 68*7dd7cddfSDavid du Colombier if(debug) 69*7dd7cddfSDavid du Colombier printf("read %d\n", n); 70*7dd7cddfSDavid du Colombier if(n <= 0){ 71*7dd7cddfSDavid du Colombier printf("read %d: ", n); 72*7dd7cddfSDavid du Colombier perror(""); 73*7dd7cddfSDavid du Colombier exit(1); 74*7dd7cddfSDavid du Colombier } 75*7dd7cddfSDavid du Colombier printf("challenge: %s\n", challenge); 76*7dd7cddfSDavid du Colombier write(1, "response: ", 10); 77*7dd7cddfSDavid du Colombier read(0, response, NETCHLEN-1); 78*7dd7cddfSDavid du Colombier lseek(fd, 0, 0); 79*7dd7cddfSDavid du Colombier n = write(fd, response, NETCHLEN); 80*7dd7cddfSDavid du Colombier if(debug) 81*7dd7cddfSDavid du Colombier printf("write %d\n", n); 82*7dd7cddfSDavid du Colombier if(n <= 0){ 83*7dd7cddfSDavid du Colombier printf("write %d: ", n); 84*7dd7cddfSDavid du Colombier perror(""); 85*7dd7cddfSDavid du Colombier exit(1); 86*7dd7cddfSDavid du Colombier } 87*7dd7cddfSDavid du Colombier exit(0); 88*7dd7cddfSDavid du Colombier } 89