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