/* * 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); }
/* * 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; }