Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
Synchronet
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Main
Synchronet
Commits
24831379
Commit
24831379
authored
7 years ago
by
rswindell
Browse files
Options
Downloads
Patches
Plain Diff
Address many (but not all) Coverity reported "issues".
parent
1e5bbbdf
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/sbbs3/sbbsecho.c
+208
-165
208 additions, 165 deletions
src/sbbs3/sbbsecho.c
with
208 additions
and
165 deletions
src/sbbs3/sbbsecho.c
+
208
−
165
View file @
24831379
...
...
@@ -302,20 +302,20 @@ echostat_msg_t parse_echostat_msg(str_list_t ini, const char* section, const cha
return
msg
;
}
echostat_msg_t
fidomsg_to_echostat_msg
(
fmsghdr_t
fmsg
hdr
,
fidoaddr_t
*
pkt_orig
,
const
char
*
fmsgbuf
)
echostat_msg_t
fidomsg_to_echostat_msg
(
fmsghdr_t
*
hdr
,
fidoaddr_t
*
pkt_orig
,
const
char
*
fmsgbuf
)
{
char
*
p
;
echostat_msg_t
msg
=
{{
0
}};
SAFECOPY
(
msg
.
to
,
fmsg
hdr
.
to
);
SAFECOPY
(
msg
.
from
,
fmsg
hdr
.
from
);
SAFECOPY
(
msg
.
subj
,
fmsg
hdr
.
subj
);
msg
.
msg_time
=
fmsgtime
(
fmsg
hdr
.
time
);
SAFECOPY
(
msg
.
to
,
hdr
->
to
);
SAFECOPY
(
msg
.
from
,
hdr
->
from
);
SAFECOPY
(
msg
.
subj
,
hdr
->
subj
);
msg
.
msg_time
=
fmsgtime
(
hdr
->
time
);
msg
.
localtime
=
time
(
NULL
);
msg
.
origaddr
.
zone
=
fmsg
hdr
.
origzone
;
msg
.
origaddr
.
net
=
fmsg
hdr
.
orignet
;
msg
.
origaddr
.
node
=
fmsg
hdr
.
orignode
;
msg
.
origaddr
.
point
=
fmsg
hdr
.
origpoint
;
msg
.
origaddr
.
zone
=
hdr
->
origzone
;
msg
.
origaddr
.
net
=
hdr
->
orignet
;
msg
.
origaddr
.
node
=
hdr
->
orignode
;
msg
.
origaddr
.
point
=
hdr
->
origpoint
;
if
(
pkt_orig
!=
NULL
)
msg
.
pkt_orig
=
*
pkt_orig
;
if
((
p
=
parse_control_line
(
fmsgbuf
,
"MSGID:"
))
!=
NULL
)
{
...
...
@@ -575,89 +575,89 @@ char *mycmdstr(scfg_t* cfg, const char *instr, const char *fpath, const char *fs
cmd
[
j
]
=
0
;
switch
(
toupper
(
instr
[
i
]))
{
case
'F'
:
/* File path */
strcat
(
cmd
,
fpath
);
SAFECAT
(
cmd
,
fpath
);
break
;
case
'G'
:
/* Temp directory */
if
(
cfg
->
temp_dir
[
0
]
!=
'\\'
&&
cfg
->
temp_dir
[
0
]
!=
'/'
&&
cfg
->
temp_dir
[
1
]
!=
':'
)
{
strcpy
(
str
,
cfg
->
node_dir
);
strcat
(
str
,
cfg
->
temp_dir
);
SAFECOPY
(
str
,
cfg
->
node_dir
);
SAFECAT
(
str
,
cfg
->
temp_dir
);
if
(
FULLPATH
(
str2
,
str
,
40
))
strcpy
(
str
,
str2
);
backslash
(
str
);
strcat
(
cmd
,
str
);}
SAFECAT
(
cmd
,
str
);}
else
strcat
(
cmd
,
cfg
->
temp_dir
);
SAFECAT
(
cmd
,
cfg
->
temp_dir
);
break
;
case
'J'
:
if
(
cfg
->
data_dir
[
0
]
!=
'\\'
&&
cfg
->
data_dir
[
0
]
!=
'/'
&&
cfg
->
data_dir
[
1
]
!=
':'
)
{
strcpy
(
str
,
cfg
->
node_dir
);
strcat
(
str
,
cfg
->
data_dir
);
SAFECOPY
(
str
,
cfg
->
node_dir
);
SAFECAT
(
str
,
cfg
->
data_dir
);
if
(
FULLPATH
(
str2
,
str
,
40
))
strcpy
(
str
,
str2
);
SAFECOPY
(
str
,
str2
);
backslash
(
str
);
strcat
(
cmd
,
str
);
SAFECAT
(
cmd
,
str
);
}
else
strcat
(
cmd
,
cfg
->
data_dir
);
SAFECAT
(
cmd
,
cfg
->
data_dir
);
break
;
case
'K'
:
if
(
cfg
->
ctrl_dir
[
0
]
!=
'\\'
&&
cfg
->
ctrl_dir
[
0
]
!=
'/'
&&
cfg
->
ctrl_dir
[
1
]
!=
':'
)
{
strcpy
(
str
,
cfg
->
node_dir
);
strcat
(
str
,
cfg
->
ctrl_dir
);
SAFECOPY
(
str
,
cfg
->
node_dir
);
SAFECAT
(
str
,
cfg
->
ctrl_dir
);
if
(
FULLPATH
(
str2
,
str
,
40
))
strcpy
(
str
,
str2
);
SAFECOPY
(
str
,
str2
);
backslash
(
str
);
strcat
(
cmd
,
str
);
SAFECAT
(
cmd
,
str
);
}
else
strcat
(
cmd
,
cfg
->
ctrl_dir
);
SAFECAT
(
cmd
,
cfg
->
ctrl_dir
);
break
;
case
'N'
:
/* Node Directory (same as SBBSNODE environment var) */
strcat
(
cmd
,
cfg
->
node_dir
);
SAFECAT
(
cmd
,
cfg
->
node_dir
);
break
;
case
'O'
:
/* SysOp */
strcat
(
cmd
,
cfg
->
sys_op
);
SAFECAT
(
cmd
,
cfg
->
sys_op
);
break
;
case
'Q'
:
/* QWK ID */
strcat
(
cmd
,
cfg
->
sys_id
);
SAFECAT
(
cmd
,
cfg
->
sys_id
);
break
;
case
'S'
:
/* File Spec */
strcat
(
cmd
,
fspec
);
SAFECAT
(
cmd
,
fspec
);
break
;
case
'!'
:
/* EXEC Directory */
strcat
(
cmd
,
cfg
->
exec_dir
);
SAFECAT
(
cmd
,
cfg
->
exec_dir
);
break
;
case
'@'
:
/* EXEC Directory for DOS/OS2/Win32, blank for Unix */
#ifndef __unix__
strcat
(
cmd
,
cfg
->
exec_dir
);
SAFECAT
(
cmd
,
cfg
->
exec_dir
);
#endif
break
;
case
'#'
:
/* Node number (same as SBBSNNUM environment var) */
sprintf
(
str
,
"%d"
,
cfg
->
node_num
);
strcat
(
cmd
,
str
);
SAFECAT
(
cmd
,
str
);
break
;
case
'*'
:
sprintf
(
str
,
"%03d"
,
cfg
->
node_num
);
strcat
(
cmd
,
str
);
SAFECAT
(
cmd
,
str
);
break
;
case
'%'
:
/* %% for percent sign */
strcat
(
cmd
,
"%"
);
SAFECAT
(
cmd
,
"%"
);
break
;
case
'.'
:
/* .exe for DOS/OS2/Win32, blank for Unix */
#ifndef __unix__
strcat
(
cmd
,
".exe"
);
SAFECAT
(
cmd
,
".exe"
);
#endif
break
;
case
'?'
:
/* Platform */
strcpy
(
str
,
PLATFORM_DESC
);
SAFECOPY
(
str
,
PLATFORM_DESC
);
strlwr
(
str
);
strcat
(
cmd
,
str
);
SAFECAT
(
cmd
,
str
);
break
;
default:
/* unknown specification */
lprintf
(
LOG_ERR
,
"ERROR Checking Command Line '%s'"
,
instr
);
...
...
@@ -733,7 +733,10 @@ int get_outbound(fidoaddr_t dest, char* outbound, size_t maxlen, bool fileboxes)
const
char
*
get_current_outbound
(
fidoaddr_t
dest
,
bool
fileboxes
)
{
static
char
outbound
[
MAX_PATH
+
1
];
get_outbound
(
dest
,
outbound
,
sizeof
(
outbound
)
-
1
,
fileboxes
);
if
(
get_outbound
(
dest
,
outbound
,
sizeof
(
outbound
)
-
1
,
fileboxes
)
!=
0
)
{
lprintf
(
LOG_ERR
,
"Error creating outbound directory"
);
return
NULL
;
}
return
outbound
;
}
...
...
@@ -746,6 +749,8 @@ bool bso_lock_node(fidoaddr_t dest)
return
true
;
outbound
=
get_current_outbound
(
dest
,
/* fileboxes: */
false
);
if
(
outbound
==
NULL
)
return
false
;
if
(
dest
.
point
)
SAFEPRINTF2
(
fname
,
"%s%08x.bsy"
,
outbound
,
dest
.
point
);
...
...
@@ -793,6 +798,8 @@ const char* bso_flo_filename(fidoaddr_t dest, uint16_t attr)
}
}
outbound
=
get_current_outbound
(
dest
,
/* fileboxes: */
false
);
if
(
outbound
==
NULL
)
return
NULL
;
if
(
dest
.
point
)
SAFEPRINTF3
(
filename
,
"%s%08x.%clo"
,
outbound
,
dest
.
point
,
ch
);
...
...
@@ -823,6 +830,9 @@ int write_flofile(const char *infile, fidoaddr_t dest, bool bundle, bool use_out
return
1
;
flo_filename
=
bso_flo_filename
(
dest
,
attr
);
if
(
flo_filename
==
NULL
)
return
-
2
;
SAFECOPY
(
attachment
,
infile
);
if
(
!
fexistcase
(
attachment
))
{
/* just in-case it's the wrong case for a Unix file system */
lprintf
(
LOG_ERR
,
"ERROR line %u, attachment file not found: %s"
,
__LINE__
,
attachment
);
...
...
@@ -1101,7 +1111,10 @@ int create_netmail(const char *to, const smbmsg_t* msg, const char *subject, con
nodecfg
=
findnodecfg
(
&
cfg
,
dest
,
/* skip exact match: */
2
);
}
MKDIR
(
scfg
.
netmail_dir
);
if
(
!
isdir
(
scfg
.
netmail_dir
)
&&
MKDIR
(
scfg
.
netmail_dir
)
!=
0
)
{
lprintf
(
LOG_ERR
,
"Error %u (%s) line %d creating directory: %s"
,
errno
,
strerror
(
errno
),
__LINE__
,
scfg
.
netmail_dir
);
return
-
2
;
}
for
(
i
=
startmsg
;
i
;
i
++
)
{
sprintf
(
fname
,
"%s%u.msg"
,
scfg
.
netmail_dir
,
i
);
if
(
!
fexistcase
(
fname
))
...
...
@@ -1151,7 +1164,7 @@ int create_netmail(const char *to, const smbmsg_t* msg, const char *subject, con
SAFECOPY
(
hdr
.
from
,
from
);
SAFECOPY
(
hdr
.
subj
,
subject
);
fwrite
(
&
hdr
,
sizeof
(
fmsghdr_t
),
1
,
fp
);
(
void
)
fwrite
(
&
hdr
,
sizeof
(
fmsghdr_t
),
1
,
fp
);
fwrite_intl_control_line
(
fp
,
&
hdr
);
if
(
!
fidoctrl_line_exists
(
msg
,
"TZUTC:"
))
{
...
...
@@ -1221,7 +1234,9 @@ int file_to_netmail(FILE* infile, const char* title, fidoaddr_t dest, const char
long
l
,
m
,
len
;
int
netmails_created
=
0
;
fseek
(
infile
,
0
,
SEEK_END
);
if
(
fseek
(
infile
,
0
,
SEEK_END
)
!=
0
)
return
0
;
l
=
len
=
ftell
(
infile
);
if
(
len
>
8192L
)
len
=
8192L
;
...
...
@@ -1237,10 +1252,10 @@ int file_to_netmail(FILE* infile, const char* title, fidoaddr_t dest, const char
if
(
*
p
)
{
*
p
=
0
;
p
++
;
fseek
(
infile
,
-
1L
,
SEEK_CUR
);
(
void
)
fseek
(
infile
,
-
1L
,
SEEK_CUR
);
while
(
*
p
)
{
/* Seek back to end of last line */
p
++
;
fseek
(
infile
,
-
1L
,
SEEK_CUR
);
(
void
)
fseek
(
infile
,
-
1L
,
SEEK_CUR
);
}
}
}
...
...
@@ -1401,11 +1416,11 @@ void netmail_arealist(enum arealist_type type, fidoaddr_t addr, const char* to)
str_list_t
area_list
;
if
(
type
==
AREALIST_ALL
)
strcpy
(
title
,
"List of Available Areas"
);
SAFECOPY
(
title
,
"List of Available Areas"
);
else
if
(
type
==
AREALIST_CONNECTED
)
strcpy
(
title
,
"List of Connected Areas"
);
SAFECOPY
(
title
,
"List of Connected Areas"
);
else
strcpy
(
title
,
"List of Unlinked Areas"
);
SAFECOPY
(
title
,
"List of Unlinked Areas"
);
if
((
area_list
=
strListInit
())
==
NULL
)
{
lprintf
(
LOG_ERR
,
"ERROR line %d couldn't allocate string list"
,
__LINE__
);
...
...
@@ -2287,7 +2302,8 @@ int unpack(const char *infile, const char* outdir)
}
for
(
u
=
0
;
u
<
cfg
.
arcdefs
;
u
++
)
{
str
[
0
]
=
0
;
fseek
(
stream
,
cfg
.
arcdef
[
u
].
byteloc
,
SEEK_SET
);
if
(
fseek
(
stream
,
cfg
.
arcdef
[
u
].
byteloc
,
SEEK_SET
)
!=
0
)
continue
;
for
(
j
=
0
;
j
<
strlen
(
cfg
.
arcdef
[
u
].
hexid
)
/
2
;
j
++
)
{
ch
=
fgetc
(
stream
);
if
(
ch
==
EOF
)
{
...
...
@@ -2434,7 +2450,7 @@ int attachment(const char *bundlename, fidoaddr_t dest, enum attachment_mode mod
globfree
(
&
g
);
while
(
!
feof
(
stream
))
{
if
(
!
fread
(
&
attach
,
sizeof
(
attach_t
),
1
,
stream
))
if
(
fread
(
&
attach
,
1
,
sizeof
(
attach_t
),
stream
)
!=
sizeof
(
attach_t
)
)
break
;
TERMINATE
(
attach
.
filename
);
if
(
!
fexistcase
(
attach
.
filename
))
...
...
@@ -2472,7 +2488,7 @@ int attachment(const char *bundlename, fidoaddr_t dest, enum attachment_mode mod
memcpy
(
&
attach
.
dest
,
&
dest
,
sizeof
(
fidoaddr_t
));
SAFECOPY
(
attach
.
filename
,
bundlename
);
/* TODO: Write of unpacked struct */
fwrite
(
&
attach
,
sizeof
(
attach_t
),
1
,
stream
);
(
void
)
fwrite
(
&
attach
,
sizeof
(
attach_t
),
1
,
stream
);
fclose
(
stream
);
#endif
return
(
0
);
...
...
@@ -2528,6 +2544,8 @@ bool pack_bundle(const char *tmp_pkt, fidoaddr_t orig, fidoaddr_t dest)
}
}
outbound
=
get_current_outbound
(
dest
,
/* fileboxes: */
true
);
if
(
outbound
==
NULL
)
return
false
;
/* Try to use the same filename as the temp packet, if we can */
SAFEPRINTF2
(
new_pkt
,
"%s%s"
,
outbound
,
getfname
(
tmp_pkt
));
...
...
@@ -2761,18 +2779,22 @@ int mv(const char *insrc, const char *indest, bool copy)
setvbuf
(
outp
,
NULL
,
_IOFBF
,
8
*
1024
);
length
=
filelength
(
ind
);
l
=
0L
;
int
result
=
0
;
while
(
l
<
length
)
{
if
(
l
+
chunk
>
length
)
chunk
=
length
-
l
;
fread
(
buf
,
chunk
,
1
,
inp
);
fwrite
(
buf
,
chunk
,
1
,
outp
);
l
+=
chunk
;
if
(
fread
(
buf
,
1
,
chunk
,
inp
)
!=
chunk
)
{
result
=
-
2
;
break
;
}
(
void
)
fwrite
(
buf
,
chunk
,
1
,
outp
);
l
+=
chunk
;
}
fclose
(
inp
);
fclose
(
outp
);
if
(
!
copy
)
if
(
result
==
0
&&
!
copy
)
delfile
(
src
,
__LINE__
);
return
(
0
)
;
return
result
;
}
/****************************************************************************/
...
...
@@ -2835,7 +2857,11 @@ ulong loadmsgs(smb_t* smb, post_t** post, ulong ptr)
return
(
0
);
}
fseek
(
smb
->
sid_fp
,
0L
,
SEEK_SET
);
if
(
fseek
(
smb
->
sid_fp
,
0L
,
SEEK_SET
)
!=
0
)
{
lprintf
(
LOG_ERR
,
"ERROR %u (%s) line %d rewinding index of %s"
,
errno
,
strerror
(
errno
),
__LINE__
,
smb
->
file
);
return
0
;
}
for
(
l
=
0
;
l
<
total
&&
!
feof
(
smb
->
sid_fp
);
)
{
if
(
smb_fread
(
smb
,
&
idx
,
sizeof
(
idx
),
smb
->
sid_fp
)
!=
sizeof
(
idx
))
break
;
...
...
@@ -3018,11 +3044,11 @@ ushort matchname(const char *inname)
lprintf
(
LOG_ERR
,
"ERROR locking USER.DAT record #%ld"
,
total_users
);
continue
;
}
lseek
(
userdat
,(
long
)((
long
)(
total_users
)
*
U_LEN
)
+
U_ALIAS
,
SEEK_SET
);
read
(
userdat
,
alias
,
LEN_ALIAS
);
read
(
userdat
,
name
,
LEN_NAME
);
lseek
(
userdat
,(
long
)(((
long
)
total_users
)
*
U_LEN
)
+
U_MISC
,
SEEK_SET
);
read
(
userdat
,
misc
,
8
);
(
void
)
lseek
(
userdat
,(
long
)((
long
)(
total_users
)
*
U_LEN
)
+
U_ALIAS
,
SEEK_SET
);
(
void
)
read
(
userdat
,
alias
,
LEN_ALIAS
);
(
void
)
read
(
userdat
,
name
,
LEN_NAME
);
(
void
)
lseek
(
userdat
,(
long
)(((
long
)
total_users
)
*
U_LEN
)
+
U_MISC
,
SEEK_SET
);
(
void
)
read
(
userdat
,
misc
,
8
);
for
(
i
=
0
;
i
<
8
;
i
++
)
if
(
misc
[
i
]
==
ETX
||
misc
[
i
]
==
'\r'
)
break
;
misc
[
i
]
=
0
;
...
...
@@ -3183,7 +3209,8 @@ char* getfmsg(FILE* stream, ulong* outlen)
{
uchar
*
fbuf
;
int
ch
;
ulong
l
,
length
,
start
;
long
start
;
ulong
l
,
length
;
length
=
0L
;
start
=
ftell
(
stream
);
/* Beginning of Message */
...
...
@@ -3200,11 +3227,11 @@ char* getfmsg(FILE* stream, ulong* outlen)
return
(
NULL
);
}
fseek
(
stream
,
start
,
SEEK_SET
);
(
void
)
fseek
(
stream
,
start
,
SEEK_SET
);
for
(
l
=
0
;
l
<
length
;
l
++
)
fbuf
[
l
]
=
fgetc
(
stream
);
fbuf
[
l
]
=
(
uchar
)
fgetc
(
stream
);
if
(
ch
==
0
)
fgetc
(
stream
);
/* Read NULL */
(
void
)
fgetc
(
stream
);
/* Read NULL */
while
(
length
&&
fbuf
[
length
-
1
]
<=
' '
)
/* truncate white-space */
length
--
;
...
...
@@ -3231,7 +3258,7 @@ enum {
/* Returns 0 on success, 1 dupe, 2 filtered, 3 empty, 4 too-old */
/* or other SMB error */
/****************************************************************************/
int
fmsgtosmsg
(
char
*
fbuf
,
fmsghdr_t
fmsg
hdr
,
uint
user
,
uint
subnum
)
int
fmsgtosmsg
(
char
*
fbuf
,
fmsghdr_t
*
hdr
,
uint
user
,
uint
subnum
)
{
uchar
ch
,
stail
[
MAX_TAILLEN
+
1
],
*
sbody
;
char
msg_id
[
256
],
str
[
128
],
*
p
;
...
...
@@ -3251,53 +3278,53 @@ int fmsgtosmsg(char* fbuf, fmsghdr_t fmsghdr, uint user, uint subnum)
if
(
twit_list
)
{
sprintf
(
fname
,
"%stwitlist.cfg"
,
scfg
.
ctrl_dir
);
if
(
findstr
(
fmsg
hdr
.
from
,
fname
)
||
findstr
(
fmsg
hdr
.
to
,
fname
))
{
lprintf
(
LOG_INFO
,
"Filtering message from %s to %s"
,
fmsg
hdr
.
from
,
fmsg
hdr
.
to
);
if
(
findstr
(
hdr
->
from
,
fname
)
||
findstr
(
hdr
->
to
,
fname
))
{
lprintf
(
LOG_INFO
,
"Filtering message from %s to %s"
,
hdr
->
from
,
hdr
->
to
);
return
IMPORT_FILTERED_TWIT
;
}
}
memset
(
&
msg
,
0
,
sizeof
(
smbmsg_t
));
if
(
fmsg
hdr
.
attr
&
FIDO_PRIVATE
)
if
(
hdr
->
attr
&
FIDO_PRIVATE
)
msg
.
hdr
.
attr
|=
MSG_PRIVATE
;
if
(
scfg
.
sys_misc
&
SM_DELREADM
)
msg
.
hdr
.
attr
|=
MSG_KILLREAD
;
if
(
fmsg
hdr
.
attr
&
FIDO_FILE
)
if
(
hdr
->
attr
&
FIDO_FILE
)
msg
.
hdr
.
auxattr
|=
MSG_FILEATTACH
;
msg
.
hdr
.
when_imported
.
time
=
now
;
msg
.
hdr
.
when_imported
.
zone
=
sys_timezone
(
&
scfg
);
if
(
fmsg
hdr
.
time
[
0
])
{
msg
.
hdr
.
when_written
.
time
=
fmsgtime
(
fmsg
hdr
.
time
);
if
(
hdr
->
time
[
0
])
{
msg
.
hdr
.
when_written
.
time
=
fmsgtime
(
hdr
->
time
);
if
(
max_msg_age
&&
(
time32_t
)
msg
.
hdr
.
when_written
.
time
<
now
&&
(
now
-
msg
.
hdr
.
when_written
.
time
)
>
max_msg_age
)
{
lprintf
(
LOG_INFO
,
"Filtering message from %s due to age: %1.1f days"
,
fmsg
hdr
.
from
,
hdr
->
from
,(
now
-
msg
.
hdr
.
when_written
.
time
)
/
(
24
.
0
*
60
.
0
*
60
.
0
));
return
IMPORT_FILTERED_AGE
;
}
}
else
msg
.
hdr
.
when_written
=
msg
.
hdr
.
when_imported
;
origaddr
.
zone
=
fmsg
hdr
.
origzone
;
/* only valid if NetMail */
origaddr
.
net
=
fmsg
hdr
.
orignet
;
origaddr
.
node
=
fmsg
hdr
.
orignode
;
origaddr
.
point
=
fmsg
hdr
.
origpoint
;
origaddr
.
zone
=
hdr
->
origzone
;
/* only valid if NetMail */
origaddr
.
net
=
hdr
->
orignet
;
origaddr
.
node
=
hdr
->
orignode
;
origaddr
.
point
=
hdr
->
origpoint
;
destaddr
.
zone
=
fmsg
hdr
.
destzone
;
/* only valid if NetMail */
destaddr
.
net
=
fmsg
hdr
.
destnet
;
destaddr
.
node
=
fmsg
hdr
.
destnode
;
destaddr
.
point
=
fmsg
hdr
.
destpoint
;
destaddr
.
zone
=
hdr
->
destzone
;
/* only valid if NetMail */
destaddr
.
net
=
hdr
->
destnet
;
destaddr
.
node
=
hdr
->
destnode
;
destaddr
.
point
=
hdr
->
destpoint
;
smb_hfield_str
(
&
msg
,
SENDER
,
fmsg
hdr
.
from
);
smb_hfield_str
(
&
msg
,
RECIPIENT
,
fmsg
hdr
.
to
);
smb_hfield_str
(
&
msg
,
SENDER
,
hdr
->
from
);
smb_hfield_str
(
&
msg
,
RECIPIENT
,
hdr
->
to
);
if
(
user
)
{
sprintf
(
str
,
"%u"
,
user
);
smb_hfield_str
(
&
msg
,
RECIPIENTEXT
,
str
);
}
smb_hfield_str
(
&
msg
,
SUBJECT
,
fmsg
hdr
.
subj
);
smb_hfield_str
(
&
msg
,
SUBJECT
,
hdr
->
subj
);
if
(
fbuf
==
NULL
)
{
lprintf
(
LOG_ERR
,
"ERROR line %d allocating fbuf"
,
__LINE__
);
...
...
@@ -3562,6 +3589,7 @@ int fmsgtosmsg(char* fbuf, fmsghdr_t fmsghdr, uint user, uint subnum)
}
smb_freemsgmem
(
&
msg
);
free
(
sbody
);
return
(
i
);
}
...
...
@@ -3606,7 +3634,7 @@ void getzpt(FILE* stream, fmsghdr_t* hdr)
else
cr
=
0
;
}
fseek
(
stream
,
pos
,
SEEK_SET
);
(
void
)
fseek
(
stream
,
pos
,
SEEK_SET
);
}
bool
foreign_zone
(
uint16_t
zone1
,
uint16_t
zone2
)
...
...
@@ -3620,7 +3648,7 @@ bool foreign_zone(uint16_t zone1, uint16_t zone2)
This function puts a message into a Fido packet, writing both the header
information and the message body
******************************************************************************/
void
putfmsg
(
FILE
*
stream
,
const
char
*
fbuf
,
fmsghdr_t
fmsg
hdr
,
area_t
area
void
putfmsg
(
FILE
*
stream
,
const
char
*
fbuf
,
fmsghdr_t
*
hdr
,
area_t
area
,
addrlist_t
seenbys
,
addrlist_t
paths
)
{
char
str
[
256
],
seenby
[
256
];
...
...
@@ -3630,27 +3658,27 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
fpkdmsg_t
pkdmsg
;
size_t
len
;
addr
=
getsysfaddr
(
fmsg
hdr
.
destzone
);
addr
=
getsysfaddr
(
hdr
->
destzone
);
/* Write fixed-length header fields */
memset
(
&
pkdmsg
,
0
,
sizeof
(
pkdmsg
));
pkdmsg
.
type
=
2
;
pkdmsg
.
orignet
=
addr
.
net
;
pkdmsg
.
orignode
=
addr
.
node
;
pkdmsg
.
destnet
=
fmsg
hdr
.
destnet
;
pkdmsg
.
destnode
=
fmsg
hdr
.
destnode
;
pkdmsg
.
attr
=
fmsg
hdr
.
attr
;
pkdmsg
.
cost
=
fmsg
hdr
.
cost
;
SAFECOPY
(
pkdmsg
.
time
,
fmsg
hdr
.
time
);
fwrite
(
&
pkdmsg
,
sizeof
(
pkdmsg
)
,
1
,
stream
);
pkdmsg
.
destnet
=
hdr
->
destnet
;
pkdmsg
.
destnode
=
hdr
->
destnode
;
pkdmsg
.
attr
=
hdr
->
attr
;
pkdmsg
.
cost
=
hdr
->
cost
;
SAFECOPY
(
pkdmsg
.
time
,
hdr
->
time
);
(
void
)
fwrite
(
&
pkdmsg
,
sizeof
(
pkdmsg
)
,
1
,
stream
);
/* Write variable-length (ASCIIZ) header fields */
fwrite
(
fmsg
hdr
.
to
,
strlen
(
fmsg
hdr
.
to
)
+
1
,
1
,
stream
);
fwrite
(
fmsg
hdr
.
from
,
strlen
(
fmsg
hdr
.
from
)
+
1
,
1
,
stream
);
fwrite
(
fmsg
hdr
.
subj
,
strlen
(
fmsg
hdr
.
subj
)
+
1
,
1
,
stream
);
(
void
)
fwrite
(
hdr
->
to
,
strlen
(
hdr
->
to
)
+
1
,
1
,
stream
);
(
void
)
fwrite
(
hdr
->
from
,
strlen
(
hdr
->
from
)
+
1
,
1
,
stream
);
(
void
)
fwrite
(
hdr
->
subj
,
strlen
(
hdr
->
subj
)
+
1
,
1
,
stream
);
if
(
area
.
tag
==
NULL
&&
strstr
(
fbuf
,
"
\1
INTL "
)
==
NULL
)
/* NetMail, so add FSC-0004 INTL kludge */
fwrite_intl_control_line
(
stream
,
&
fmsg
hdr
);
/* If not already present */
fwrite_intl_control_line
(
stream
,
hdr
);
/* If not already present */
len
=
strlen
((
char
*
)
fbuf
);
...
...
@@ -3658,7 +3686,7 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
if
(
area
.
tag
)
if
(
strncmp
((
char
*
)
fbuf
,
"AREA:"
,
5
))
/* No AREA: Line */
fprintf
(
stream
,
"AREA:%s
\r
"
,
area
.
tag
);
/* So add one */
fwrite
(
fbuf
,
len
,
1
,
stream
);
(
void
)
fwrite
(
fbuf
,
len
,
1
,
stream
);
lastlen
=
9
;
if
(
len
&&
fbuf
[
len
-
1
]
!=
'\r'
)
fputc
(
'\r'
,
stream
);
...
...
@@ -3667,8 +3695,8 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
fwrite_via_control_line
(
stream
,
&
addr
);
}
else
{
/* EchoMail, Not NetMail */
if
(
foreign_zone
(
addr
.
zone
,
fmsg
hdr
.
destzone
))
/* Zone Gate */
fprintf
(
stream
,
"SEEN-BY: %d/%d
\r
"
,
fmsg
hdr
.
destnet
,
fmsg
hdr
.
destnode
);
if
(
foreign_zone
(
addr
.
zone
,
hdr
->
destzone
))
/* Zone Gate */
fprintf
(
stream
,
"SEEN-BY: %d/%d
\r
"
,
hdr
->
destnet
,
hdr
->
destnode
);
else
{
fprintf
(
stream
,
"SEEN-BY:"
);
for
(
u
=
0
;
u
<
seenbys
.
addrs
;
u
++
)
{
/* Put back original SEEN-BYs */
...
...
@@ -3684,7 +3712,7 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
sprintf
(
str
,
"%d"
,
seenbys
.
addr
[
u
].
node
);
strcat
(
seenby
,
str
);
if
(
lastlen
+
strlen
(
seenby
)
<
80
)
{
fwrite
(
seenby
,
strlen
(
seenby
),
1
,
stream
);
(
void
)
fwrite
(
seenby
,
strlen
(
seenby
),
1
,
stream
);
lastlen
+=
strlen
(
seenby
);
}
else
{
...
...
@@ -3715,7 +3743,7 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
sprintf
(
str
,
"%d"
,
area
.
link
[
u
].
node
);
strcat
(
seenby
,
str
);
if
(
lastlen
+
strlen
(
seenby
)
<
80
)
{
fwrite
(
seenby
,
strlen
(
seenby
),
1
,
stream
);
(
void
)
fwrite
(
seenby
,
strlen
(
seenby
),
1
,
stream
);
lastlen
+=
strlen
(
seenby
);
}
else
{
...
...
@@ -3744,7 +3772,7 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
sprintf
(
str
,
"%d"
,
scfg
.
faddr
[
u
].
node
);
strcat
(
seenby
,
str
);
if
(
lastlen
+
strlen
(
seenby
)
<
80
)
{
fwrite
(
seenby
,
strlen
(
seenby
),
1
,
stream
);
(
void
)
fwrite
(
seenby
,
strlen
(
seenby
),
1
,
stream
);
lastlen
+=
strlen
(
seenby
);
}
else
{
...
...
@@ -3759,7 +3787,7 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
lastlen
=
7
;
net_exists
=
0
;
fprintf
(
stream
,
"
\r\1
PATH:"
);
addr
=
getsysfaddr
(
fmsg
hdr
.
destzone
);
addr
=
getsysfaddr
(
hdr
->
destzone
);
for
(
u
=
0
;
u
<
paths
.
addrs
;
u
++
)
{
/* Put back the original PATH */
if
(
paths
.
addr
[
u
].
net
==
0
)
continue
;
// Invalid node number/address, don't include "0/0" in PATH
...
...
@@ -3776,7 +3804,7 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
sprintf
(
str
,
"%d"
,
paths
.
addr
[
u
].
node
);
strcat
(
seenby
,
str
);
if
(
lastlen
+
strlen
(
seenby
)
<
80
)
{
fwrite
(
seenby
,
strlen
(
seenby
),
1
,
stream
);
(
void
)
fwrite
(
seenby
,
strlen
(
seenby
),
1
,
stream
);
lastlen
+=
strlen
(
seenby
);
}
else
{
...
...
@@ -3788,7 +3816,7 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
}
strcpy
(
seenby
,
" "
);
/* Add first address with same zone to PATH */
sysaddr
=
getsysfaddr
(
fmsg
hdr
.
destzone
);
sysaddr
=
getsysfaddr
(
hdr
->
destzone
);
if
(
sysaddr
.
net
!=
0
&&
sysaddr
.
point
==
0
&&
(
paths
.
addrs
==
0
||
lasthop
.
net
!=
sysaddr
.
net
||
lasthop
.
node
!=
sysaddr
.
node
))
{
if
(
sysaddr
.
net
!=
addr
.
net
||
!
net_exists
)
{
...
...
@@ -3800,10 +3828,10 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
sprintf
(
str
,
"%d"
,
sysaddr
.
node
);
strcat
(
seenby
,
str
);
if
(
lastlen
+
strlen
(
seenby
)
<
80
)
fwrite
(
seenby
,
strlen
(
seenby
),
1
,
stream
);
(
void
)
fwrite
(
seenby
,
strlen
(
seenby
),
1
,
stream
);
else
{
fprintf
(
stream
,
"
\r\1
PATH:"
);
fwrite
(
seenby
,
strlen
(
seenby
),
1
,
stream
);
(
void
)
fwrite
(
seenby
,
strlen
(
seenby
),
1
,
stream
);
}
}
fputc
(
'\r'
,
stream
);
...
...
@@ -3825,11 +3853,12 @@ long find_packet_terminator(FILE* stream)
uint16_t
terminator
=
~
FIDO_PACKET_TERMINATOR
;
long
offset
;
fseek
(
stream
,
0
,
SEEK_END
);
if
(
fseek
(
stream
,
0
,
SEEK_END
)
!=
0
)
return
0
;
offset
=
ftell
(
stream
);
if
(
offset
>=
sizeof
(
fpkthdr_t
)
+
sizeof
(
terminator
))
{
fseek
(
stream
,
offset
-
sizeof
(
terminator
),
SEEK_SET
);
if
(
fread
(
&
terminator
,
sizeof
(
terminator
),
1
,
stream
)
(
void
)
fseek
(
stream
,
offset
-
sizeof
(
terminator
),
SEEK_SET
);
if
(
fread
(
&
terminator
,
1
,
sizeof
(
terminator
),
stream
)
==
sizeof
(
terminator
)
&&
terminator
==
FIDO_PACKET_TERMINATOR
)
offset
-=
sizeof
(
terminator
);
}
...
...
@@ -4086,10 +4115,13 @@ outpkt_t* get_outpkt(fidoaddr_t orig, fidoaddr_t dest, nodecfg_t* nodecfg)
}
if
((
pkt
->
filename
=
strdup
(
pktname
(
cfg
.
temp_dir
)))
==
NULL
)
{
lprintf
(
LOG_CRIT
,
"Memory allocation error, line %u"
,
__LINE__
);
free
(
pkt
);
return
NULL
;
}
if
((
pkt
->
fp
=
fopen
(
pkt
->
filename
,
"wb"
))
==
NULL
)
{
lprintf
(
LOG_ERR
,
"ERROR %u (%s) opening/creating %s"
,
errno
,
strerror
(
errno
),
pkt
->
filename
);
free
(
pkt
->
filename
);
free
(
pkt
);
return
NULL
;
}
...
...
@@ -4100,7 +4132,7 @@ outpkt_t* get_outpkt(fidoaddr_t orig, fidoaddr_t dest, nodecfg_t* nodecfg)
,
smb_faddrtoa
(
&
orig
,
str
),
smb_faddrtoa
(
&
dest
,
NULL
),
pkt
->
filename
);
fpkthdr_t
pkthdr
;
new_pkthdr
(
&
pkthdr
,
orig
,
dest
,
nodecfg
);
fwrite
(
&
pkthdr
,
sizeof
(
pkthdr
),
1
,
pkt
->
fp
);
(
void
)
fwrite
(
&
pkthdr
,
sizeof
(
pkthdr
),
1
,
pkt
->
fp
);
listAddNode
(
&
outpkt_list
,
pkt
,
0
,
LAST_NODE
);
return
pkt
;
}
...
...
@@ -4109,7 +4141,7 @@ outpkt_t* get_outpkt(fidoaddr_t orig, fidoaddr_t dest, nodecfg_t* nodecfg)
This is where we put outgoing messages into packets.
******************************************************************************/
void
pkt_to_pkt
(
const
char
*
fbuf
,
area_t
area
,
const
fidoaddr_t
*
faddr
,
fmsghdr_t
fmsg
hdr
,
addrlist_t
seenbys
,
addrlist_t
paths
)
,
fmsghdr_t
*
hdr
,
addrlist_t
seenbys
,
addrlist_t
paths
)
{
unsigned
u
;
fidoaddr_t
sysaddr
;
...
...
@@ -4119,10 +4151,10 @@ void pkt_to_pkt(const char *fbuf, area_t area, const fidoaddr_t* faddr
continue
;
if
(
check_psb
(
&
seenbys
,
area
.
link
[
u
]))
continue
;
if
(
fmsg
hdr
.
origzone
==
area
.
link
[
u
].
zone
&&
fmsg
hdr
.
orignet
==
area
.
link
[
u
].
net
&&
fmsg
hdr
.
orignode
==
area
.
link
[
u
].
node
&&
fmsg
hdr
.
origpoint
==
area
.
link
[
u
].
point
)
if
(
hdr
->
origzone
==
area
.
link
[
u
].
zone
&&
hdr
->
orignet
==
area
.
link
[
u
].
net
&&
hdr
->
orignode
==
area
.
link
[
u
].
node
&&
hdr
->
origpoint
==
area
.
link
[
u
].
point
)
continue
;
/* Don't loop messages back to originator */
nodecfg_t
*
nodecfg
=
findnodecfg
(
&
cfg
,
area
.
link
[
u
],
0
);
if
(
nodecfg
!=
NULL
&&
nodecfg
->
passive
)
...
...
@@ -4134,12 +4166,12 @@ void pkt_to_pkt(const char *fbuf, area_t area, const fidoaddr_t* faddr
lprintf
(
LOG_ERR
,
"ERROR Creating/opening outbound packet for %s"
,
smb_faddrtoa
(
&
area
.
link
[
u
],
NULL
));
bail
(
1
);
}
fmsg
hdr
.
destnode
=
area
.
link
[
u
].
node
;
fmsg
hdr
.
destnet
=
area
.
link
[
u
].
net
;
fmsg
hdr
.
destzone
=
area
.
link
[
u
].
zone
;
hdr
->
destnode
=
area
.
link
[
u
].
node
;
hdr
->
destnet
=
area
.
link
[
u
].
net
;
hdr
->
destzone
=
area
.
link
[
u
].
zone
;
lprintf
(
LOG_DEBUG
,
"Adding %s message from %s (%s) to packet for %s: %s"
,
area
.
tag
,
fmsg
hdr
.
from
,
fmsghdr_srcaddr_str
(
&
fmsg
hdr
),
smb_faddrtoa
(
&
area
.
link
[
u
],
NULL
),
pkt
->
filename
);
putfmsg
(
pkt
->
fp
,
fbuf
,
fmsg
hdr
,
area
,
seenbys
,
paths
);
,
area
.
tag
,
hdr
->
from
,
fmsghdr_srcaddr_str
(
hdr
),
smb_faddrtoa
(
&
area
.
link
[
u
],
NULL
),
pkt
->
filename
);
putfmsg
(
pkt
->
fp
,
fbuf
,
hdr
,
area
,
seenbys
,
paths
);
}
}
...
...
@@ -4159,20 +4191,29 @@ int pkt_to_msg(FILE* fidomsg, fmsghdr_t* hdr, const char* info, const char* inbo
printf
(
"Empty NetMail"
);
else
{
printf
(
"Exporting: "
);
MKDIR
(
scfg
.
netmail_dir
);
if
(
!
isdir
(
scfg
.
netmail_dir
)
&&
MKDIR
(
scfg
.
netmail_dir
)
!=
0
)
{
lprintf
(
LOG_ERR
,
"Error %u (%s) line %d creating directory: %s"
,
errno
,
strerror
(
errno
),
__LINE__
,
scfg
.
netmail_dir
);
free
(
fmsgbuf
);
return
-
2
;
}
for
(
i
=
1
;
i
;
i
++
)
{
SAFEPRINTF2
(
path
,
"%s%u.msg"
,
scfg
.
netmail_dir
,
i
);
if
(
!
fexistcase
(
path
))
break
;
if
(
terminated
)
if
(
terminated
)
{
free
(
fmsgbuf
);
return
1
;
}
}
if
(
!
i
)
{
lprintf
(
LOG_WARNING
,
"Too many netmail messages"
);
free
(
fmsgbuf
);
return
(
-
1
);
}
if
((
file
=
nopen
(
path
,
O_WRONLY
|
O_CREAT
))
==-
1
)
{
lprintf
(
LOG_ERR
,
"ERROR %u (%s) line %d creating %s"
,
errno
,
strerror
(
errno
),
__LINE__
,
path
);
free
(
fmsgbuf
);
return
(
-
1
);
}
if
(
hdr
->
attr
&
FIDO_FILE
)
{
/* File attachment (only a single file supported) */
...
...
@@ -4180,8 +4221,8 @@ int pkt_to_msg(FILE* fidomsg, fmsghdr_t* hdr, const char* info, const char* inbo
SAFECOPY
(
fname
,
getfname
(
hdr
->
subj
));
SAFEPRINTF2
(
hdr
->
subj
,
"%s%s"
,
inbound
,
fname
);
/* Fix the file path in the subject */
}
write
(
file
,
hdr
,
sizeof
(
fmsghdr_t
));
write
(
file
,
fmsgbuf
,
l
+
1
);
/* Write the '\0' terminator too */
(
void
)
write
(
file
,
hdr
,
sizeof
(
fmsghdr_t
));
(
void
)
write
(
file
,
fmsgbuf
,
l
+
1
);
/* Write the '\0' terminator too */
close
(
file
);
printf
(
"%s"
,
path
);
lprintf
(
LOG_INFO
,
"%s Exported to %s"
,
info
,
path
);
...
...
@@ -4298,8 +4339,8 @@ int import_netmail(const char* path, fmsghdr_t hdr, FILE* fp, const char* inboun
}
else
{
hdr
.
attr
|=
FIDO_RECV
;
fseek
(
fp
,
0L
,
SEEK_SET
);
fwrite
(
&
hdr
,
sizeof
(
fmsghdr_t
),
1
,
fp
);
(
void
)
fseek
(
fp
,
0L
,
SEEK_SET
);
(
void
)
fwrite
(
&
hdr
,
sizeof
(
fmsghdr_t
),
1
,
fp
);
fclose
(
fp
);
/* Gotta close it here for areafix stuff */
}
}
...
...
@@ -4345,7 +4386,9 @@ int import_netmail(const char* path, fmsghdr_t hdr, FILE* fp, const char* inboun
}
SAFEPRINTF
(
subj
,
"Pong: %s"
,
hdr
.
subj
);
create_netmail
(
/* to: */
hdr
.
from
,
/* msg: */
NULL
,
subj
,
body
,
addr
,
/* file_attached: */
false
);
FREE_AND_NULL
(
body
);
if
(
body
!=
fmsgbuf
)
{
FREE_AND_NULL
(
body
);
}
}
else
{
/* AreaFix */
p
=
process_areafix
(
addr
,
fmsgbuf
,
/* Password: */
hdr
.
subj
,
/* To: */
hdr
.
from
);
if
(
p
!=
NULL
&&
cfg
.
areamgr
[
0
]
!=
0
)
{
...
...
@@ -4356,7 +4399,7 @@ int import_netmail(const char* path, fmsghdr_t hdr, FILE* fp, const char* inboun
SAFECOPY
(
hdr
.
from
,
"SBBSecho"
);
hdr
.
origzone
=
hdr
.
orignet
=
hdr
.
orignode
=
hdr
.
origpoint
=
0
;
hdr
.
time
[
0
]
=
0
;
/* Generate a new timestamp */
if
(
fmsgtosmsg
(
p
,
hdr
,
notify
,
INVALID_SUB
)
==
IMPORT_SUCCESS
)
{
if
(
fmsgtosmsg
(
p
,
&
hdr
,
notify
,
INVALID_SUB
)
==
IMPORT_SUCCESS
)
{
sprintf
(
str
,
"
\7\1
n
\1
hSBBSecho
\1
n
\1
msent you mail
\r\n
"
);
putsmsg
(
&
scfg
,
notify
,
str
);
}
...
...
@@ -4392,7 +4435,7 @@ int import_netmail(const char* path, fmsghdr_t hdr, FILE* fp, const char* inboun
fmsgbuf
=
getfmsg
(
fp
,
&
length
);
switch
(
i
=
fmsgtosmsg
(
fmsgbuf
,
hdr
,
usernumber
,
INVALID_SUB
))
{
switch
(
i
=
fmsgtosmsg
(
fmsgbuf
,
&
hdr
,
usernumber
,
INVALID_SUB
))
{
case
IMPORT_SUCCESS
:
/* success */
break
;
case
IMPORT_FILTERED_DUPE
:
/* filtered */
...
...
@@ -4472,11 +4515,9 @@ static uint32_t read_export_ptr(int subnum, const char* tag)
{
char
path
[
MAX_PATH
+
1
];
char
key
[
INI_MAX_VALUE_LEN
];
int
file
;
FILE
*
fp
;
uint32_t
ptr
=
0
;
/* New way (July-21-2012): */
safe_snprintf
(
path
,
sizeof
(
path
),
"%s%s.ini"
,
scfg
.
sub
[
subnum
]
->
data_dir
,
scfg
.
sub
[
subnum
]
->
code
);
if
((
fp
=
iniOpenFile
(
path
,
/* create: */
false
))
!=
NULL
)
{
safe_snprintf
(
key
,
sizeof
(
key
),
"%s.export_ptr"
,
tag
);
...
...
@@ -4484,13 +4525,6 @@ static uint32_t read_export_ptr(int subnum, const char* tag)
ptr
=
iniReadLongInt
(
fp
,
"SBBSecho"
,
"export_ptr"
,
0
);
/* the previous .ini method (did not support gating) */
iniCloseFile
(
fp
);
}
if
(
ptr
)
return
ptr
;
/* Old way: */
safe_snprintf
(
path
,
sizeof
(
path
),
"%s%s.sfp"
,
scfg
.
sub
[
subnum
]
->
data_dir
,
scfg
.
sub
[
subnum
]
->
code
);
if
((
file
=
nopen
(
path
,
O_RDONLY
))
!=
-
1
)
{
read
(
file
,
&
ptr
,
sizeof
(
ptr
));
close
(
file
);
}
return
ptr
;
}
...
...
@@ -4821,7 +4855,7 @@ void export_echomail(const char* sub_code, const nodecfg_t* nodecfg, bool rescan
if
(
cfg
.
area
[
u
].
sub
==
subnum
)
{
cfg
.
area
[
u
].
exported
++
;
pkt_to_pkt
(
fmsgbuf
,
cfg
.
area
[
u
]
,
nodecfg
?
&
nodecfg
->
addr
:
NULL
,
hdr
,
msg_seen
,
msg_path
);
,
nodecfg
?
&
nodecfg
->
addr
:
NULL
,
&
hdr
,
msg_seen
,
msg_path
);
break
;
}
}
...
...
@@ -5116,7 +5150,7 @@ int export_netmail(void)
,
i
,
email
->
last_error
,
msg
.
hdr
.
number
);
if
(
msg
.
hdr
.
auxattr
&
MSG_FILEATTACH
)
delfattach
(
&
scfg
,
&
msg
);
fseek
(
email
->
sid_fp
,
(
msg
.
offset
+
1
)
*
sizeof
(
msg
.
idx
),
SEEK_SET
);
(
void
)
fseek
(
email
->
sid_fp
,
(
msg
.
offset
+
1
)
*
sizeof
(
msg
.
idx
),
SEEK_SET
);
}
else
{
/* Just mark as "sent" */
msg
.
hdr
.
netattr
|=
MSG_SENT
;
...
...
@@ -5174,7 +5208,7 @@ bool netmail_sent(const char* fname)
}
hdr
.
attr
|=
FIDO_SENT
;
rewind
(
fp
);
fwrite
(
&
hdr
,
sizeof
(
hdr
),
1
,
fp
);
(
void
)
fwrite
(
&
hdr
,
sizeof
(
hdr
),
1
,
fp
);
fclose
(
fp
);
if
(
!
cfg
.
ignore_netmail_kill_attr
&&
(
hdr
.
attr
&
FIDO_KILLSENT
))
return
delfile
(
fname
,
__LINE__
);
...
...
@@ -5259,6 +5293,8 @@ void pack_netmail(void)
if
(
!
bso_lock_node
(
addr
))
continue
;
outbound
=
get_current_outbound
(
addr
,
/* fileboxes: */
true
);
if
(
outbound
==
NULL
)
continue
;
if
(
addr
.
point
)
SAFEPRINTF2
(
req
,
"%s%08x.req"
,
outbound
,
addr
.
point
);
else
...
...
@@ -5280,9 +5316,10 @@ void pack_netmail(void)
,
hdr
.
from
,
fmsghdr_srcaddr_str
(
&
hdr
)
,
hdr
.
to
,
smb_faddrtoa
(
&
addr
,
NULL
)
,
hdr
.
attr
,
hdr
.
subj
);
FREE_AND_NULL
(
fmsgbuf
);
fmsgbuf
=
getfmsg
(
fidomsg
,
NULL
);
fclose
(
fidomsg
);
if
(
!
fmsgbuf
)
{
if
(
fmsgbuf
==
NULL
)
{
lprintf
(
LOG_ERR
,
"ERROR line %d allocating memory for NetMail fmsgbuf"
,
__LINE__
);
bail
(
1
);
...
...
@@ -5301,6 +5338,8 @@ void pack_netmail(void)
if
(
cfg
.
flo_mailer
)
{
outbound
=
get_current_outbound
(
addr
,
/* fileboxes: */
true
);
if
(
outbound
==
NULL
)
continue
;
if
(
nodecfg
!=
NULL
&&
nodecfg
->
outbox
[
0
])
SAFECOPY
(
packet
,
pktname
(
outbound
));
else
{
...
...
@@ -5345,14 +5384,14 @@ void pack_netmail(void)
chsize
(
file
,
0
);
rewind
(
stream
);
new_pkthdr
(
&
pkthdr
,
getsysfaddr
(
addr
.
zone
),
addr
,
nodecfg
);
fwrite
(
&
pkthdr
,
sizeof
(
pkthdr
),
1
,
stream
);
(
void
)
fwrite
(
&
pkthdr
,
sizeof
(
pkthdr
),
1
,
stream
);
}
else
fseek
(
stream
,
find_packet_terminator
(
stream
),
SEEK_SET
);
(
void
)
fseek
(
stream
,
find_packet_terminator
(
stream
),
SEEK_SET
);
lprintf
(
LOG_DEBUG
,
"Adding NetMail (%s) to %spacket for %s: %s"
,
getfname
(
path
)
,
newpkt
,
smb_faddrtoa
(
&
addr
,
NULL
),
packet
);
putfmsg
(
stream
,
fmsgbuf
,
hdr
,
fakearea
,
msg_seen
,
msg_path
);
putfmsg
(
stream
,
fmsgbuf
,
&
hdr
,
fakearea
,
msg_seen
,
msg_path
);
/* Write packet terminator */
terminate_packet
(
stream
);
...
...
@@ -5367,6 +5406,7 @@ void pack_netmail(void)
packed_netmail
++
;
}
globfree
(
&
g
);
FREE_AND_NULL
(
fmsgbuf
);
}
/* Find any packets that have been left behind in the temp directory */
...
...
@@ -5414,8 +5454,8 @@ void find_stray_packets(void)
continue
;
}
terminator
=
~
FIDO_PACKET_TERMINATOR
;
fseek
(
fp
,
flen
-
sizeof
(
terminator
),
SEEK_SET
);
fread
(
&
terminator
,
sizeof
(
terminator
),
1
,
fp
);
(
void
)
fseek
(
fp
,
flen
-
sizeof
(
terminator
),
SEEK_SET
);
(
void
)
fread
(
&
terminator
,
sizeof
(
terminator
),
1
,
fp
);
fclose
(
fp
);
if
(
!
parse_pkthdr
(
&
pkthdr
,
&
pkt_orig
,
&
pkt_dest
,
&
pkt_type
))
{
lprintf
(
LOG_WARNING
,
"Failure to parse packet (%s) header, type: %u"
...
...
@@ -5457,6 +5497,8 @@ bool rename_bad_packet(const char* packet)
char
badpkt
[
MAX_PATH
+
1
];
SAFECOPY
(
badpkt
,
packet
);
char
*
ext
=
getfext
(
badpkt
);
if
(
ext
==
NULL
)
return
false
;
strcpy
(
ext
,
".bad"
);
if
(
mv
(
packet
,
badpkt
,
/* copy: */
false
)
==
0
)
return
true
;
...
...
@@ -5517,15 +5559,15 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
}
terminator
=
~
FIDO_PACKET_TERMINATOR
;
fseek
(
fidomsg
,
-
(
int
)
sizeof
(
terminator
),
SEEK_END
);
fread
(
&
terminator
,
sizeof
(
terminator
),
1
,
fidomsg
)
;
if
(
terminator
!=
FIDO_PACKET_TERMINATOR
)
{
(
void
)
fseek
(
fidomsg
,
-
(
int
)
sizeof
(
terminator
),
SEEK_END
);
if
(
fread
(
&
terminator
,
1
,
sizeof
(
terminator
),
fidomsg
)
!=
sizeof
(
terminator
)
||
terminator
!=
FIDO_PACKET_TERMINATOR
)
{
fclose
(
fidomsg
);
lprintf
(
LOG_WARNING
,
"WARNING: packet %s not terminated correctly (0x%04hX)"
,
packet
,
terminator
);
rename_bad_packet
(
packet
);
continue
;
}
fseek
(
fidomsg
,
0L
,
SEEK_SET
);
(
void
)
fseek
(
fidomsg
,
0L
,
SEEK_SET
);
if
(
fread
(
&
pkthdr
,
sizeof
(
pkthdr
),
1
,
fidomsg
)
!=
1
)
{
fclose
(
fidomsg
);
lprintf
(
LOG_ERR
,
"ERROR line %d reading %u bytes from %s"
,
__LINE__
...
...
@@ -5610,9 +5652,9 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
hdr
.
attr
&=~
FIDO_LOCAL
;
/* Strip local bit, obviously not created locally */
if
(
strncmp
(
fmsgbuf
,
"AREA:"
,
5
)
!=
0
)
{
/* Netmail */
fseek
(
fidomsg
,
msg_offset
,
SEEK_SET
);
(
void
)
fseek
(
fidomsg
,
msg_offset
,
SEEK_SET
);
import_netmail
(
""
,
hdr
,
fidomsg
,
inbound
);
fseek
(
fidomsg
,
next_msg
,
SEEK_SET
);
(
void
)
fseek
(
fidomsg
,
next_msg
,
SEEK_SET
);
printf
(
"
\n
"
);
continue
;
}
...
...
@@ -5633,7 +5675,7 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
lprintf
(
LOG_WARNING
,
"%s: Failed to parse Origin Line in message from %s (%s) in packet from %s: %s"
,
areatag
,
hdr
.
from
,
fmsghdr_srcaddr_str
(
&
hdr
),
smb_faddrtoa
(
&
pkt_orig
,
NULL
),
packet
);
new_echostat_msg
(
stat
,
ECHOSTAT_MSG_RECEIVED
,
fidomsg_to_echostat_msg
(
hdr
,
&
pkt_orig
,
fmsgbuf
));
new_echostat_msg
(
stat
,
ECHOSTAT_MSG_RECEIVED
,
fidomsg_to_echostat_msg
(
&
hdr
,
&
pkt_orig
,
fmsgbuf
));
if
(
!
opt_import_echomail
)
{
printf
(
"EchoMail Ignored"
);
...
...
@@ -5692,7 +5734,7 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
if
(
cfg
.
area
[
i
].
sub
==
INVALID_SUB
)
{
/* Passthru */
strip_psb
(
fmsgbuf
);
pkt_to_pkt
(
fmsgbuf
,
curarea
,
NULL
,
hdr
,
msg_seen
,
msg_path
);
pkt_to_pkt
(
fmsgbuf
,
curarea
,
NULL
,
&
hdr
,
msg_seen
,
msg_path
);
printf
(
"
\n
"
);
continue
;
}
/* On to the next message */
...
...
@@ -5709,7 +5751,7 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
,
areatag
,
smb_faddrtoa
(
&
scfg
.
faddr
[
j
],
NULL
),
hdr
.
from
,
fmsghdr_srcaddr_str
(
&
hdr
));
printf
(
"
\n
"
);
new_echostat_msg
(
stat
,
ECHOSTAT_MSG_CIRCULAR
,
fidomsg_to_echostat_msg
(
hdr
,
&
pkt_orig
,
fmsgbuf
));
,
fidomsg_to_echostat_msg
(
&
hdr
,
&
pkt_orig
,
fmsgbuf
));
continue
;
}
}
...
...
@@ -5736,7 +5778,7 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
fputs
(
str
,
stdout
);
lprintf
(
LOG_ERR
,
"%s"
,
str
);
strip_psb
(
fmsgbuf
);
pkt_to_pkt
(
fmsgbuf
,
curarea
,
NULL
,
hdr
,
msg_seen
,
msg_path
);
pkt_to_pkt
(
fmsgbuf
,
curarea
,
NULL
,
&
hdr
,
msg_seen
,
msg_path
);
printf
(
"
\n
"
);
continue
;
}
...
...
@@ -5752,7 +5794,7 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
lprintf
(
LOG_ERR
,
"%s"
,
str
);
smb_close
(
&
smb
[
cur_smb
]);
strip_psb
(
fmsgbuf
);
pkt_to_pkt
(
fmsgbuf
,
curarea
,
NULL
,
hdr
,
msg_seen
,
msg_path
);
pkt_to_pkt
(
fmsgbuf
,
curarea
,
NULL
,
&
hdr
,
msg_seen
,
msg_path
);
printf
(
"
\n
"
);
continue
;
}
...
...
@@ -5765,7 +5807,7 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
lprintf
(
LOG_NOTICE
,
"%s: Private posts disallowed from %s (%s) to %s, subject: %s"
,
areatag
,
hdr
.
from
,
fmsghdr_srcaddr_str
(
&
hdr
),
hdr
.
to
,
hdr
.
subj
);
strip_psb
(
fmsgbuf
);
pkt_to_pkt
(
fmsgbuf
,
curarea
,
NULL
,
hdr
,
msg_seen
,
msg_path
);
pkt_to_pkt
(
fmsgbuf
,
curarea
,
NULL
,
&
hdr
,
msg_seen
,
msg_path
);
printf
(
"
\n
"
);
continue
;
}
...
...
@@ -5776,18 +5818,18 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
/**********************/
/* Importing EchoMail */
/**********************/
result
=
fmsgtosmsg
(
fmsgbuf
,
hdr
,
0
,
cfg
.
area
[
i
].
sub
);
result
=
fmsgtosmsg
(
fmsgbuf
,
&
hdr
,
0
,
cfg
.
area
[
i
].
sub
);
if
(
result
==
IMPORT_FILTERED_DUPE
)
{
lprintf
(
LOG_NOTICE
,
"%s Duplicate message from %s (%s) to %s, subject: %s"
,
areatag
,
hdr
.
from
,
fmsghdr_srcaddr_str
(
&
hdr
),
hdr
.
to
,
hdr
.
subj
);
cfg
.
area
[
i
].
dupes
++
;
new_echostat_msg
(
stat
,
ECHOSTAT_MSG_DUPLICATE
,
fidomsg_to_echostat_msg
(
hdr
,
&
pkt_orig
,
fmsgbuf
));
,
fidomsg_to_echostat_msg
(
&
hdr
,
&
pkt_orig
,
fmsgbuf
));
}
else
if
(
result
==
IMPORT_SUCCESS
||
(
result
==
IMPORT_FILTERED_AGE
&&
cfg
.
relay_filtered_msgs
))
{
/* Not a dupe */
strip_psb
(
fmsgbuf
);
pkt_to_pkt
(
fmsgbuf
,
curarea
,
NULL
,
hdr
,
msg_seen
,
msg_path
);
pkt_to_pkt
(
fmsgbuf
,
curarea
,
NULL
,
&
hdr
,
msg_seen
,
msg_path
);
}
if
(
result
==
SMB_SUCCESS
)
{
/* Successful import */
...
...
@@ -5806,7 +5848,7 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
echomail
++
;
cfg
.
area
[
i
].
imported
++
;
new_echostat_msg
(
stat
,
ECHOSTAT_MSG_IMPORTED
,
fidomsg_to_echostat_msg
(
hdr
,
&
pkt_orig
,
fmsgbuf
));
,
fidomsg_to_echostat_msg
(
&
hdr
,
&
pkt_orig
,
fmsgbuf
));
}
printf
(
"
\n
"
);
}
...
...
@@ -5959,6 +6001,7 @@ int main(int argc, char **argv)
break
;
default:
fprintf
(
stderr
,
"Unsupported option: %c
\n
"
,
argv
[
i
][
j
]);
/* Fall-through */
case
'?'
:
printf
(
"%s"
,
usage
);
bail
(
0
);
...
...
@@ -6383,8 +6426,8 @@ int main(int argc, char **argv)
}
else
{
hdr
.
attr
|=
FIDO_RECV
;
fseek
(
fidomsg
,
0L
,
SEEK_SET
);
fwrite
(
&
hdr
,
sizeof
(
fmsghdr_t
),
1
,
fidomsg
);
(
void
)
fseek
(
fidomsg
,
0L
,
SEEK_SET
);
(
void
)
fwrite
(
&
hdr
,
sizeof
(
fmsghdr_t
),
1
,
fidomsg
);
fclose
(
fidomsg
);
}
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment