#include #include #define BUFSIZ 1500 #define DATSIZ 1420 #define LONGTIMOUT 12000 #define SHORTTIMOUT 5000 static unsigned char op[8], dev[64], htmlname[32]; static int port, csock; typedef struct { char extention[8]; char attr[32]; } table; static table mime[] = { {".jpg", "image/jpeg"}, {".pdf", "application/pdf"}, {".gif", "image/gif"}, {".bmp", "image/bmp"}, {".png", "image/png"}, {".elf", "text/html"}, {".htm", "text/html"}, {".txt", "text/plain"}, {"", "text/html"}, }; void not_found(int sock, char *data, char *ver) { int n; strcpy(data, ver); n = strlen(data); strcpy(data + n, " 404 Not Found\r\n"); n = strlen(data); strcpy(data + n, "Server: MES 2.0\r\n"); n += strlen(data + n); strcpy(data + n, "Content-Length: 46\r\n\r\n"); n += strlen(data + n); strcpy(data + n, "

Not Found!!

"); n += strlen(data + n); tcp_write(sock, data, n); } int parse(int sock, char *data, char *name) { char com[8], ver[16], tmpname[32]; char *ptr1, *ptr2, *p, *opt, *ext, *argv[3]; int i, n, fd, filesize, offset, size, pid, argc, ret; ptr1 = data; ptr2 = strchr(data, ' '); if(ptr2 == 0) return -1; *ptr2 = 0; strcpy(com, ptr1); ptr1 = ptr2 + 1; ptr2 = strchr(ptr1, ' '); if(ptr2 == 0) return -1; *ptr2 = 0; name[0] = 0; if(ptr1[1] == 0 || ptr1[1] == '?') strcpy(name, &htmlname[2]); strncat(name, &ptr1[1], BUFSIZ - 10); if(name[0] == '~') name[0] = '/'; p = strchr(name, '?'); if(p == 0) { opt = &name[strlen(name)]; } else { *p = 0; opt = p + 1; } ptr1 = ptr2 + 1; ptr2 = strchr(ptr1, '\r'); if(ptr2 == 0) return -1; *ptr2 = 0; strcpy(ver, ptr1); ret = 0; if(strcmp(com, "GET") == 0) { tmpname[0] = 0; ext = strchr(name, '.'); if(ext == 0) { not_found(sock, data, ver); return -1; } if(strcmp(ext, ".elf") == 0) { sprintf(tmpname, "/ram0/tmp%d", sock & 0xff); fd = open(tmpname, OptWrite); argc = 2; argv[0] = name; argv[1] = opt; argv[2] = 0; pid = execfd(argc, argv, fd); if(pid == -1) { close(fd); not_found(sock, data, ver); return -1; } wait(pid); close(fd); fd = open(tmpname, OptRead); } else { fd = open(name, OptRead); if(fd == -1) { not_found(sock, data, ver); return -1; } } filesize = GetFileSize(fd); strcpy(data, ver); n = strlen(data); strcpy(data + n, " 200 OK\r\n"); n = strlen(data); strcpy(data + n, "Server: MES 2.0\r\n"); n += strlen(data + n); i = 0; while(mime[i].extention[0] == '.') { if(strcmp(ext, mime[i].extention) == 0) { sprintf(data + n, "Content-Type: %s\r\n", mime[i].attr); n += strlen(data + n); break; } i++; } sprintf(data + n, "Content-Length: %d\r\n\r\n", filesize); n += strlen(data + n); ret = tcp_write(sock, data, n); if(ret == -1) { close(fd); if(tmpname[0] != 0) DeleteFile(tmpname); return -1; } tcp_timeout(sock, SHORTTIMOUT); for(;;) { bzero(data, DATSIZ); n = read(fd, data, DATSIZ); if(n <= 0) { ret = 0; break; } ret = tcp_write(sock, data, n); if(ret == -1) break; } close(fd); if(tmpname[0] != 0) DeleteFile(tmpname); } return ret; } int server(char *filename) { int pid, ret, sock, dsock; char *args[6], numchar[10]; struct sockaddr myaddr, cliaddr; sock = tcp_socket(0); tcp_timeout(sock, LONGTIMOUT); myaddr.sin_port = port; ret = tcp_bind(sock, &myaddr); if(ret == -1) { tcp_free(sock); printf("Already used.\r"); return -1; } tcp_listen(sock, 16); while(1) { dsock = tcp_accept(sock, &cliaddr); if(dsock < 0) continue; args[0] = filename; args[1] = "client"; sprintf(numchar, "p=%d", dsock); args[2] = numchar; args[3] = dev; args[4] = htmlname; args[5] = 0; pid = exec(5, args); } } int client() { char *data, *buffer, *p; int dsock, offset, remain, size, ret; dsock = csock; printf("[Connect %x]\r", dsock); tcp_change_taskid(dsock); data = malloc(BUFSIZ * 2); if(data == 0) { tcp_free(dsock); return -1; } buffer = &data[BUFSIZ]; cd(dev); for(;;) { ret = tcp_timeout(dsock, LONGTIMOUT); if(ret == -1) break; offset = 0; remain = BUFSIZ; do { bzero(buffer, BUFSIZ); size = tcp_read(dsock, buffer, BUFSIZ); if(size <= 0) break; if(remain > 0) memcpy(&data[offset], buffer, (size > remain) ? remain : size); offset += size; remain -= size; p = strrchr(buffer, '\n'); } while(p == 0 || (p[-1] != '\n' && p[-2] != '\n')); if(size <= 0) break; data[offset] = 0; ret = parse(dsock, data, buffer); if(ret == -1) break; } tcp_free(dsock); free(data); printf("[Disconnect %x]\r", dsock); return 0; } int main(int argc, char **argv) { int i; char *filename; strcpy(op, "server"); strcpy(dev, "/ram0/"); strcpy(htmlname, "/=index.htm"); port = 80; for(i = 1;i < argc;i++) { if(argv[i][0] == 'p' && argv[i][1] == '=') { sscanf(&argv[i][2], "%d", &port); } else if(argv[i][0] == '/') { if(argv[i][1] == '=') { strncpy(htmlname, argv[i], 31); } else { strncpy(dev, argv[i], 63); } } else if(strcmp(argv[i], "server") == 0 || strcmp(argv[i], "client") == 0) { strcpy(op, argv[i]); } else { printf("Illegal option error!!\r"); return -1; } } csock = port; if(op[0] == 's') server(argv[0]); else client(); return 0; }