зеркало из https://github.com/mozilla/pjs.git
first insert of mknews (C++ version) into netlib from Nova
This commit is contained in:
Родитель
185e86393f
Коммит
64d899a5db
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,413 @@
|
|||
/* -*- Mode: C; tab-width: 4 -*- */
|
||||
#include "mkutils.h"
|
||||
#include "msgcom.h"
|
||||
#include "xp_reg.h"
|
||||
#include "xp_qsort.h"
|
||||
|
||||
/* UNIX doesn't need this stuff since it uses the file system
|
||||
* to store the mappings as filenames
|
||||
*/
|
||||
|
||||
XP_List *HostMapList=0;
|
||||
Bool NewsrcMapDirty=FALSE;
|
||||
|
||||
typedef struct _NewsrcHostMap {
|
||||
char * filename;
|
||||
char * psuedo_name;
|
||||
Bool is_newsgroups_file; /* This was Bool * */
|
||||
} NewsrcHostMap;
|
||||
|
||||
/* register a newsrc file mapping
|
||||
*/
|
||||
PUBLIC Bool
|
||||
NET_RegisterNewsrcFile(char * filename,
|
||||
char *hostname,
|
||||
Bool bs,
|
||||
Bool is_newsgroups_file)
|
||||
{
|
||||
NewsrcHostMap *host_map_struct = PR_NEW(NewsrcHostMap);
|
||||
XP_List * list_prt;
|
||||
NewsrcHostMap *tmp_host_map_struct;
|
||||
|
||||
if(!host_map_struct)
|
||||
return(FALSE);
|
||||
|
||||
memset(host_map_struct, 0, sizeof(NewsrcHostMap));
|
||||
|
||||
/* you losers, there's no such thing as XP_Assert in xfe!! */
|
||||
assert(filename);
|
||||
assert(hostname);
|
||||
|
||||
if(bs)
|
||||
StrAllocCopy(host_map_struct->psuedo_name, "snewsrc-");
|
||||
else
|
||||
StrAllocCopy(host_map_struct->psuedo_name, "newsrc-");
|
||||
|
||||
StrAllocCat(host_map_struct->psuedo_name, hostname);
|
||||
|
||||
StrAllocCopy(host_map_struct->filename, filename);
|
||||
|
||||
host_map_struct->is_newsgroups_file = is_newsgroups_file;
|
||||
|
||||
if(!HostMapList)
|
||||
HostMapList = XP_ListNew();
|
||||
|
||||
if(!HostMapList)
|
||||
return(FALSE);
|
||||
|
||||
NewsrcMapDirty = TRUE;
|
||||
|
||||
/* search for duplicate mappings */
|
||||
list_prt = HostMapList;
|
||||
while((tmp_host_map_struct = (NewsrcHostMap *)XP_ListNextObject(list_prt)) != NULL)
|
||||
{
|
||||
if(tmp_host_map_struct->is_newsgroups_file == is_newsgroups_file
|
||||
&& !PL_strcasecmp(tmp_host_map_struct->psuedo_name,
|
||||
host_map_struct->psuedo_name))
|
||||
{
|
||||
XP_ListRemoveObject(HostMapList, tmp_host_map_struct);
|
||||
FREEIF(tmp_host_map_struct->psuedo_name);
|
||||
FREEIF(tmp_host_map_struct->filename);
|
||||
FREE(tmp_host_map_struct);
|
||||
|
||||
break; /* end search */
|
||||
}
|
||||
}
|
||||
|
||||
XP_ListAddObjectToEnd(HostMapList, host_map_struct);
|
||||
|
||||
NET_SaveNewsrcFileMappings();
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
/* removes a newshost to file mapping. Removes both
|
||||
* the newsrc and the newsgroups mapping
|
||||
* this function does not remove the actual files,
|
||||
* that is left up to the caller
|
||||
*/
|
||||
PUBLIC void
|
||||
NET_UnregisterNewsHost(const char *host,
|
||||
Bool bs)
|
||||
{
|
||||
XP_List * list_prt = HostMapList;
|
||||
NewsrcHostMap *host_map_struct;
|
||||
char *hostname;
|
||||
|
||||
PR_ASSERT(host);
|
||||
|
||||
if(!host)
|
||||
return;
|
||||
|
||||
/* Run through the entire list and remove all entries that
|
||||
* match that hostname
|
||||
*/
|
||||
while((host_map_struct = (NewsrcHostMap *)XP_ListNextObject(list_prt)) != NULL)
|
||||
{
|
||||
|
||||
if(bs && *host_map_struct->psuedo_name != 's')
|
||||
continue;
|
||||
|
||||
if(!bs && *host_map_struct->psuedo_name == 's')
|
||||
continue;
|
||||
|
||||
hostname = PL_strchr(host_map_struct->psuedo_name, '-');
|
||||
|
||||
if(!hostname)
|
||||
continue;
|
||||
|
||||
hostname++;
|
||||
|
||||
if(PL_strcasecmp(hostname, host))
|
||||
continue;
|
||||
|
||||
XP_ListRemoveObject(HostMapList, host_map_struct);
|
||||
|
||||
NewsrcMapDirty = TRUE;
|
||||
|
||||
/* free the data */
|
||||
FREEIF(host_map_struct->psuedo_name);
|
||||
FREEIF(host_map_struct->filename);
|
||||
FREE(host_map_struct);
|
||||
|
||||
/* we must start over in the list because the
|
||||
* act of removeing an item will cause purity
|
||||
* errors if we don't start over
|
||||
*/
|
||||
list_prt = HostMapList;
|
||||
}
|
||||
NET_SaveNewsrcFileMappings();
|
||||
}
|
||||
|
||||
/* map a filename and security status into a filename
|
||||
*
|
||||
* returns NULL on error or no mapping.
|
||||
*/
|
||||
PUBLIC char *
|
||||
NET_MapNewsrcHostToFilename(char * host,
|
||||
Bool bs,
|
||||
Bool is_newsgroups_file)
|
||||
{
|
||||
XP_List * list_prt = HostMapList;
|
||||
NewsrcHostMap *host_map_struct;
|
||||
char *hostname;
|
||||
|
||||
while((host_map_struct = (NewsrcHostMap *)XP_ListNextObject(list_prt)) != NULL)
|
||||
{
|
||||
if(is_newsgroups_file != host_map_struct->is_newsgroups_file)
|
||||
continue;
|
||||
|
||||
if(bs && *host_map_struct->psuedo_name != 's')
|
||||
continue;
|
||||
|
||||
if(!bs && *host_map_struct->psuedo_name == 's')
|
||||
continue;
|
||||
|
||||
hostname = PL_strchr(host_map_struct->psuedo_name, '-');
|
||||
|
||||
if(!hostname)
|
||||
continue;
|
||||
|
||||
hostname++;
|
||||
|
||||
if(PL_strcasecmp(hostname, host))
|
||||
continue;
|
||||
|
||||
return(host_map_struct->filename);
|
||||
|
||||
}
|
||||
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
#define NEWSRC_MAP_FILE_COOKIE "netscape-newsrc-map-file"
|
||||
|
||||
/* save newsrc file mappings from memory onto disk
|
||||
*/
|
||||
PUBLIC Bool
|
||||
NET_SaveNewsrcFileMappings()
|
||||
{
|
||||
XP_List * list_prt = HostMapList;
|
||||
NewsrcHostMap *host_map_struct;
|
||||
XP_File fp;
|
||||
|
||||
if(!NewsrcMapDirty)
|
||||
return(TRUE);
|
||||
|
||||
if(!(fp = XP_FileOpen("", xpNewsrcFileMap, XP_FILE_WRITE_BIN)))
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
XP_FileWrite(NEWSRC_MAP_FILE_COOKIE, PL_strlen(NEWSRC_MAP_FILE_COOKIE), fp);
|
||||
XP_FileWrite(LINEBREAK, PL_strlen(LINEBREAK), fp);
|
||||
|
||||
while((host_map_struct = (NewsrcHostMap *)XP_ListNextObject(list_prt)) != NULL)
|
||||
{
|
||||
|
||||
XP_FileWrite(host_map_struct->psuedo_name,
|
||||
PL_strlen(host_map_struct->psuedo_name),
|
||||
fp);
|
||||
|
||||
XP_FileWrite("\t", 1, fp);
|
||||
|
||||
XP_FileWrite(host_map_struct->filename,
|
||||
PL_strlen(host_map_struct->filename),
|
||||
fp);
|
||||
|
||||
XP_FileWrite("\t", 1, fp);
|
||||
|
||||
if(host_map_struct->is_newsgroups_file)
|
||||
XP_FileWrite("TRUE", 4, fp);
|
||||
else
|
||||
XP_FileWrite("FALSE", 5, fp);
|
||||
|
||||
XP_FileWrite(LINEBREAK, PL_strlen(LINEBREAK), fp);
|
||||
}
|
||||
|
||||
XP_FileClose(fp);
|
||||
|
||||
NewsrcMapDirty = FALSE;
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
/* read newsrc file mappings from disk into memory
|
||||
*/
|
||||
PUBLIC Bool
|
||||
NET_ReadNewsrcFileMappings()
|
||||
{
|
||||
XP_File fp;
|
||||
char buffer[512];
|
||||
char psuedo_name[512];
|
||||
char filename[512];
|
||||
char is_newsgroup[512];
|
||||
NewsrcHostMap * hs_struct;
|
||||
|
||||
if(!(fp = XP_FileOpen("", xpNewsrcFileMap, XP_FILE_READ_BIN)))
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
if(!HostMapList)
|
||||
HostMapList = XP_ListNew();
|
||||
|
||||
/* get the cookie and ignore */
|
||||
XP_FileReadLine(buffer, sizeof(buffer), fp);
|
||||
|
||||
while(XP_FileReadLine(buffer, sizeof(buffer), fp))
|
||||
{
|
||||
char * p;
|
||||
int i;
|
||||
|
||||
hs_struct = PR_NEW(NewsrcHostMap);
|
||||
|
||||
if(!hs_struct)
|
||||
return(FALSE);
|
||||
|
||||
memset(hs_struct, 0, sizeof(NewsrcHostMap));
|
||||
|
||||
/*
|
||||
This used to be scanf() call which would incorrectly
|
||||
parse long filenames with spaces in them. - JRE
|
||||
*/
|
||||
|
||||
filename[0] = '\0';
|
||||
is_newsgroup[0]='\0';
|
||||
|
||||
for (i = 0, p = buffer; *p && *p != '\t' && i < 500; p++, i++)
|
||||
psuedo_name[i] = *p;
|
||||
psuedo_name[i] = '\0';
|
||||
if (*p)
|
||||
{
|
||||
for (i = 0, p++; *p && *p != '\t' && i < 500; p++, i++)
|
||||
filename[i] = *p;
|
||||
filename[i]='\0';
|
||||
if (*p)
|
||||
{
|
||||
for (i = 0, p++; *p && *p != '\r' && i < 500; p++, i++)
|
||||
is_newsgroup[i] = *p;
|
||||
is_newsgroup[i]='\0';
|
||||
}
|
||||
}
|
||||
|
||||
StrAllocCopy(hs_struct->psuedo_name, psuedo_name);
|
||||
StrAllocCopy(hs_struct->filename, filename);
|
||||
|
||||
if(!XP_STRNCMP(is_newsgroup, "TRUE", 4))
|
||||
hs_struct->is_newsgroups_file = TRUE;
|
||||
|
||||
XP_ListAddObjectToEnd(HostMapList, hs_struct);
|
||||
}
|
||||
|
||||
|
||||
XP_FileClose(fp);
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
PUBLIC void
|
||||
NET_FreeNewsrcFileMappings(void)
|
||||
{
|
||||
NewsrcHostMap *host_map_struct;
|
||||
|
||||
while((host_map_struct = (NewsrcHostMap *)XP_ListRemoveTopObject(HostMapList)) != NULL)
|
||||
{
|
||||
FREEIF(host_map_struct->psuedo_name);
|
||||
FREEIF(host_map_struct->filename);
|
||||
FREE(host_map_struct);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#if defined(DEBUG) && defined(XP_UNIX)
|
||||
|
||||
PUBLIC void
|
||||
TestNewsrcFileMappings(void)
|
||||
{
|
||||
|
||||
HG04206;
|
||||
printf("insec flop maps to: %s\n", NET_MapNewsrcHostToFilename("flop", FALSE, FALSE));
|
||||
printf("insec news maps to: %s\n", NET_MapNewsrcHostToFilename("news", FALSE, FALSE));
|
||||
|
||||
NET_RegisterNewsrcFile("newsrc-flop", "flop", FALSE, FALSE);
|
||||
NET_RegisterNewsrcFile("snewsrc-flop", "flop", TRUE, FALSE);
|
||||
NET_RegisterNewsrcFile("newsrc-news", "news", FALSE, FALSE);
|
||||
|
||||
HG04206;
|
||||
printf("insec flop maps to: %s\n", NET_MapNewsrcHostToFilename("flop", FALSE, FALSE));
|
||||
printf("insec news maps to: %s\n", NET_MapNewsrcHostToFilename("news", FALSE, FALSE));
|
||||
|
||||
printf("saving mappings\n");
|
||||
NET_SaveNewsrcFileMappings();
|
||||
printf("freeing mappings\n");
|
||||
NET_FreeNewsrcFileMappings();
|
||||
printf("reading mappings\n");
|
||||
NET_ReadNewsrcFileMappings();
|
||||
|
||||
printf("adding duplicates\n");
|
||||
NET_RegisterNewsrcFile("newsrc-flop", "flop", FALSE, FALSE);
|
||||
NET_RegisterNewsrcFile("snewsrc-flop", "flop", TRUE, FALSE);
|
||||
NET_RegisterNewsrcFile("newsrc-news", "news", FALSE, FALSE);
|
||||
|
||||
HG04206;
|
||||
printf("insec flop maps to: %s\n", NET_MapNewsrcHostToFilename("flop", FALSE, FALSE));
|
||||
printf("insec news maps to: %s\n", NET_MapNewsrcHostToFilename("news", FALSE, FALSE));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* XP_GetNewsRCFiles returns a null terminated array
|
||||
* of pointers to malloc'd filename's. Each filename
|
||||
* represents a different newsrc file.
|
||||
*
|
||||
* return only the filename since the path is not needed
|
||||
* or wanted.
|
||||
*
|
||||
* Netlib is expecting a string of the form:
|
||||
* [s]newsrc-host.name.domain[:port]
|
||||
*
|
||||
* examples:
|
||||
* newsrc-news.mcom.com
|
||||
* snewsrc-flop.mcom.com
|
||||
* newsrc-news.mcom.com:118
|
||||
* snewsrc-flop.mcom.com:1191
|
||||
*
|
||||
* the port number is optional and should only be
|
||||
* there when different from the default.
|
||||
* the "s" in front of newsrc signifies that
|
||||
* security is to be used.
|
||||
*
|
||||
* return NULL on critical error or no files
|
||||
*/
|
||||
#if !defined(XP_UNIX)
|
||||
PUBLIC char ** XP_GetNewsRCFiles(void)
|
||||
{
|
||||
/* @@@ max number of newsrc's is 512
|
||||
*/
|
||||
char ** rv = (char **)PL_Malloc(sizeof(char*)*512);
|
||||
XP_List * list_prt = HostMapList;
|
||||
NewsrcHostMap *host_map_struct;
|
||||
int count=0;
|
||||
|
||||
if(!rv)
|
||||
return(NULL);
|
||||
|
||||
memset(rv, 0, sizeof(char*)*512);
|
||||
|
||||
while((host_map_struct = (NewsrcHostMap *)XP_ListNextObject(list_prt)) != NULL)
|
||||
{
|
||||
|
||||
if(host_map_struct->is_newsgroups_file)
|
||||
continue;
|
||||
|
||||
StrAllocCopy(rv[count++], host_map_struct->psuedo_name);
|
||||
|
||||
if(count >= 510)
|
||||
break;
|
||||
}
|
||||
|
||||
return(rv);
|
||||
}
|
||||
#endif /* UNIX */
|
||||
|
||||
|
Загрузка…
Ссылка в новой задаче