int read_and_exec(int socket) { struct buf_t* buf = buf_new(8049); int pos = buf_readuntil(socket, buf, '\n'); if (pos == -2) return 0; char* buffer = buf->data; buffer[pos] = '\0'; struct execargs_t* arguments[1024]; int k = 0; while (1) { char delim; int argc = count_words(buffer, '|'); if (argc == 0) break; char* argv[argc]; int shift; int i = 0; for (i = 0; i < argc; i++) { delim = '|'; argv[i] = get_word(buffer, &delim, &shift); buffer += shift; } arguments[k] = (struct execargs_t*) malloc(sizeof(struct execargs_t)); *arguments[k] = new_args(argc, argv); shift = get_delim(buffer, '|'); buffer+=shift; k++; } buf->size -= (buffer - (char*) buf->data + 1); runpiped(arguments, k, socket); buf_free(buf); return 0; }
// requires: exp be a c string, with no // spaces and only valid characters. int rpn(char *exp, int size) { if (size == 1) { return 0; } else { if (check_constraints(exp, size)) { printf("%s\n", exp); printf("Constraints not met\n"); return 1; } int delim_loc = get_delim(exp, size); char delim = exp[delim_loc]; exp[delim_loc] = '\0'; exp[size - 1] = '\0'; char *left, *right; left = exp + 1; right = exp + delim_loc + 1; if (rpn(left, strlen(left)) || rpn(right, strlen(right))) { return 1; } merge(exp, left, right, delim); return 0; } }
int get_line(char **lineptr,size_t *n,FILE *fp) { return (get_delim(lineptr,n,'\n',fp)); }