Skip to content
Snippets Groups Projects
Commit 86433ba8 authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Simplify fmutex_open() signature even more, add fmutex_init()

Can't used designated initializers in fmutex_init() because this file is still
built with C++Builder6.
parent 44ce881b
No related branches found
No related tags found
No related merge requests found
...@@ -2166,7 +2166,7 @@ static void ctrl_thread(void* arg) ...@@ -2166,7 +2166,7 @@ static void ctrl_thread(void* arg)
int curdir=-1; int curdir=-1;
int orglib; int orglib;
int orgdir; int orgdir;
fmutex_t mutex_file = {.fd = -1}; fmutex_t mutex_file = fmutex_init();
long filepos=0L; long filepos=0L;
long timeleft; long timeleft;
ulong l; ulong l;
...@@ -2605,11 +2605,10 @@ static void ctrl_thread(void* arg) ...@@ -2605,11 +2605,10 @@ static void ctrl_thread(void* arg)
} }
if(user.rest & FLAG('Q')) { // QWKnet accont if(user.rest & FLAG('Q')) { // QWKnet accont
char mutex_fname[MAX_PATH + 1]; snprintf(mutex_file.name, sizeof mutex_file.name, "%suser/%04u.ftp", scfg.data_dir, user.number);
snprintf(mutex_fname, sizeof mutex_fname, "%suser/%04u.ftp", scfg.data_dir, user.number); if(!fmutex_open(&mutex_file, startup->host_name, /* max_age: */60 * 60)) {
if(!fmutex_open(mutex_fname, startup->host_name, /* max_age: */60 * 60, &mutex_file)) {
lprintf(LOG_NOTICE, "%04d <%s> QWKnet account already logged-in to FTP server: %s (since %s)" lprintf(LOG_NOTICE, "%04d <%s> QWKnet account already logged-in to FTP server: %s (since %s)"
,sock, user.alias, mutex_fname, time_as_hhmm(&scfg, mutex_file.time, str)); ,sock, user.alias, mutex_file.name, time_as_hhmm(&scfg, mutex_file.time, str));
sockprintf(sock, sess, "421 QWKnet accounts are limited to one concurrent FTP session"); sockprintf(sock, sess, "421 QWKnet accounts are limited to one concurrent FTP session");
user.number = 0; user.number = 0;
break; break;
......
...@@ -2918,11 +2918,11 @@ void event_thread(void* arg) ...@@ -2918,11 +2918,11 @@ void event_thread(void* arg)
sbbs->useron.number = atoi(fname+offset); sbbs->useron.number = atoi(fname+offset);
getuserdat(&sbbs->cfg,&sbbs->useron); getuserdat(&sbbs->cfg,&sbbs->useron);
if(sbbs->useron.number != 0 && !(sbbs->useron.misc&(DELETED|INACTIVE))) { if(sbbs->useron.number != 0 && !(sbbs->useron.misc&(DELETED|INACTIVE))) {
SAFEPRINTF(lockfname,"%s.lock",fname);
fmutex_t lockfile; fmutex_t lockfile;
if(!fmutex_open(lockfname, startup->host_name, TIMEOUT_MUTEX_FILE, &lockfile)) { SAFEPRINTF(lockfile.name,"%s.lock",fname);
if(!fmutex_open(&lockfile, startup->host_name, TIMEOUT_MUTEX_FILE)) {
if(difftime(time(NULL), lockfile.time) > 60) if(difftime(time(NULL), lockfile.time) > 60)
sbbs->lprintf(LOG_INFO," %s exists (unpack in progress?) since %s", lockfname, time_as_hhmm(&sbbs->cfg, lockfile.time, str)); sbbs->lprintf(LOG_INFO," %s exists (unpack in progress?) since %s", lockfile.name, time_as_hhmm(&sbbs->cfg, lockfile.time, str));
continue; continue;
} }
sbbs->lprintf(LOG_DEBUG, "Opened %s", lockfname); sbbs->lprintf(LOG_DEBUG, "Opened %s", lockfname);
...@@ -2986,11 +2986,11 @@ void event_thread(void* arg) ...@@ -2986,11 +2986,11 @@ void event_thread(void* arg)
sbbs->fremove(WHERE, fname, /* log-all-errors: */true); sbbs->fremove(WHERE, fname, /* log-all-errors: */true);
continue; continue;
} }
SAFEPRINTF2(lockfname,"%spack%04u.lock",sbbs->cfg.data_dir,usernum);
fmutex_t lockfile; fmutex_t lockfile;
if(!fmutex_open(lockfname, startup->host_name, TIMEOUT_MUTEX_FILE, &lockfile)) { SAFEPRINTF2(lockfile.name,"%spack%04u.lock",sbbs->cfg.data_dir,usernum);
if(!fmutex_open(&lockfile, startup->host_name, TIMEOUT_MUTEX_FILE)) {
if(difftime(time(NULL), lockfile.time) > 60) if(difftime(time(NULL), lockfile.time) > 60)
sbbs->lprintf(LOG_INFO,"%s exists (pack in progress?) since %s", lockfname, time_as_hhmm(&sbbs->cfg, lockfile.time, str)); sbbs->lprintf(LOG_INFO,"%s exists (pack in progress?) since %s", lockfile.name, time_as_hhmm(&sbbs->cfg, lockfile.time, str));
continue; continue;
} }
sbbs->lprintf(LOG_DEBUG, "Opened %s", lockfname); sbbs->lprintf(LOG_DEBUG, "Opened %s", lockfname);
......
...@@ -112,9 +112,17 @@ bool ftouch(const char* fname) ...@@ -112,9 +112,17 @@ bool ftouch(const char* fname)
return true; return true;
} }
fmutex_t fmutex_init(void)
{
fmutex_t fm = { 0 };
fm.fd = -1;
fm.time = -1;
return fm;
}
// Opens a mutex file (implementation) // Opens a mutex file (implementation)
static static
bool _fmutex_open(const char* fname, const char* text, long max_age, bool auto_remove, fmutex_t* fm) bool _fmutex_open(fmutex_t* fm, const char* text, long max_age, bool auto_remove)
{ {
size_t len; size_t len;
#if !defined(NO_SOCKET_SUPPORT) #if !defined(NO_SOCKET_SUPPORT)
...@@ -127,20 +135,16 @@ bool _fmutex_open(const char* fname, const char* text, long max_age, bool auto_r ...@@ -127,20 +135,16 @@ bool _fmutex_open(const char* fname, const char* text, long max_age, bool auto_r
if(fm == NULL) if(fm == NULL)
return false; return false;
memset(fm, 0, sizeof *fm);
fm->fd = -1; fm->fd = -1;
snprintf(fm->name, sizeof fm->name, fname); fm->time = fdate(fm->name);
if(max_age > 0) {
fm->time = fdate(fname);
if(max_age > 0 && fm->time != -1 && (time(NULL) - fm->time) > max_age) { if(max_age > 0 && fm->time != -1 && (time(NULL) - fm->time) > max_age) {
if(remove(fname) != 0) if(remove(fm->name) != 0)
return false; return false;
} }
}
#if defined _WIN32 #if defined _WIN32
if(auto_remove) if(auto_remove)
attributes |= FILE_FLAG_DELETE_ON_CLOSE; attributes |= FILE_FLAG_DELETE_ON_CLOSE;
h = CreateFileA(fname, h = CreateFileA(fm->name,
GENERIC_WRITE, // dwDesiredAccess GENERIC_WRITE, // dwDesiredAccess
0, // dwShareMode (deny all) 0, // dwShareMode (deny all)
NULL, // lpSecurityAttributes, NULL, // lpSecurityAttributes,
...@@ -173,9 +177,9 @@ bool _fmutex_open(const char* fname, const char* text, long max_age, bool auto_r ...@@ -173,9 +177,9 @@ bool _fmutex_open(const char* fname, const char* text, long max_age, bool auto_r
} }
// Opens a mutex file (public API: always auto-removes upon close) // Opens a mutex file (public API: always auto-removes upon close)
bool fmutex_open(const char* fname, const char* text, long max_age, fmutex_t* fm) bool fmutex_open(fmutex_t* fm, const char* text, long max_age)
{ {
return _fmutex_open(fname, text, max_age, /* auto-remove: */true, fm); return _fmutex_open(fm, text, max_age, /* auto-remove: */true);
} }
bool fmutex_close(fmutex_t* fm) bool fmutex_close(fmutex_t* fm)
...@@ -185,6 +189,7 @@ bool fmutex_close(fmutex_t* fm) ...@@ -185,6 +189,7 @@ bool fmutex_close(fmutex_t* fm)
if(fm->fd < 0) // already closed (or never opened) if(fm->fd < 0) // already closed (or never opened)
return true; return true;
#if !defined _WIN32 // should only be necessary (and possible) on *nix #if !defined _WIN32 // should only be necessary (and possible) on *nix
// We remove before close to insure the file we remove is the file we opened
if(unlink(fm->name) != 0) if(unlink(fm->name) != 0)
return false; return false;
#endif #endif
...@@ -199,7 +204,8 @@ bool fmutex(const char* fname, const char* text, long max_age, time_t* tp) ...@@ -199,7 +204,8 @@ bool fmutex(const char* fname, const char* text, long max_age, time_t* tp)
{ {
fmutex_t fm; fmutex_t fm;
if(!_fmutex_open(fname, text, max_age, /* auto_remove: */false, &fm)) { SAFECOPY(fm.name, fname);
if(!_fmutex_open(&fm, text, max_age, /* auto_remove: */false)) {
if(tp != NULL) if(tp != NULL)
*tp = fm.time; *tp = fm.time;
return false; return false;
......
...@@ -44,7 +44,8 @@ int nopen(const char* str, uint access); ...@@ -44,7 +44,8 @@ int nopen(const char* str, uint access);
FILE * fnopen(int* file, const char* str, uint access); FILE * fnopen(int* file, const char* str, uint access);
bool ftouch(const char* fname); bool ftouch(const char* fname);
bool fmutex(const char* fname, const char* text, long max_age, time_t*); bool fmutex(const char* fname, const char* text, long max_age, time_t*);
bool fmutex_open(const char* fname, const char* text, long max_age, fmutex_t*); fmutex_t fmutex_init(void);
bool fmutex_open(fmutex_t*, const char* text, long max_age);
bool fmutex_close(fmutex_t*); bool fmutex_close(fmutex_t*);
bool fcompare(const char* fn1, const char* fn2); bool fcompare(const char* fn1, const char* fn2);
bool backup(const char* org, int backup_level, bool ren); bool backup(const char* org, int backup_level, bool ren);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment