Exemple #1
0
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;
}
Exemple #2
0
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
}
Exemple #3
0
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;
	}
}