login.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <auth.h>
  4. #include <authsrv.h>
  5. void
  6. readln(char *prompt, char *line, int len, int raw)
  7. {
  8. char *p;
  9. int fdin, fdout, ctl, n, nr;
  10. fdin = open("/dev/cons", OREAD);
  11. fdout = open("/dev/cons", OWRITE);
  12. fprint(fdout, "%s", prompt);
  13. if(raw){
  14. ctl = open("/dev/consctl", OWRITE);
  15. if(ctl < 0){
  16. fprint(2, "couldn't set raw mode");
  17. exits("readln");
  18. }
  19. write(ctl, "rawon", 5);
  20. } else
  21. ctl = -1;
  22. nr = 0;
  23. p = line;
  24. for(;;){
  25. n = read(fdin, p, 1);
  26. if(n < 0){
  27. close(ctl);
  28. close(fdin);
  29. close(fdout);
  30. fprint(2, "can't read cons");
  31. exits("readln");
  32. }
  33. if(*p == 0x7f)
  34. exits(0);
  35. if(n == 0 || *p == '\n' || *p == '\r'){
  36. *p = '\0';
  37. if(raw){
  38. write(ctl, "rawoff", 6);
  39. write(fdout, "\n", 1);
  40. }
  41. close(ctl);
  42. close(fdin);
  43. close(fdout);
  44. return;
  45. }
  46. if(*p == '\b'){
  47. if(nr > 0){
  48. nr--;
  49. p--;
  50. }
  51. }else{
  52. nr++;
  53. p++;
  54. }
  55. if(nr == len){
  56. fprint(fdout, "line too long; try again\n");
  57. nr = 0;
  58. p = line;
  59. }
  60. }
  61. }
  62. void
  63. setenv(char *var, char *val)
  64. {
  65. int fd;
  66. fd = create(var, OWRITE, 0644);
  67. if(fd < 0)
  68. print("init: can't open %s\n", var);
  69. else{
  70. fprint(fd, val);
  71. close(fd);
  72. }
  73. }
  74. void
  75. main(int argc, char *argv[])
  76. {
  77. char pass[ANAMELEN];
  78. char buf[2*ANAMELEN];
  79. char home[2*ANAMELEN];
  80. char *user, *sysname, *tz, *cputype, *service;
  81. rfork(RFENVG|RFNAMEG);
  82. service = getenv("service");
  83. if(strcmp(service, "cpu") == 0){
  84. fprint(2, "not from a cpu server!\n");
  85. exits("fail");
  86. }
  87. if(argc != 2){
  88. fprint(2, "usage: login username\n");
  89. exits("usage");
  90. }
  91. user = argv[1];
  92. memset(pass, 0, sizeof(pass));
  93. readln("Password: ", pass, sizeof(pass), 1);
  94. if(login(argv[1], pass, nil) < 0){
  95. fprint(2, "login failed: %r\n");
  96. exits("fail");
  97. }
  98. /* set up a new environment */
  99. cputype = getenv("cputype");
  100. sysname = getenv("sysname");
  101. tz = getenv("timezone");
  102. rfork(RFCENVG);
  103. setenv("#e/service", "con");
  104. setenv("#e/user", user);
  105. snprint(home, sizeof(home), "/usr/%s", user);
  106. setenv("#e/home", home);
  107. setenv("#e/cputype", cputype);
  108. setenv("#e/objtype", cputype);
  109. if(sysname != nil)
  110. setenv("#e/sysname", sysname);
  111. if(tz != nil)
  112. setenv("#e/timezone", tz);
  113. /* go to new home directory */
  114. snprint(buf, sizeof(buf), "/usr/%s", user);
  115. if(chdir(buf) < 0)
  116. chdir("/");
  117. /* read profile and start interactive rc */
  118. execl("/bin/rc", "rc", "-li", 0);
  119. exits(0);
  120. }