|
|
|
@ -2085,6 +2085,7 @@ SUBREQUEST_FUNC(mod_webdav_subrequest_handler_huge) {
|
|
|
|
|
}
|
|
|
|
|
} else if (S_ISDIR(st.st_mode)) {
|
|
|
|
|
int r;
|
|
|
|
|
int created = 0;
|
|
|
|
|
/* src is a directory */
|
|
|
|
|
|
|
|
|
|
if (con->physical.path->ptr[buffer_string_length(con->physical.path)-1] != '/') {
|
|
|
|
@ -2097,6 +2098,7 @@ SUBREQUEST_FUNC(mod_webdav_subrequest_handler_huge) {
|
|
|
|
|
con->http_status = 403;
|
|
|
|
|
return HANDLER_FINISHED;
|
|
|
|
|
}
|
|
|
|
|
created = 1;
|
|
|
|
|
} else if (!S_ISDIR(st.st_mode)) {
|
|
|
|
|
if (overwrite == 0) {
|
|
|
|
|
/* copying into a non-dir ? */
|
|
|
|
@ -2108,6 +2110,7 @@ SUBREQUEST_FUNC(mod_webdav_subrequest_handler_huge) {
|
|
|
|
|
con->http_status = 403;
|
|
|
|
|
return HANDLER_FINISHED;
|
|
|
|
|
}
|
|
|
|
|
created = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2123,11 +2126,12 @@ SUBREQUEST_FUNC(mod_webdav_subrequest_handler_huge) {
|
|
|
|
|
|
|
|
|
|
rmdir(con->physical.path->ptr);
|
|
|
|
|
}
|
|
|
|
|
con->http_status = 201;
|
|
|
|
|
con->http_status = created ? 201 : 204;
|
|
|
|
|
con->file_finished = 1;
|
|
|
|
|
} else {
|
|
|
|
|
/* it is just a file, good */
|
|
|
|
|
int r;
|
|
|
|
|
int destdir = 0;
|
|
|
|
|
|
|
|
|
|
/* does the client have a lock for this connection ? */
|
|
|
|
|
if (!webdav_has_lock(srv, con, p, p->uri.path)) {
|
|
|
|
@ -2140,6 +2144,7 @@ SUBREQUEST_FUNC(mod_webdav_subrequest_handler_huge) {
|
|
|
|
|
if (S_ISDIR(st.st_mode)) {
|
|
|
|
|
/* file to dir/
|
|
|
|
|
* append basename to physical path */
|
|
|
|
|
destdir = 1;
|
|
|
|
|
|
|
|
|
|
if (NULL != (sep = strrchr(con->physical.path->ptr, '/'))) {
|
|
|
|
|
buffer_append_string(p->physical.path, sep);
|
|
|
|
@ -2149,7 +2154,7 @@ SUBREQUEST_FUNC(mod_webdav_subrequest_handler_huge) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (-1 == r) {
|
|
|
|
|
con->http_status = 201; /* we will create a new one */
|
|
|
|
|
con->http_status = destdir ? 204 : 201; /* we will create a new one */
|
|
|
|
|
con->file_finished = 1;
|
|
|
|
|
|
|
|
|
|
switch(errno) {
|
|
|
|
@ -2419,23 +2424,23 @@ propmatch_cleanup:
|
|
|
|
|
hdr_if = ds->value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* we don't support Depth: Infinity on directories */
|
|
|
|
|
if (hdr_if == NULL && depth == -1) {
|
|
|
|
|
if (0 != stat(con->physical.path->ptr, &st)) {
|
|
|
|
|
if (errno == ENOENT) {
|
|
|
|
|
int fd = open(con->physical.path->ptr, O_WRONLY|O_CREAT|O_APPEND|O_BINARY|FIFO_NONBLOCK, WEBDAV_FILE_MODE);
|
|
|
|
|
if (fd >= 0) {
|
|
|
|
|
close(fd);
|
|
|
|
|
created = 1;
|
|
|
|
|
} else {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sBss",
|
|
|
|
|
"create file", con->physical.path, ":", strerror(errno));
|
|
|
|
|
con->http_status = 403; /* Forbidden */
|
|
|
|
|
if (0 != stat(con->physical.path->ptr, &st)) {
|
|
|
|
|
if (errno == ENOENT) {
|
|
|
|
|
int fd = open(con->physical.path->ptr, O_WRONLY|O_CREAT|O_APPEND|O_BINARY|FIFO_NONBLOCK, WEBDAV_FILE_MODE);
|
|
|
|
|
if (fd >= 0) {
|
|
|
|
|
close(fd);
|
|
|
|
|
created = 1;
|
|
|
|
|
} else {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sBss",
|
|
|
|
|
"create file", con->physical.path, ":", strerror(errno));
|
|
|
|
|
con->http_status = 403; /* Forbidden */
|
|
|
|
|
|
|
|
|
|
return HANDLER_FINISHED;
|
|
|
|
|
}
|
|
|
|
|
return HANDLER_FINISHED;
|
|
|
|
|
}
|
|
|
|
|
} else if (S_ISDIR(st.st_mode)) {
|
|
|
|
|
}
|
|
|
|
|
} else if (hdr_if == NULL && depth == -1) {
|
|
|
|
|
/* we don't support Depth: Infinity on directories */
|
|
|
|
|
if (S_ISDIR(st.st_mode)) {
|
|
|
|
|
con->http_status = 409; /* Conflict */
|
|
|
|
|
|
|
|
|
|
return HANDLER_FINISHED;
|
|
|
|
|