ihandlr.c - geomyidae - A small C-based gopherd. Err bitreich.org 70 hgit clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ URL:git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ bitreich.org 70 1Log /scm/geomyidae/log.gph bitreich.org 70 1Files /scm/geomyidae/files.gph bitreich.org 70 1Refs /scm/geomyidae/refs.gph bitreich.org 70 1Tags /scm/geomyidae/tag bitreich.org 70 1README /scm/geomyidae/file/README.gph bitreich.org 70 1LICENSE /scm/geomyidae/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 ihandlr.c (5384B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 /* Err bitreich.org 70 i 2 * Copy me if you can. Err bitreich.org 70 i 3 * by 20h Err bitreich.org 70 i 4 */ Err bitreich.org 70 i 5 Err bitreich.org 70 i 6 #include Err bitreich.org 70 i 7 #include Err bitreich.org 70 i 8 #include Err bitreich.org 70 i 9 #include Err bitreich.org 70 i 10 #include Err bitreich.org 70 i 11 #include Err bitreich.org 70 i 12 #include Err bitreich.org 70 i 13 #include Err bitreich.org 70 i 14 #include Err bitreich.org 70 i 15 #include Err bitreich.org 70 i 16 #include Err bitreich.org 70 i 17 #include Err bitreich.org 70 i 18 #include Err bitreich.org 70 i 19 #include Err bitreich.org 70 i 20 #include Err bitreich.org 70 i 21 Err bitreich.org 70 i 22 #include "ind.h" Err bitreich.org 70 i 23 #include "arg.h" Err bitreich.org 70 i 24 Err bitreich.org 70 i 25 void Err bitreich.org 70 i 26 handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70 i 27 char *sear, char *ohost, char *chost, char *bhost, int istls, Err bitreich.org 70 i 28 char *sel, char *traverse) Err bitreich.org 70 i 29 { Err bitreich.org 70 i 30 char *pa, *file, *e, *par; Err bitreich.org 70 i 31 struct dirent **dirent; Err bitreich.org 70 i 32 int ndir, i, ret = 0; Err bitreich.org 70 i 33 struct stat st; Err bitreich.org 70 i 34 filetype *type; Err bitreich.org 70 i 35 Err bitreich.org 70 i 36 USED(args); Err bitreich.org 70 i 37 USED(sear); Err bitreich.org 70 i 38 USED(bhost); Err bitreich.org 70 i 39 USED(sel); Err bitreich.org 70 i 40 USED(traverse); Err bitreich.org 70 i 41 Err bitreich.org 70 i 42 pa = xstrdup(path); Err bitreich.org 70 i 43 Err bitreich.org 70 i 44 /* Is there any directory below the request? */ Err bitreich.org 70 i 45 if (strlen(pa+strlen(base)) > 1) { Err bitreich.org 70 i 46 par = xstrdup(pa+strlen(base)); Err bitreich.org 70 i 47 e = strrchr(par, '/'); Err bitreich.org 70 i 48 *e = '\0'; Err bitreich.org 70 i 49 dprintf(sock, "1..\t%s\t%s\t%s\r\n", Err bitreich.org 70 i 50 par, ohost, port); Err bitreich.org 70 i 51 free(par); Err bitreich.org 70 i 52 } Err bitreich.org 70 i 53 Err bitreich.org 70 i 54 ndir = scandir(pa, &dirent, 0, alphasort); Err bitreich.org 70 i 55 if (ndir < 0) { Err bitreich.org 70 i 56 perror("scandir"); Err bitreich.org 70 i 57 free(pa); Err bitreich.org 70 i 58 return; Err bitreich.org 70 i 59 } else { Err bitreich.org 70 i 60 for (i = 0; i < ndir && ret >= 0; i++) { Err bitreich.org 70 i 61 if (dirent[i]->d_name[0] == '.') Err bitreich.org 70 i 62 continue; Err bitreich.org 70 i 63 Err bitreich.org 70 i 64 type = gettype(dirent[i]->d_name); Err bitreich.org 70 i 65 Err bitreich.org 70 i 66 file = smprintf("%s%s%s", Err bitreich.org 70 i 67 pa, Err bitreich.org 70 i 68 pa[strlen(pa)-1] == '/'? "" : "/", Err bitreich.org 70 i 69 dirent[i]->d_name); Err bitreich.org 70 i 70 if (stat(file, &st) >= 0 && S_ISDIR(st.st_mode)) Err bitreich.org 70 i 71 type = gettype("index.gph"); Err bitreich.org 70 i 72 ret = dprintf(sock, Err bitreich.org 70 i 73 "%c%-50.50s %10s %16s\t%s\t%s\t%s\r\n", Err bitreich.org 70 i 74 *type->type, Err bitreich.org 70 i 75 dirent[i]->d_name, Err bitreich.org 70 i 76 humansize(st.st_size), Err bitreich.org 70 i 77 humantime(&(st.st_mtime)), Err bitreich.org 70 i 78 file + strlen(base), ohost, port); Err bitreich.org 70 i 79 free(file); Err bitreich.org 70 i 80 } Err bitreich.org 70 i 81 for (i = 0; i < ndir; i++) Err bitreich.org 70 i 82 free(dirent[i]); Err bitreich.org 70 i 83 free(dirent); Err bitreich.org 70 i 84 } Err bitreich.org 70 i 85 dprintf(sock, ".\r\n"); Err bitreich.org 70 i 86 Err bitreich.org 70 i 87 free(pa); Err bitreich.org 70 i 88 } Err bitreich.org 70 i 89 Err bitreich.org 70 i 90 void Err bitreich.org 70 i 91 handlegph(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i 92 char *sear, char *ohost, char *chost, char *bhost, int istls, Err bitreich.org 70 i 93 char *sel, char *traverse) Err bitreich.org 70 i 94 { Err bitreich.org 70 i 95 gphindex *act; Err bitreich.org 70 i 96 int i, ret = 0; Err bitreich.org 70 i 97 Err bitreich.org 70 i 98 USED(args); Err bitreich.org 70 i 99 USED(sear); Err bitreich.org 70 i 100 USED(bhost); Err bitreich.org 70 i 101 USED(sel); Err bitreich.org 70 i 102 USED(traverse); Err bitreich.org 70 i 103 Err bitreich.org 70 i 104 act = gph_scanfile(file); Err bitreich.org 70 i 105 if (act != NULL) { Err bitreich.org 70 i 106 for (i = 0; i < act->num && ret >= 0; i++) Err bitreich.org 70 i 107 ret = gph_printelem(sock, act->n[i], file, base, ohost, port); Err bitreich.org 70 i 108 dprintf(sock, ".\r\n"); Err bitreich.org 70 i 109 Err bitreich.org 70 i 110 for (i = 0; i < act->num; i++) { Err bitreich.org 70 i 111 gph_freeelem(act->n[i]); Err bitreich.org 70 i 112 act->n[i] = NULL; Err bitreich.org 70 i 113 } Err bitreich.org 70 i 114 gph_freeindex(act); Err bitreich.org 70 i 115 } Err bitreich.org 70 i 116 } Err bitreich.org 70 i 117 Err bitreich.org 70 i 118 void Err bitreich.org 70 i 119 handlebin(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i 120 char *sear, char *ohost, char *chost, char *bhost, int istls, Err bitreich.org 70 i 121 char *sel, char *traverse) Err bitreich.org 70 i 122 { Err bitreich.org 70 i 123 int fd; Err bitreich.org 70 i 124 Err bitreich.org 70 i 125 USED(port); Err bitreich.org 70 i 126 USED(base); Err bitreich.org 70 i 127 USED(args); Err bitreich.org 70 i 128 USED(sear); Err bitreich.org 70 i 129 USED(ohost); Err bitreich.org 70 i 130 USED(bhost); Err bitreich.org 70 i 131 USED(sel); Err bitreich.org 70 i 132 USED(traverse); Err bitreich.org 70 i 133 Err bitreich.org 70 i 134 fd = open(file, O_RDONLY); Err bitreich.org 70 i 135 if (fd >= 0) { Err bitreich.org 70 i 136 if (xsendfile(fd, sock) < 0) Err bitreich.org 70 i 137 perror("sendfile"); Err bitreich.org 70 i 138 close(fd); Err bitreich.org 70 i 139 } Err bitreich.org 70 i 140 } Err bitreich.org 70 i 141 Err bitreich.org 70 i 142 void Err bitreich.org 70 i 143 handlecgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i 144 char *sear, char *ohost, char *chost, char *bhost, int istls, Err bitreich.org 70 i 145 char *sel, char *traverse) Err bitreich.org 70 i 146 { Err bitreich.org 70 i 147 char *script, *path, *filec, *scriptc; Err bitreich.org 70 i 148 Err bitreich.org 70 i 149 USED(base); Err bitreich.org 70 i 150 USED(port); Err bitreich.org 70 i 151 Err bitreich.org 70 i 152 filec = xstrdup(file); Err bitreich.org 70 i 153 scriptc = xstrdup(file); Err bitreich.org 70 i 154 path = dirname(filec); Err bitreich.org 70 i 155 script = basename(scriptc); Err bitreich.org 70 i 156 Err bitreich.org 70 i 157 if (sear == NULL) Err bitreich.org 70 i 158 sear = ""; Err bitreich.org 70 i 159 if (args == NULL) Err bitreich.org 70 i 160 args = ""; Err bitreich.org 70 i 161 Err bitreich.org 70 i 162 while (dup2(sock, 0) < 0 && errno == EINTR); Err bitreich.org 70 i 163 while (dup2(sock, 1) < 0 && errno == EINTR); Err bitreich.org 70 i 164 while (dup2(sock, 2) < 0 && errno == EINTR); Err bitreich.org 70 i 165 switch (fork()) { Err bitreich.org 70 i 166 case 0: Err bitreich.org 70 i 167 if (path != NULL) { Err bitreich.org 70 i 168 if (chdir(path) < 0) Err bitreich.org 70 i 169 break; Err bitreich.org 70 i 170 } Err bitreich.org 70 i 171 Err bitreich.org 70 i 172 setcgienviron(script, file, port, base, args, sear, ohost, chost, Err bitreich.org 70 i 173 bhost, istls, sel, traverse); Err bitreich.org 70 i 174 Err bitreich.org 70 i 175 if (execl(file, script, sear, args, ohost, port, traverse, sel, Err bitreich.org 70 i 176 (char *)NULL) == -1) { Err bitreich.org 70 i 177 perror("execl"); Err bitreich.org 70 i 178 _exit(1); Err bitreich.org 70 i 179 } Err bitreich.org 70 i 180 case -1: Err bitreich.org 70 i 181 perror("fork"); Err bitreich.org 70 i 182 break; Err bitreich.org 70 i 183 default: Err bitreich.org 70 i 184 wait(NULL); Err bitreich.org 70 i 185 free(filec); Err bitreich.org 70 i 186 free(scriptc); Err bitreich.org 70 i 187 break; Err bitreich.org 70 i 188 } Err bitreich.org 70 i 189 } Err bitreich.org 70 i 190 Err bitreich.org 70 i 191 void Err bitreich.org 70 i 192 handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i 193 char *sear, char *ohost, char *chost, char *bhost, int istls, Err bitreich.org 70 i 194 char *sel, char *traverse) Err bitreich.org 70 i 195 { Err bitreich.org 70 i 196 FILE *fp; Err bitreich.org 70 i 197 char *script, *path, *filec, *scriptc, *ln = NULL; Err bitreich.org 70 i 198 size_t linesiz = 0; Err bitreich.org 70 i 199 ssize_t n; Err bitreich.org 70 i 200 int outsocks[2], ret = 0; Err bitreich.org 70 i 201 gphelem *el; Err bitreich.org 70 i 202 Err bitreich.org 70 i 203 if (socketpair(AF_LOCAL, SOCK_STREAM, 0, outsocks) < 0) Err bitreich.org 70 i 204 return; Err bitreich.org 70 i 205 Err bitreich.org 70 i 206 filec = xstrdup(file); Err bitreich.org 70 i 207 scriptc = xstrdup(file); Err bitreich.org 70 i 208 path = dirname(filec); Err bitreich.org 70 i 209 script = basename(scriptc); Err bitreich.org 70 i 210 Err bitreich.org 70 i 211 if (sear == NULL) Err bitreich.org 70 i 212 sear = ""; Err bitreich.org 70 i 213 if (args == NULL) Err bitreich.org 70 i 214 args = ""; Err bitreich.org 70 i 215 Err bitreich.org 70 i 216 while (dup2(sock, 0) < 0 && errno == EINTR); Err bitreich.org 70 i 217 while (dup2(sock, 2) < 0 && errno == EINTR); Err bitreich.org 70 i 218 switch (fork()) { Err bitreich.org 70 i 219 case 0: Err bitreich.org 70 i 220 while (dup2(outsocks[1], 1) < 0 && errno == EINTR); Err bitreich.org 70 i 221 close(outsocks[0]); Err bitreich.org 70 i 222 if (path != NULL) { Err bitreich.org 70 i 223 if (chdir(path) < 0) Err bitreich.org 70 i 224 break; Err bitreich.org 70 i 225 } Err bitreich.org 70 i 226 Err bitreich.org 70 i 227 setcgienviron(script, file, port, base, args, sear, ohost, chost, Err bitreich.org 70 i 228 bhost, istls, sel, traverse); Err bitreich.org 70 i 229 Err bitreich.org 70 i 230 if (execl(file, script, sear, args, ohost, port, traverse, sel, Err bitreich.org 70 i 231 (char *)NULL) == -1) { Err bitreich.org 70 i 232 perror("execl"); Err bitreich.org 70 i 233 _exit(1); Err bitreich.org 70 i 234 } Err bitreich.org 70 i 235 break; Err bitreich.org 70 i 236 case -1: Err bitreich.org 70 i 237 perror("fork"); Err bitreich.org 70 i 238 break; Err bitreich.org 70 i 239 default: Err bitreich.org 70 i 240 while (dup2(sock, 1) < 0 && errno == EINTR); Err bitreich.org 70 i 241 close(outsocks[1]); Err bitreich.org 70 i 242 Err bitreich.org 70 i 243 if (!(fp = fdopen(outsocks[0], "r"))) { Err bitreich.org 70 i 244 perror("fdopen"); Err bitreich.org 70 i 245 close(outsocks[0]); Err bitreich.org 70 i 246 break; Err bitreich.org 70 i 247 } Err bitreich.org 70 i 248 Err bitreich.org 70 i 249 while ((n = getline(&ln, &linesiz, fp)) > 0 && ret >= 0) { Err bitreich.org 70 i 250 if (ln[n - 1] == '\n') Err bitreich.org 70 i 251 ln[--n] = '\0'; Err bitreich.org 70 i 252 Err bitreich.org 70 i 253 el = gph_getadv(ln); Err bitreich.org 70 i 254 if (el == NULL) Err bitreich.org 70 i 255 continue; Err bitreich.org 70 i 256 Err bitreich.org 70 i 257 ret = gph_printelem(sock, el, file, base, ohost, port); Err bitreich.org 70 i 258 gph_freeelem(el); Err bitreich.org 70 i 259 } Err bitreich.org 70 i 260 if (ferror(fp)) Err bitreich.org 70 i 261 perror("getline"); Err bitreich.org 70 i 262 dprintf(sock, ".\r\n"); Err bitreich.org 70 i 263 Err bitreich.org 70 i 264 free(ln); Err bitreich.org 70 i 265 fclose(fp); Err bitreich.org 70 i 266 wait(NULL); Err bitreich.org 70 i 267 free(filec); Err bitreich.org 70 i 268 free(scriptc); Err bitreich.org 70 i 269 break; Err bitreich.org 70 i 270 } Err bitreich.org 70 i 271 } Err bitreich.org 70 i 272 Err bitreich.org 70 .