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
5227a6f1
Commit
5227a6f1
authored
23 years ago
by
rswindell
Browse files
Options
Downloads
Patches
Plain Diff
I'm checking this in, just so I have a back-up of my HTML generation code. :-)
This is not intended for public consumption.
parent
70b3f5f9
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
xtrn/sbl/sbbslist.c
+646
-128
646 additions, 128 deletions
xtrn/sbl/sbbslist.c
with
646 additions
and
128 deletions
xtrn/sbl/sbbslist.c
+
646
−
128
View file @
5227a6f1
...
...
@@ -5,6 +5,7 @@
/* Converts Synchronet BBS List (SBL.DAB) to text file */
#include
"xsdk.h"
#include
"telnet.h"
#include
"sbldefs.h"
char
*
wday
[]
=
{
"Sun"
,
"Mon"
,
"Tue"
,
"Wed"
,
"Thu"
,
"Fri"
,
"Sat"
};
...
...
@@ -12,23 +13,56 @@ char *mon[]={"Jan","Feb","Mar","Apr","May","Jun"
,
"Jul"
,
"Aug"
,
"Sep"
,
"Oct"
,
"Nov"
,
"Dec"
};
char
*
nulstr
=
""
;
char
tmp
[
256
];
struct
date
date
;
struct
time
curtime
;
extern
int
daylight
=
0
;
extern
long
timezone
=
0L
;
#undef ERROR_VALUE
#define ERROR_VALUE (GetLastError()-WSABASEERR)
#define SORT TRUE
#define VERIFY TRUE
typedef
struct
{
char
str
[
13
];
time_t
date
;
ulong
count
;
ulong
attempts
;
short
offset
;
}
sort
str
_t
;
}
sort_t
;
int
sort
str
_cmp
(
sort
str
_t
**
str1
,
sort
str
_t
**
str2
)
int
sort_cmp
(
sort_t
**
str1
,
sort_t
**
str2
)
{
return
(
stricmp
((
*
str1
)
->
str
,(
*
str2
)
->
str
));
int
diff
;
/* sort descending by date */
diff
=
((
*
str2
)
->
date
&
0xffff0000
)
-
((
*
str1
)
->
date
&
0xffff0000
);
if
(
diff
)
return
(
diff
);
/* sort descending by verfication counter */
diff
=
(((
*
str2
)
->
count
)
-
((
*
str1
)
->
count
));
if
(
diff
)
return
(
diff
);
/* sort ascending by verification attempts */
return
(((
*
str1
)
->
attempts
)
-
((
*
str2
)
->
attempts
));
}
/****************************************************************************/
/* Truncates white-space chars off end of 'str' */
/****************************************************************************/
void
truncsp
(
uchar
*
str
)
{
uint
c
;
c
=
strlen
(
str
);
while
(
c
&&
(
uchar
)
str
[
c
-
1
]
<=
SP
)
c
--
;
str
[
c
]
=
0
;
}
/****************************************************************************/
...
...
@@ -41,23 +75,29 @@ char *timestr(time_t *intime)
char
mer
[
3
],
hour
;
struct
tm
*
gm
;
gm
=
localtime
(
intime
);
if
(
gm
->
tm_hour
>=
12
)
{
if
(
gm
->
tm_hour
==
12
)
hour
=
12
;
else
hour
=
gm
->
tm_hour
-
12
;
strcpy
(
mer
,
"pm"
);
}
else
{
if
(
gm
->
tm_hour
==
0
)
hour
=
12
;
else
hour
=
gm
->
tm_hour
;
strcpy
(
mer
,
"am"
);
}
sprintf
(
str
,
"%s %s %02d %4d %02d:%02d %s"
,
wday
[
gm
->
tm_wday
],
mon
[
gm
->
tm_mon
],
gm
->
tm_mday
,
1900
+
gm
->
tm_year
,
hour
,
gm
->
tm_min
,
mer
);
return
(
str
);
gm
=
localtime
(
intime
);
if
(
gm
==
NULL
)
{
sprintf
(
str
,
"Invalid time: %08lX"
,
*
intime
);
return
(
str
);
}
if
(
gm
->
tm_hour
>=
12
)
{
if
(
gm
->
tm_hour
==
12
)
hour
=
12
;
else
hour
=
gm
->
tm_hour
-
12
;
strcpy
(
mer
,
"pm"
);
}
else
{
if
(
gm
->
tm_hour
==
0
)
hour
=
12
;
else
hour
=
gm
->
tm_hour
;
strcpy
(
mer
,
"am"
);
}
sprintf
(
str
,
"%s %s %02d %4d %02d:%02d %s"
,
wday
[
gm
->
tm_wday
],
mon
[
gm
->
tm_mon
],
gm
->
tm_mday
,
1900
+
gm
->
tm_year
,
hour
,
gm
->
tm_min
,
mer
);
return
(
str
);
}
/****************************************************************************/
...
...
@@ -65,19 +105,24 @@ return(str);
/****************************************************************************/
char
*
unixtodstr
(
time_t
unix
,
char
*
str
)
{
struct
tm
*
tm
;
if
(
!
unix
)
strcpy
(
str
,
"00/00/00"
);
else
{
unixtodos
(
unix
,
&
date
,
&
curtime
);
if
((
unsigned
)
date
.
da_mon
>
12
)
{
/* DOS leap year bug */
date
.
da_mon
=
1
;
date
.
da_year
++
;
}
if
((
unsigned
)
date
.
da_day
>
31
)
date
.
da_day
=
1
;
sprintf
(
str
,
"%02u/%02u/%02u"
,
date
.
da_mon
,
date
.
da_day
,
date
.
da_year
>=
2000
?
date
.
da_year
-
2000
:
date
.
da_year
-
1900
);
}
return
(
str
);
if
(
!
unix
)
strcpy
(
str
,
"00/00/00"
);
else
{
tm
=
gmtime
(
&
unix
);
if
(
tm
==
NULL
)
strcpy
(
str
,
"00/00/00"
);
else
{
if
(
tm
->
tm_mon
>
11
)
{
/* DOS leap year bug */
tm
->
tm_mon
=
0
;
tm
->
tm_year
++
;
}
if
(
tm
->
tm_mday
>
31
)
tm
->
tm_mday
=
1
;
sprintf
(
str
,
"%02u/%02u/%02u"
,
tm
->
tm_mon
+
1
,
tm
->
tm_mday
,
tm
->
tm_year
%
100
);
}
}
return
(
str
);
}
...
...
@@ -132,15 +177,21 @@ for(i=0;i<bbs.total_terminals && i<MAX_TERMS;i++) {
fprintf
(
out
,
"and "
);
}
fprintf
(
out
,
"%s"
,
bbs
.
terminal
[
i
]);
}
fprintf
(
out
,
"
\r\n\r\n
"
);
for
(
i
=
0
;
i
<
bbs
.
total_numbers
&&
i
<
MAX_NUMBERS
;
i
++
)
fprintf
(
out
,
"%-30.30s %12.12s %5u %-15.15s "
"Minimum: %u
\r\n
"
,
i
&&
!
strcmp
(
bbs
.
number
[
i
].
location
,
bbs
.
number
[
i
-
1
].
location
)
?
nulstr
:
bbs
.
number
[
i
].
location
,
bbs
.
number
[
i
].
number
,
bbs
.
number
[
i
].
max_rate
,
bbs
.
number
[
i
].
modem
,
bbs
.
number
[
i
].
min_rate
);
for
(
i
=
0
;
i
<
bbs
.
total_numbers
&&
i
<
MAX_NUMBERS
;
i
++
)
{
fprintf
(
out
,
"%-30.30s "
,
i
&&
!
strcmp
(
bbs
.
number
[
i
].
modem
.
location
,
bbs
.
number
[
i
-
1
].
modem
.
location
)
?
nulstr
:
bbs
.
number
[
i
].
modem
.
location
);
if
(
bbs
.
number
[
i
].
modem
.
min_rate
==
0xffff
)
fprintf
(
out
,
"%s:%d
\r\n
"
,
bbs
.
number
[
i
].
telnet
.
addr
,
bbs
.
number
[
i
].
telnet
.
port
);
else
fprintf
(
out
,
"%12.12s %5u %-15.15s "
"Minimum: %u
\r\n
"
,
bbs
.
number
[
i
].
modem
.
number
,
bbs
.
number
[
i
].
modem
.
max_rate
,
bbs
.
number
[
i
].
modem
.
desc
,
bbs
.
number
[
i
].
modem
.
min_rate
);
}
fprintf
(
out
,
"
\r\n
"
);
for
(
i
=
0
;
i
<
5
;
i
++
)
{
if
(
!
bbs
.
desc
[
i
][
0
])
...
...
@@ -158,93 +209,560 @@ if(bbs.verified && bbs.userverified[0])
,
timestr
(
&
bbs
.
verified
),
bbs
.
userverified
);
}
u_long
resolve_ip
(
char
*
addr
)
{
HOSTENT
*
host
;
if
(
isdigit
(
addr
[
0
]))
return
(
inet_addr
(
addr
));
if
((
host
=
gethostbyname
(
addr
))
==
NULL
)
{
// printf("!ERROR resolving hostname: %s\n",addr);
return
(
0
);
}
return
(
*
((
ulong
*
)
host
->
h_addr_list
[
0
]));
}
int
telnet_negotiate
(
SOCKET
sock
,
uchar
*
buf
,
int
rd
,
int
max_rd
)
{
int
i
;
int
rsplen
;
uchar
rsp
[
512
];
return
(
rd
);
do
{
rsplen
=
0
;
for
(
i
=
0
;
i
<
rd
&&
rsplen
<
sizeof
(
rsp
)
-
2
;
i
++
)
{
if
(
buf
[
i
]
!=
TELNET_IAC
)
continue
;
i
++
;
printf
(
"telnet cmd: %02X %02X
\n
"
,
buf
[
i
],
buf
[
i
+
1
]);
if
(
buf
[
i
]
==
TELNET_DO
)
{
rsp
[
rsplen
++
]
=
TELNET_IAC
;
rsp
[
rsplen
++
]
=
TELNET_WILL
;
rsp
[
rsplen
++
]
=
buf
[
i
+
1
];
}
if
(
buf
[
i
]
==
TELNET_DONT
)
{
rsp
[
rsplen
++
]
=
TELNET_IAC
;
rsp
[
rsplen
++
]
=
TELNET_WONT
;
rsp
[
rsplen
++
]
=
buf
[
i
+
1
];
}
i
++
;
}
if
(
!
rsplen
)
break
;
printf
(
"telnet rsp: "
);
for
(
i
=
0
;
i
<
rsplen
;
i
++
)
printf
(
"%02X "
,
rsp
[
i
]);
printf
(
"
\n
"
);
send
(
sock
,
rsp
,
rsplen
,
0
);
Sleep
(
3000
);
rd
=
recv
(
sock
,
buf
,
max_rd
,
0
);
}
while
(
rd
>
0
);
return
(
rd
);
}
int
main
(
int
argc
,
char
**
argv
)
{
char
str
[
128
];
int
i
,
j
,
file
,
ff
;
FILE
*
in
,
*
shrt
,
*
lng
;
bbs_t
bbs
;
sortstr_t
**
sortstr
=
NULL
;
if
((
i
=
open
(
"SBL.DAB"
,
O_RDONLY
|
O_BINARY
|
O_DENYNONE
))
==-
1
)
{
printf
(
"error opening SBL.DAB
\n
"
);
return
(
1
);
}
if
((
in
=
fdopen
(
i
,
"rb"
))
==
NULL
)
{
printf
(
"error opening SBL.DAB
\n
"
);
return
(
1
);
}
if
((
shrt
=
fopen
(
"SBBS.LST"
,
"wb"
))
==
NULL
)
{
printf
(
"error opening/creating SBBS.LST
\n
"
);
return
(
1
);
}
if
((
lng
=
fopen
(
"SBBS_DET.LST"
,
"wb"
))
==
NULL
)
{
printf
(
"error opening/creating SBBS_DET.LST
\n
"
);
return
(
1
);
}
fprintf
(
shrt
,
"Synchronet BBS List exported from Vertrauen on %s
\r\n
"
"======================================================="
"
\r\n\r\n
"
,
unixtodstr
(
time
(
NULL
),
str
));
fprintf
(
lng
,
"Detailed Synchronet BBS List exported from Vertrauen on %s
\r\n
"
"================================================================"
"
\r\n\r\n
"
,
unixtodstr
(
time
(
NULL
),
str
));
printf
(
"Sorting..."
);
fseek
(
in
,
0L
,
SEEK_SET
);
i
=
j
=
0
;
while
(
1
)
{
if
(
!
fread
(
&
bbs
,
sizeof
(
bbs_t
),
1
,
in
))
break
;
j
++
;
printf
(
"%4u
\b\b\b\b
"
,
j
);
if
(
!
bbs
.
name
[
0
]
||
strnicmp
(
bbs
.
software
,
"SYNCHRONET"
,
10
))
continue
;
i
++
;
strcpy
(
str
,
bbs
.
number
[
0
].
number
);
if
((
sortstr
=
(
sortstr_t
**
)
farrealloc
(
sortstr
,
sizeof
(
sortstr_t
*
)
*
i
))
==
NULL
)
{
printf
(
"
\r\n\7
Memory allocation error
\r\n
"
);
char
str
[
128
],
name
[
128
],
*
location
,
nodes
[
32
],
*
sysop
;
char
sysop_email
[
128
];
char
buf
[
256
];
char
verify_result
[
128
];
char
version
[
128
];
char
*
p
;
char
*
sp
;
char
*
tp
;
char
*
for_os
;
char
*
fontstr
=
"<FONT FACE=
\"
Arial
\"
SIZE=
\"
-1
\"
>"
;
char
telnet_addr_buf
[
128
];
char
*
telnet_addr
;
char
telnet_portstr
[
32
];
ushort
telnet_port
;
BOOL
verified
;
ushort
index
;
int
i
,
j
,
file
,
ff
,
rd
;
long
l
;
ulong
ip_addr
;
ulong
total_systems
;
ulong
total_attempts
=
0
;
ulong
total_verified
=
0
;
FILE
*
in
,
*
shrt
,
*
lng
,
*
html
;
bbs_t
bbs
;
sort_t
**
sort
=
NULL
;
time_t
now
;
/* socket stuff */
SOCKET
sock
;
SOCKADDR_IN
addr
;
int
status
;
/* Status Code */
WSADATA
WSAData
;
if
((
status
=
WSAStartup
(
MAKEWORD
(
1
,
1
),
&
WSAData
))
!=
0
)
{
printf
(
"!WinSock startup ERROR %d
\n
"
,
status
);
return
(
1
);
}
if
(
_putenv
(
"TZ=UCT0"
))
printf
(
"!putenv() FAILED"
);
tzset
();
now
=
time
(
NULL
);
if
((
i
=
_sopen
(
"SBL.DAB"
,
O_RDWR
|
O_BINARY
,
SH_DENYNO
,
S_IREAD
|
S_IWRITE
))
==-
1
)
{
printf
(
"error opening SBL.DAB
\n
"
);
return
(
1
);
}
if
((
sortstr
[
i
-
1
]
=
(
sortstr_t
*
)
farmalloc
(
sizeof
(
sortstr_t
)
))
==
NULL
)
{
printf
(
"
\r\n\7
Memory allocation error
\r
\n
"
);
if
((
in
=
fdopen
(
i
,
"rb"
))
==
NULL
)
{
printf
(
"
error opening SBL.DAB
\n
"
);
return
(
1
);
}
strcpy
(
sortstr
[
i
-
1
]
->
str
,
str
);
sortstr
[
i
-
1
]
->
offset
=
j
-
1
;
}
qsort
((
void
*
)
sortstr
,
i
,
sizeof
(
sortstr
[
0
])
,(
int
(
*
)(
const
void
*
,
const
void
*
))
sortstr_cmp
);
printf
(
"
\n
Creating index..."
);
sprintf
(
str
,
"SBBSSORT.NDX"
);
if
((
file
=
open
(
str
,
O_RDWR
|
O_CREAT
|
O_TRUNC
|
O_BINARY
,
S_IWRITE
|
S_IREAD
))
==-
1
)
{
printf
(
"
\n\7
Error creating %s
\n
"
,
str
);
return
(
1
);
}
for
(
j
=
0
;
j
<
i
;
j
++
)
write
(
file
,
&
sortstr
[
j
]
->
offset
,
2
);
printf
(
"
\n
"
);
lseek
(
file
,
0L
,
SEEK_SET
);
ff
=
0
;
while
(
1
)
{
if
(
read
(
file
,
&
i
,
2
)
!=
2
)
break
;
fseek
(
in
,(
long
)
i
*
sizeof
(
bbs_t
),
SEEK_SET
);
if
(
!
fread
(
&
bbs
,
sizeof
(
bbs_t
),
1
,
in
))
break
;
long_bbs_info
(
lng
,
bbs
);
if
(
ff
)
fprintf
(
lng
,
"
\x0c\r\n
"
);
else
fprintf
(
lng
,
"
\r\n
---------------------------------------------"
"----------------------------------
\r\n\r\n
"
);
ff
=!
ff
;
for
(
i
=
0
;
i
<
bbs
.
total_numbers
&&
i
<
MAX_NUMBERS
;
i
++
)
fprintf
(
shrt
,
"%-25.25s %-30.30s %12.12s %u
\r\n
"
,
i
?
""
:
bbs
.
name
,
bbs
.
number
[
i
].
location
,
bbs
.
number
[
i
].
number
,
bbs
.
number
[
i
].
max_rate
);
if
((
shrt
=
fopen
(
"SBBS.LST"
,
"wb"
))
==
NULL
)
{
printf
(
"error opening/creating SBBS.LST
\n
"
);
return
(
1
);
}
if
((
lng
=
fopen
(
"SBBS_DET.LST"
,
"wb"
))
==
NULL
)
{
printf
(
"error opening/creating SBBS_DET.LST
\n
"
);
return
(
1
);
}
if
((
html
=
fopen
(
"sbbslist.html"
,
"w"
))
==
NULL
)
{
printf
(
"error opening/creating sbbslist.html
\n
"
);
return
(
1
);
}
fprintf
(
shrt
,
"Synchronet BBS List exported from Vertrauen on %s
\r\n
"
"======================================================="
"
\r\n\r\n
"
,
unixtodstr
(
time
(
NULL
),
str
));
fprintf
(
lng
,
"Detailed Synchronet BBS List exported from Vertrauen on %s
\r\n
"
"================================================================"
"
\r\n\r\n
"
,
unixtodstr
(
time
(
NULL
),
str
));
fprintf
(
html
,
"<HTML><HEAD><TITLE>Synchronet BBS List</TITLE></HEAD>
\n
"
);
fprintf
(
html
,
"<BODY><FONT FACE=
\"
Arial
\"
SIZE=
\"
-1
\"
>
\n
"
);
printf
(
"Sorting..."
);
fseek
(
in
,
0L
,
SEEK_SET
);
i
=
j
=
0
;
while
(
1
)
{
if
(
!
fread
(
&
bbs
,
sizeof
(
bbs_t
),
1
,
in
))
break
;
j
++
;
printf
(
"%4u
\b\b\b\b
"
,
j
);
if
(
!
bbs
.
name
[
0
]
||
strnicmp
(
bbs
.
software
,
"SYNCHRONET"
,
10
))
{
// printf("%s\n",bbs.software);
continue
;
}
i
++
;
if
((
sort
=
(
sort_t
**
)
REALLOC
(
sort
,
sizeof
(
sort_t
*
)
*
i
))
==
NULL
)
{
printf
(
"
\r\n\7
Memory allocation error
\r\n
"
);
return
(
1
);
}
if
((
sort
[
i
-
1
]
=
(
sort_t
*
)
LMALLOC
(
sizeof
(
sort_t
)
))
==
NULL
)
{
printf
(
"
\r\n\7
Memory allocation error
\r\n
"
);
return
(
1
);
}
sort
[
i
-
1
]
->
date
=
bbs
.
verified
;
sort
[
i
-
1
]
->
count
=
bbs
.
verification_count
;
sort
[
i
-
1
]
->
attempts
=
bbs
.
verification_attempts
;
sort
[
i
-
1
]
->
offset
=
j
-
1
;
}
total_systems
=
i
;
#if SORT
qsort
((
void
*
)
sort
,
total_systems
,
sizeof
(
sort
[
0
])
,(
int
(
*
)(
const
void
*
,
const
void
*
))
sort_cmp
);
#endif
printf
(
" Done.
\n
"
);
printf
(
"Creating index..."
);
sprintf
(
str
,
"SBBSSORT.NDX"
);
if
((
file
=
open
(
str
,
O_RDWR
|
O_CREAT
|
O_TRUNC
|
O_BINARY
,
S_IWRITE
|
S_IREAD
))
==-
1
)
{
printf
(
"
\n\7
Error creating %s
\n
"
,
str
);
return
(
1
);
}
for
(
j
=
0
;
j
<
(
int
)
total_systems
;
j
++
)
write
(
file
,
&
sort
[
j
]
->
offset
,
2
);
lseek
(
file
,
0L
,
SEEK_SET
);
printf
(
" Done.
\n
"
);
printf
(
"Creating lists...
\n
"
);
fprintf
(
html
,
"<CENTER>"
);
fprintf
(
html
,
"<H1><I><A HREF=http://www.synchro.net>Synchronet"
"</A> BBS List</H1></I>
\n
"
);
fprintf
(
html
,
"(%d systems) exported from "
"<B><A HREF=http://vert.synchro.net>Vertrauen</A></B> on %s
\n
"
,
total_systems
,
timestr
(
&
now
));
fprintf
(
html
,
"<P></CENTER>
\n
"
);
fprintf
(
html
,
"<TABLE WIDTH=
\"
100%%
\"
>
\n
"
);
fprintf
(
html
,
"<COLGROUP ALIGN=LEFT><COLGROUP ALIGN=LEFT>"
"<COLGROUP ALIGN=CENTER><COLGROUP ALIGN=CENTER>"
"<COLGROUP ALIGN=RIGHT><COLGROUP ALIGN=CENTER>
\n
"
);
fprintf
(
html
,
"<TR BGCOLOR=
\"
#000000
\"
>
\n
"
);
fprintf
(
html
,
"<TH><FONT FACE=
\"
Arial
\"
SIZE=
\"
-1
\"
COLOR=
\"
#FFFFFF
\"
>BBS Name
\n
"
);
fprintf
(
html
,
"<TH><FONT FACE=
\"
Arial
\"
SIZE=
\"
-1
\"
COLOR=
\"
#FFFFFF
\"
>Sysop
\n
"
);
fprintf
(
html
,
"<TH><FONT FACE=
\"
Arial
\"
SIZE=
\"
-1
\"
COLOR=
\"
#FFFFFF
\"
>Location
\n
"
);
fprintf
(
html
,
"<TH><FONT FACE=
\"
Arial
\"
SIZE=
\"
-1
\"
COLOR=
\"
#FFFFFF
\"
>Nodes
\n
"
);
fprintf
(
html
,
"<TH><FONT FACE=
\"
Arial
\"
SIZE=
\"
-1
\"
COLOR=
\"
#FFFFFF
\"
>Modem/Telnet Address
\n
"
);
fprintf
(
html
,
"<TH><FONT FACE=
\"
Arial
\"
SIZE=
\"
-1
\"
COLOR=
\"
#FFFFFF
\"
>Verification Results
\n
"
);
ff
=
0
;
while
(
1
)
{
if
(
read
(
file
,
&
index
,
2
)
!=
2
)
break
;
fseek
(
in
,(
long
)
index
*
sizeof
(
bbs_t
),
SEEK_SET
);
if
(
!
fread
(
&
bbs
,
sizeof
(
bbs_t
),
1
,
in
))
break
;
long_bbs_info
(
lng
,
bbs
);
if
(
ff
)
fprintf
(
lng
,
"
\x0c\r\n
"
);
else
fprintf
(
lng
,
"
\r\n
---------------------------------------------"
"----------------------------------
\r\n\r\n
"
);
ff
=!
ff
;
verified
=
FALSE
;
total_attempts
++
;
for
(
i
=
0
;
i
<
bbs
.
total_numbers
&&
i
<
MAX_NUMBERS
;
i
++
)
{
if
(
!
i
)
{
if
(
bbs
.
sysop_email
[
0
])
{
sprintf
(
sysop_email
,
"<A HREF=mailto:%s>%s</A>"
,
bbs
.
sysop_email
,
bbs
.
sysop
[
0
]);
sysop
=
sysop_email
;
}
else
sysop
=
bbs
.
sysop
[
0
];
sprintf
(
nodes
,
"%u"
,
bbs
.
nodes
);
}
else
{
sysop
=
""
;
nodes
[
0
]
=
0
;
}
if
(
i
&&
!
stricmp
(
bbs
.
number
[
i
].
modem
.
number
,
bbs
.
number
[
i
-
1
].
modem
.
number
))
continue
;
// duplicate
if
(
i
&&
!
stricmp
(
bbs
.
number
[
i
].
modem
.
location
,
bbs
.
number
[
i
-
1
].
modem
.
location
))
location
=
""
;
else
location
=
bbs
.
number
[
i
].
modem
.
location
;
fprintf
(
shrt
,
"%-25.25s %-25.25s %s
\r\n
"
,
i
?
""
:
bbs
.
name
,
location
,
bbs
.
number
[
i
].
modem
.
number
);
if
(
!
i
)
{
fprintf
(
html
,
"<A NAME=
\"
%s.index
\"
>"
,
bbs
.
name
);
fprintf
(
html
,
"<TR BGCOLOR=
\"
#EEEEEE
\"
>"
);
}
else
fprintf
(
html
,
"<TR>"
);
sprintf
(
name
,
"<A HREF=
\"
#%s
\"
>%s</A>"
,
bbs
.
name
,
bbs
.
name
);
if
(
bbs
.
number
[
i
].
modem
.
min_rate
==
0xffff
/* && bbs.name[0]=='E' */
)
{
telnet_port
=
bbs
.
number
[
i
].
telnet
.
port
;
if
(
telnet_port
==
0
)
telnet_port
=
23
;
strcpy
(
telnet_addr_buf
,
bbs
.
number
[
i
].
telnet
.
addr
);
telnet_addr
=
telnet_addr_buf
;
if
(
!
strnicmp
(
telnet_addr
,
"TELNET:"
,
7
))
telnet_addr
+=
7
;
if
(
!
strnicmp
(
telnet_addr
,
"//"
,
2
))
telnet_addr
+=
2
;
p
=
strchr
(
telnet_addr
,
':'
);
if
(
p
!=
NULL
)
{
*
p
=
0
;
telnet_port
=
atoi
(
p
+
1
);
}
#if !VERIFY
/* set to 1 for no-verification */
verified
=
TRUE
;
strcpy
(
verify_result
,
"<B>v3.00x for Win32</B>"
);
#else
printf
(
"Verifying %d/%d %s:%d "
,
total_attempts
,
total_systems
,
telnet_addr
,
telnet_port
);
ip_addr
=
resolve_ip
(
telnet_addr
);
if
(
!
ip_addr
)
strcpy
(
verify_result
,
"bad hostname"
);
else
{
if
((
sock
=
socket
(
AF_INET
,
SOCK_STREAM
,
IPPROTO_IP
))
==
INVALID_SOCKET
)
{
printf
(
"
\n\7
Error %d opening socket"
,
ERROR_VALUE
);
return
(
1
);
}
memset
(
&
addr
,
0
,
sizeof
(
addr
));
addr
.
sin_family
=
AF_INET
;
if
(
bind
(
sock
,
(
struct
sockaddr
*
)
&
addr
,
sizeof
(
addr
))
!=
0
)
{
closesocket
(
sock
);
printf
(
"!ERROR %d binding to socket %d"
,
ERROR_VALUE
,
sock
);
return
(
1
);
}
memset
(
&
addr
,
0
,
sizeof
(
addr
));
addr
.
sin_addr
.
S_un
.
S_addr
=
ip_addr
;
addr
.
sin_family
=
AF_INET
;
addr
.
sin_port
=
htons
(
telnet_port
);
if
(
connect
(
sock
,
(
struct
sockaddr
*
)
&
addr
,
sizeof
(
addr
))
!=
0
)
sprintf
(
verify_result
,
"no connect (%ld)"
,
ERROR_VALUE
);
else
{
l
=
1
;
ioctlsocket
(
sock
,
FIONBIO
,
&
l
);
Sleep
(
3000
);
buf
[
0
]
=
0
;
rd
=
recv
(
sock
,
buf
,
sizeof
(
buf
)
-
1
,
0
);
if
((
rd
=
telnet_negotiate
(
sock
,
buf
,
rd
,
sizeof
(
buf
)
-
1
))
<
1
)
sprintf
(
verify_result
,
"no data (%ld)"
,
rd
==
SOCKET_ERROR
?
ERROR_VALUE
:
rd
);
else
{
buf
[
rd
]
=
0
;
sp
=
buf
+
(
rd
-
1
);
while
(
*
sp
&&
sp
!=
buf
)
sp
--
;
// Skip garbage (with null)
if
(
*
sp
==
0
)
sp
++
;
p
=
strstr
(
sp
,
"Synchronet"
);
if
(
p
!=
NULL
)
{
verified
=
TRUE
;
for_os
=
strstr
(
sp
,
" for "
);
if
(
for_os
==
NULL
)
for_os
=
""
;
p
=
strstr
(
sp
,
"Version "
);
if
(
p
==
NULL
)
version
[
0
]
=
0
;
else
{
p
+=
8
;
tp
=
strchr
(
p
,
'\r'
);
if
(
tp
!=
NULL
)
*
tp
=
0
;
truncsp
(
p
);
for_os
[
11
]
=
0
;
truncsp
(
for_os
);
sprintf
(
version
,
"v%s%s"
,
p
,
for_os
);
}
sprintf
(
verify_result
,
"<B>%s</B>"
,
version
[
0
]
?
version
:
"Verified"
);
}
else
{
printf
(
"rd=%d buf='%s' sp='%s'
\n
"
,
rd
,
buf
,
sp
);
sprintf
(
verify_result
,
"non-Synchronet"
);
}
}
}
closesocket
(
sock
);
}
printf
(
"%s
\n
"
,
verify_result
);
bbs
.
verification_attempts
++
;
#endif
if
(
telnet_port
==
23
)
telnet_portstr
[
0
]
=
0
;
else
sprintf
(
telnet_portstr
,
":%d"
,
telnet_port
);
fprintf
(
html
,
"<TD><B>%s%s</B><TD>%s%s<TD>%s%s<TD>%s%s<TD%s>"
"<A HREF=telnet://%s%s>%s%s%s%s%s</A><TD%s>%s%s
\n
"
,
fontstr
,
i
?
""
:
name
,
fontstr
,
sysop
,
fontstr
,
location
,
fontstr
,
nodes
,
i
?
" BGCOLOR=
\"
#EEEEEE
\"
"
:
""
,
telnet_addr
,
telnet_portstr
,
fontstr
,
verified
?
"<B>"
:
""
,
telnet_addr
,
telnet_portstr
,
verified
?
"</B>"
:
""
,
i
?
" BGCOLOR=
\"
#EEEEEE
\"
"
:
""
,
fontstr
,
verify_result
);
}
else
fprintf
(
html
,
"<TD><B>%s%s</B><TD>%s%s<TD>%s%s<TD>%s%s<TD%s>%s%s"
"<TD%s>%s%s
\n
"
,
fontstr
,
i
?
""
:
name
,
fontstr
,
sysop
,
fontstr
,
location
,
fontstr
,
nodes
,
i
?
" BGCOLOR=
\"
#EEEEEE
\"
"
:
""
,
fontstr
,
bbs
.
number
[
i
].
modem
.
number
,
i
?
" BGCOLOR=
\"
#EEEEEE
\"
"
:
""
,
fontstr
,
"N/A"
);
}
/* for(numbers) */
#if VERIFY
if
(
verified
)
{
total_verified
++
;
bbs
.
verified
=
time
(
NULL
);
bbs
.
verification_count
++
;
strcpy
(
bbs
.
userverified
,
"SBBS List Verifier"
);
}
fseek
(
in
,(
long
)
index
*
sizeof
(
bbs_t
),
SEEK_SET
);
fwrite
(
&
bbs
,
sizeof
(
bbs_t
),
1
,
in
);
#endif
}
fprintf
(
html
,
"</TABLE>
\n
"
);
now
=
time
(
NULL
);
fprintf
(
html
,
"<CENTER>
\n
"
);
fprintf
(
html
,
"%d systems verified from "
"<B><A HREF=http://vert.synchro.net>Vertrauen</A></B> on %s
\n
"
,
total_verified
,
timestr
(
&
now
));
fprintf
(
html
,
"<H1><I>Detailed Synchronet BBS List</I></H1>
\n
"
);
fprintf
(
html
,
"</CENTER>
\n
"
);
/* Generate Detailed List */
lseek
(
file
,
0L
,
SEEK_SET
);
while
(
1
)
{
if
(
read
(
file
,
&
index
,
2
)
!=
2
)
break
;
fseek
(
in
,(
long
)
index
*
sizeof
(
bbs_t
),
SEEK_SET
);
if
(
!
fread
(
&
bbs
,
sizeof
(
bbs_t
),
1
,
in
))
break
;
fprintf
(
html
,
"<P><A NAME=
\"
%s
\"
>
\n
"
,
bbs
.
name
);
fprintf
(
html
,
"<H2><A HREF=
\"
#%s.index
\"
>%s</A></H2>"
,
bbs
.
name
,
bbs
.
name
);
fprintf
(
html
,
"<FONT FACE=
\"
Arial
\"
SIZE=
\"
-1
\"
>
\n
"
);
fprintf
(
html
,
"Online since: %s<BR>
\n
"
,
unixtodstr
(
bbs
.
birth
,
tmp
));
if
(
bbs
.
sysop_email
[
0
])
{
sprintf
(
sysop_email
,
"<A HREF=mailto:%s>%s</A>"
,
bbs
.
sysop_email
,
bbs
.
sysop
[
0
]);
sysop
=
sysop_email
;
}
else
sysop
=
bbs
.
sysop
[
0
];
fprintf
(
html
,
"Operator: %s"
,
sysop
);
for
(
i
=
1
;
i
<
bbs
.
total_sysops
&&
i
<
MAX_SYSOPS
;
i
++
)
{
if
(
bbs
.
total_sysops
>
2
)
fprintf
(
html
,
", "
);
else
fputc
(
SP
,
html
);
if
(
i
+
1
==
bbs
.
total_sysops
)
fprintf
(
html
,
"and "
);
fprintf
(
html
,
"%s"
,
bbs
.
sysop
[
i
]);
}
fprintf
(
html
,
"<BR>
\n
"
);
if
(
bbs
.
web_url
[
0
])
fprintf
(
html
,
"Web-site: <A HREF=http://%s>%s</A><BR>
\n
"
,
bbs
.
web_url
,
bbs
.
web_url
);
fprintf
(
html
,
"Nodes: %u, "
"Users: %u, Doors: %u<BR>
\n
"
,
bbs
.
nodes
,
bbs
.
users
,
bbs
.
xtrns
);
fprintf
(
html
,
"Download: %lu files in %u directories of "
"%luMB total space<BR>
\n
"
,
bbs
.
files
,
bbs
.
dirs
,
bbs
.
megs
);
fprintf
(
html
,
"Messages: %lu messages in %u sub-boards<BR>
\n
"
,
bbs
.
msgs
,
bbs
.
subs
);
if
(
bbs
.
total_networks
)
{
fprintf
(
html
,
"Networks: "
);
for
(
i
=
0
;
i
<
bbs
.
total_networks
&&
i
<
MAX_NETS
;
i
++
)
{
if
(
i
)
{
if
(
bbs
.
total_networks
>
2
)
fprintf
(
html
,
", "
);
else
fputc
(
SP
,
html
);
if
(
!
(
i
%
2
))
fprintf
(
html
,
"<BR>"
);
if
(
i
+
1
==
bbs
.
total_networks
)
fprintf
(
html
,
"and "
);
}
fprintf
(
html
,
"%s [%s]"
,
bbs
.
network
[
i
],
bbs
.
address
[
i
]);
}
fprintf
(
html
,
"<BR>
\n
"
);
}
if
(
bbs
.
total_terminals
)
{
fprintf
(
html
,
"Terminal: "
);
for
(
i
=
0
;
i
<
bbs
.
total_terminals
&&
i
<
MAX_TERMS
;
i
++
)
{
if
(
i
)
{
if
(
bbs
.
total_terminals
>
2
)
fprintf
(
html
,
", "
);
else
fputc
(
SP
,
html
);
if
(
i
+
1
==
bbs
.
total_terminals
)
fprintf
(
html
,
"and "
);
}
fprintf
(
html
,
"%s"
,
bbs
.
terminal
[
i
]);
}
fprintf
(
html
,
"<BR>
\n
"
);
}
fprintf
(
html
,
"<BR>
\n
"
);
for
(
i
=
0
;
i
<
bbs
.
total_numbers
&&
i
<
MAX_NUMBERS
;
i
++
)
{
if
(
bbs
.
number
[
i
].
modem
.
min_rate
==
0xffff
)
{
telnet_port
=
bbs
.
number
[
i
].
telnet
.
port
;
if
(
telnet_port
==
0
)
telnet_port
=
23
;
strcpy
(
telnet_addr_buf
,
bbs
.
number
[
i
].
telnet
.
addr
);
telnet_addr
=
telnet_addr_buf
;
if
(
!
strnicmp
(
telnet_addr
,
"TELNET:"
,
7
))
telnet_addr
+=
7
;
if
(
!
strnicmp
(
telnet_addr
,
"//"
,
2
))
telnet_addr
+=
2
;
p
=
strchr
(
telnet_addr
,
':'
);
if
(
p
!=
NULL
)
{
*
p
=
0
;
telnet_port
=
atoi
(
p
+
1
);
}
if
(
telnet_port
==
23
)
telnet_portstr
[
0
]
=
0
;
else
sprintf
(
telnet_portstr
,
":%d"
,
telnet_port
);
fprintf
(
html
,
"<A HREF=telnet://%s%s>telnet://%s%s</A>"
,
telnet_addr
,
telnet_portstr
,
telnet_addr
,
telnet_portstr
);
}
else
fprintf
(
html
,
"%s %u %s "
"Minimum: %u"
,
bbs
.
number
[
i
].
modem
.
number
,
bbs
.
number
[
i
].
modem
.
max_rate
,
bbs
.
number
[
i
].
modem
.
desc
,
bbs
.
number
[
i
].
modem
.
min_rate
);
fprintf
(
html
,
" %s<BR>
\n
"
,
i
&&
!
strcmp
(
bbs
.
number
[
i
].
modem
.
location
,
bbs
.
number
[
i
-
1
].
modem
.
location
)
?
nulstr
:
bbs
.
number
[
i
].
modem
.
location
);
}
fprintf
(
html
,
"<BR>
\n
"
);
fprintf
(
html
,
"<BLOCKQUOTE>
\n
"
);
for
(
i
=
0
;
i
<
5
;
i
++
)
{
if
(
!
bbs
.
desc
[
i
][
0
])
break
;
fprintf
(
html
,
"%s<BR>
\n
"
,
bbs
.
desc
[
i
]);
}
fprintf
(
html
,
"</BLOCKQUOTE>
\n
"
);
fprintf
(
html
,
"<PRE>
\n
"
);
fprintf
(
html
,
"Entry created on %s by %s
\n
"
,
timestr
(
&
bbs
.
created
),
bbs
.
user
);
if
(
bbs
.
updated
&&
bbs
.
userupdated
[
0
])
fprintf
(
html
,
" Last updated on %s by %s
\n
"
,
timestr
(
&
bbs
.
updated
),
bbs
.
userupdated
);
if
(
bbs
.
verified
&&
bbs
.
userverified
[
0
])
fprintf
(
html
,
"Last verified on %s by %s
\n
"
,
timestr
(
&
bbs
.
verified
),
bbs
.
userverified
);
fprintf
(
html
,
"</PRE></P>
\n
"
);
}
fprintf
(
html
,
"<CENTER><H1>End</H1></CENTER>
\n
"
);
fprintf
(
html
,
"<P>If you are a sysop of a <B>Synchronet BBS</B> and you would "
"like to add your system to this list, please do one of the following:
\n
"
);
fprintf
(
html
,
"<UL>
\n
"
);
fprintf
(
html
,
"<LI>Install <I>Synchronet BBS List <B>v2.00+</B></I> on your BBS and "
"link it into the <B>SYNCDATA</B> message conference (on <B>DOVE-Net</B> or <B>FidoNet</B>)
\n
"
);
fprintf
(
html
,
"<LI><B>OR</B> log on to <A HREF=telnet://vert.synchro.net>Vertrauen</A> and "
"manually add your system into the online BBS List database.
\n
"
);
fprintf
(
html
,
"</UL>
\n
"
);
fprintf
(
html
,
"</BODY></HTML>
\n
"
);
printf
(
" Done.
\n
"
);
return
(
0
);
}
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