aqhome-cgi: added AQH_ModService_WriteDbFileSafely()
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user