diff --git a/dcapi/local/local_client.c b/dcapi/local/local_client.c index 4b0416fb29..e363bbe022 100644 --- a/dcapi/local/local_client.c +++ b/dcapi/local/local_client.c @@ -13,11 +13,34 @@ #include #include #include +#include +#include +#include +#include +#include #include #include "local_common.h" + +static int _DC_checkpoint_file_requested= 0; +static int _DC_checkpoint_made= 0; + +static char * +_DC_cfg(enum _DC_e_param what) +{ + if (what >= cfg_nuof) + return(NULL); + if (_DC_params[what].lvalue) + return(_DC_params[what].lvalue); + + _DC_params[what].lvalue= DC_getCfgStr(_DC_params[what].name); + if (_DC_params[what].lvalue) + return(_DC_params[what].lvalue); + return(_DC_params[what].def); +} + /******************************************************************** * Common API functions */ @@ -49,11 +72,76 @@ int DC_initClient(void) char *DC_resolveFileName(DC_FileType type, const char *logicalFileName) { + /* init_log calls this fn, so it is not possible to call DC_log + from here */ + /*DC_log(LOG_DEBUG, "DC_resolveFileName(%d,%s)", + type, logicalFileName);*/ + char *cn= _DC_cfg(cfg_checkpoint_file); + if (!strcmp(logicalFileName, DC_CHECKPOINT_FILE)) + { + switch (type) + { + case DC_FILE_IN: + { + /* - param of last DC_checkpointMade() + - filename created by previous run + - NULL otherwise */ + if (_DC_checkpoint_made) + { + char *fn= (char*)malloc(strlen(cn)+100); + sprintf(fn, "%s_finished.txt", cn); + return(fn); + } + else + { + FILE *f; + char *fn= (char*)malloc(strlen(cn)+100); + sprintf(fn, "%s_finished.txt", cn); + if ((f= fopen(fn, "r")) != NULL) + { + fclose(f); + return(fn); + } + else + { + free(fn); + return(NULL); + } + } + break; + } + case DC_FILE_OUT: + { + char *s; + /* new non-existant name */ + if (_DC_checkpoint_file_requested) + { + DC_log(LOG_ERR, "Checkpoint file creation " + "can not be restarted " + "(DC_resolveFileName(" + DC_CHECKPOINT_FILE + ") called twice without calling of " + "DC_checkpointMade())"); + return(NULL); + } + _DC_checkpoint_file_requested= 1; + s= (char*)malloc(strlen(cn)+100); + sprintf(s, "%s_creating.txt", cn); + return(s); + break; + } + default: + return(NULL); + } + } + return(strdup((char*)logicalFileName)); +/* if (!strcmp(logicalFileName, DC_CHECKPOINT_FILE)) { return strdup(CKPT_LABEL); } return strdup(logicalFileName); +*/ } int DC_sendResult(const char *logicalFileName, const char *path, DC_FileMode fileMode) @@ -84,7 +172,23 @@ void DC_destroyClientEvent(DC_ClientEvent *event) void DC_checkpointMade(const char *fileName) { - // Nothing to do with it. + DC_log(LOG_DEBUG, "DC_checkpointMade(%s)", fileName); + _DC_checkpoint_file_requested= 0; + if (fileName) + { + char *cn= _DC_cfg(cfg_checkpoint_file); + char *fn; + fn= (char*)malloc(strlen(cn)+100); + sprintf(fn, "%s_finished.txt", cn); + if (rename(fileName, fn) != 0) + { + DC_log(LOG_ERR, "Renaming %s to %s failed: %s", + fileName, fn, strerror(errno)); + } + else + _DC_checkpoint_made++; + free(fn); + } } void DC_fractionDone(double fraction)