Fixed warnings, handled write errors

This commit is contained in:
Thomas Kolb 2013-08-19 20:28:26 +02:00
parent 1c103e0952
commit b6a76a3d43
2 changed files with 31 additions and 13 deletions

View file

@ -7,7 +7,8 @@ enum ResultCode {
RC_OK = 0, // No problem (so far) RC_OK = 0, // No problem (so far)
RC_EXISTS = 1, // On upload, the file to be uploaded already existed RC_EXISTS = 1, // On upload, the file to be uploaded already existed
RC_OPEN_FAILED = 2, // On upload, opening the file for writing failed RC_OPEN_FAILED = 2, // On upload, opening the file for writing failed
RC_WRONG_TARGET = 3 // On upload, the given URL was not a directory RC_WRONG_TARGET = 3, // On upload, the given URL was not a directory
RC_WRITE_FAILED = 4 // On upload, a write operation to the file failed
}; };
enum RequestType { enum RequestType {
@ -23,6 +24,7 @@ struct ConnectionState {
uint8_t uploadRequest; uint8_t uploadRequest;
FILE *upload_fd; FILE *upload_fd;
char uploadFilename[PATH_MAX];
enum ResultCode result; enum ResultCode result;
enum RequestType requestType; enum RequestType requestType;

View file

@ -231,7 +231,7 @@ int serv_result_page(struct MHD_Connection *connection, struct ConnectionState *
int ret; int ret;
char *message, *title; char *message, *title;
unsigned int resultCode; unsigned int resultCode = MHD_HTTP_OK;
switch(connstate->result) { switch(connstate->result) {
case RC_OK: case RC_OK:
@ -257,6 +257,12 @@ int serv_result_page(struct MHD_Connection *connection, struct ConnectionState *
title = "Target error"; title = "Target error";
resultCode = MHD_HTTP_INTERNAL_SERVER_ERROR; resultCode = MHD_HTTP_INTERNAL_SERVER_ERROR;
break; break;
case RC_WRITE_FAILED:
message = "A write error occurred while storing uploaded data to the file.";
title = "Write error";
resultCode = MHD_HTTP_INTERNAL_SERVER_ERROR;
break;
} }
char *buffer = malloc(strlen(HEADER1 HEADER2 FOOTER) + 1024); char *buffer = malloc(strlen(HEADER1 HEADER2 FOOTER) + 1024);
@ -299,40 +305,50 @@ static int post_processor(void *cls,
if(strcmp("data", key) == 0) { if(strcmp("data", key) == 0) {
if(ci->upload_fd == NULL) { if(ci->upload_fd == NULL) {
// file pointer not allocated yet // file pointer not allocated yet
// determine the path where to store the uploaded file
char uploadFilename[PATH_MAX];
// check if we are storing the new file into a directory
if(!S_ISDIR(ci->targetStat.st_mode)) { if(!S_ISDIR(ci->targetStat.st_mode)) {
LOG(LVL_WARN, "Cannot upload %s: Target path is not an existing directory.", filename); LOG(LVL_WARN, "Cannot upload %s: Target path is not an existing directory.", filename);
ci->result = RC_WRONG_TARGET; ci->result = RC_WRONG_TARGET;
return MHD_NO; return MHD_NO;
} }
strncpy(uploadFilename, ci->localFileName, PATH_MAX); // determine the path where to store the uploaded file
strncat(uploadFilename, "/", PATH_MAX); strncpy(ci->uploadFilename, ci->localFileName, PATH_MAX);
strncat(uploadFilename, filename, PATH_MAX); strcat(ci->uploadFilename, "/");
strncat(ci->uploadFilename, filename, PATH_MAX-strlen(ci->uploadFilename));
// check if the file already exists // check if the file already exists
FILE *tmp = fopen(uploadFilename, "rb"); FILE *tmp = fopen(ci->uploadFilename, "rb");
if(tmp) { if(tmp) {
LOG(LVL_WARN, "Cannot upload to %s: file exists.", uploadFilename); LOG(LVL_WARN, "Cannot upload to %s: file exists.", ci->uploadFilename);
ci->result = RC_EXISTS; ci->result = RC_EXISTS;
fclose(tmp); fclose(tmp);
return MHD_NO; return MHD_NO;
} }
// file does not exist and can therefore be opened for writing // file does not exist and can therefore be opened for writing
ci->upload_fd = fopen(uploadFilename, "wb"); ci->upload_fd = fopen(ci->uploadFilename, "wb");
if(!ci->upload_fd) { if(!ci->upload_fd) {
LOG(LVL_WARN, "Cannot upload to %s: file cannot be created.", uploadFilename); LOG(LVL_WARN, "Cannot upload to %s: file cannot be created.", ci->uploadFilename);
ci->result = RC_OPEN_FAILED; ci->result = RC_OPEN_FAILED;
return MHD_NO; return MHD_NO;
} }
fwrite(data, size, 1, ci->upload_fd); if(0 == fwrite(data, size, 1, ci->upload_fd)) {
LOG(LVL_WARN, "Cannot upload to %s: write operation failed.", ci->uploadFilename);
ci->result = RC_WRITE_FAILED;
return MHD_NO;
}
LOG(LVL_WARN, "Upload to %s started successfully.", ci->uploadFilename);
} else { } else {
// file descriptor is already open // file descriptor is already open
fwrite(data, size, 1, ci->upload_fd); if(0 == fwrite(data, size, 1, ci->upload_fd)) {
LOG(LVL_WARN, "Cannot upload to %s: write operation failed.", ci->uploadFilename);
ci->result = RC_WRITE_FAILED;
return MHD_NO;
}
} }
} }
return MHD_YES; return MHD_YES;