auth.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #include "u.h"
  2. #include "../port/lib.h"
  3. #include "mem.h"
  4. #include "dat.h"
  5. #include "fns.h"
  6. #include "../port/error.h"
  7. #include <authsrv.h>
  8. char *eve;
  9. char hostdomain[DOMLEN];
  10. /*
  11. * return true if current user is eve
  12. */
  13. int
  14. iseve(void)
  15. {
  16. return strcmp(eve, up->user) == 0;
  17. }
  18. long
  19. sysfversion(ulong *arg)
  20. {
  21. char *vers;
  22. uint arglen, m, msize;
  23. Chan *c;
  24. msize = arg[1];
  25. vers = (char*)arg[2];
  26. arglen = arg[3];
  27. validaddr(arg[2], arglen, 1);
  28. /* check there's a NUL in the version string */
  29. if(arglen==0 || memchr(vers, 0, arglen)==0)
  30. error(Ebadarg);
  31. c = fdtochan(arg[0], ORDWR, 0, 1);
  32. if(waserror()){
  33. cclose(c);
  34. nexterror();
  35. }
  36. m = mntversion(c, vers, msize, arglen);
  37. cclose(c);
  38. poperror();
  39. return m;
  40. }
  41. long
  42. sys_fsession(ulong *arg)
  43. {
  44. /* deprecated; backwards compatibility only */
  45. if(arg[2] == 0)
  46. error(Ebadarg);
  47. validaddr(arg[1], arg[2], 1);
  48. ((uchar*)arg[1])[0] = '\0';
  49. return 0;
  50. }
  51. long
  52. sysfauth(ulong *arg)
  53. {
  54. Chan *c, *ac;
  55. char *aname;
  56. int fd;
  57. validaddr(arg[1], 1, 0);
  58. aname = (char*)arg[1];
  59. validname(aname, 1);
  60. c = fdtochan(arg[0], ORDWR, 0, 1);
  61. if(waserror()){
  62. cclose(c);
  63. nexterror();
  64. }
  65. ac = mntauth(c, aname);
  66. /* at this point ac is responsible for keeping c alive */
  67. cclose(c);
  68. poperror(); /* c */
  69. if(waserror()){
  70. cclose(ac);
  71. nexterror();
  72. }
  73. fd = newfd(ac);
  74. if(fd < 0)
  75. error(Enofd);
  76. poperror(); /* ac */
  77. /* always mark it close on exec */
  78. ac->flag |= CCEXEC;
  79. return fd;
  80. }
  81. /*
  82. * called by devcons() for user device
  83. *
  84. * anyone can become none
  85. */
  86. long
  87. userwrite(char *a, int n)
  88. {
  89. if(n!=4 || strncmp(a, "none", 4)!=0)
  90. error(Eperm);
  91. kstrdup(&up->user, "none");
  92. up->basepri = PriNormal;
  93. return n;
  94. }
  95. /*
  96. * called by devcons() for host owner/domain
  97. *
  98. * writing hostowner also sets user
  99. */
  100. long
  101. hostownerwrite(char *a, int n)
  102. {
  103. char buf[128];
  104. if(!iseve())
  105. error(Eperm);
  106. if(n <= 0 || n >= sizeof buf)
  107. error(Ebadarg);
  108. memmove(buf, a, n);
  109. buf[n] = 0;
  110. renameuser(eve, buf);
  111. kstrdup(&eve, buf);
  112. kstrdup(&up->user, buf);
  113. up->basepri = PriNormal;
  114. return n;
  115. }
  116. long
  117. hostdomainwrite(char *a, int n)
  118. {
  119. char buf[DOMLEN];
  120. if(!iseve())
  121. error(Eperm);
  122. if(n >= DOMLEN)
  123. error(Ebadarg);
  124. memset(buf, 0, DOMLEN);
  125. strncpy(buf, a, n);
  126. if(buf[0] == 0)
  127. error(Ebadarg);
  128. memmove(hostdomain, buf, DOMLEN);
  129. return n;
  130. }