コード例 #1
0
ファイル: yp_all.c プロジェクト: ldm5180/openbsd-libc
bool_t
xdr_ypresp_all_seq(XDR *xdrs, u_long *objp)
{
	struct ypresp_all out;
	u_long status;
	char *key, *val;
	int size;
	int done = 0;  /* set to 1 when the user does not want more data */
	bool_t rc = TRUE;  /* FALSE at the end of loop signals failure */

	memset(&out, 0, sizeof out);
	while (rc && !done) {
		rc = FALSE;
		if (!xdr_ypresp_all(xdrs, &out)) {
			*objp = (u_long)YP_YPERR;
			goto fail;
		}
		if (out.more == 0)
			goto fail;
		status = out.ypresp_all_u.val.stat;
		if (status == YP_TRUE) {
			size = out.ypresp_all_u.val.key.keydat_len;
			if ((key = malloc(size + 1)) == NULL) {
				*objp = (u_long)YP_YPERR;
				goto fail;
			}
			(void)memcpy(key, out.ypresp_all_u.val.key.keydat_val,
			    size);
			key[size] = '\0';

			size = out.ypresp_all_u.val.val.valdat_len;
			if ((val = malloc(size + 1)) == NULL) {
				free(key);
				*objp = (u_long)YP_YPERR;
				goto fail;
			}
			(void)memcpy(val, out.ypresp_all_u.val.val.valdat_val,
			    size);
			val[size] = '\0';

			done = (*ypresp_allfn)(status, key,
			    out.ypresp_all_u.val.key.keydat_len, val,
			    out.ypresp_all_u.val.val.valdat_len, ypresp_data);
			free(key);
			free(val);
		} else
			done = 1;
		if (status != YP_NOMORE)
			*objp = status;
		rc = TRUE;
fail:
		xdr_free(xdr_ypresp_all, (char *)&out);
	}
	return rc;
}
コード例 #2
0
ファイル: xdryp.c プロジェクト: ppaeps/freebsd-head
bool_t
xdr_ypresp_all_seq(XDR *xdrs, u_long *objp)
{
	struct ypresp_all out;
	u_long status;
	char *key, *val;
	int r;

	bzero(&out, sizeof out);
	while (1) {
		if (!xdr_ypresp_all(xdrs, &out)) {
			xdr_free((xdrproc_t)xdr_ypresp_all, &out);
			*objp = YP_YPERR;
			return (FALSE);
		}
		if (out.more == 0) {
			xdr_free((xdrproc_t)xdr_ypresp_all, &out);
			*objp = YP_NOMORE;
			return (TRUE);
		}
		status = out.ypresp_all_u.val.stat;
		switch (status) {
		case YP_TRUE:
			key = (char *)malloc(out.ypresp_all_u.val.key.keydat_len + 1);
			bcopy(out.ypresp_all_u.val.key.keydat_val, key,
				out.ypresp_all_u.val.key.keydat_len);
			key[out.ypresp_all_u.val.key.keydat_len] = '\0';
			val = (char *)malloc(out.ypresp_all_u.val.val.valdat_len + 1);
			bcopy(out.ypresp_all_u.val.val.valdat_val, val,
				out.ypresp_all_u.val.val.valdat_len);
			val[out.ypresp_all_u.val.val.valdat_len] = '\0';
			xdr_free((xdrproc_t)xdr_ypresp_all, &out);

			r = (*ypresp_allfn)(status,
				key, out.ypresp_all_u.val.key.keydat_len,
				val, out.ypresp_all_u.val.val.valdat_len,
				ypresp_data);
			*objp = status;
			free(key);
			free(val);
			if (r)
				return (TRUE);
			break;
		case YP_NOMORE:
			xdr_free((xdrproc_t)xdr_ypresp_all, &out);
			*objp = YP_NOMORE;
			return (TRUE);
		default:
			xdr_free((xdrproc_t)xdr_ypresp_all, &out);
			*objp = status;
			return (TRUE);
		}
	}
}
コード例 #3
0
ファイル: ypserv_db.c プロジェクト: ryo/netbsd-src
bool_t
ypdb_xdr_get_all(XDR *xdrs, struct ypreq_nokey *req)
{
	static struct ypresp_all resp;
	DBM *db;
	datum k, v;

	(void)memset(&resp, 0, sizeof(resp));

	/*
	 * open db, and advance past any private keys we may see
	 */
	db = ypdb_open_db(req->domain, req->map,
	    &resp.ypresp_all_u.val.status, NULL);

	if (db == NULL || (int)resp.ypresp_all_u.val.status < 0)
		return (FALSE);

	k = ypdb_firstkey(db);
	while (yp_private(k, FALSE))
		k = ypdb_nextkey(db);

	for (;;) {
		if (k.dptr == NULL)
			break;

		v = ypdb_fetch(db, k);

		if (v.dptr == NULL)
			break;

		resp.more = TRUE;
		resp.ypresp_all_u.val.status = YP_TRUE;
		resp.ypresp_all_u.val.keydat.dptr = k.dptr;
		resp.ypresp_all_u.val.keydat.dsize = k.dsize;
		resp.ypresp_all_u.val.valdat.dptr = v.dptr;
		resp.ypresp_all_u.val.valdat.dsize = v.dsize;

		if (!xdr_ypresp_all(xdrs, &resp)) {
#ifdef DEBUG
			syslog(LOG_DEBUG,
			    "ypdb_xdr_get_all: xdr_ypresp_all failed");
#endif
			return (FALSE);
		}

		/* advance past private keys */
		k = ypdb_nextkey(db);
		while (yp_private(k, FALSE))
			k = ypdb_nextkey(db);
	}

	(void)memset(&resp, 0, sizeof(resp));
	resp.ypresp_all_u.val.status = YP_NOKEY;
	resp.more = FALSE;

	if (!xdr_ypresp_all(xdrs, &resp)) {
#ifdef DEBUG
		syslog(LOG_DEBUG,
		    "ypdb_xdr_get_all: final xdr_ypresp_all failed");
#endif
		return (FALSE);
	}

	if (db != NULL)
		ypdb_close_db(db);

	return (TRUE);
}