typepasswd.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <authsrv.h>
  4. int readln(char*, char*, int);
  5. void error(char*, ...);
  6. void passwd(char*);
  7. void
  8. main(int argc, char *argv[])
  9. {
  10. char np[64];
  11. argc--;
  12. argv0 = *argv;
  13. if(argc){
  14. fprint(2, "usage: typepasswd\n");
  15. exits("usage");
  16. }
  17. if(access("#i/draw", AEXIST) < 0){
  18. fprint(2, "typepasswd: must be run on a terminal\n");
  19. exits("run typepasswd on a terminal");
  20. }
  21. readln("New password:", np, sizeof np);
  22. passwd(np);
  23. exits(0);
  24. }
  25. void
  26. passwd(char *p)
  27. {
  28. char key[DESKEYLEN];
  29. int fd;
  30. if(passtokey(key, p) == 0)
  31. error("bad password");
  32. fd = open("/dev/key", OWRITE);
  33. if(fd < 0)
  34. error("can't open /dev/key");
  35. if(write(fd, key, DESKEYLEN) != DESKEYLEN)
  36. error("can't write key");
  37. close(fd);
  38. print("password changed\n");
  39. }
  40. int
  41. readln(char *prompt, char *line, int len)
  42. {
  43. char *p;
  44. int fd, ctl, n, nr;
  45. fd = open("/dev/cons", ORDWR);
  46. if(fd < 0)
  47. error("couldn't open cons");
  48. ctl = open("/dev/consctl", OWRITE);
  49. if(ctl < 0)
  50. error("couldn't set raw mode");
  51. write(ctl, "rawon", 5);
  52. fprint(fd, "%s", prompt);
  53. nr = 0;
  54. p = line;
  55. for(;;){
  56. n = read(fd, p, 1);
  57. if(n < 0){
  58. close(ctl);
  59. close(fd);
  60. return -1;
  61. }
  62. if(n == 0 || *p == '\n' || *p == '\r'){
  63. *p = '\0';
  64. write(fd, "\n", 1);
  65. close(ctl);
  66. close(fd);
  67. return nr;
  68. }
  69. if(*p == '\b'){
  70. if(nr > 0){
  71. nr--;
  72. p--;
  73. }
  74. }else{
  75. nr++;
  76. p++;
  77. }
  78. if(nr == len){
  79. fprint(2, "line too long; try again\n");
  80. nr = 0;
  81. p = line;
  82. }
  83. }
  84. return -1;
  85. }
  86. void
  87. error(char *fmt, ...)
  88. {
  89. va_list arg;
  90. char buf[8192], *s;
  91. s = buf;
  92. s += sprint(s, "%s: ", argv0);
  93. va_start(arg, fmt);
  94. s = vseprint(s, buf + sizeof(buf) / sizeof(*buf), fmt, arg);
  95. va_end(arg);
  96. *s++ = '\n';
  97. write(2, buf, s - buf);
  98. exits(buf);
  99. }