/* Find all labels. */ void scan_labels() { int addr; char *temp; label_init(); /* zero all labels */ temp = prog; /* save pointer to top of program */ /* if the first bas_token in the file is a label */ get_token(); if(bas_token_type==NUMBER) { strcpy(label_table[0].name,bas_token); label_table[0].p=prog; } find_eol(); do { get_token(); if(bas_token_type==NUMBER) { addr = get_next_label(bas_token); if(addr==-1 || addr==-2) { (addr==-1) ?serror(5):serror(6); } strcpy(label_table[addr].name, bas_token); label_table[addr].p = prog; /* current point in program */ } /* if not on a blank line, find next line */ if(bas_tok!=EOL) find_eol(); } while(bas_tok!=FINISHED); prog = temp; /* restore to original */ }
/* Execute an IF statement. */ void exec_if() { int cond; double x; // char op; // printf("if:ini bas_token=%s \n", bas_token ); get_exp(&x); // get left expression // ORIGINAL /* get_token(); // get the operator if(!strchr("=<>", *bas_token)) { serror(0); // not a legal operator return; } op=*bas_token; get_exp(&y); // get right expression */ // printf("if: bas_token=%s x=%4d \n", bas_token, x ); //NEUMIME = cond = (int) x; //20100422 // cond=int(x); // expresion x gives 1 or 0 // determine the outcome /* cond = 0; switch(op) { case '<': if(x<y) cond=1; break; case '>': if(x>y) cond=1; break; case '=': if(x==y) cond=1; break; } */ if(cond) { /* is true so process target of IF */ get_token(); if(bas_tok!=THEN) { serror(8); return; }/* else program execution starts on next line */ } else find_eol(); /* find start of next line */ }
int list_keys_main (void *parent, char *controller, const char *cgroup, struct ucred p, struct ucred r, struct keys_return_type ***output) { DBusMessage *message; DBusMessageIter iter; int sv[2], ret = -1; uint32_t len; int32_t nrkeys; nih_local char * results = NULL; char *s; int i; *output = NULL; if (memcmp(&p, &r, sizeof(struct ucred)) != 0) { nih_error("%s: proxy != requestor", __func__); return -1; } if (!sane_cgroup(cgroup)) { nih_error("%s: unsafe cgroup", __func__); return -1; } if (!(message = start_dbus_request("ListKeysScm", sv))) { nih_error("%s: error starting dbus request", __func__); return -1; } dbus_message_iter_init_append(message, &iter); if (! dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &controller)) { nih_error("%s: out of memory", __func__); dbus_message_unref(message); goto out; } if (! dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &cgroup)) { nih_error("%s: out of memory", __func__); dbus_message_unref(message); goto out; } if (! dbus_message_iter_append_basic (&iter, DBUS_TYPE_UNIX_FD, &sv[1])) { nih_error("%s: out of memory", __func__); dbus_message_unref(message); goto out; } if (!complete_dbus_request(message, sv, &r, NULL)) { nih_error("%s: error completing dbus request", __func__); goto out; } if (proxyrecv(sv[0], &nrkeys, sizeof(int32_t)) != sizeof(int32_t)) goto out; if (nrkeys == 0) { ret = 0; goto out; } if (nrkeys < 0) { nih_error("%s: Server encountered an error: bad cgroup?", __func__); ret = -1; goto out; } if (proxyrecv(sv[0], &len, sizeof(uint32_t)) != sizeof(uint32_t)) goto out; results = nih_alloc(NULL, len+1); results[len] = '\0'; if (read(sv[0], results, len) != len) { nih_error("%s: Failed getting results from server", __func__); goto out; } *output = NIH_MUST( nih_alloc(parent, sizeof(**output)*(nrkeys+1)) ); memset(*output, 0, (nrkeys + 1) * sizeof(**output)); s = results; for (i=0; i<nrkeys; i++) { struct keys_return_type *tmp; char *s2 = find_eol(s); if (s2 > results + len) goto bad; *s2 = '\0'; (*output)[i] = tmp = NIH_MUST( nih_new(*output, struct keys_return_type) ); tmp->name = NIH_MUST( nih_strdup(tmp, s) ); s = s2 + 1; s2 = find_eol(s); if (s2 > results + len) goto bad; if (sscanf(s, "%u\n", &tmp->uid) != 1) goto bad; s = s2 + 1; s2 = find_eol(s); if (sscanf(s, "%u\n", &tmp->gid) != 1) goto bad; s = s2 + 1; s2 = find_eol(s); if (sscanf(s, "%u\n", &tmp->perms) != 1) goto bad; s = s2 + 1; } ret = nrkeys; out: close(sv[0]); close(sv[1]); return ret; bad: ret = -1; nih_error("%s: corrupted result from cgmanager", __func__); goto out; }
void swAio_handler_stream_get_line(swAio_event *event) { int ret = -1; if (flock(event->fd, LOCK_SH) < 0) { swSysError("flock(%d, LOCK_SH) failed.", event->fd); event->ret = -1; event->error = errno; return; } off_t readpos = event->offset; off_t writepos = (long) event->req; size_t avail = 0; char *eol; char *tmp; char *read_buf = event->buf; int read_n = event->nbytes; while (1) { avail = writepos - readpos; swTraceLog(SW_TRACE_AIO, "readpos=%ld, writepos=%ld", (long)readpos, (long)writepos); if (avail > 0) { tmp = event->buf + readpos; eol = find_eol(tmp, avail); if (eol) { event->buf = tmp; event->ret = (eol - tmp) + 1; readpos += event->ret; goto _return; } else if (readpos == 0) { if (writepos == event->nbytes) { writepos = 0; event->ret = event->nbytes; goto _return; } else { event->flags = SW_AIO_EOF; ((char*) event->buf)[writepos] = '\0'; event->ret = writepos; writepos = 0; goto _return; } } else { memmove(event->buf, event->buf + readpos, avail); writepos = avail; read_buf = event->buf + writepos; read_n = event->nbytes - writepos; readpos = 0; goto _readfile; } } else { _readfile: while (1) { ret = read(event->fd, read_buf, read_n); if (ret < 0 && (errno == EINTR || errno == EAGAIN)) { continue; } break; } if (ret > 0) { writepos += ret; } else if (ret == 0) { event->flags = SW_AIO_EOF; if (writepos > 0) { event->ret = writepos; } else { ((char*) event->buf)[0] = '\0'; event->ret = 0; } readpos = writepos = 0; goto _return; } } } _return: if (flock(event->fd, LOCK_UN) < 0) { swSysError("flock(%d, LOCK_UN) failed.", event->fd); } event->offset = readpos; event->req = (void *) (long) writepos; }