READ3res * xdr_to_READ3res(char *msg, int len, int data_xdr) { READ3res *res = NULL; XDR xdr; if(msg == NULL) return NULL; res = (READ3res *)mem_alloc(sizeof(READ3res)); if(res == NULL) return NULL; xdrmem_create(&xdr, msg, len, XDR_DECODE); if(data_xdr == NFS3_DATA_NO_DEXDR) xdr.x_public = __DISABLE_DATA_DEXDR_INTERNAL; else xdr.x_public = __ENABLE_DATA_DEXDR_INTERNAL; res->READ3res_u.resok.data.data_val = NULL; if(!xdr_READ3res(&xdr, res)) { mem_free(res, sizeof(READ3res)); return NULL; } return res; }
static void read_callback (void *arg, struct nfs_client *client, READ3res *result) { struct http_cache_entry *e = arg; assert( e != NULL); assert (result != NULL); assert (result->status == NFS3_OK); READ3resok *res = &result->READ3res_u.resok; assert(res->count == res->data.data_len); assert (e->hbuff != NULL); assert (e->hbuff->data != NULL ); assert (e->hbuff->len >= e->copied + res->data.data_len); memcpy (e->hbuff->data + e->copied, res->data.data_val, res->data.data_len); e->copied += res->data.data_len; // DEBUGPRINT ("got response of len %d, filesize %lu\n", // res->data.data_len, e->copied); // free arguments xdr_READ3res(&xdr_free, result); if (!res->eof) { // more data to come, read the next chunk err_t err = nfs_read(client, e->file_handle, e->copied, MAX_NFS_READ, read_callback, e); assert(err == ERR_OK); return; } /* This is the end-of-file, so deal with it. */ e->valid = 1; e->loading = 0; decrement_buff_holder_ref (e->hbuff); #ifdef PRELOAD_WEB_CACHE if (!cache_loading_phase) { handle_pending_list (e); /* done! */ return; } /* This is cache loading going on... */ printf("Copied %zu bytes for file [%s] of length: %zu\n", e->copied, e->name, e->hbuff->len); ++cache_loaded_counter; handle_cache_load_done(); #else // PRELOAD_WEB_CACHE handle_pending_list(e); /* done! */ #endif // PRELOAD_WEB_CACHE }
void nfs3_reply(struct xid_map *xm, struct tuple4 *addr, u_char *buf, int len) { XDR xdrs; struct LOOKUP3res lres; struct READ3res rres; switch (xm->proc) { case NFSPROC3_LOOKUP: xdrmem_create(&xdrs, buf, len, XDR_DECODE); memset(&lres, 0, sizeof(lres)); if (xdr_LOOKUP3res(&xdrs, &lres)) { if (lres.status == NFS3_OK) { fh_map_add((char *)xm->data, lres.LOOKUP3res_u.resok.object.data.data_val, lres.LOOKUP3res_u.resok.object.data.data_len); } } xdr_destroy(&xdrs); break; case NFSPROC3_READ: xdrmem_create(&xdrs, buf, len, XDR_DECODE); memset(&rres, 0, sizeof(rres)); if (xdr_READ3res(&xdrs, &rres)) { if (rres.status == NFS3_OK) { nfs_save(addr, (struct myreadargs *)xm->data, rres.READ3res_u.resok.data.data_val, rres.READ3res_u.resok.data.data_len); } } xdr_destroy(&xdrs); break; } }