auth.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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 = validnamedup((char*)arg[1], 1);
  59. if(waserror()){
  60. free(aname);
  61. nexterror();
  62. }
  63. c = fdtochan(arg[0], ORDWR, 0, 1);
  64. if(waserror()){
  65. cclose(c);
  66. nexterror();
  67. }
  68. ac = mntauth(c, aname);
  69. /* at this point ac is responsible for keeping c alive */
  70. cclose(c);
  71. poperror(); /* c */
  72. free(aname);
  73. poperror(); /* aname */
  74. if(waserror()){
  75. cclose(ac);
  76. nexterror();
  77. }
  78. fd = newfd(ac);
  79. if(fd < 0)
  80. error(Enofd);
  81. poperror(); /* ac */
  82. /* always mark it close on exec */
  83. ac->flag |= CCEXEC;
  84. return fd;
  85. }
  86. /*
  87. * called by devcons() for user device
  88. *
  89. * anyone can become none
  90. */
  91. long
  92. userwrite(char *a, int n)
  93. {
  94. if(n!=4 || strncmp(a, "none", 4)!=0)
  95. error(Eperm);
  96. kstrdup(&up->user, "none");
  97. up->basepri = PriNormal;
  98. return n;
  99. }
  100. /*
  101. * called by devcons() for host owner/domain
  102. *
  103. * writing hostowner also sets user
  104. */
  105. long
  106. hostownerwrite(char *a, int n)
  107. {
  108. char buf[128];
  109. if(!iseve())
  110. error(Eperm);
  111. if(n <= 0 || n >= sizeof buf)
  112. error(Ebadarg);
  113. memmove(buf, a, n);
  114. buf[n] = 0;
  115. renameuser(eve, buf);
  116. kstrdup(&eve, buf);
  117. kstrdup(&up->user, buf);
  118. up->basepri = PriNormal;
  119. return n;
  120. }
  121. long
  122. hostdomainwrite(char *a, int n)
  123. {
  124. char buf[DOMLEN];
  125. if(!iseve())
  126. error(Eperm);
  127. if(n >= DOMLEN)
  128. error(Ebadarg);
  129. memset(buf, 0, DOMLEN);
  130. strncpy(buf, a, n);
  131. if(buf[0] == 0)
  132. error(Ebadarg);
  133. memmove(hostdomain, buf, DOMLEN);
  134. return n;
  135. }