experimental cancel of upload

This commit is contained in:
2026-05-18 18:35:59 +03:00
parent 7a9edc9535
commit 111a81618f
4 changed files with 86 additions and 26 deletions
+53 -10
View File
@@ -197,6 +197,7 @@ int file_receive_prepare(session *sess, char *line, server_data_t *s_d) {
sess->file->path = malloc(sizeof(STORAGE_FOLDER) + 2 + 9); sess->file->path = malloc(sizeof(STORAGE_FOLDER) + 2 + 9);
sess->file->permissions = (char)perm; sess->file->permissions = (char)perm;
sess->file->description = NULL; sess->file->description = NULL;
sess->file->package_rest = 0;
strncpy(sess->file->name, name_begin, name_len); strncpy(sess->file->name, name_begin, name_len);
sess->file->name[name_len] = 0; sess->file->name[name_len] = 0;
@@ -286,19 +287,15 @@ void clear_file_from_sess(session *s) {
s->file = NULL; s->file = NULL;
} }
void file_load(session *sess, enum f_actions f_action) { /* download to the client */
int source_d = f_action == F_DOWNLOAD ? sess->fd : sess->sd; void file_download(session *sess) {
int dest_d = f_action == F_DOWNLOAD ? sess->sd : sess->fd; int source_d = sess->fd;
int dest_d = sess->sd;
char buf[INBUFSIZE]; char buf[INBUFSIZE];
int rlen = read(source_d, buf, INBUFSIZE); int rlen = read(source_d, buf, INBUFSIZE);
if (rlen == 0) { if (rlen == 0) {
if (sess->file->rest) { if (sess->file->rest) {
if (f_action == F_DOWNLOAD) {
fprintf(stderr, "Error downloading file %s!\n", sess->file->name); fprintf(stderr, "Error downloading file %s!\n", sess->file->name);
} else {
fprintf(stderr, "Error uploading file %s!\n", sess->file->name);
unlink(sess->file->path); /* remove file */
}
clear_file_from_sess(sess); clear_file_from_sess(sess);
} }
sess->state = OP_WAIT; sess->state = OP_WAIT;
@@ -307,16 +304,62 @@ void file_load(session *sess, enum f_actions f_action) {
write(dest_d, buf, rlen); write(dest_d, buf, rlen);
sess->file->rest -= rlen; sess->file->rest -= rlen;
if (!sess->file->rest) { if (!sess->file->rest) {
if (f_action == F_DOWNLOAD) {
printf("File %s is downloaded from the server\n", sess->file->name); printf("File %s is downloaded from the server\n", sess->file->name);
clear_file_from_sess(sess); clear_file_from_sess(sess);
sess->state = OP_WAIT;
}
}
/* upload to the server */
void file_upload(session *sess) {
int source_d = sess->sd;
int dest_d = sess->fd;
char buf[INBUFSIZE];
int rlen = read(source_d, buf, INBUFSIZE);
if (rlen == 0) {
if (sess->file->rest) {
fprintf(stderr, "Error uploading file %s!\n", sess->file->name);
unlink(sess->file->path); /* remove file */
clear_file_from_sess(sess);
}
sess->state = OP_WAIT;
return;
}
if (sess->file->package_rest < rlen) {
write(dest_d, buf, sess->file->package_rest);
s_file_pd_t *fpd = (s_file_pd_t *)buf + sess->file->package_rest;
switch (fpd->signal) {
case sig_continue:
sess->file->package_rest = fpd->package_size;
rlen -= sizeof(s_file_pd_t);
if (rlen > 0) {
write(dest_d, buf + sizeof(s_file_pd_t), rlen);
}
break;
case sig_cancel:
fprintf(stderr, "Upload of %s is cancelled!\n", sess->file->name);
unlink(sess->file->path); /* remove file */
clear_file_from_sess(sess);
sess->state = OP_WAIT;
return;
case sig_finish:
/* TODO: implement */
case sig_pause:
/* TODO: implement */
break;
}
} else { } else {
write(dest_d, buf, rlen);
}
sess->file->rest -= rlen;
sess->file->package_rest -= rlen;
if (!sess->file->rest) {
printf("File %s is uploaded to the server\n", sess->file->name); printf("File %s is uploaded to the server\n", sess->file->name);
session_send_string(sess, "finished\n"); session_send_string(sess, "finished\n");
if (db_save_file(sess)) { if (db_save_file(sess)) {
clear_file_from_sess(sess); clear_file_from_sess(sess);
} }
}
sess->state = OP_WAIT; sess->state = OP_WAIT;
} }
} }
+8 -4
View File
@@ -5,22 +5,26 @@
#define FILEP_H #define FILEP_H
#include "main.h" #include "main.h"
#include <stdint.h> #include <stdint.h>
void clear_list(fl_t *start);
typedef struct { typedef struct {
int32_t page; int32_t page;
int32_t limit; int32_t limit;
char *name; char *name;
} i_file_list_t; } i_file_list_t;
void file_list(session *, server_data_t *, i_file_list_t *l_args);
int file_send_prepare(session *, char *, server_data_t *);
enum f_actions { enum f_actions {
F_UPLOAD, F_UPLOAD,
F_DOWNLOAD, F_DOWNLOAD,
}; };
void file_load(session *sess, enum f_actions);
void clear_list(fl_t *start);
void file_list(session *, server_data_t *, i_file_list_t *l_args);
int file_send_prepare(session *, char *, server_data_t *);
int file_receive_prepare(session *sess, char *line, server_data_t *s_d); int file_receive_prepare(session *sess, char *line, server_data_t *s_d);
int file_upload_description(session *sess, char *line, server_data_t *s_d); int file_upload_description(session *sess, char *line, server_data_t *s_d);
int file_save_db(session *sess, server_data_t *s_d); int file_save_db(session *sess, server_data_t *s_d);
void clear_file_from_sess(session *); void clear_file_from_sess(session *);
int directory_exists(const char *path); int directory_exists(const char *path);
void file_download(session *sess);
void file_upload(session *sess);
#endif #endif
+13
View File
@@ -54,11 +54,24 @@ typedef struct {
char permissions; char permissions;
size_t size; size_t size;
size_t rest; size_t rest;
size_t package_rest;
int32_t hash; int32_t hash;
int32_t id; int32_t id;
int32_t owner_id; int32_t owner_id;
} s_file_t; } s_file_t;
enum package_signal {
sig_continue,
sig_cancel,
sig_finish,
sig_pause
};
typedef struct {
enum package_signal signal;
size_t package_size;
} s_file_pd_t; /* file package descriptor */
typedef struct fl_t { typedef struct fl_t {
char *name; char *name;
char *description; char *description;
+2 -2
View File
@@ -149,10 +149,10 @@ void perform_session_action(session *sess, char *line, server_data_t *s_d) {
process_client_command(line, sess, s_d); process_client_command(line, sess, s_d);
break; break;
case OP_DOWNLOAD: case OP_DOWNLOAD:
file_load(sess, F_DOWNLOAD); file_download(sess);
break; break;
case OP_UPLOAD: case OP_UPLOAD:
file_load(sess, F_UPLOAD); file_upload(sess);
break; break;
case OP_UPLOAD_DESCRIPTION: case OP_UPLOAD_DESCRIPTION:
res = file_upload_description(sess, line, s_d); res = file_upload_description(sess, line, s_d);