Hi, Attached to this mail you'll find an extension for neon to support ranged PUTs. Yuri Vasilevski wrote this patch for the webdav filesystem wdfs [1] maintained by myself. I've integrated it into wdfs and it's working like a charm. :D You can find it in the SVN [2].
As ranged PUTs are on the todo list of the neon project, you might be interested in including it into neon. Kind regards, Jens [1] http://noedler.de/projekte/wdfs/ [2] http://svn.projectai.org/svn/projects_private/wdfs/trunk/ -- jens m. noedler [EMAIL PROTECTED] pgp: 0x9f0920bb http://noedler.de
#include <sys/stat.h> #include <errno.h> #include "ne_put_range.h" #ifdef NE_LFS #define ne_fstat fstat64 typedef struct stat64 struct_stat; #else #define ne_fstat fstat typedef struct stat struct_stat; #endif /* PUT's from fd to URI */ int ne_put_range( ne_session *sess, const char *uri, ne_content_range *range, int fd) { ne_request *req; struct_stat st; int ret; char crange[64]; if (ne_fstat(fd, &st)) { int errnum = errno; char buf[200]; ne_set_error(sess, "Could not determine file size: %s", ne_strerror(errnum, buf, sizeof buf)); return NE_ERROR; } req = ne_request_create(sess, "PUT", uri); ne_snprintf(crange, sizeof crange, "bytes %ld-%ld/%ld", (long int)range->start, (long int)range->end, (long int)range->total); ne_add_request_header(req, "Content-Range", crange); #ifdef NE_HAVE_DAV ne_lock_using_resource(req, uri, 0); ne_lock_using_parent(req, uri); #endif #ifdef NE_LFS ne_set_request_body_fd64(req, fd, 0, st.st_size); #else ne_set_request_body_fd(req, fd, 0, st.st_size); #endif ret = ne_request_dispatch(req); if (ret == NE_OK && ne_get_status(req)->klass != 2) ret = NE_ERROR; ne_request_destroy(req); return ret; } #ifdef NE_LFS /* PUT's from fd to URI */ int ne_put_range64( ne_session *sess, const char *uri, ne_content_range64 *range, int fd) { ne_request *req; struct_stat st; int ret; char crange[64]; if (ne_fstat(fd, &st)) { int errnum = errno; char buf[200]; ne_set_error(sess, "Could not determine file size: %s", ne_strerror(errnum, buf, sizeof buf)); return NE_ERROR; } req = ne_request_create(sess, "PUT", uri); ne_snprintf(crange, sizeof crange, "bytes %lld-%lld/%lld", (long long int)range->start, (long long int)range->end, (long long int)range->total); ne_add_request_header(req, "Content-Range", crange); #ifdef NE_HAVE_DAV ne_lock_using_resource(req, uri, 0); ne_lock_using_parent(req, uri); #endif #ifdef NE_LFS ne_set_request_body_fd64(req, fd, 0, st.st_size); #else ne_set_request_body_fd(req, fd, 0, st.st_size); #endif ret = ne_request_dispatch(req); if (ret == NE_OK && ne_get_status(req)->klass != 2) ret = NE_ERROR; ne_request_destroy(req); return ret; } #endif
#ifndef NEPUTRANGE_H_ #define NEPUTRANGE_H_ #include <ne_basic.h> #include "ne_get_range.h" /* PUT's from fd to URI */ int ne_put_range(ne_session *sess, const char *uri, ne_content_range *range, int fd); #ifdef NE_LFS int ne_put_range64(ne_session *sess, const char *uri, ne_content_range64 *range, int fd); #endif #endif /*NEPUTRANGE_H_*/
_______________________________________________ neon mailing list neon@webdav.org http://mailman.webdav.org/mailman/listinfo/neon