Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 43 additions & 13 deletions src/server/auditserver/ldcs_audit_server_filemngt.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ char *_ldcs_audit_server_cachepath;
static char *normalized_tmpdir;
static char *_ldcs_audit_server_commpath;
extern int spindle_mkdir(char *path);
extern int spindle_mkdir_in_cache(char *path, char *cachepath);

static char *filemngt_normalize_dir(char *dir) {
char *newpath = realpath(dir, NULL);
Expand Down Expand Up @@ -95,6 +96,32 @@ int ldcs_is_a_localfile(ldcs_process_data_t *procdata, char *filename) {


#define MAX_FILENAME_LEN 256
void filemngt_calc_dirname(const char *global_name, char *local_name_result, size_t local_name_result_size)
{
char *lastslash, *endslash;
int starts_with_slash, endslash_position;

lastslash = strrchr(_ldcs_audit_server_cachepath, '/');
if (lastslash && lastslash[1] == '\0')
endslash = "";
else
endslash = "/";

starts_with_slash = (global_name[0] == '/') ? 1 : 0;

snprintf(local_name_result, local_name_result_size, "%s%s%s", _ldcs_audit_server_cachepath, endslash, global_name+starts_with_slash);

//Take out any trailing slashes
endslash = strrchr(local_name_result, '/');
endslash_position = endslash ? (int) (endslash - local_name_result) : 0;
if (endslash_position+1 >= local_name_result_size || endslash[1] == '\0') {
while (*endslash == '/' && endslash != local_name_result) {
*endslash = '\0';
endslash--;
}
}
}

char *filemngt_calc_localname(char *global_name, calc_local_t reqtype)
{
//The naming decisions here need to be cordinated with name parsing in
Expand All @@ -103,16 +130,11 @@ char *filemngt_calc_localname(char *global_name, calc_local_t reqtype)
char target[MAX_PATH_LEN+1];
char dirpart[MAX_PATH_LEN+1];
char filepart[MAX_PATH_LEN+1];
char *endslash, *lastslash;
const char *prefix = NULL;
char *lastslash;
size_t dirpart_size, filepart_size;
int cut_dirpart_slash;

lastslash = strrchr(_ldcs_audit_server_cachepath, '/');
if (lastslash && lastslash[1] == '\0')
endslash = "";
else
endslash = "/";
ssize_t bytes_left;
int result, error;

GCC7_DISABLE_WARNING("-Wformat-truncation");

Expand Down Expand Up @@ -154,12 +176,20 @@ char *filemngt_calc_localname(char *global_name, calc_local_t reqtype)
strncpy(filepart, target, sizeof(filepart));
filepart[sizeof(filepart)-1] = '\0';

cut_dirpart_slash = (dirpart[0] == '/') ? 1 : 0;

snprintf(target, sizeof(target), "%s%s%s", _ldcs_audit_server_cachepath, endslash, dirpart+cut_dirpart_slash);
spindle_mkdir(target);
filemngt_calc_dirname(dirpart, target, sizeof(target));
debug_printf3("Calling spindle_mkdir(%s, %s)\n", target, _ldcs_audit_server_cachepath);
result = spindle_mkdir_in_cache(target, _ldcs_audit_server_cachepath);
if (result == -1) {
error = errno;
err_printf("spindle_mkdir_in_cache(%s, %s) failed with error %s\n", target, _ldcs_audit_server_cachepath, strerror(error));
return NULL;
}
debug_printf3("Calculated local directory name for %s as %s and made directory\n", global_name, target);

snprintf(target, sizeof(target), "%s%s%s/%s", _ldcs_audit_server_cachepath, endslash, dirpart+cut_dirpart_slash, filepart);
bytes_left = sizeof(target) - strlen(target);
strncat(target, "/", --bytes_left);
strncat(target, filepart, bytes_left - strlen(filepart));
target[sizeof(target)-1] = '\0';

GCC7_ENABLE_WARNING;

Expand Down
3 changes: 2 additions & 1 deletion src/server/auditserver/ldcs_audit_server_filemngt.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ typedef struct
size_t extended_stat_size(extended_stat_t *st);

char *filemngt_calc_localname(char *global_name, calc_local_t reqtype);

void filemngt_calc_dirname(const char *global_name, char *local_name_result, size_t local_name_result_size);

int ldcs_audit_server_filemngt_clean();

int filemngt_create_file_space(char *filename, size_t size, void **buffer_out, int *fd_out);
Expand Down
30 changes: 27 additions & 3 deletions src/server/auditserver/ldcs_audit_server_handlers.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ static int handle_send_file_query(ldcs_process_data_t *procdata, char *fullpath,
static int handle_file_recv(ldcs_process_data_t *procdata, ldcs_message_t *msg, node_peer_t peer,
broadcast_t bcast);
static int handle_directory_recv(ldcs_process_data_t *procdata, ldcs_message_t *msg, broadcast_t bcast);
static int handle_process_directory(ldcs_process_data_t *procdata, const char *dirname);
static int handle_alias_recv(ldcs_process_data_t *procdata, ldcs_message_t *msg, broadcast_t bcast);

static int handle_exit_broadcast(ldcs_process_data_t *procdata);
Expand Down Expand Up @@ -631,8 +632,11 @@ static int handle_read_directory(ldcs_process_data_t *procdata, char *dir)
procdata->server_stat.procdir.bytes += rc;
procdata->server_stat.procdir.time += (ldcs_get_time() - starttime);

if (cache_dir_result == LDCS_CACHE_DIR_PARSED_AND_EXISTS ||
cache_dir_result == LDCS_CACHE_DIR_PARSED_AND_NOT_EXISTS) {
if (cache_dir_result == LDCS_CACHE_DIR_PARSED_AND_EXISTS) {
handle_process_directory(procdata, dir);
return 0;
}
if (cache_dir_result == LDCS_CACHE_DIR_PARSED_AND_NOT_EXISTS) {
return 0;
}
else {
Expand Down Expand Up @@ -1665,18 +1669,38 @@ static int handle_file_recv(ldcs_process_data_t *procdata, ldcs_message_t *msg,
return global_error;
}

/**
* We're processing a directory that exists, either from reading it or recv'ing it on the
* network.
**/
extern int spindle_mkdir_in_cache(char *orig_path, char *cachepath);
static int handle_process_directory(ldcs_process_data_t *procdata, const char *dirname)
{
char local_dirname[MAX_PATH_LEN+1];

debug_printf2("Creating directory %s in cache\n", dirname);
filemngt_calc_dirname(dirname, local_dirname, sizeof(local_dirname));
spindle_mkdir_in_cache(local_dirname, procdata->cachepath);
return 0;
}

/**
* We've received a packet with directory info. Process it.
**/
static int handle_directory_recv(ldcs_process_data_t *procdata, ldcs_message_t *msg, broadcast_t bcast)
{
double starttime = ldcs_get_time();
char dirname[MAX_PATH_LEN+1];
int num_entries_in_dir;

debug_printf2("New directory cache entries received from %s\n",
bcast == preload_broadcast ? "preload" : "request");

ldcs_cache_decodeDirContents(msg->data, msg->header.len, dirname, MAX_PATH_LEN);
num_entries_in_dir = ldcs_cache_decodeDirContents(msg->data, msg->header.len, dirname, MAX_PATH_LEN);
debug_printf2("Directory %s has %d entries\n", dirname, num_entries_in_dir);
if (num_entries_in_dir) {
handle_process_directory(procdata, dirname);
}

handle_broadcast_dir(procdata, dirname, bcast);

Expand Down
4 changes: 2 additions & 2 deletions src/server/cache/ldcs_cache.cc
Original file line number Diff line number Diff line change
Expand Up @@ -445,6 +445,7 @@ int ldcs_cache_decodeDirContents(char *buffer, size_t len,
while (pos < len) {
int fn_length;
string filename;
num_entries++;
memcpy(&fn_length, buffer + pos, sizeof(int));
assert(fn_length <= MAX_PATH_LEN+1);
pos += sizeof(int);
Expand All @@ -459,14 +460,13 @@ int ldcs_cache_decodeDirContents(char *buffer, size_t len,
assert(pos <= len);

addFile(dirname, filename);
num_entries++;
}

strncpy(dirbuffer, dirname.c_str(), dirbuffer_sz);
dirbuffer[dirbuffer_sz - 1] = '\0';

debug_printf3("Decoded packet for directory with %d entries: %s\n", num_entries, dirbuffer);
return 0;
return num_entries;
}

void ldcs_cache_addFileDir(char *dname, char *fname)
Expand Down
Loading
Loading