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
[email protected]
http://mailman.webdav.org/mailman/listinfo/neon