aqhome-cgi: added AQH_ModService_WriteDbFileSafely()

This commit is contained in:
Martin Preuss
2026-08-24 23:32:45 +02:00
parent 515829ef6e
commit 5587dd5abc
2 changed files with 60 additions and 0 deletions

View File

@@ -17,6 +17,7 @@
#include <gwenhywfar/debug.h> #include <gwenhywfar/debug.h>
#include <gwenhywfar/text.h> #include <gwenhywfar/text.h>
#include <gwenhywfar/fslock.h>
#include <string.h> #include <string.h>
#include <ctype.h> #include <ctype.h>
@@ -920,4 +921,61 @@ void AQH_ModService_DenyRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, const AQCGI_
int AQH_ModService_WriteDbFileSafely(GWEN_DB_NODE *db, const char *sFilename)
{
if (db && sFilename && *sFilename) {
GWEN_BUFFER *nbuf;
GWEN_FSLOCK *lck;
GWEN_FSLOCK_RESULT res;
int rv;
nbuf=GWEN_Buffer_new(0, 256, 0, 1);
GWEN_Buffer_AppendString(nbuf, sFilename);
GWEN_Buffer_AppendString(nbuf, ".tmp");
lck=GWEN_FSLock_new(sFilename, GWEN_FSLock_TypeFile);
res=GWEN_FSLock_Lock(lck, GWEN_DB_DEFAULT_LOCK_TIMEOUT, 0);
if (res!=GWEN_FSLock_ResultOk) {
DBG_ERROR(GWEN_LOGDOMAIN, "Could not apply lock to file \"%s\" (%d)", sFilename, res);
GWEN_FSLock_free(lck);
return GWEN_ERROR_IO;
}
rv=GWEN_DB_WriteFile(db, GWEN_Buffer_GetStart(nbuf), GWEN_DB_FLAGS_DEFAULT);
if (rv<0) {
DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
remove(GWEN_Buffer_GetStart(nbuf));
GWEN_FSLock_Unlock(lck);
GWEN_FSLock_free(lck);
GWEN_Buffer_free(nbuf);
return rv;
}
rv=rename(GWEN_Buffer_GetStart(nbuf), sFilename);
if (rv<0) {
DBG_INFO(GWEN_LOGDOMAIN, "here (%d: %s)", errno, strerror(errno));
remove(GWEN_Buffer_GetStart(nbuf));
GWEN_FSLock_Unlock(lck);
GWEN_FSLock_free(lck);
GWEN_Buffer_free(nbuf);
return rv;
}
res=GWEN_FSLock_Unlock(lck);
if (res!=GWEN_FSLock_ResultOk) {
DBG_WARN(GWEN_LOGDOMAIN, "Could not remove lock on file \"%s\" (%d)", sFilename, res);
}
GWEN_FSLock_free(lck);
GWEN_Buffer_free(nbuf);
return 0;
}
else {
DBG_ERROR(GWEN_LOGDOMAIN, "Empty arg(s)");
return GWEN_ERROR_INVALID;
}
}

View File

@@ -97,5 +97,7 @@ void AQH_ModService_Redirect(AQCGI_REQUEST *rq, const char *destLocation);
void AQH_ModService_RedirectWithReferer(AQCGI_REQUEST *rq, const char *destLocation); void AQH_ModService_RedirectWithReferer(AQCGI_REQUEST *rq, const char *destLocation);
void AQH_ModService_DenyRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, const AQCGI_SESSION *session, GWEN_BUFFER *dbuf); void AQH_ModService_DenyRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, const AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
int AQH_ModService_WriteDbFileSafely(GWEN_DB_NODE *db, const char *sFilename);
#endif #endif