-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
hi to all.
yes, my hd ran out of space and i loose my users.conf.
as CICQDaemon::SaveUserList don't use the CIniFile to save the users.conf
the user.conf was opened directly for writing damaging the file in this
case.
i rewrote the function using a temporary file, using system calls.
Cheers,
Juan.
-----BEGIN PGP SIGNATURE-----
iD8DBQE9jQ5KUMlRieHkprgRAuVtAJ4oZrCuTAbNXVfbEvN9LNWqKVKQTwCeNL+t
7wNTDj7PZNyOrOD1BBNpLf4=
=DZNz
-----END PGP SIGNATURE-----
Index: src/icqd.cpp
===================================================================
RCS file: /cvsroot/licq/licq/src/icqd.cpp,v
retrieving revision 1.51
diff -u -d -p -r1.51 icqd.cpp
--- src/icqd.cpp 16 Sep 2002 23:24:03 -0000 1.51
+++ src/icqd.cpp 22 Sep 2002 00:14:51 -0000
@@ -761,21 +761,54 @@ unsigned short VersionToUse(unsigned sho
//-----SaveUserList-------------------------------------------------------------
void CICQDaemon::SaveUserList()
{
- char filename[MAX_FILENAME_LEN];
- snprintf(filename, MAX_FILENAME_LEN, "%s/users.conf", BASE_DIR);
- FILE *usersConf = fopen(filename, "w");
+ static const char suffix[] = ".new";
+ static const char file[] = "users.conf";
+
+ size_t len = strlen(BASE_DIR) + sizeof(file) + sizeof(suffix) + 2;
+ char tmpname[len], filename[len], buff[128];
+ int nRet,n,fd;
- fprintf(usersConf, "[users]\nNumOfUsers = %d\n", gUserManager.NumUsers());
+ snprintf(filename, len, "%s/%s", BASE_DIR,file);
+ strcpy(tmpname,filename);
+ strcat(tmpname,suffix);
- unsigned short i = 1;
- FOR_EACH_UIN_START
- {
- fprintf(usersConf, "User%d = %ld\n", i, nUin);
- i++;
- }
- FOR_EACH_UIN_END
+ fd = open(tmpname, O_WRONLY | O_CREAT | O_TRUNC, 00664);
+ if( fd == -1 )
+ { /* avoid popup a msgbox if we are shutting down
+ * (there is a race in qt-gui )
+ */
+ if( !m_bShuttingDown )
+ gLog.Error("%s Failed updating %s: `%s'",L_ERRORxSTR,
+ filename,strerror(errno));
+ return;
+ }
- fclose(usersConf);
+ n = sprintf(buff,"[users]\nNumOfUsers = %d\n", gUserManager.NumUsers());
+ nRet = write(fd, buff, n);
+
+ unsigned short i = 1;
+
+ FOR_EACH_UIN_START
+ {
+ n = sprintf(buff, "User%d = %ld\n", i, nUin);
+ nRet = write(fd,buff,n);
+ if( nRet == -1 )
+ FOR_EACH_UIN_BREAK
+
+ i++;
+ }
+ FOR_EACH_UIN_END
+
+ close(fd);
+
+ if( nRet != -1 )
+ {
+ if( rename(tmpname,filename))
+ unlink(tmpname);
+ }
+ else if( !m_bShuttingDown )
+ gLog.Error("%s Failed updating %s: `%s'",L_WARNxSTR,
+ filename,strerror(errno));
}
void CICQDaemon::SetIgnore(unsigned short n, bool b)