main.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include "u.h"
  2. #include "lib.h"
  3. #include "kern/dat.h"
  4. #include "kern/fns.h"
  5. #include "user.h"
  6. #include "drawterm.h"
  7. char *argv0;
  8. char *user;
  9. extern int errfmt(Fmt*);
  10. void
  11. sizebug(void)
  12. {
  13. /*
  14. * Needed by various parts of the code.
  15. * This is a huge bug.
  16. */
  17. assert(sizeof(char)==1);
  18. assert(sizeof(short)==2);
  19. assert(sizeof(ushort)==2);
  20. assert(sizeof(int)==4);
  21. assert(sizeof(uint)==4);
  22. assert(sizeof(long)==4);
  23. assert(sizeof(ulong)==4);
  24. assert(sizeof(vlong)==8);
  25. assert(sizeof(uvlong)==8);
  26. }
  27. int
  28. main(int argc, char **argv)
  29. {
  30. eve = getuser();
  31. if(eve == nil)
  32. eve = "drawterm";
  33. sizebug();
  34. osinit();
  35. procinit0();
  36. printinit();
  37. screeninit();
  38. chandevreset();
  39. chandevinit();
  40. quotefmtinstall();
  41. if(bind("#c", "/dev", MBEFORE) < 0)
  42. panic("bind #c: %r");
  43. if(bind("#m", "/dev", MBEFORE) < 0)
  44. panic("bind #m: %r");
  45. if(bind("#i", "/dev", MBEFORE) < 0)
  46. panic("bind #i: %r");
  47. if(bind("#I", "/net", MBEFORE) < 0)
  48. panic("bind #I: %r");
  49. if(bind("#U", "/", MAFTER) < 0)
  50. panic("bind #U: %r");
  51. bind("#A", "/dev", MAFTER);
  52. if(open("/dev/cons", OREAD) != 0)
  53. panic("open0: %r");
  54. if(open("/dev/cons", OWRITE) != 1)
  55. panic("open1: %r");
  56. if(open("/dev/cons", OWRITE) != 2)
  57. panic("open2: %r");
  58. cpumain(argc, argv);
  59. return 0;
  60. }
  61. char*
  62. getkey(char *user, char *dom)
  63. {
  64. char buf[1024];
  65. snprint(buf, sizeof buf, "%s@%s password", user, dom);
  66. return readcons(buf, nil, 1);
  67. }
  68. char*
  69. findkey(char **puser, char *dom)
  70. {
  71. char buf[1024], *f[50], *p, *ep, *nextp, *pass, *user;
  72. int nf, haveproto, havedom, i;
  73. for(p=secstorebuf; *p; p=nextp){
  74. nextp = strchr(p, '\n');
  75. if(nextp == nil){
  76. ep = p+strlen(p);
  77. nextp = "";
  78. }else{
  79. ep = nextp++;
  80. }
  81. if(ep-p >= sizeof buf){
  82. print("warning: skipping long line in secstore factotum file\n");
  83. continue;
  84. }
  85. memmove(buf, p, ep-p);
  86. buf[ep-p] = 0;
  87. nf = tokenize(buf, f, nelem(f));
  88. if(nf == 0 || strcmp(f[0], "key") != 0)
  89. continue;
  90. pass = nil;
  91. haveproto = havedom = 0;
  92. user = nil;
  93. for(i=1; i<nf; i++){
  94. if(strncmp(f[i], "user=", 5) == 0)
  95. user = f[i]+5;
  96. if(strncmp(f[i], "!password=", 10) == 0)
  97. pass = f[i]+10;
  98. if(strncmp(f[i], "dom=", 4) == 0 && strcmp(f[i]+4, dom) == 0)
  99. havedom = 1;
  100. if(strcmp(f[i], "proto=p9sk1") == 0)
  101. haveproto = 1;
  102. }
  103. if(!haveproto || !havedom || !pass || !user)
  104. continue;
  105. *puser = strdup(user);
  106. pass = strdup(pass);
  107. memset(buf, 0, sizeof buf);
  108. return pass;
  109. }
  110. return nil;
  111. }