INT64_T cfs_basic_putfile(const char *path, struct link * link, INT64_T length, INT64_T mode, time_t stoptime) { int fd; INT64_T result; mode = 0600 | (mode & 0100); fd = cfs->open(path, O_WRONLY | O_CREAT | O_TRUNC, (int) mode); if(fd >= 0) { char buffer[65536]; INT64_T total = 0; link_putliteral(link, "0\n", stoptime); while(length > 0) { INT64_T ractual, wactual; INT64_T chunk = MIN((int) sizeof(buffer), length); ractual = link_read(link, buffer, chunk, stoptime); if(ractual <= 0) break; wactual = cfs->pwrite(fd, buffer, ractual, total); if(wactual != ractual) { total = -1; break; } total += ractual; length -= ractual; } result = total; if(length != 0) { if(result >= 0) link_soak(link, length - result, stoptime); result = -1; } cfs->close(fd); } else { result = -1; } return result; }
INT64_T chirp_client_flistxattr(struct chirp_client *c, INT64_T fd, char *list, size_t size, time_t stoptime) { INT64_T result = send_command(c, stoptime, "flistxattr %lld\n", fd); if (result < 0) return result; result = get_result(c, stoptime); if (result < 0) return result; if (result > (int) size) { link_soak(c->link, result, stoptime); errno = ERANGE; return result; } if(!link_read(c->link, list, result, stoptime)) { return -1; } return result; }
INT64_T chirp_client_llistxattr(struct chirp_client *c, const char *path, char *list, size_t size, time_t stoptime) { char safepath[CHIRP_LINE_MAX]; url_encode(path, safepath, sizeof(safepath)); INT64_T result = send_command(c, stoptime, "llistxattr %s\n", safepath); if (result < 0) return result; result = get_result(c, stoptime); if (result < 0) return result; if (result > (int) size) { link_soak(c->link, result, stoptime); errno = ERANGE; return result; } if(!link_read(c->link, list, result, stoptime)) { return -1; } return result; }
INT64_T chirp_client_fgetxattr(struct chirp_client *c, INT64_T fd, const char *name, void *data, size_t size, time_t stoptime) { INT64_T result = send_command(c, stoptime, "fgetxattr %lld %s\n", fd, name); if (result < 0) return result; result = get_result(c, stoptime); if (result < 0) { if (errno == EINVAL) errno = ENOATTR; return result; } else if (result > (int) size) { link_soak(c->link, result, stoptime); errno = ERANGE; return result; } if(!link_read(c->link, data, result, stoptime)) { return -1; } return result; }
INT64_T chirp_client_lgetxattr(struct chirp_client *c, const char *path, const char *name, void *data, size_t size, time_t stoptime) { char safepath[CHIRP_LINE_MAX]; url_encode(path, safepath, sizeof(safepath)); INT64_T result = send_command(c, stoptime, "lgetxattr %s %s\n", safepath, name); if (result < 0) return result; result = get_result(c, stoptime); if (result < 0) { if (errno == EINVAL) errno = ENOATTR; return result; } else if (result > (int) size) { link_soak(c->link, result, stoptime); errno = ERANGE; return result; } if(!link_read(c->link, data, result, stoptime)) { return -1; } return result; }