aqhome-cgi: added AQH_ModService_WriteDbFileSafely()
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
|
||||
#include <gwenhywfar/debug.h>
|
||||
#include <gwenhywfar/text.h>
|
||||
#include <gwenhywfar/fslock.h>
|
||||
|
||||
#include <string.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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user