_envsetup.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include "lib.h"
  2. #include <stdlib.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <dirent.h>
  6. #include <unistd.h>
  7. #include <string.h>
  8. #include <signal.h>
  9. #include "sys9.h"
  10. #include "dir.h"
  11. /*
  12. * Called before main to initialize environ.
  13. * Some plan9 environment variables
  14. * have 0 bytes in them (notably $path);
  15. * we change them to 1's (and execve changes back)
  16. *
  17. * Also, register the note handler.
  18. */
  19. char **environ;
  20. int errno;
  21. unsigned long _clock;
  22. static char name[NAME_MAX+5] = "#e";
  23. static void fdsetup(char *, char *);
  24. static void sigsetup(char *, char *);
  25. enum {
  26. Envhunk=7000,
  27. };
  28. void
  29. _envsetup(void)
  30. {
  31. int dfd;
  32. struct dirent *de;
  33. int n, nd, m, i, j, f;
  34. int psize, cnt;
  35. int nohandle;
  36. int fdinited;
  37. char *ps, *p;
  38. char **pp;
  39. Dir *d9, *d9a;
  40. nohandle = 0;
  41. fdinited = 0;
  42. cnt = 0;
  43. dfd = _OPEN(name, 0);
  44. if(dfd < 0) {
  45. static char **emptyenvp = 0;
  46. environ = emptyenvp;
  47. return;
  48. }
  49. name[2] = '/';
  50. ps = p = malloc(Envhunk);
  51. psize = Envhunk;
  52. nd = _dirreadall(dfd, &d9a);
  53. _CLOSE(dfd);
  54. for(j=0; j<nd; j++){
  55. d9 = &d9a[j];
  56. n = strlen(d9->name);
  57. m = d9->length;
  58. i = p - ps;
  59. if(i+n+1+m+1 > psize) {
  60. psize += (n+m+2 < Envhunk)? Envhunk : n+m+2;
  61. ps = realloc(ps, psize);
  62. p = ps + i;
  63. }
  64. memcpy(p, d9->name, n);
  65. p[n] = '=';
  66. strcpy(name+3, d9->name);
  67. f = _OPEN(name, O_RDONLY);
  68. if(f < 0 || _READ(f, p+n+1, m) != m)
  69. m = 0;
  70. _CLOSE(f);
  71. if(p[n+m] == 0)
  72. m--;
  73. for(i=0; i<m; i++)
  74. if(p[n+1+i] == 0)
  75. p[n+1+i] = 1;
  76. p[n+1+m] = 0;
  77. if(strcmp(d9->name, "_fdinfo") == 0) {
  78. _fdinit(p+n+1, p+n+1+m);
  79. fdinited = 1;
  80. } else if(strcmp(d9->name, "_sighdlr") == 0)
  81. sigsetup(p+n+1, p+n+1+m);
  82. else if(strcmp(d9->name, "nohandle") == 0)
  83. nohandle = 1;
  84. p += n+m+2;
  85. cnt++;
  86. }
  87. free(d9a);
  88. if(!fdinited)
  89. _fdinit(0, 0);
  90. environ = pp = malloc((1+cnt)*sizeof(char *));
  91. p = ps;
  92. for(i = 0; i < cnt; i++) {
  93. *pp++ = p;
  94. p = memchr(p, 0, ps+psize-p);
  95. if (!p)
  96. break;
  97. p++;
  98. }
  99. *pp = 0;
  100. if(!nohandle)
  101. _NOTIFY(_notehandler);
  102. }
  103. static void
  104. sigsetup(char *s, char *se)
  105. {
  106. int i, sig;
  107. char *e;
  108. while(s < se){
  109. sig = strtoul(s, &e, 10);
  110. if(s == e)
  111. break;
  112. s = e;
  113. if(sig <= MAXSIG)
  114. _sighdlr[sig] = SIG_IGN;
  115. }
  116. }