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