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

Reply via email to