Пример #1
0
/*
 * add_variable -- add variable to current session
 *
 *	if all OK returns 0, otherwise it returns a 
 *	negative number that tells you where it got
 *	lost.
 */
int add_variables(int sessionid, char *pbuf)
{
	char *vp;
	char *dec_p;	// decoded array
	struct vp_offer *ofp;
	int n_vars;	// retrieved number of variable, value pairs
	int e_vars;	// estimated number according to buffer size
			// (includes __END__ pair, so
			// its one item bigger than the actual number
	int rval;

	while (*pbuf == ' ' || *pbuf == '\n' || *pbuf == '\t')
		pbuf++;

	if ((rval = kn_decode_hex(pbuf, &dec_p)) < 0) {
		fprintf(stderr, "add_variables: kn_decode_hex(%d), "
		    "returned %d, error %d.\n",  strlen(pbuf), rval, keynote_errno);
		fprintf(stderr, "buffer: <<<%s>>>\n", pbuf);
		return(-1);
	}
	if (dec_p == NULL) {
		fprintf(stderr, "process_offer: kn_decode_hex returned NULL ???\n");
		return(-2);
	}

	if ((e_vars =  strlen(pbuf)/2) % sizeof(struct vp_offer) != 0)
		fprintf(stderr, "warning: len (%d) not a multiple of vp_offer"
		    "(%d)\n\tbuf = <<%s>>\n", e_vars, sizeof(struct vp_offer), dec_p);
	e_vars = e_vars/sizeof(struct vp_offer);        // est. number of variables

	for (ofp = (struct vp_offer *)dec_p, n_vars = 0;
	    strncmp(ENDOFLIST, ofp->o_nam,  strlen(ENDOFLIST)) != 0; ofp++, n_vars++) {
		if (n_vars >= e_vars) {
			fprintf(stderr, "process_offer: too many variables\n");
			break;
		}
		printf("\t%s = \"%s\"\n", ofp->o_nam, ofp->o_val);
		if (kn_add_action(sessionid, ofp->o_nam, ofp->o_val, 0) == -1)
		{
			switch (keynote_errno)
			{
			    case ERROR_SYNTAX:
				fprintf(stderr, "Invalid name action attribute name "
					"[%s]\n", ofp->o_nam);
				break;

			    case ERROR_MEMORY:
				fprintf(stderr, "Out of mem adding action attribute "
					"[%s = \"%s\"]\n", ofp->o_nam, ofp->o_val);
				break;

			    case ERROR_NOTFOUND:
				fprintf(stderr, "Session %d not found while "
				    "addiing action " "attribute [%s = \"%s\"]\n",
				    sessionid, ofp->o_nam, ofp->o_val);
				break;

			    default:
				fprintf(stderr, "Can't happen error %d while adding"
				    "action attribute [%s = \"%s\"]\n",
				    keynote_errno, ofp->o_nam, ofp->o_val);
				break;
			}
			return(-4);
		}
	}
	return(0);
}
Пример #2
0
/*
 * Simple API for doing a single KeyNote query.
 */
int
kn_query(struct environment *env, char **retvalues, int numval,
	 char **trusted, int *trustedlen, int numtrusted,
	 char **untrusted, int *untrustedlen, int numuntrusted,
	 char **authorizers, int numauthorizers)
{
    struct environment *en;
    int sessid, i, serrno;

    keynote_errno = 0;
    if ((sessid = kn_init()) == -1)
      return -1;

    /* Action set */
    for (en = env; en != (struct environment *) NULL; en = en->env_next)
      if (kn_add_action(sessid, en->env_name, en->env_value,
          en->env_flags) == -1)
      {
	  serrno = keynote_errno;
	  kn_close(sessid);
	  keynote_errno = serrno;
	  return -1;
      }

    /* Locally trusted assertions */
    for (i = 0; i < numtrusted; i++)
      if ((kn_add_assertion(sessid, trusted[i], trustedlen[i],
	  ASSERT_FLAG_LOCAL) == -1) && (keynote_errno == ERROR_MEMORY))
      {
	  serrno = keynote_errno;
	  kn_close(sessid);
	  keynote_errno = serrno;
	  return -1;
      }

    /* Untrusted assertions */
    for (i = 0; i < numuntrusted; i++)
      if ((kn_add_assertion(sessid, untrusted[i], untrustedlen[i], 0) == -1)
	  && (keynote_errno == ERROR_MEMORY))
      {
	  serrno = keynote_errno;
	  kn_close(sessid);
	  keynote_errno = serrno;
	  return -1;
      }

    /* Authorizers */
    for (i = 0; i < numauthorizers; i++)
      if (kn_add_authorizer(sessid, authorizers[i]) == -1)
      {
	  serrno = keynote_errno;
	  kn_close(sessid);
	  keynote_errno = serrno;
	  return -1;
      }

    i = kn_do_query(sessid, retvalues, numval);
    serrno = keynote_errno;
    kn_close(sessid);

    if (serrno)
      keynote_errno = serrno;

    return i;
}