Exemplo n.º 1
0
/* 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 */
}
Exemplo n.º 2
0
/* 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 */
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
}