10 #include <sys/socket.h>
12 #include <netinet/in.h>
14 #include <lufs/proto.h>
24 stop_xfer(struct gnet_locator *loc){
25 gnet_xfer_shutdown(loc);
34 find_xfer(struct local_ctx *ctx, char *txt){
37 TRACE("searching xfer(%s)", txt);
39 list_for_each(p, &ctx->opened_files)
40 if(!(strcmp(txt, list_entry(p, struct gnet_locator, list)->name))){
42 return list_entry(p, struct gnet_locator, list);
45 TRACE("xfer not found");
51 create_xfer(struct local_ctx *ctx, char *txt){
52 struct global_ctx *glob = *ctx->global;
53 struct gnet_locator *xfer;
56 struct gnet_locator *loc;
59 TRACE("creating xfer(%s)", txt);
61 if(!(sep = strrchr(txt, '/'))){
62 WARN("no '/' separator found!");
66 if((xfer = find_xfer(ctx, sep + 1))){
67 TRACE("xfer already created");
73 pthread_mutex_lock(&glob->lock);
75 if(!(srch = find_search_by_txt(glob, txt)))
79 if(!(res = find_result_by_name(srch, sep + 1)))
82 if(list_empty(&res->locators)){
83 TRACE("no available locators");
87 loc = list_entry(res->locators.next, struct gnet_locator, list);
90 list_add_tail(&loc->list, &res->locators);
94 if(!(xfer = malloc(sizeof(struct gnet_locator))))
97 memcpy(xfer, loc, sizeof(struct gnet_locator));
99 if(!(xfer->name = malloc(strlen(sep + 1) + 1)))
102 strcpy(xfer->name, sep + 1);
105 pthread_mutex_unlock(&glob->lock);
107 list_add(&xfer->list, &ctx->opened_files);
109 TRACE("xfer created");
117 pthread_mutex_unlock(&glob->lock);
123 xfer_read(struct local_ctx *ctx, char *txt, unsigned int offset, unsigned int count, char *buf){
124 struct gnet_locator *xfer;
126 TRACE("txt: %s", txt);
128 if(!(xfer = create_xfer(ctx, txt))){
129 WARN("could not create xfer");
133 TRACE("reading %d bytes", count);
135 return gnet_xfer_read((*ctx->global)->gnet, xfer, offset, count, buf);