9auth.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <stdio.h>
  5. #define NETCHLEN 16 /* max network challenge length */
  6. char * argv0;
  7. int debug;
  8. int delete;
  9. char * root = "/n/emelie";
  10. char * user;
  11. char file[64];
  12. char challenge[NETCHLEN];
  13. char response[NETCHLEN];
  14. void
  15. usage(void)
  16. {
  17. printf("usage: %s [-d] username\n", argv0);
  18. exit(1);
  19. }
  20. void
  21. main(int argc, char **argv)
  22. {
  23. int fd, n;
  24. for(argv0=*argv++,--argc; argc>0; ++argv,--argc){
  25. if(argv[0][0] != '-' || argv[0][1] == '-')
  26. break;
  27. switch(argv[0][1]){
  28. case 'D':
  29. ++debug;
  30. break;
  31. case 'd':
  32. ++delete;
  33. break;
  34. case 'r':
  35. root = argv[0][2] ? &argv[0][2] : (--argc, *++argv);
  36. break;
  37. default:
  38. usage();
  39. break;
  40. }
  41. }
  42. if(argc != 1)
  43. usage();
  44. user = argv[0];
  45. snprintf(file, sizeof file, "%s/#%s", root, user);
  46. if(debug)
  47. printf("debug=%d, file=%s\n", debug, file);
  48. if(delete){
  49. fd = creat(file, 0600);
  50. if(fd < 0){
  51. perror(file);
  52. exit(1);
  53. }
  54. exit(0);
  55. }
  56. fd = open(file, 2);
  57. if(fd < 0){
  58. perror(file);
  59. exit(1);
  60. }
  61. n = read(fd, challenge, NETCHLEN);
  62. if(debug)
  63. printf("read %d\n", n);
  64. if(n <= 0){
  65. printf("read %d: ", n);
  66. perror("");
  67. exit(1);
  68. }
  69. printf("challenge: %s\n", challenge);
  70. write(1, "response: ", 10);
  71. read(0, response, NETCHLEN-1);
  72. lseek(fd, 0, 0);
  73. n = write(fd, response, NETCHLEN);
  74. if(debug)
  75. printf("write %d\n", n);
  76. if(n <= 0){
  77. printf("write %d: ", n);
  78. perror("");
  79. exit(1);
  80. }
  81. exit(0);
  82. }