17dd7cddfSDavid du Colombier #include <sys/types.h>
27dd7cddfSDavid du Colombier #include <sys/stat.h>
37dd7cddfSDavid du Colombier #include <fcntl.h>
47dd7cddfSDavid du Colombier #include <stdio.h>
57dd7cddfSDavid du Colombier
67dd7cddfSDavid du Colombier #define NETCHLEN 16 /* max network challenge length */
77dd7cddfSDavid du Colombier
87dd7cddfSDavid du Colombier char * argv0;
97dd7cddfSDavid du Colombier int debug;
107dd7cddfSDavid du Colombier int delete;
117dd7cddfSDavid du Colombier
127dd7cddfSDavid du Colombier char * root = "/n/emelie";
137dd7cddfSDavid du Colombier char * user;
147dd7cddfSDavid du Colombier char file[64];
157dd7cddfSDavid du Colombier char challenge[NETCHLEN];
167dd7cddfSDavid du Colombier char response[NETCHLEN];
177dd7cddfSDavid du Colombier
187dd7cddfSDavid du Colombier void
usage(void)197dd7cddfSDavid du Colombier usage(void)
207dd7cddfSDavid du Colombier {
217dd7cddfSDavid du Colombier printf("usage: %s [-d] username\n", argv0);
227dd7cddfSDavid du Colombier exit(1);
237dd7cddfSDavid du Colombier }
247dd7cddfSDavid du Colombier
257dd7cddfSDavid du Colombier void
main(int argc,char ** argv)267dd7cddfSDavid du Colombier main(int argc, char **argv)
277dd7cddfSDavid du Colombier {
287dd7cddfSDavid du Colombier int fd, n;
297dd7cddfSDavid du Colombier
307dd7cddfSDavid du Colombier for(argv0=*argv++,--argc; argc>0; ++argv,--argc){
317dd7cddfSDavid du Colombier if(argv[0][0] != '-' || argv[0][1] == '-')
327dd7cddfSDavid du Colombier break;
337dd7cddfSDavid du Colombier switch(argv[0][1]){
347dd7cddfSDavid du Colombier case 'D':
357dd7cddfSDavid du Colombier ++debug;
367dd7cddfSDavid du Colombier break;
377dd7cddfSDavid du Colombier case 'd':
387dd7cddfSDavid du Colombier ++delete;
397dd7cddfSDavid du Colombier break;
407dd7cddfSDavid du Colombier case 'r':
417dd7cddfSDavid du Colombier root = argv[0][2] ? &argv[0][2] : (--argc, *++argv);
427dd7cddfSDavid du Colombier break;
437dd7cddfSDavid du Colombier default:
447dd7cddfSDavid du Colombier usage();
457dd7cddfSDavid du Colombier break;
467dd7cddfSDavid du Colombier }
477dd7cddfSDavid du Colombier }
487dd7cddfSDavid du Colombier if(argc != 1)
497dd7cddfSDavid du Colombier usage();
507dd7cddfSDavid du Colombier user = argv[0];
51*9a747e4fSDavid du Colombier snprintf(file, sizeof file, "%s/#%s", root, user);
527dd7cddfSDavid du Colombier if(debug)
537dd7cddfSDavid du Colombier printf("debug=%d, file=%s\n", debug, file);
547dd7cddfSDavid du Colombier if(delete){
557dd7cddfSDavid du Colombier fd = creat(file, 0600);
567dd7cddfSDavid du Colombier if(fd < 0){
577dd7cddfSDavid du Colombier perror(file);
587dd7cddfSDavid du Colombier exit(1);
597dd7cddfSDavid du Colombier }
607dd7cddfSDavid du Colombier exit(0);
617dd7cddfSDavid du Colombier }
627dd7cddfSDavid du Colombier fd = open(file, 2);
637dd7cddfSDavid du Colombier if(fd < 0){
647dd7cddfSDavid du Colombier perror(file);
657dd7cddfSDavid du Colombier exit(1);
667dd7cddfSDavid du Colombier }
677dd7cddfSDavid du Colombier n = read(fd, challenge, NETCHLEN);
687dd7cddfSDavid du Colombier if(debug)
697dd7cddfSDavid du Colombier printf("read %d\n", n);
707dd7cddfSDavid du Colombier if(n <= 0){
717dd7cddfSDavid du Colombier printf("read %d: ", n);
727dd7cddfSDavid du Colombier perror("");
737dd7cddfSDavid du Colombier exit(1);
747dd7cddfSDavid du Colombier }
757dd7cddfSDavid du Colombier printf("challenge: %s\n", challenge);
767dd7cddfSDavid du Colombier write(1, "response: ", 10);
777dd7cddfSDavid du Colombier read(0, response, NETCHLEN-1);
787dd7cddfSDavid du Colombier lseek(fd, 0, 0);
797dd7cddfSDavid du Colombier n = write(fd, response, NETCHLEN);
807dd7cddfSDavid du Colombier if(debug)
817dd7cddfSDavid du Colombier printf("write %d\n", n);
827dd7cddfSDavid du Colombier if(n <= 0){
837dd7cddfSDavid du Colombier printf("write %d: ", n);
847dd7cddfSDavid du Colombier perror("");
857dd7cddfSDavid du Colombier exit(1);
867dd7cddfSDavid du Colombier }
877dd7cddfSDavid du Colombier exit(0);
887dd7cddfSDavid du Colombier }
89