void start(code *c, int pc, var *local) { struct thread *p = new(struct thread); p->code = codecopy(c); p->pc = pc; p->argv = 0; p->redir = p->startredir = runq?runq->redir:0; p->local = local; p->cmdfile = 0; p->cmdfd = 0; p->eof = 0; p->iflag = 0; p->lineno = 1; p->ret = runq; runq = p; }
void Xfn(void) { var *v; word *a; int end; end = runq->code[runq->pc].i; for(a = runq->argv->words;a;a = a->next){ v = gvlook(a->word); if(v->fn) codefree(v->fn); v->fn = codecopy(runq->code); v->pc = runq->pc+2; v->fnchanged = 1; } runq->pc = end; poplist(); }
int listen_for_code(void){ int sockfd, new_sockfd, port=PORT, yes=1, recvlength=1; socklen_t sin_size; char buffer[TRANSMISSION_SIZE]; struct sockaddr_in srv_addr, cli_addr; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) fatal("in socket"); if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) fatal("setting socket option SO_REUSEADDR"); srv_addr.sin_family = AF_INET; // host byte order srv_addr.sin_port = htons(port); // short, network byte order srv_addr.sin_addr.s_addr = 0; // automatically fill with my ip address memset(&(srv_addr.sin_zero), '\0', 8); // zero out the rest of the struct if (bind(sockfd, (struct sockaddr *)&srv_addr, sizeof(struct sockaddr)) == -1) fatal("binding to socket"); if (listen(sockfd, 5) == -1) fatal("listening on socket"); /** * Main loop **/ unsigned char *codebuffer; unsigned char *result; char *sexp; int codelength, actual_sexp_length; codebuffer = malloc(MAX_CODE_SIZE); result = malloc(SYSREG_BYTES); sexp = malloc(SEXP_LENGTH); while (1) { sin_size = sizeof(struct sockaddr_in); if ((new_sockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &sin_size)) == -1) fatal("accepting connection"); printf("SERVER: ACCEPTED CONNECTION FROM %s PORT %d\n", inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port)); //send(new_sockfd, "Hello, world!\n\r", 13, 0); // just for testing recvlength = recv(new_sockfd, &buffer, TRANSMISSION_SIZE, 0); /** * Clean the buffers **/ memset(codebuffer, 0, MAX_CODE_SIZE); memset(result, 0, SYSREG_BYTES); memset(sexp, 0, SEXP_LENGTH); codelength = 0; while (recvlength > 0) { printf("RECV: %d bytes\n", recvlength); if (DUMP) fdump(stdout, buffer, recvlength); // memcpy(codebuffer+codelength, buffer, recvlength); codelength = codecopy(codebuffer, buffer, codelength, recvlength); // codelength += recvlength; printf("code length = %d\n", codelength); if (READY(codelength)){ hatch_code(codebuffer, NULL, result); actual_sexp_length = lisp_encode(result, sexp); send(new_sockfd, sexp, actual_sexp_length, 0); break; } else { recvlength = recv(new_sockfd, &buffer, TRANSMISSION_SIZE, 0); } } close(new_sockfd); } free(codebuffer); free(result); free(sexp); }