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
usage(void)19 usage(void)
20 {
21 printf("usage: %s [-d] username\n", argv0);
22 exit(1);
23 }
24
25 void
main(int argc,char ** argv)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