snfs_call_status_t snfs_readdir(snfs_fhandle_t dir, unsigned cmax, snfs_dir_entry_t* list, unsigned* count) { snfs_msg_req_t req; snfs_msg_res_t res; memset(&req,0,sizeof(req)); memset(&res,0,sizeof(res)); // format request req.type = REQ_READDIR; req.body.readdir.dir = dir; req.body.readdir.cmax = cmax; int status = remote_call(&req, sizeof(req.type) + sizeof(req.body.readdir), &res, sizeof(res)); // format response if (status < 0 || res.status != RES_OK) { return STAT_ERROR; } *count = res.body.readdir.count; memcpy(list, res.body.readdir.list, sizeof(snfs_dir_entry_t)*(*count)); return STAT_OK; }
snfs_call_status_t snfs_create(snfs_fhandle_t dir, char* name, snfs_fhandle_t* file) { snfs_msg_req_t req; snfs_msg_res_t res; memset(&req,0,sizeof(req)); memset(&res,0,sizeof(res)); // format request req.type = REQ_CREATE; req.body.create.dir = (snfs_fhandle_t)dir; strcpy(req.body.create.name, name); int status = remote_call(&req, sizeof(req.type) + sizeof(req.body.create), &res, sizeof(res)); // format response if (status < 0 || res.status != RES_OK) { return STAT_ERROR; } *file = res.body.create.file; return STAT_OK; }
snfs_call_status_t snfs_write(snfs_fhandle_t fhandle, unsigned offset, unsigned count, char* buffer, unsigned int* fsize) { snfs_msg_req_t req; snfs_msg_res_t res; memset(&req,0,sizeof(req)); memset(&res,0,sizeof(res)); // format request req.type = REQ_WRITE; req.body.write.fhandle = fhandle; req.body.write.offset = offset; req.body.write.count = count; memcpy(req.body.write.data, buffer, count); int status = remote_call(&req, sizeof(req.type) + sizeof(req.body.write), &res, sizeof(res)); // format response if (status < 0 || res.status != RES_OK) { return STAT_ERROR; } *fsize = res.body.write.fsize; return STAT_OK; }
snfs_call_status_t snfs_read(snfs_fhandle_t fhandle, unsigned offset, unsigned count, char* buffer, int* nread) { snfs_msg_req_t req; snfs_msg_res_t res; memset(&req,0,sizeof(req)); memset(&res,0,sizeof(res)); // format request req.type = REQ_READ; req.body.read.fhandle = fhandle; req.body.read.offset = offset; req.body.read.count = count; int status = remote_call(&req, sizeof(req.type) + sizeof(req.body.read), &res, sizeof(res)); // format response if (status < 0 || res.status != RES_OK) { return STAT_ERROR; } memcpy(buffer, res.body.read.data, count); *nread = res.body.read.nread; return STAT_OK; }
snfs_call_status_t snfs_lookup(char* pathname, snfs_fhandle_t* file, unsigned* fsize) { snfs_msg_req_t req; snfs_msg_res_t res; memset(&req,0,sizeof(req)); memset(&res,0,sizeof(res)); // format request req.type = REQ_LOOKUP; strcpy(req.body.lookup.pname, pathname); int status = remote_call(&req, sizeof(req.type) + sizeof(req.body.lookup), &res, sizeof(res)); // format response if (status < 0 || res.status != RES_OK) { *file = res.body.lookup.file; // myopen() needs this information in case of a wrong pathname return STAT_ERROR; } *file = res.body.lookup.file; *fsize = res.body.lookup.fsize; return STAT_OK; }
inline Activity *activity() { ActivityID *aid = activity_id(); UniqueComponentActivityID ucaid = randr(); Timestamp time_start = randr(); Timestamp time_stop = time_start + randr(); RemoteCallIdentifier *invoker = remote_call_id(); ActivityError error_value = randr(); vector<ActivityID> parents; int num_parents = randr(0, 20); for (int i = 0; i < num_parents; i++) parents.push_back(*activity_id()); vector<Attribute> attributes; int num_attrs = randr(0, 20); for (int i = 0; i < num_attrs; i++) attributes.push_back(*attribute()); vector<RemoteCall> remote_calls; int num_rcs = randr(0, 20); for (int i = 0; i < num_rcs; i++) remote_calls.push_back(*remote_call()); Activity *act = new Activity(ucaid, time_start, time_stop, *aid, parents, attributes, remote_calls, invoker, error_value); return act; }
snfs_call_status_t snfs_ping(char* inmsg, int insize, char* outmsg, int outsize) { snfs_msg_req_t req; snfs_msg_res_t res; memset(&req,0,sizeof(req)); memset(&res,0,sizeof(res)); // format request req.type = REQ_PING; strncpy(req.body.ping.msg,inmsg,insize); int status = remote_call(&req, sizeof(req.type) + sizeof(req.body.ping), &res, sizeof(res)); // format response if (status < 0 || res.status != RES_OK) { return STAT_ERROR; } strncpy(outmsg,res.body.ping.msg,outsize); return STAT_OK; }
snfs_call_status_t snfs_copy(snfs_fhandle_t src_dir, char* src_name, snfs_fhandle_t dst_dir, char* dst_name, snfs_fhandle_t* file) { snfs_msg_req_t req; snfs_msg_res_t res; memset(&req, 0, sizeof(req)); memset(&res, 0, sizeof(res)); //format request req.type = REQ_COPY; req.body.copy.src_dir = src_dir; req.body.copy.dst_dir = dst_dir; strcpy(req.body.copy.src_name, src_name); strcpy(req.body.copy.dst_name, dst_name); int status = remote_call(&req, sizeof(req.type) + sizeof(req.body.copy), &res, sizeof(res)); // format response if (status < 0 || res.status != RES_OK) return STAT_ERROR; *file = res.body.copy.file; return STAT_OK; }
/* TEST */ snfs_call_status_t snfs_remove(snfs_fhandle_t dir, char* name, snfs_fhandle_t* file) { puts("BANZAAAAAAAAAAI"); snfs_msg_req_t req; snfs_msg_res_t res; memset(&req, 0, sizeof(req)); memset(&res, 0, sizeof(res)); // format request req.type = REQ_REMOVE; req.body.remove.dir = dir; strcpy(req.body.remove.name, name); int status = remote_call(&req, sizeof(req.type) + sizeof(req.body.remove), &res, sizeof(res)); // format response if (status < 0 || res.status != RES_OK) { return STAT_ERROR; } *file = res.body.remove.file; return STAT_OK; }
snfs_call_status_t snfs_mkdir(snfs_fhandle_t dir, char* name, snfs_fhandle_t* file) { snfs_msg_req_t req; snfs_msg_res_t res; memset(&req,0,sizeof(req)); memset(&res,0,sizeof(res)); // format request req.type = REQ_MKDIR; req.body.mkdir.dir = dir; strcpy(req.body.mkdir.file, name); int status = remote_call(&req, sizeof(req.type) + sizeof(req.body.mkdir), &res, sizeof(res)); // format response if (status < 0 || res.status != RES_OK) { return STAT_ERROR; } *file = res.body.mkdir.newdirid; return STAT_OK; }