henesyinit from p9f47575dc5 years agoHistory
89 lines · 1.5 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <auth.h>#include "srv.h" enum{	SULEN	= AUTHLEN + NAMELEN + DESKEYLEN,}; static int	readarg(int, char*, int); intgetchall(char *user, char *chal){	char uandh[2*NAMELEN+AUTHLEN], sysname[NAMELEN];	int fd, n; 	fd = open("#c/sysname", OREAD);	if(fd < 0)		return -1;	n = read(fd, sysname, sizeof sysname - 1);	close(fd);	if(n < 0)		return -1;	sysname[n] = '\0';	fd = open("#c/chal", OREAD);	if(fd < 0)		return -1;	n = read(fd, uandh+2*NAMELEN, AUTHLEN);	close(fd);	if(n != AUTHLEN)		return -1;	strncpy(uandh, user, NAMELEN);	strncpy(uandh+NAMELEN, sysname, NAMELEN);	fd = authdial("chal");	if(fd < 0)		return -1;	if(write(fd, uandh, sizeof uandh) != sizeof uandh	|| readarg(fd, chal, NETCHLEN) < 0){		close(fd);		return -1;	}	return fd;} intchallreply(int fd, char *user, char *reply){	char su[SULEN];	int n; 	if(write(fd, reply, strlen(reply)+1) != strlen(reply)+1	|| read(fd, su, 2) != 2	|| su[0] != 'O' || su[1] != 'K'){		close(fd);		return -1;	}	n = read(fd, su, sizeof su);	close(fd);	if(n != sizeof su)		return -1;	netchown(user);	fd = open("#c/chal", OWRITE|OTRUNC);	if(fd < 0)		return -1;	n = write(fd, su, sizeof su);	close(fd);	if(n != sizeof su)		return -1;	return 0;} static intreadarg(int fd, char *arg, int len){	char buf[1];	int i; 	i = 0;	for(;;){		if(read(fd, buf, 1) != 1)			return -1;		if(i < len - 1)			arg[i++] = *buf;		if(*buf == '\0'){			arg[i] = '\0';			return 0;		}	}}