DB: get file list.
This commit is contained in:
@@ -3,6 +3,8 @@
|
|||||||
## Features
|
## Features
|
||||||
|
|
||||||
- [ ] Database integration
|
- [ ] Database integration
|
||||||
|
- [ ] Paging in the file list
|
||||||
|
- [ ] Get files in FS by their hash
|
||||||
- [ ] Registration
|
- [ ] Registration
|
||||||
- [ ] Message to admin
|
- [ ] Message to admin
|
||||||
- [ ] Advanced folder structure for the storage
|
- [ ] Advanced folder structure for the storage
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#include "db.h"
|
#include "db.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
#include <endian.h>
|
||||||
#include <libpq-fe.h>
|
#include <libpq-fe.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@@ -161,39 +162,97 @@ int db_save_file(session *s) {
|
|||||||
|
|
||||||
// }
|
// }
|
||||||
|
|
||||||
int db_get_files(i_get_files_db *arg) {
|
uint64_t db_get_files_data(i_get_files_db *arg, fl_t **fl_start,
|
||||||
const char *paramValues[3];
|
uint64_t *full_count) {
|
||||||
int paramLengths[3];
|
fl_t *fl_current;
|
||||||
int paramFormats[3];
|
char query[512];
|
||||||
int i, j, nFields;
|
char sort_by[16] = "id";
|
||||||
|
char sort_dir[5] = "ASC";
|
||||||
|
const char *paramValues[2];
|
||||||
|
int paramLengths[2];
|
||||||
|
int paramFormats[2];
|
||||||
|
int i;
|
||||||
|
uint64_t count;
|
||||||
|
uint64_t n_limit = htobe64(arg->limit);
|
||||||
|
uint64_t n_offset = htobe64(arg->offset);
|
||||||
|
|
||||||
paramValues[0] = arg->sort_by;
|
switch (arg->sort_by) {
|
||||||
paramValues[1] = (char *)&arg->limit;
|
case NAME:
|
||||||
paramValues[2] = (char *)&arg->offset;
|
strcpy(sort_by, "name");
|
||||||
|
break;
|
||||||
|
case CREATED_AT:
|
||||||
|
strcpy(sort_by, "created_at");
|
||||||
|
break;
|
||||||
|
case USER_ID:
|
||||||
|
strcpy(sort_by, "user_id");
|
||||||
|
break;
|
||||||
|
case ID: // id is by default
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
paramLengths[0] = strlen(arg->sort_by);
|
if (arg->sort_direction == DESC) {
|
||||||
paramLengths[1] = sizeof(arg->limit);
|
strcpy(sort_dir, "DESC");
|
||||||
paramLengths[2] = sizeof(arg->offset);
|
}
|
||||||
|
|
||||||
paramFormats[0] = TEXT;
|
paramValues[0] = (char *)&n_limit;
|
||||||
|
paramValues[1] = (char *)&n_offset;
|
||||||
|
|
||||||
|
paramLengths[0] = sizeof(n_limit);
|
||||||
|
paramLengths[1] = sizeof(n_offset);
|
||||||
|
|
||||||
|
paramFormats[0] = BIN;
|
||||||
paramFormats[1] = BIN;
|
paramFormats[1] = BIN;
|
||||||
paramFormats[2] = BIN;
|
|
||||||
|
|
||||||
res = PQexecParams(conn, "SELECT * FROM files ORDER BY $1 LIMIT $2 OFFSET $3",
|
sprintf(
|
||||||
3, NULL, paramValues, paramLengths, paramFormats, TEXT);
|
query,
|
||||||
|
"SELECT user_id, name, size, description, permissions, hash, username "
|
||||||
|
"FROM files JOIN users ON user_id = users.id "
|
||||||
|
"ORDER BY files.%s %s LIMIT $1 OFFSET $2",
|
||||||
|
sort_by, sort_dir);
|
||||||
|
|
||||||
nFields = PQnfields(res);
|
res = PQexecParams(conn, query, 2, NULL, paramValues, paramLengths,
|
||||||
for (i = 0; i < nFields; i++)
|
paramFormats, TEXT);
|
||||||
printf("%-15s", PQfname(res, i));
|
|
||||||
printf("\n\n");
|
if (PQresultStatus(res) != PGRES_TUPLES_OK && !PQntuples(res))
|
||||||
|
return exit_query_2(0);
|
||||||
|
|
||||||
for (i = 0; i < PQntuples(res); i++) {
|
for (i = 0; i < PQntuples(res); i++) {
|
||||||
for (j = 0; j < nFields; j++)
|
fl_t *l_item = malloc(sizeof(fl_t));
|
||||||
printf("%-15s", PQgetvalue(res, i, j));
|
l_item->next = NULL;
|
||||||
printf("\n");
|
l_item->owner_id = atoi(PQgetvalue(res, i, 0));
|
||||||
|
char *name = PQgetvalue(res, i, 1);
|
||||||
|
l_item->name = malloc(strlen(name) + 1);
|
||||||
|
strcpy(l_item->name, name);
|
||||||
|
l_item->size = atoll(PQgetvalue(res, i, 2));
|
||||||
|
char *description = PQgetvalue(res, i, 3);
|
||||||
|
l_item->description = malloc(strlen(description) + 1);
|
||||||
|
strcpy(l_item->description, description);
|
||||||
|
l_item->permissions = atoi(PQgetvalue(res, i, 4));
|
||||||
|
l_item->hash = atoi(PQgetvalue(res, i, 5));
|
||||||
|
char *owner = PQgetvalue(res, i, 6);
|
||||||
|
l_item->owner = malloc(strlen(owner) + 1);
|
||||||
|
strcpy(l_item->owner, owner);
|
||||||
|
|
||||||
|
if (*fl_start == NULL) {
|
||||||
|
*fl_start = l_item;
|
||||||
|
} else {
|
||||||
|
fl_current->next = l_item;
|
||||||
|
}
|
||||||
|
fl_current = l_item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
count = PQntuples(res);
|
||||||
|
|
||||||
clearRes();
|
clearRes();
|
||||||
|
|
||||||
return 0;
|
res = PQexec(conn, "SELECT COUNT(id) "
|
||||||
|
"FROM files "); // TODO: finish
|
||||||
|
|
||||||
|
if (PQresultStatus(res) != PGRES_TUPLES_OK && !PQntuples(res))
|
||||||
|
return exit_query_2(0);
|
||||||
|
|
||||||
|
*full_count = atoll(PQgetvalue(res, 0, 0));
|
||||||
|
clearRes();
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
#ifndef DB_H
|
||||||
|
#define DB_H
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
@@ -21,15 +23,21 @@ typedef struct {
|
|||||||
int user_id;
|
int user_id;
|
||||||
} i_get_file_db;
|
} i_get_file_db;
|
||||||
|
|
||||||
typedef struct {
|
enum sort_direction { ASC, DESC };
|
||||||
int user_id; // TODO: implement
|
enum sort_by { ID, NAME, CREATED_AT, USER_ID };
|
||||||
char *name; // TODO: implement
|
|
||||||
int limit;
|
|
||||||
int offset;
|
|
||||||
char sort_by[12];
|
|
||||||
} i_get_files_db;
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t user_id; // TODO: implement
|
||||||
|
char name[12]; // TODO: implement
|
||||||
|
uint32_t limit;
|
||||||
|
uint32_t offset;
|
||||||
|
enum sort_by sort_by;
|
||||||
|
enum sort_direction sort_direction;
|
||||||
|
} i_get_files_db;
|
||||||
|
|
||||||
int init_db_connection();
|
int init_db_connection();
|
||||||
int db_user_auth(i_auth_t *credentials, o_auth_t *response);
|
int db_user_auth(i_auth_t *credentials, o_auth_t *response);
|
||||||
int db_save_file(session *s);
|
int db_save_file(session *s);
|
||||||
|
uint64_t db_get_files_data(i_get_files_db *arg, fl_t **fl_start,
|
||||||
|
uint64_t *full_count);
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
client.o: src/client.c src/client.h src/main.h src/file_p.h src/session.h
|
||||||
|
db.o: src/db.c src/db.h src/main.h
|
||||||
|
file_p.o: src/file_p.c src/file_p.h src/main.h src/db.h \
|
||||||
|
src/libs/murmur3/murmur3.h src/session.h
|
||||||
|
main.o: src/main.c src/main.h src/server.h src/db.h
|
||||||
|
server.o: src/server.c src/main.h src/session.h src/user.h
|
||||||
|
session.o: src/session.c src/session.h src/main.h src/client.h src/db.h \
|
||||||
|
src/file_p.h src/user.h
|
||||||
|
user.o: src/user.c src/main.h src/session.h src/db.h
|
||||||
|
|||||||
+73
-90
@@ -1,4 +1,5 @@
|
|||||||
#include "file_p.h"
|
#include "file_p.h"
|
||||||
|
#include "db.h"
|
||||||
#include "libs/murmur3/murmur3.h"
|
#include "libs/murmur3/murmur3.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "session.h"
|
#include "session.h"
|
||||||
@@ -7,6 +8,7 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -23,23 +25,69 @@
|
|||||||
char *extract_second_arg(char *);
|
char *extract_second_arg(char *);
|
||||||
size_t get_file_size(char *, char *);
|
size_t get_file_size(char *, char *);
|
||||||
|
|
||||||
|
void clear_list(fl_t *start) {
|
||||||
|
if (start) {
|
||||||
|
fl_t *curr = start;
|
||||||
|
fl_t *next;
|
||||||
|
do {
|
||||||
|
next = curr->next;
|
||||||
|
free(curr->description);
|
||||||
|
free(curr->name);
|
||||||
|
free(curr->owner);
|
||||||
|
free(curr);
|
||||||
|
} while ((curr = next) != NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void file_list(session *sess, server_data_t *s_d) {
|
void file_list(session *sess, server_data_t *s_d) {
|
||||||
// TODO: change of format (rewrite in C++)
|
|
||||||
char list_end[] = "list_end\n";
|
char list_end[] = "list_end\n";
|
||||||
fl_t *current;
|
fl_t *fl_start, *fl_current;
|
||||||
current = s_d->fl_start;
|
|
||||||
char item_h[256];
|
char item_h[256];
|
||||||
|
i_get_files_db args;
|
||||||
|
uint64_t page = 1;
|
||||||
|
uint64_t full_count, count, pages_count;
|
||||||
|
|
||||||
|
fl_start = NULL;
|
||||||
|
fl_current = NULL;
|
||||||
|
|
||||||
|
if (sess->fl_start) {
|
||||||
|
clear_list(fl_start);
|
||||||
|
sess->fl_start = NULL;
|
||||||
|
sess->fl_current = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
args.limit = 15;
|
||||||
|
args.offset = 15 * (page - 1);
|
||||||
|
args.sort_by = ID;
|
||||||
|
args.sort_direction = ASC;
|
||||||
|
|
||||||
|
count = db_get_files_data(&args, &fl_start, &full_count);
|
||||||
|
char page_info[256];
|
||||||
|
|
||||||
|
pages_count = full_count / 15;
|
||||||
|
if (!pages_count)
|
||||||
|
pages_count = 1;
|
||||||
|
|
||||||
|
sprintf(page_info, "PAGE %lu FROM %lu. COUNT: %lu FROM %lu\n", page,
|
||||||
|
pages_count, count, full_count);
|
||||||
|
|
||||||
|
if (!fl_start)
|
||||||
|
return;
|
||||||
|
|
||||||
|
fl_current = fl_start;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
int n_len = strlen(sess->uname);
|
int n_len = strlen(sess->uname);
|
||||||
if (strncmp(current->owner, sess->uname, n_len) && !current->permissions) {
|
if (strncmp(fl_current->owner, sess->uname, n_len) &&
|
||||||
|
!fl_current->permissions) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
int h_len = sprintf(item_h, "%s %zu %s", current->name, current->size,
|
int h_len = sprintf(item_h, "%s %zu %s", fl_current->name, fl_current->size,
|
||||||
current->owner);
|
fl_current->owner);
|
||||||
int d_len = strlen(current->description);
|
int d_len = strlen(fl_current->description);
|
||||||
int f_len = h_len + d_len + 2;
|
int f_len = h_len + d_len + 2;
|
||||||
char *full_str = malloc(sizeof(char) * f_len);
|
char *full_str = malloc(sizeof(char) * f_len);
|
||||||
sprintf(full_str, "%s %s", item_h, current->description);
|
sprintf(full_str, "%s %s", item_h, fl_current->description);
|
||||||
int i;
|
int i;
|
||||||
for (i = h_len; i < h_len + d_len; i++) {
|
for (i = h_len; i < h_len + d_len; i++) {
|
||||||
if (full_str[i] == '\n') {
|
if (full_str[i] == '\n') {
|
||||||
@@ -48,8 +96,12 @@ void file_list(session *sess, server_data_t *s_d) {
|
|||||||
}
|
}
|
||||||
write(sess->sd, full_str, f_len - 1); // -1 : do not include \0
|
write(sess->sd, full_str, f_len - 1); // -1 : do not include \0
|
||||||
free(full_str);
|
free(full_str);
|
||||||
} while ((current = current->next) != NULL);
|
sess->fl_current = fl_current;
|
||||||
|
} while ((fl_current = fl_current->next) != NULL);
|
||||||
|
|
||||||
|
sess->fl_start = fl_start;
|
||||||
write(sess->sd, list_end, sizeof(list_end));
|
write(sess->sd, list_end, sizeof(list_end));
|
||||||
|
write(sess->sd, page_info, strlen(page_info));
|
||||||
}
|
}
|
||||||
|
|
||||||
int file_send_prepare(session *sess, char *line, server_data_t *s_d) {
|
int file_send_prepare(session *sess, char *line, server_data_t *s_d) {
|
||||||
@@ -76,7 +128,6 @@ int file_send_prepare(session *sess, char *line, server_data_t *s_d) {
|
|||||||
fsize = lseek(file_d, 0, SEEK_END);
|
fsize = lseek(file_d, 0, SEEK_END);
|
||||||
lseek(file_d, 0, SEEK_SET);
|
lseek(file_d, 0, SEEK_SET);
|
||||||
|
|
||||||
sess->file->fd = file_d;
|
|
||||||
sess->file->size = fsize;
|
sess->file->size = fsize;
|
||||||
sess->file->rest = fsize;
|
sess->file->rest = fsize;
|
||||||
sess->file->name = malloc(strlen(fname));
|
sess->file->name = malloc(strlen(fname));
|
||||||
@@ -113,6 +164,7 @@ int file_receive_prepare(session *sess, char *line, server_data_t *s_d) {
|
|||||||
sscanf(line, "file upload \"%s %zd %d", fname, &fsize, &perm);
|
sscanf(line, "file upload \"%s %zd %d", fname, &fsize, &perm);
|
||||||
sess->file = malloc(sizeof(session_file));
|
sess->file = malloc(sizeof(session_file));
|
||||||
sess->file->name = malloc(sizeof(char) * strlen(fname));
|
sess->file->name = malloc(sizeof(char) * strlen(fname));
|
||||||
|
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;
|
||||||
strncpy(sess->file->name, fname, strlen(fname) - 1);
|
strncpy(sess->file->name, fname, strlen(fname) - 1);
|
||||||
@@ -143,12 +195,11 @@ int file_receive_prepare(session *sess, char *line, server_data_t *s_d) {
|
|||||||
int file_d;
|
int file_d;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
MurmurHash3_x86_32(sess->file->name, strlen(sess->file->name),
|
MurmurHash3_x86_32(sess->file->name, strlen(sess->file->name), seed,
|
||||||
seed, &sess->file->hash);
|
&sess->file->hash);
|
||||||
|
|
||||||
extract_names_from_hash(sess->file->hash, hashed_dir_name, hashed_name);
|
extract_names_from_hash(sess->file->hash, hashed_dir_name, hashed_name);
|
||||||
|
|
||||||
sess->file->path = malloc(sizeof(STORAGE_FOLDER) + 2 + 9);
|
|
||||||
sprintf(sess->file->path, "%s/%s/%s", STORAGE_FOLDER, hashed_dir_name,
|
sprintf(sess->file->path, "%s/%s/%s", STORAGE_FOLDER, hashed_dir_name,
|
||||||
hashed_name);
|
hashed_name);
|
||||||
|
|
||||||
@@ -163,8 +214,6 @@ int file_receive_prepare(session *sess, char *line, server_data_t *s_d) {
|
|||||||
if (file_d == -1) {
|
if (file_d == -1) {
|
||||||
if (errno == EEXIST) {
|
if (errno == EEXIST) {
|
||||||
seed++;
|
seed++;
|
||||||
free(sess->file->path);
|
|
||||||
sess->file->path = NULL;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
mes_len = sprintf(mes, "Can't create file with such name: \"%s\"\n",
|
mes_len = sprintf(mes, "Can't create file with such name: \"%s\"\n",
|
||||||
@@ -178,7 +227,7 @@ int file_receive_prepare(session *sess, char *line, server_data_t *s_d) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mes_len = sprintf(mes, "accept");
|
mes_len = sprintf(mes, "accept");
|
||||||
sess->file->fd = file_d;
|
sess->fd = file_d;
|
||||||
sess->file->size = fsize;
|
sess->file->size = fsize;
|
||||||
sess->file->rest = fsize;
|
sess->file->rest = fsize;
|
||||||
write(sd, mes, mes_len);
|
write(sd, mes, mes_len);
|
||||||
@@ -199,16 +248,17 @@ void clear_file_from_sess(session *s) {
|
|||||||
free(sf->description);
|
free(sf->description);
|
||||||
sf->description = NULL;
|
sf->description = NULL;
|
||||||
}
|
}
|
||||||
if (sf->fd > -1) {
|
if (s->fd > -1) {
|
||||||
close(sf->fd);
|
close(s->fd);
|
||||||
|
s->fd = -1;
|
||||||
}
|
}
|
||||||
free(sf);
|
free(sf);
|
||||||
s->file = NULL;
|
s->file = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void file_download_upload(session *sess, enum f_actions f_action) {
|
void file_load(session *sess, enum f_actions f_action) {
|
||||||
int source_d = f_action == F_DOWNLOAD ? sess->file->fd : sess->sd;
|
int source_d = f_action == F_DOWNLOAD ? sess->fd : sess->sd;
|
||||||
int dest_d = f_action == F_DOWNLOAD ? sess->sd : sess->file->fd;
|
int dest_d = f_action == F_DOWNLOAD ? sess->sd : sess->fd;
|
||||||
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) {
|
||||||
@@ -282,77 +332,10 @@ int file_upload_description(session *sess, char *line, server_data_t *s_d) {
|
|||||||
}
|
}
|
||||||
char *desc_end = strstr(line, ":END:");
|
char *desc_end = strstr(line, ":END:");
|
||||||
if (desc_end != NULL) {
|
if (desc_end != NULL) {
|
||||||
sess->file->description[strlen(sess->file->description) - 6] = 0; // cut the :END:
|
sess->file->description[strlen(sess->file->description) - 6] =
|
||||||
|
0; // cut the :END:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
line = NULL;
|
line = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: синхронизовать c C++
|
|
||||||
void get_files_descriptions(server_data_t *s_d) {
|
|
||||||
int fd = open(FILE_DESCRIPTIONS_NAME, O_RDONLY);
|
|
||||||
if (-1 == fd) {
|
|
||||||
perror(FILE_DESCRIPTIONS_NAME);
|
|
||||||
exit(8);
|
|
||||||
}
|
|
||||||
int rlen;
|
|
||||||
|
|
||||||
char buf[INBUFSIZE] = "";
|
|
||||||
chdir(STORAGE_FOLDER);
|
|
||||||
|
|
||||||
while ((rlen = read(fd, buf, FILEBUFSIZE)) > 0) {
|
|
||||||
char *buf_pos = buf;
|
|
||||||
char tmp[256];
|
|
||||||
while (buf_pos[0] != '\0') {
|
|
||||||
fl_t *fl_item = malloc(sizeof(fl_t));
|
|
||||||
fl_item->next = NULL;
|
|
||||||
|
|
||||||
/* file name */
|
|
||||||
sscanf(buf_pos, "%s\n", tmp);
|
|
||||||
buf_pos += strlen(tmp) + 1;
|
|
||||||
fl_item->name = malloc(sizeof(char) * (strlen(tmp) + 1));
|
|
||||||
strcpy(fl_item->name, tmp);
|
|
||||||
|
|
||||||
/* file owner */
|
|
||||||
sscanf(buf_pos, "%s\n", tmp);
|
|
||||||
buf_pos += strlen(tmp) + 1;
|
|
||||||
fl_item->owner = malloc(sizeof(char) * (strlen(tmp) + 1));
|
|
||||||
strcpy(fl_item->owner, tmp);
|
|
||||||
|
|
||||||
/* file permissions */
|
|
||||||
sscanf(buf_pos, "%s\n", tmp);
|
|
||||||
buf_pos += strlen(tmp) + 1;
|
|
||||||
fl_item->permissions = atoi(tmp);
|
|
||||||
|
|
||||||
/* file size */
|
|
||||||
int fd = open(fl_item->name, O_RDONLY);
|
|
||||||
if (-1 == fd) {
|
|
||||||
perror(fl_item->name);
|
|
||||||
free(fl_item->name);
|
|
||||||
free(fl_item->owner);
|
|
||||||
free(fl_item);
|
|
||||||
buf_pos += strstr(buf_pos, ":END:") + 6 - buf_pos;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
fl_item->size = lseek(fd, 0, SEEK_END);
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
/* file description */
|
|
||||||
int d_len = strstr(buf_pos, ":END:\n") - buf_pos;
|
|
||||||
fl_item->description = malloc(d_len + 1);
|
|
||||||
strncpy(fl_item->description, buf_pos, d_len);
|
|
||||||
fl_item->description[d_len] = 0;
|
|
||||||
buf_pos += d_len + 6;
|
|
||||||
if (s_d->fl_start == NULL) {
|
|
||||||
s_d->fl_start = fl_item;
|
|
||||||
s_d->fl_current = fl_item;
|
|
||||||
} else {
|
|
||||||
s_d->fl_current->next = fl_item;
|
|
||||||
s_d->fl_current = fl_item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close(fd);
|
|
||||||
chdir("..");
|
|
||||||
}
|
|
||||||
+3
-2
@@ -1,14 +1,15 @@
|
|||||||
#ifndef FILEP_H
|
#ifndef FILEP_H
|
||||||
#define FILEP_H
|
#define FILEP_H
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
void get_files_descriptions(server_data_t *);
|
void get_files_data(server_data_t *, uint32_t page);
|
||||||
|
void clear_list(fl_t *start);
|
||||||
void file_list(session *, server_data_t *);
|
void file_list(session *, server_data_t *);
|
||||||
int file_send_prepare(session *, char *, server_data_t *);
|
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_download_upload(session *sess, enum f_actions);
|
void file_load(session *sess, enum f_actions);
|
||||||
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);
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "file_p.h"
|
|
||||||
#include "server.h"
|
#include "server.h"
|
||||||
#include "db.h"
|
#include "db.h"
|
||||||
|
|
||||||
@@ -8,10 +7,7 @@ int main(int argc, char *argv[]) {
|
|||||||
server_data_t server_data;
|
server_data_t server_data;
|
||||||
prepare_start(argc, argv);
|
prepare_start(argc, argv);
|
||||||
server_data.welcome_message = get_welcome_mes();
|
server_data.welcome_message = get_welcome_mes();
|
||||||
server_data.fl_start = NULL;
|
|
||||||
server_data.fl_current = NULL;
|
|
||||||
init_db_connection();
|
init_db_connection();
|
||||||
get_files_descriptions(&server_data);
|
|
||||||
server_data.ls = start_server();
|
server_data.ls = start_server();
|
||||||
server_main_loop(&server_data);
|
server_main_loop(&server_data);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
+15
-13
@@ -49,9 +49,19 @@ typedef struct {
|
|||||||
size_t size;
|
size_t size;
|
||||||
size_t rest;
|
size_t rest;
|
||||||
uint32_t hash;
|
uint32_t hash;
|
||||||
int fd;
|
|
||||||
} session_file;
|
} session_file;
|
||||||
|
|
||||||
|
typedef struct fl_t {
|
||||||
|
char *name;
|
||||||
|
char *description;
|
||||||
|
char *owner;
|
||||||
|
char permissions;
|
||||||
|
uint32_t owner_id;
|
||||||
|
uint32_t hash;
|
||||||
|
size_t size;
|
||||||
|
struct fl_t *next;
|
||||||
|
} fl_t;
|
||||||
|
|
||||||
typedef struct session {
|
typedef struct session {
|
||||||
unsigned long from_ip;
|
unsigned long from_ip;
|
||||||
unsigned short from_port;
|
unsigned short from_port;
|
||||||
@@ -62,22 +72,14 @@ typedef struct session {
|
|||||||
char privileges;
|
char privileges;
|
||||||
char *uname;
|
char *uname;
|
||||||
uint32_t uid;
|
uint32_t uid;
|
||||||
|
int fd;
|
||||||
int sd; /* session descriptor */
|
int sd; /* session descriptor */
|
||||||
session_file *file;
|
session_file *file;
|
||||||
} session;
|
|
||||||
|
|
||||||
typedef struct fl_t {
|
|
||||||
char *name;
|
|
||||||
char *description;
|
|
||||||
char *owner;
|
|
||||||
char permissions;
|
|
||||||
size_t size;
|
|
||||||
struct fl_t *next;
|
|
||||||
} fl_t;
|
|
||||||
|
|
||||||
typedef struct server_data_t {
|
|
||||||
fl_t *fl_start;
|
fl_t *fl_start;
|
||||||
fl_t *fl_current;
|
fl_t *fl_current;
|
||||||
|
} session;
|
||||||
|
|
||||||
|
typedef struct server_data_t {
|
||||||
char *welcome_message;
|
char *welcome_message;
|
||||||
int ls;
|
int ls;
|
||||||
} server_data_t;
|
} server_data_t;
|
||||||
|
|||||||
+4
-4
@@ -35,8 +35,8 @@ void server_main_loop(server_data_t *s_d) {
|
|||||||
if (i > maxfd)
|
if (i > maxfd)
|
||||||
maxfd = i;
|
maxfd = i;
|
||||||
/* active uploads/downloads */
|
/* active uploads/downloads */
|
||||||
if (connections[i]->file && connections[i]->file->fd > -1) {
|
if (connections[i]->fd > -1) {
|
||||||
int fd = connections[i]->file->fd;
|
int fd = connections[i]->fd;
|
||||||
FD_SET(fd, &readfds);
|
FD_SET(fd, &readfds);
|
||||||
if (fd > maxfd)
|
if (fd > maxfd)
|
||||||
maxfd = fd;
|
maxfd = fd;
|
||||||
@@ -61,8 +61,8 @@ void server_main_loop(server_data_t *s_d) {
|
|||||||
/* download/upload file */
|
/* download/upload file */
|
||||||
if (connections[i] != NULL && (connections[i]->state == OP_UPLOAD ||
|
if (connections[i] != NULL && (connections[i]->state == OP_UPLOAD ||
|
||||||
connections[i]->state == OP_DOWNLOAD)) {
|
connections[i]->state == OP_DOWNLOAD)) {
|
||||||
if (connections[i]->file && connections[i]->file->fd > -1 &&
|
if (connections[i]->fd > -1 &&
|
||||||
FD_ISSET(connections[i]->file->fd, &readfds)) {
|
FD_ISSET(connections[i]->fd, &readfds)) {
|
||||||
perform_session_action(connections[i], NULL, s_d);
|
perform_session_action(connections[i], NULL, s_d);
|
||||||
}
|
}
|
||||||
} else if (connections[i] != NULL && FD_ISSET(i, &readfds)) {
|
} else if (connections[i] != NULL && FD_ISSET(i, &readfds)) {
|
||||||
|
|||||||
+15
-8
@@ -1,9 +1,9 @@
|
|||||||
#include "session.h"
|
#include "session.h"
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
|
#include "db.h"
|
||||||
#include "file_p.h"
|
#include "file_p.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "user.h"
|
#include "user.h"
|
||||||
#include "db.h"
|
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
@@ -42,7 +42,10 @@ session *make_new_session(int fd, struct sockaddr_in *from, char *wm) {
|
|||||||
sess->reason = NO_REASON;
|
sess->reason = NO_REASON;
|
||||||
sess->uname = NULL;
|
sess->uname = NULL;
|
||||||
sess->sd = fd;
|
sess->sd = fd;
|
||||||
|
sess->fd = -1;
|
||||||
sess->file = NULL;
|
sess->file = NULL;
|
||||||
|
sess->fl_start = NULL;
|
||||||
|
sess->fl_current = NULL;
|
||||||
session_send_string(sess, wm);
|
session_send_string(sess, wm);
|
||||||
session_send_string(sess, "login> ");
|
session_send_string(sess, "login> ");
|
||||||
return sess;
|
return sess;
|
||||||
@@ -112,10 +115,10 @@ int query_extract_from_buf(session *sess, char **output_line) {
|
|||||||
pos++;
|
pos++;
|
||||||
memmove(sess->buf, sess->buf + pos, sess->buf_used);
|
memmove(sess->buf, sess->buf + pos, sess->buf_used);
|
||||||
sess->buf[sess->buf_used] = 0;
|
sess->buf[sess->buf_used] = 0;
|
||||||
if (line[pos-2] == '\r') {
|
if (line[pos - 2] == '\r') {
|
||||||
line[pos-2] = line[pos-1];
|
line[pos - 2] = line[pos - 1];
|
||||||
pos--;
|
pos--;
|
||||||
line[pos-1] = 0;
|
line[pos - 1] = 0;
|
||||||
}
|
}
|
||||||
*output_line = line;
|
*output_line = line;
|
||||||
}
|
}
|
||||||
@@ -124,7 +127,6 @@ int query_extract_from_buf(session *sess, char **output_line) {
|
|||||||
|
|
||||||
void perform_session_action(session *sess, char *line, server_data_t *s_d) {
|
void perform_session_action(session *sess, char *line, server_data_t *s_d) {
|
||||||
int state = sess->state;
|
int state = sess->state;
|
||||||
int priv;
|
|
||||||
int res;
|
int res;
|
||||||
/* while (sess->buf_used) { */
|
/* while (sess->buf_used) { */
|
||||||
switch (state) {
|
switch (state) {
|
||||||
@@ -138,10 +140,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_download_upload(sess, F_DOWNLOAD);
|
file_load(sess, F_DOWNLOAD);
|
||||||
break;
|
break;
|
||||||
case OP_UPLOAD:
|
case OP_UPLOAD:
|
||||||
file_download_upload(sess, F_UPLOAD);
|
file_load(sess, F_UPLOAD);
|
||||||
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);
|
||||||
@@ -161,10 +163,15 @@ void perform_session_action(session *sess, char *line, server_data_t *s_d) {
|
|||||||
|
|
||||||
void close_session(session *connections[], int sd) {
|
void close_session(session *connections[], int sd) {
|
||||||
if (connections[sd] != NULL) {
|
if (connections[sd] != NULL) {
|
||||||
if (connections[sd]->file) clear_file_from_sess(connections[sd]);
|
if (connections[sd]->file != NULL)
|
||||||
|
clear_file_from_sess(connections[sd]);
|
||||||
close(sd);
|
close(sd);
|
||||||
connections[sd]->sd = -1;
|
connections[sd]->sd = -1;
|
||||||
free(connections[sd]->uname);
|
free(connections[sd]->uname);
|
||||||
|
if (connections[sd]->fl_start != NULL) {
|
||||||
|
fl_t *fl_start = connections[sd]->fl_start;
|
||||||
|
clear_list(fl_start);
|
||||||
|
}
|
||||||
free(connections[sd]);
|
free(connections[sd]);
|
||||||
connections[sd] = NULL;
|
connections[sd] = NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user