xref: /plan9/sys/src/cmd/9nfs/9auth.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
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