void CtdlPutRoomLock(struct ctdlroom *qrbuf);
typedef void (*ForEachRoomCallBack)(struct ctdlroom *EachRoom, void *out_data);
void CtdlForEachRoom(ForEachRoomCallBack CB, void *in_data);
-typedef void (*ForEachRoomNetCfgCallBack)(struct ctdlroom *EachRoom, void *out_data, const OneRoomNetCfg *OneRNCFG);
+typedef void (*ForEachRoomNetCfgCallBack)(struct ctdlroom *EachRoom, void *out_data, OneRoomNetCfg *OneRNCFG);
void CtdlForEachNetCfgRoom(ForEachRoomNetCfgCallBack CB,
void *in_data,
RoomNetCfg filter);
+void SaveChangedConfigs(void);
void CtdlDeleteRoom(struct ctdlroom *qrbuf);
int CtdlRenameRoom(char *old_name, char *new_name, int new_floor);
void DeleteGenericCfgLine(const CfgLineType *ThisOne, RoomNetCfgLine **data);
RoomNetCfgLine *DuplicateOneGenericCfgLine(const RoomNetCfgLine *data);
-const OneRoomNetCfg* CtdlGetNetCfgForRoom(long QRNumber);
+OneRoomNetCfg* CtdlGetNetCfgForRoom(long QRNumber);
typedef struct _nodeconf {
int DeleteMe;
SpoolControl sc;
int i;
+ memset(&sc, 0, sizeof(SpoolControl));
+ sc.RNCfg = room_to_spool->OneRNCfg;
+ sc.lastsent = room_to_spool->OneRNCfg->lastsent;
+ sc.working_ignetcfg = working_ignetcfg;
+ sc.the_netmap = the_netmap;
+
if ((sc.RNCfg->NetConfigs[listrecp] == NULL) &&
(sc.RNCfg->NetConfigs[digestrecp] == NULL) &&
(sc.RNCfg->NetConfigs[participate] == NULL) &&
syslog(LOG_INFO, "Networking started for <%s>\n", CCC->room.QRname);
- sc.RNCfg = room_to_spool->OneRNCfg;
- sc.lastsent = room_to_spool->OneRNCfg->lastsent;
- sc.working_ignetcfg = working_ignetcfg;
- sc.the_netmap = the_netmap;
/* If there are digest recipients, we have to build a digest */
if (sc.RNCfg->NetConfigs[digestrecp] != NULL) {
}
}
-RoomProcList *CreateRoomProcListEntry(struct ctdlroom *qrbuf, const OneRoomNetCfg *OneRNCFG)
+RoomProcList *CreateRoomProcListEntry(struct ctdlroom *qrbuf, OneRoomNetCfg *OneRNCFG)
{
int i;
struct RoomProcList *ptr;
/*
* Batch up and send all outbound traffic from the current room
*/
-void network_queue_interesting_rooms(struct ctdlroom *qrbuf, void *data, const OneRoomNetCfg *OneRNCfg)
+void network_queue_interesting_rooms(struct ctdlroom *qrbuf, void *data, OneRoomNetCfg *OneRNCfg)
{
struct RoomProcList *ptr;
roomlists *RP = (roomlists*) data;
int network_room_handler (struct ctdlroom *qrbuf)
{
struct RoomProcList *ptr;
- const OneRoomNetCfg* RNCfg;
+ OneRoomNetCfg* RNCfg;
if (qrbuf->QRdefaultview == VIEW_QUEUE)
return 1;
last_run = time(NULL);
}
destroy_network_queue_room(RL.rplist);
+ SaveChangedConfigs();
+
}
/*
* Scan a room's netconfig to determine whether it requires POP3 aggregation
*/
-void pop3client_scan_room(struct ctdlroom *qrbuf, void *data, const OneRoomNetCfg *OneRNCFG)
+void pop3client_scan_room(struct ctdlroom *qrbuf, void *data, OneRoomNetCfg *OneRNCFG)
{
const RoomNetCfgLine *pLine;
void *vptr;
/*
* Scan a room's netconfig to determine whether it is requesting any RSS feeds
*/
-void rssclient_scan_room(struct ctdlroom *qrbuf, void *data, const OneRoomNetCfg *OneRNCFG)
+void rssclient_scan_room(struct ctdlroom *qrbuf, void *data, OneRoomNetCfg *OneRNCFG)
{
const RoomNetCfgLine *pLine;
rss_room_counter *Count = NULL;
int SaveRoomNetConfigFile(OneRoomNetCfg *OneRNCFG, char *filename)
{
RoomNetCfg eCfg;
- StrBuf *Cfg;
+ StrBuf *Cfg = NULL;
+ StrBuf *OutBuffer = NULL;
char tempfilename[PATH_MAX];
int TmpFD;
long len;
time_t unixtime;
struct timeval tv;
long reltid; /* if we don't have SYS_gettid, use "random" value */
- StrBuf *OutBuffer;
int rc;
HashPos *CfgIt;
len = strlen(filename);
memcpy(tempfilename, filename, len + 1);
-#if defined(HAVE_SYONERNCFGALL_H) && defined (SYS_gettid)
- reltid = syOneRNCFGall(SYS_gettid);
+#if defined(HAVE_SYSCALL_H) && defined (SYS_gettid)
+ reltid = syscall(SYS_gettid);
#endif
gettimeofday(&tv, NULL);
/* Promote to time_t; types differ on some OSes (like darwin) */
syslog(LOG_CRIT, "ERROR: cannot open %s: %s\n",
filename, strerror(errno));
unlink(tempfilename);
+ FreeStrBuf(&Cfg);
return 0;
}
else {
+ OutBuffer = NewStrBuf();
CfgIt = GetNewHashPos(CfgTypeHash, 1);
fchown(TmpFD, config.c_ctdluid, 0);
for (eCfg = subpending; eCfg < maxRoomNetCfg; eCfg ++)
}
rc = write(TmpFD, ChrPtr(OutBuffer), StrLength(OutBuffer));
- if ((rc >=0 ) && (rc == StrLength(Cfg)))
+ if ((rc >=0 ) && (rc == StrLength(OutBuffer)))
{
close(TmpFD);
+ unlink(filename);
rename(tempfilename, filename);
rc = 1;
}
FreeStrBuf(&OutBuffer);
}
+ FreeStrBuf(&Cfg);
return rc;
}
+void SaveModifiedRooms(struct ctdlroom *qrbuf, void *data, OneRoomNetCfg *OneRNCfg)
+{
+ char filename[PATH_MAX];
+
+ if (OneRNCfg->changed)
+ {
+ assoc_file_name(filename, sizeof filename, qrbuf, ctdl_netcfg_dir);
+ SaveRoomNetConfigFile(OneRNCfg, filename);
+ OneRNCfg->changed = 0;
+ }
+}
+void SaveChangedConfigs(void)
+{
+ CtdlForEachNetCfgRoom(SaveModifiedRooms,
+ NULL,
+ maxRoomNetCfg);
+}
+
void vFreeRoomNetworkStruct(void *vOneRoomNetCfg)
{
*pOneRNCFG=NULL;
}
-const OneRoomNetCfg* CtdlGetNetCfgForRoom(long QRNumber)
+OneRoomNetCfg* CtdlGetNetCfgForRoom(long QRNumber)
{
void *pv;
GetHash(RoomConfigs, LKEY(QRNumber), &pv);
room_sanity_check(&qrbuf);
if (qrbuf.QRflags & QR_INUSE)
{
- const OneRoomNetCfg* RNCfg;
+ OneRoomNetCfg* RNCfg;
RNCfg = CtdlGetNetCfgForRoom(qrbuf.QRnumber);
if ((RNCfg != NULL) &&
((filter == maxRoomNetCfg) ||