Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
}