Linux sagir-us1.hostever.us 5.14.0-570.51.1.el9_6.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Oct 8 09:41:34 EDT 2025 x86_64
LiteSpeed
Server IP : 104.247.108.91 & Your IP : 216.73.216.105
Domains : 74 Domain
User : georgeto
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
usr /
local /
apps /
lib /
imap /
c-client /
Delete
Unzip
Name
Size
Permission
Date
Action
ARCHIVE
258
B
-rw-r--r--
2023-01-11 06:22
CCTYPE
3
B
-rw-r--r--
2023-01-11 06:22
CFLAGS
74
B
-rw-r--r--
2023-01-11 06:22
LDFLAGS
118
B
-rw-r--r--
2023-01-11 06:22
Makefile
31.74
KB
-rw-r--r--
2023-01-11 06:22
Makefile.gss
1.28
KB
-rw-r--r--
2023-01-11 06:22
OSCFLAGS
535
B
-rw-r--r--
2023-01-11 06:22
OSTYPE
4
B
-rw-r--r--
2023-01-11 06:22
SPECIALS
1
B
-rw-r--r--
2023-01-11 06:22
auth_ext.c
2.88
KB
-rw-r--r--
2023-01-11 06:22
auth_gss.c
14.25
KB
-rw-r--r--
2023-01-11 06:22
auth_log.c
3.42
KB
-rw-r--r--
2023-01-11 06:22
auth_md5.c
16.71
KB
-rw-r--r--
2023-01-11 06:22
auth_pla.c
4.32
KB
-rw-r--r--
2023-01-11 06:22
auths.c
88
B
-rw-r--r--
2023-01-11 06:22
big5.c
111.09
KB
-rw-r--r--
2023-01-11 06:22
c-client.a
3.91
MB
-rw-r--r--
2023-01-11 06:22
c-client.h
1.65
KB
-rw-r--r--
2023-01-11 06:22
ckp_1st.c
1.48
KB
-rw-r--r--
2023-01-11 06:22
ckp_2nd.c
888
B
-rw-r--r--
2023-01-11 06:22
ckp_3rd.c
816
B
-rw-r--r--
2023-01-11 06:22
ckp_a41.c
1.41
KB
-rw-r--r--
2023-01-11 06:22
ckp_afs.c
1.84
KB
-rw-r--r--
2023-01-11 06:22
ckp_bsi.c
1.38
KB
-rw-r--r--
2023-01-11 06:22
ckp_cyg.c
1.75
KB
-rw-r--r--
2023-01-11 06:22
ckp_dce.c
2.56
KB
-rw-r--r--
2023-01-11 06:22
ckp_gss.c
3.01
KB
-rw-r--r--
2023-01-11 06:22
ckp_nul.c
1.04
KB
-rw-r--r--
2023-01-11 06:22
ckp_os4.c
2.11
KB
-rw-r--r--
2023-01-11 06:22
ckp_pam.c
3.99
KB
-rw-r--r--
2023-01-11 06:22
ckp_pmb.c
3.82
KB
-rw-r--r--
2023-01-11 06:22
ckp_psx.c
3.6
KB
-rw-r--r--
2023-01-11 06:22
ckp_sce.c
1.58
KB
-rw-r--r--
2023-01-11 06:22
ckp_sec.c
1.54
KB
-rw-r--r--
2023-01-11 06:22
ckp_ssn.c
1.58
KB
-rw-r--r--
2023-01-11 06:22
ckp_std.c
1.16
KB
-rw-r--r--
2023-01-11 06:22
ckp_sv4.c
3.17
KB
-rw-r--r--
2023-01-11 06:22
ckp_svo.c
3.11
KB
-rw-r--r--
2023-01-11 06:22
ckp_ult.c
1.07
KB
-rw-r--r--
2023-01-11 06:22
cns11643.c
505.24
KB
-rw-r--r--
2023-01-11 06:22
crexcl.c
2.44
KB
-rw-r--r--
2023-01-11 06:22
crx_nfs.c
2.44
KB
-rw-r--r--
2023-01-11 06:22
crx_std.c
1.21
KB
-rw-r--r--
2023-01-11 06:22
decomtab.c
163.37
KB
-rw-r--r--
2023-01-11 06:22
drivers
989
B
-rwxr-xr-x
2023-01-11 06:22
dummy.c
24.66
KB
-rw-r--r--
2023-01-11 06:22
dummy.h
1.49
KB
-rw-r--r--
2023-01-11 06:22
dummy.o
84.54
KB
-rw-r--r--
2023-01-11 06:22
env.h
1.47
KB
-rw-r--r--
2023-01-11 06:22
env_unix.c
61.15
KB
-rw-r--r--
2023-01-11 06:22
env_unix.h
2.86
KB
-rw-r--r--
2023-01-11 06:22
fdstring.c
2.76
KB
-rw-r--r--
2023-01-11 06:22
fdstring.h
1.05
KB
-rw-r--r--
2023-01-11 06:22
fdstring.o
7.73
KB
-rw-r--r--
2023-01-11 06:22
flockcyg.c
2.99
KB
-rw-r--r--
2023-01-11 06:22
flockcyg.h
1.34
KB
-rw-r--r--
2023-01-11 06:22
flocklnx.c
2.27
KB
-rw-r--r--
2023-01-11 06:22
flocksim.c
28.21
KB
-rw-r--r--
2023-01-11 06:22
flocksim.h
4.29
KB
-rw-r--r--
2023-01-11 06:22
flstring.c
2.37
KB
-rw-r--r--
2023-01-11 06:22
flstring.h
799
B
-rw-r--r--
2023-01-11 06:22
flstring.o
8.38
KB
-rw-r--r--
2023-01-11 06:22
fs.h
905
B
-rw-r--r--
2023-01-11 06:22
fs_unix.c
1.84
KB
-rw-r--r--
2023-01-11 06:22
fsync.c
910
B
-rw-r--r--
2023-01-11 06:22
ftl.h
825
B
-rw-r--r--
2023-01-11 06:22
ftl_unix.c
1002
B
-rw-r--r--
2023-01-11 06:22
gb_12345.c
64.81
KB
-rw-r--r--
2023-01-11 06:22
gb_2312.c
179.47
KB
-rw-r--r--
2023-01-11 06:22
gethstid.c
975
B
-rw-r--r--
2023-01-11 06:22
getspnam.c
1.55
KB
-rw-r--r--
2023-01-11 06:22
gr_wait.c
1.27
KB
-rw-r--r--
2023-01-11 06:22
gr_wait4.c
1.06
KB
-rw-r--r--
2023-01-11 06:22
gr_waitp.c
1.06
KB
-rw-r--r--
2023-01-11 06:22
ibm.c
16.66
KB
-rw-r--r--
2023-01-11 06:22
imap4r1.c
193.18
KB
-rw-r--r--
2023-01-11 06:22
imap4r1.h
8.01
KB
-rw-r--r--
2023-01-11 06:22
imap4r1.o
440.85
KB
-rw-r--r--
2023-01-11 06:22
ip4_unix.c
5.13
KB
-rw-r--r--
2023-01-11 06:22
ip6_unix.c
8.54
KB
-rw-r--r--
2023-01-11 06:22
ip_unix.c
5.13
KB
-rw-r--r--
2023-01-11 06:22
ipo_unix.c
5.04
KB
-rw-r--r--
2023-01-11 06:22
iso_8859.c
13.88
KB
-rw-r--r--
2023-01-11 06:22
jis_0208.c
62.77
KB
-rw-r--r--
2023-01-11 06:22
jis_0212.c
55.8
KB
-rw-r--r--
2023-01-11 06:22
kerb_mit.c
3
KB
-rw-r--r--
2023-01-11 06:22
koi8_r.c
1.76
KB
-rw-r--r--
2023-01-11 06:22
koi8_u.c
1.77
KB
-rw-r--r--
2023-01-11 06:22
ksc_5601.c
178.16
KB
-rw-r--r--
2023-01-11 06:22
linkage.c
1.2
KB
-rw-r--r--
2023-01-11 06:22
linkage.h
510
B
-rw-r--r--
2023-01-11 06:22
log_bsi.c
1.54
KB
-rw-r--r--
2023-01-11 06:22
log_cyg.c
1.24
KB
-rw-r--r--
2023-01-11 06:22
log_old.c
1.01
KB
-rw-r--r--
2023-01-11 06:22
log_os4.c
1.62
KB
-rw-r--r--
2023-01-11 06:22
log_sec.c
1.14
KB
-rw-r--r--
2023-01-11 06:22
log_std.c
1.12
KB
-rw-r--r--
2023-01-11 06:22
log_sv4.c
1.1
KB
-rw-r--r--
2023-01-11 06:22
mail.c
201.99
KB
-rw-r--r--
2023-01-11 06:22
mail.h
66.8
KB
-rw-r--r--
2023-01-11 06:22
mail.o
426.63
KB
-rw-r--r--
2023-01-11 06:22
mbx.c
61.93
KB
-rw-r--r--
2023-01-11 06:22
mbx.o
153.46
KB
-rw-r--r--
2023-01-11 06:22
memmove.c
993
B
-rw-r--r--
2023-01-11 06:22
memmove2.c
1.32
KB
-rw-r--r--
2023-01-11 06:22
memset.c
1010
B
-rw-r--r--
2023-01-11 06:22
mh.c
39.67
KB
-rw-r--r--
2023-01-11 06:22
mh.o
118.7
KB
-rw-r--r--
2023-01-11 06:22
misc.c
13.34
KB
-rw-r--r--
2023-01-11 06:22
misc.h
3.27
KB
-rw-r--r--
2023-01-11 06:22
misc.o
26.76
KB
-rw-r--r--
2023-01-11 06:22
mix.c
92.52
KB
-rw-r--r--
2023-01-11 06:22
mix.o
237.31
KB
-rw-r--r--
2023-01-11 06:22
mkauths
1.18
KB
-rwxr-xr-x
2023-01-11 06:22
mmdf.c
89.34
KB
-rw-r--r--
2023-01-11 06:22
mmdf.o
179.64
KB
-rw-r--r--
2023-01-11 06:22
mtx.c
45.09
KB
-rw-r--r--
2023-01-11 06:22
mtx.o
120.16
KB
-rw-r--r--
2023-01-11 06:22
mx.c
39.05
KB
-rw-r--r--
2023-01-11 06:22
mx.o
117.3
KB
-rw-r--r--
2023-01-11 06:22
netmsg.c
2.88
KB
-rw-r--r--
2023-01-11 06:22
netmsg.h
987
B
-rw-r--r--
2023-01-11 06:22
netmsg.o
13.83
KB
-rw-r--r--
2023-01-11 06:22
news.c
21.78
KB
-rw-r--r--
2023-01-11 06:22
news.o
70.97
KB
-rw-r--r--
2023-01-11 06:22
newsrc.c
16.67
KB
-rw-r--r--
2023-01-11 06:22
newsrc.h
1.45
KB
-rw-r--r--
2023-01-11 06:22
newsrc.o
59.16
KB
-rw-r--r--
2023-01-11 06:22
nl.h
939
B
-rw-r--r--
2023-01-11 06:22
nl_unix.c
2.56
KB
-rw-r--r--
2023-01-11 06:22
nntp.c
74.66
KB
-rw-r--r--
2023-01-11 06:22
nntp.h
1.58
KB
-rw-r--r--
2023-01-11 06:22
nntp.o
177.67
KB
-rw-r--r--
2023-01-11 06:22
opendir.c
1.94
KB
-rw-r--r--
2023-01-11 06:22
os_a32.c
1.44
KB
-rw-r--r--
2023-01-11 06:22
os_a32.h
1.2
KB
-rw-r--r--
2023-01-11 06:22
os_a41.c
1.53
KB
-rw-r--r--
2023-01-11 06:22
os_a41.h
1.2
KB
-rw-r--r--
2023-01-11 06:22
os_a52.c
1.57
KB
-rw-r--r--
2023-01-11 06:22
os_a52.h
1.27
KB
-rw-r--r--
2023-01-11 06:22
os_aix.c
1.5
KB
-rw-r--r--
2023-01-11 06:22
os_aix.h
1.1
KB
-rw-r--r--
2023-01-11 06:22
os_aos.c
1.5
KB
-rw-r--r--
2023-01-11 06:22
os_aos.h
1.26
KB
-rw-r--r--
2023-01-11 06:22
os_art.c
2.13
KB
-rw-r--r--
2023-01-11 06:22
os_art.h
2.01
KB
-rw-r--r--
2023-01-11 06:22
os_asv.c
1.7
KB
-rw-r--r--
2023-01-11 06:22
os_asv.h
1.91
KB
-rw-r--r--
2023-01-11 06:22
os_aux.c
1.51
KB
-rw-r--r--
2023-01-11 06:22
os_aux.h
1.18
KB
-rw-r--r--
2023-01-11 06:22
os_bsd.c
1.5
KB
-rw-r--r--
2023-01-11 06:22
os_bsd.h
1.33
KB
-rw-r--r--
2023-01-11 06:22
os_bsf.c
1.33
KB
-rw-r--r--
2023-01-11 06:22
os_bsf.h
1.05
KB
-rw-r--r--
2023-01-11 06:22
os_bsi.c
1.33
KB
-rw-r--r--
2023-01-11 06:22
os_bsi.h
1.03
KB
-rw-r--r--
2023-01-11 06:22
os_cvx.c
1.38
KB
-rw-r--r--
2023-01-11 06:22
os_cvx.h
1.09
KB
-rw-r--r--
2023-01-11 06:22
os_cyg.c
1.61
KB
-rw-r--r--
2023-01-11 06:22
os_cyg.h
1.6
KB
-rw-r--r--
2023-01-11 06:22
os_d-g.c
1.32
KB
-rw-r--r--
2023-01-11 06:22
os_d-g.h
1.35
KB
-rw-r--r--
2023-01-11 06:22
os_do4.c
1.4
KB
-rw-r--r--
2023-01-11 06:22
os_do4.h
1.23
KB
-rw-r--r--
2023-01-11 06:22
os_drs.c
1.39
KB
-rw-r--r--
2023-01-11 06:22
os_drs.h
1.42
KB
-rw-r--r--
2023-01-11 06:22
os_dyn.c
1.53
KB
-rw-r--r--
2023-01-11 06:22
os_dyn.h
1.5
KB
-rw-r--r--
2023-01-11 06:22
os_hpp.c
1.89
KB
-rw-r--r--
2023-01-11 06:22
os_hpp.h
1.36
KB
-rw-r--r--
2023-01-11 06:22
os_isc.c
1.65
KB
-rw-r--r--
2023-01-11 06:22
os_isc.h
1.68
KB
-rw-r--r--
2023-01-11 06:22
os_lnx.c
1.35
KB
-rw-r--r--
2023-01-11 06:22
os_lnx.h
1.45
KB
-rw-r--r--
2023-01-11 06:22
os_lyn.c
1.32
KB
-rw-r--r--
2023-01-11 06:22
os_lyn.h
1.03
KB
-rw-r--r--
2023-01-11 06:22
os_mct.c
1.29
KB
-rw-r--r--
2023-01-11 06:22
os_mct.h
1.05
KB
-rw-r--r--
2023-01-11 06:22
os_mnt.c
1.3
KB
-rw-r--r--
2023-01-11 06:22
os_mnt.h
1.18
KB
-rw-r--r--
2023-01-11 06:22
os_nto.c
1.84
KB
-rw-r--r--
2023-01-11 06:22
os_nto.h
1.64
KB
-rw-r--r--
2023-01-11 06:22
os_nxt.c
1.32
KB
-rw-r--r--
2023-01-11 06:22
os_nxt.h
1.18
KB
-rw-r--r--
2023-01-11 06:22
os_os4.c
1.38
KB
-rw-r--r--
2023-01-11 06:22
os_os4.h
1.17
KB
-rw-r--r--
2023-01-11 06:22
os_osf.c
1.35
KB
-rw-r--r--
2023-01-11 06:22
os_osf.h
1.17
KB
-rw-r--r--
2023-01-11 06:22
os_osx.c
1.33
KB
-rw-r--r--
2023-01-11 06:22
os_osx.h
1.26
KB
-rw-r--r--
2023-01-11 06:22
os_ptx.c
2.88
KB
-rw-r--r--
2023-01-11 06:22
os_ptx.h
1.7
KB
-rw-r--r--
2023-01-11 06:22
os_pyr.c
1.49
KB
-rw-r--r--
2023-01-11 06:22
os_pyr.h
1.42
KB
-rw-r--r--
2023-01-11 06:22
os_qnx.c
1.87
KB
-rw-r--r--
2023-01-11 06:22
os_qnx.h
1.42
KB
-rw-r--r--
2023-01-11 06:22
os_s40.c
1.58
KB
-rw-r--r--
2023-01-11 06:22
os_s40.h
957
B
-rw-r--r--
2023-01-11 06:22
os_sc5.c
1.56
KB
-rw-r--r--
2023-01-11 06:22
os_sc5.h
1.72
KB
-rw-r--r--
2023-01-11 06:22
os_sco.c
1.62
KB
-rw-r--r--
2023-01-11 06:22
os_sco.h
1.76
KB
-rw-r--r--
2023-01-11 06:22
os_sgi.c
1.38
KB
-rw-r--r--
2023-01-11 06:22
os_sgi.h
1.36
KB
-rw-r--r--
2023-01-11 06:22
os_shp.c
1.94
KB
-rw-r--r--
2023-01-11 06:22
os_shp.h
1.36
KB
-rw-r--r--
2023-01-11 06:22
os_slx.c
1.43
KB
-rw-r--r--
2023-01-11 06:22
os_slx.h
1.45
KB
-rw-r--r--
2023-01-11 06:22
os_sol.c
1.67
KB
-rw-r--r--
2023-01-11 06:22
os_soln.h
1.93
KB
-rw-r--r--
2023-01-11 06:22
os_solo.h
1.9
KB
-rw-r--r--
2023-01-11 06:22
os_sos.c
1.39
KB
-rw-r--r--
2023-01-11 06:22
os_sos.h
1.17
KB
-rw-r--r--
2023-01-11 06:22
os_sua.c
1.33
KB
-rw-r--r--
2023-01-11 06:22
os_sua.h
1.16
KB
-rw-r--r--
2023-01-11 06:22
os_sun.c
1.58
KB
-rw-r--r--
2023-01-11 06:22
os_sun.h
1.28
KB
-rw-r--r--
2023-01-11 06:22
os_sv2.c
2.82
KB
-rw-r--r--
2023-01-11 06:22
os_sv2.h
2.91
KB
-rw-r--r--
2023-01-11 06:22
os_sv4.c
1.6
KB
-rw-r--r--
2023-01-11 06:22
os_sv4.h
1.79
KB
-rw-r--r--
2023-01-11 06:22
os_ult.c
1.27
KB
-rw-r--r--
2023-01-11 06:22
os_ult.h
1.01
KB
-rw-r--r--
2023-01-11 06:22
os_vu2.c
2.01
KB
-rw-r--r--
2023-01-11 06:22
os_vu2.h
2.34
KB
-rw-r--r--
2023-01-11 06:22
osdep.c
32.49
KB
-rw-r--r--
2023-01-11 06:22
osdep.h
1.45
KB
-rw-r--r--
2023-01-11 06:22
osdep.o
415.75
KB
-rw-r--r--
2023-01-11 06:22
osdepbas.c
1.43
KB
-rw-r--r--
2023-01-11 06:22
osdepckp.c
3.6
KB
-rw-r--r--
2023-01-11 06:22
osdeplog.c
1.12
KB
-rw-r--r--
2023-01-11 06:22
osdepssl.c
26.33
KB
-rw-r--r--
2023-01-11 06:22
phile.c
16.28
KB
-rw-r--r--
2023-01-11 06:22
phile.o
55.77
KB
-rw-r--r--
2023-01-11 06:22
pmatch.c
2.77
KB
-rw-r--r--
2023-01-11 06:22
pop3.c
34.08
KB
-rw-r--r--
2023-01-11 06:22
pop3.o
100.79
KB
-rw-r--r--
2023-01-11 06:22
pseudo.c
1.24
KB
-rw-r--r--
2023-01-11 06:22
pseudo.h
838
B
-rw-r--r--
2023-01-11 06:22
pseudo.o
3.34
KB
-rw-r--r--
2023-01-11 06:22
rename.c
1.12
KB
-rw-r--r--
2023-01-11 06:22
rfc822.c
78.98
KB
-rw-r--r--
2023-01-11 06:22
rfc822.h
5.29
KB
-rw-r--r--
2023-01-11 06:22
rfc822.o
168.47
KB
-rw-r--r--
2023-01-11 06:22
scandir.c
2.61
KB
-rw-r--r--
2023-01-11 06:22
setpgrp.c
946
B
-rw-r--r--
2023-01-11 06:22
sig_bsd.c
954
B
-rw-r--r--
2023-01-11 06:22
sig_psx.c
1.3
KB
-rw-r--r--
2023-01-11 06:22
sig_sv4.c
955
B
-rw-r--r--
2023-01-11 06:22
siglocal.c
1.3
KB
-rw-r--r--
2023-01-11 06:22
siglocal.o
6.8
KB
-rw-r--r--
2023-01-11 06:22
smanager.c
3.54
KB
-rw-r--r--
2023-01-11 06:22
smanager.o
15.91
KB
-rw-r--r--
2023-01-11 06:22
smtp.c
26.33
KB
-rw-r--r--
2023-01-11 06:22
smtp.h
2.48
KB
-rw-r--r--
2023-01-11 06:22
smtp.o
79.52
KB
-rw-r--r--
2023-01-11 06:22
ssl_none.c
2.57
KB
-rw-r--r--
2023-01-11 06:22
ssl_unix.c
26.33
KB
-rw-r--r--
2023-01-11 06:22
sslio.h
2.25
KB
-rw-r--r--
2023-01-11 06:22
sslstdio.c
4.15
KB
-rw-r--r--
2023-01-11 06:22
strerror.c
981
B
-rw-r--r--
2023-01-11 06:22
strpbrk.c
1.1
KB
-rw-r--r--
2023-01-11 06:22
strstr.c
1.27
KB
-rw-r--r--
2023-01-11 06:22
strtok.c
2.02
KB
-rw-r--r--
2023-01-11 06:22
strtoul.c
2.33
KB
-rw-r--r--
2023-01-11 06:22
tcp.h
1.73
KB
-rw-r--r--
2023-01-11 06:22
tcp_unix.c
31.52
KB
-rw-r--r--
2023-01-11 06:22
tcp_unix.h
1.2
KB
-rw-r--r--
2023-01-11 06:22
tenex.c
48.69
KB
-rw-r--r--
2023-01-11 06:22
tenex.o
126.43
KB
-rw-r--r--
2023-01-11 06:22
tis_620.c
1.91
KB
-rw-r--r--
2023-01-11 06:22
tmap.c
84.45
KB
-rw-r--r--
2023-01-11 06:22
truncate.c
1.06
KB
-rw-r--r--
2023-01-11 06:22
tz_bsd.c
989
B
-rw-r--r--
2023-01-11 06:22
tz_nul.c
887
B
-rw-r--r--
2023-01-11 06:22
tz_sv4.c
1.02
KB
-rw-r--r--
2023-01-11 06:22
unix.c
92.97
KB
-rw-r--r--
2023-01-11 06:22
unix.h
6.55
KB
-rw-r--r--
2023-01-11 06:22
unix.o
203.15
KB
-rw-r--r--
2023-01-11 06:22
utf8.c
84
KB
-rw-r--r--
2023-01-11 06:22
utf8.h
22.43
KB
-rw-r--r--
2023-01-11 06:22
utf8.o
531.61
KB
-rw-r--r--
2023-01-11 06:22
utf8aux.c
14.12
KB
-rw-r--r--
2023-01-11 06:22
utf8aux.h
1.49
KB
-rw-r--r--
2023-01-11 06:22
utf8aux.o
30.01
KB
-rw-r--r--
2023-01-11 06:22
utime.c
1.22
KB
-rw-r--r--
2023-01-11 06:22
viscii.c
2.8
KB
-rw-r--r--
2023-01-11 06:22
widths.c
265.05
KB
-rw-r--r--
2023-01-11 06:22
windows.c
10.77
KB
-rw-r--r--
2023-01-11 06:22
write.c
1.74
KB
-rw-r--r--
2023-01-11 06:22
Save
Rename
/* ======================================================================== * Copyright 1988-2006 University of Washington * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * * ======================================================================== */ /* * Program: Newsrc manipulation routines * * Author: Mark Crispin * Networks and Distributed Computing * Computing & Communications * University of Washington * Administration Building, AG-44 * Seattle, WA 98195 * Internet: MRC@CAC.Washington.EDU * * Date: 12 September 1994 * Last Edited: 30 August 2006 */ #include <ctype.h> #include <stdio.h> #include "c-client.h" #include "newsrc.h" #ifndef OLDFILESUFFIX #define OLDFILESUFFIX ".old" #endif /* Error message * Accepts: message format * additional message string * message level * Returns: NIL, always */ long newsrc_error (char *fmt,char *text,long errflg) { char tmp[MAILTMPLEN]; sprintf (tmp,fmt,text); MM_LOG (tmp,errflg); return NIL; } /* Write error message * Accepts: newsrc name * file designator * file designator * Returns: NIL, always */ long newsrc_write_error (char *name,FILE *f1,FILE *f2) { if (f1) fclose (f1); /* close file designators */ if (f2) fclose (f2); return newsrc_error ("Error writing to %.80s",name,ERROR); } /* Create newsrc file in local form * Accepts: MAIL stream * notification flag * Returns: file designator of newsrc */ FILE *newsrc_create (MAILSTREAM *stream,int notify) { char *newsrc = (char *) mail_parameters (stream,GET_NEWSRC,stream); FILE *f = fopen (newsrc,"wb"); if (!f) newsrc_error ("Unable to create news state %.80s",newsrc,ERROR); else if (notify) newsrc_error ("Creating news state %.80s",newsrc,WARN); return f; } /* Write new state in newsrc * Accepts: file designator of newsrc * group * new subscription status character * newline convention * Returns: T if successful, NIL otherwise */ long newsrc_newstate (FILE *f,char *group,char state,char *nl) { long ret = (f && (fputs (group,f) != EOF) && ((putc (state,f)) != EOF) && ((putc (' ',f)) != EOF) && (fputs (nl,f) != EOF)) ? LONGT : NIL; if (fclose (f) == EOF) ret = NIL; return ret; } /* Write messages in newsrc * Accepts: file designator of newsrc * MAIL stream * message number/newsgroup message map * newline convention * Returns: T if successful, NIL otherwise */ long newsrc_newmessages (FILE *f,MAILSTREAM *stream,char *nl) { unsigned long i,j,k; char tmp[MAILTMPLEN]; MESSAGECACHE *elt; int c = ' '; if (stream->nmsgs) { /* have any messages? */ for (i = 1,j = k = (mail_elt (stream,i)->private.uid > 1) ? 1 : 0; i <= stream->nmsgs; ++i) { /* deleted message? */ if ((elt = mail_elt (stream,i))->deleted) { k = elt->private.uid; /* this is the top of the current range */ if (!j) j = k; /* if no range in progress, start one */ } else if (j) { /* unread message, ending a range */ /* calculate end of range */ if (k = elt->private.uid - 1) { /* dump range */ sprintf (tmp,(j == k) ? "%c%ld" : "%c%ld-%ld",c,j,k); if (fputs (tmp,f) == EOF) return NIL; c = ','; /* need a comma after the first time */ } j = 0; /* no more range in progress */ } } if (j) { /* dump trailing range */ sprintf (tmp,(j == k) ? "%c%ld" : "%c%ld-%ld",c,j,k); if (fputs (tmp,f) == EOF) return NIL; } } /* write trailing newline, return */ return (fputs (nl,f) == EOF) ? NIL : LONGT; } /* List subscribed newsgroups * Accepts: MAIL stream * prefix to append name * pattern to search */ void newsrc_lsub (MAILSTREAM *stream,char *pattern) { char *s,*t,*lcl,name[MAILTMPLEN]; int c = ' '; int showuppers = pattern[strlen (pattern) - 1] == '%'; FILE *f = fopen ((char *) mail_parameters (stream,GET_NEWSRC,stream),"rb"); if (f) { /* got file? */ /* remote name? */ if (*(lcl = strcpy (name,pattern)) == '{') lcl = strchr (lcl,'}') + 1; if (*lcl == '#') lcl += 6; /* namespace format name? */ while (c != EOF) { /* yes, read newsrc */ for (s = lcl; (s < (name + MAILTMPLEN - 1)) && ((c = getc (f)) != EOF) && (c != ':') && (c != '!') && (c != '\015') && (c != '\012'); *s++ = c); if (c == ':') { /* found a subscribed newsgroup? */ *s = '\0'; /* yes, tie off name */ /* report if match */ if (pmatch_full (name,pattern,'.')) mm_lsub (stream,'.',name,NIL); else while (showuppers && (t = strrchr (lcl,'.'))) { *t = '\0'; /* tie off the name */ if (pmatch_full (name,pattern,'.')) mm_lsub (stream,'.',name,LATT_NOSELECT); } } while ((c != '\015') && (c != '\012') && (c != EOF)) c = getc (f); } fclose (f); } } /* Update subscription status of newsrc * Accepts: MAIL stream * group * new subscription status character * Returns: T if successful, NIL otherwise */ long newsrc_update (MAILSTREAM *stream,char *group,char state) { char tmp[MAILTMPLEN]; char *newsrc = (char *) mail_parameters (stream,GET_NEWSRC,stream); long ret = NIL; FILE *f = fopen (newsrc,"r+b"); if (f) { /* update existing file */ int c = 0; char *s,nl[3]; long pos = 0; nl[0] = nl[1] = nl[2]='\0'; /* no newline known yet */ do { /* read newsrc */ for (s = tmp; (s < (tmp + MAILTMPLEN - 1)) && ((c = getc (f)) != EOF) && (c != ':') && (c != '!') && (c != '\015') && (c != '\012'); *s++ = c) pos = ftell (f); *s = '\0'; /* tie off name */ /* found the newsgroup? */ if (((c == ':') || (c == '!')) && !strcmp (tmp,group)) { if (c == state) { /* already at that state? */ if (c == ':') newsrc_error("Already subscribed to %.80s",group,WARN); ret = LONGT; /* noop the update */ } /* write the character */ else if (!fseek (f,pos,0)) ret = ((putc (state,f)) == EOF) ? NIL:LONGT; if (fclose (f) == EOF) ret = NIL; f = NIL; /* done with file */ break; } /* gobble remainder of this line */ while ((c != '\015') && (c != '\012') && (c != EOF)) c = getc (f); /* need to know about newlines and found it? */ if (!nl[0] && ((c == '\015') || (c == '\012')) && ((nl[0]=c) == '\015')){ /* sniff and see if an LF */ if ((c = getc (f)) == '\012') nl[1] = c; else ungetc (c,f); /* nope, push it back */ } } while (c != EOF); if (f) { /* still haven't written it yet? */ if (nl[0]) { /* know its newline convention? */ fseek (f,0L,2); /* yes, seek to end of file */ ret = newsrc_newstate (f,group,state,nl); } else { /* can't find a newline convention */ fclose (f); /* punt the file */ /* can't win if read something */ if (pos) newsrc_error ("Unknown newline convention in %.80s", newsrc,ERROR); /* file must have been empty, rewrite it */ else ret = newsrc_newstate(newsrc_create(stream,NIL),group,state,"\n"); } } } /* create new file */ else ret = newsrc_newstate (newsrc_create (stream,T),group,state,"\n"); return ret; /* return with update status */ } /* Update newsgroup status in stream * Accepts: newsgroup name * MAIL stream * Returns: number of recent messages */ long newsrc_read (char *group,MAILSTREAM *stream) { int c = 0; char *s,tmp[MAILTMPLEN]; unsigned long i,j; MESSAGECACHE *elt; unsigned long m = 1,recent = 0,unseen = 0; FILE *f = fopen ((char *) mail_parameters (stream,GET_NEWSRC,stream),"rb"); if (f) do { /* read newsrc */ for (s = tmp; (s < (tmp + MAILTMPLEN - 1)) && ((c = getc (f)) != EOF) && (c != ':') && (c != '!') && (c != '\015') && (c != '\012'); *s++ = c); *s = '\0'; /* tie off name */ if ((c==':') || (c=='!')) { /* found newsgroup? */ if (strcmp (tmp,group)) /* group name match? */ while ((c != '\015') && (c != '\012') && (c != EOF)) c = getc (f); else { /* yes, skip leading whitespace */ while ((c = getc (f)) == ' '); /* only if unprocessed messages */ if (stream->nmsgs) while (f && (m <= stream->nmsgs)) { /* collect a number */ if (isdigit (c)) { /* better have a number */ for (i = 0,j = 0; isdigit (c); c = getc (f)) i = i*10 + (c-'0'); if (c == '-') for (c = getc (f); isdigit (c); c = getc (f)) j = j*10 +(c-'0');/* collect second value if range */ if (!unseen && (mail_elt (stream,m)->private.uid < i)) unseen = m; /* skip messages before first value */ while ((m <= stream->nmsgs) && ((elt = mail_elt (stream,m))->private.uid < i) && m++) elt->valid = T; /* do all messages in range */ while ((m <= stream->nmsgs) && (elt = mail_elt (stream,m)) && (j ? ((elt->private.uid >= i) && (elt->private.uid <= j)) : (elt->private.uid == i)) && m++) elt->valid = elt->deleted = T; } switch (c) { /* what is the delimiter? */ case ',': /* more to come */ c = getc (f); /* get first character of number */ break; default: /* bogus character */ sprintf (tmp,"Bogus character 0x%x in news state",(unsigned int)c); MM_LOG (tmp,ERROR); case EOF: case '\015': case '\012': fclose (f); /* all done - close the file */ f = NIL; break; } } else { /* empty newsgroup */ while ((c != '\015') && (c != '\012') && (c != EOF)) c = getc (f); fclose (f); /* all done - close the file */ f = NIL; } } } } while (f && (c != EOF)); /* until file closed or EOF */ if (f) { /* still have file open? */ sprintf (tmp,"No state for newsgroup %.80s found, reading as new",group); MM_LOG (tmp,WARN); fclose (f); /* close the file */ } if (m <= stream->nmsgs) { /* any messages beyond newsrc range? */ if (!unseen) unseen = m; /* then this must be the first unseen one */ do { elt = mail_elt (stream,m++); elt->valid = elt->recent = T; ++recent; /* count another recent message */ } while (m <= stream->nmsgs); } if (unseen) { /* report first unseen message */ sprintf (tmp,"[UNSEEN] %lu is first unseen message in %.80s",unseen,group); MM_NOTIFY (stream,tmp,(long) NIL); } return recent; } /* Update newsgroup entry in newsrc * Accepts: newsgroup name * MAIL stream * Returns: T if successful, NIL otherwise */ long newsrc_write (char *group,MAILSTREAM *stream) { long ret = NIL; int c = 0,d = EOF; char *newsrc = (char *) mail_parameters (stream,GET_NEWSRC,stream); char *s,tmp[MAILTMPLEN],backup[MAILTMPLEN],nl[3]; FILE *f,*bf; nl[0] = nl[1] = nl[2] = '\0'; /* no newline known yet */ if (f = fopen (newsrc,"rb")) {/* have existing newsrc file? */ if (!(bf = fopen ((strcat (strcpy (backup,newsrc),OLDFILESUFFIX)),"wb"))) { fclose (f); /* punt input file */ return newsrc_error("Can't create backup news state %.80s",backup,ERROR); } /* copy to backup file */ while ((c = getc (f)) != EOF) { /* need to know about newlines and found it? */ if (!nl[0] && ((c == '\015') || (c == '\012')) && ((nl[0]=c) == '\015')){ /* sniff and see if an LF */ if ((c = getc (f)) == '\012') nl[1] = c; ungetc (c,f); /* push it back */ } /* write to backup file */ if ((d = putc (c,bf)) == EOF) { fclose (f); /* punt input file */ return newsrc_error ("Error writing backup news state %.80s", newsrc,ERROR); } } fclose (f); /* close existing file */ if (fclose (bf) == EOF) /* and backup file */ return newsrc_error ("Error closing backup news state %.80s", newsrc,ERROR); if (d == EOF) { /* open for write if empty file */ if (f = newsrc_create (stream,NIL)) bf = NIL; else return NIL; } else if (!nl[0]) /* make sure newlines valid */ return newsrc_error ("Unknown newline convention in %.80s",newsrc,ERROR); /* now read backup file */ else if (!(bf = fopen (backup,"rb"))) return newsrc_error ("Error reading backup news state %.80s", backup,ERROR); /* open newsrc for writing */ else if (!(f = fopen (newsrc,"wb"))) { fclose (bf); /* punt backup */ return newsrc_error ("Can't rewrite news state %.80s",newsrc,ERROR); } } else { /* create new newsrc file */ if (f = newsrc_create (stream,T)) bf = NIL; else return NIL; /* can't create newsrc */ } while (bf) { /* read newsrc */ for (s = tmp; (s < (tmp + MAILTMPLEN - 1)) && ((c = getc (bf)) != EOF) && (c != ':') && (c != '!') && (c != '\015') && (c != '\012'); *s++ = c); *s = '\0'; /* tie off name */ /* saw correct end of group delimiter? */ if (tmp[0] && ((c == ':') || (c == '!'))) { /* yes, write newsgroup name and delimiter */ if ((tmp[0] && (fputs (tmp,f) == EOF)) || ((putc (c,f)) == EOF)) return newsrc_write_error (newsrc,bf,f); if (!strcmp (tmp,group)) {/* found correct group? */ /* yes, write new status */ if (!newsrc_newmessages (f,stream,nl[0] ? nl : "\n")) return newsrc_write_error (newsrc,bf,f); /* skip past old data */ while (((c = getc (bf)) != EOF) && (c != '\015') && (c != '\012')); /* skip past newline */ while ((c == '\015') || (c == '\012')) c = getc (bf); while (c != EOF) { /* copy remainder of file */ if (putc (c,f) == EOF) return newsrc_write_error (newsrc,bf,f); c = getc (bf); /* get next character */ } /* done with file */ if (fclose (f) == EOF) return newsrc_write_error (newsrc,bf,NIL); f = NIL; } /* copy remainder of line */ else while (((c = getc (bf)) != EOF) && (c != '\015') && (c != '\012')) if (putc (c,f) == EOF) return newsrc_write_error (newsrc,bf,f); if (c == '\015') { /* write CR if seen */ if (putc (c,f) == EOF) return newsrc_write_error (newsrc,bf,f); /* sniff to see if LF */ if (((c = getc (bf)) != EOF) && (c != '\012')) ungetc (c,bf); } /* write LF if seen */ if ((c == '\012') && (putc (c,f) == EOF)) return newsrc_write_error (newsrc,bf,f); } if (c == EOF) { /* hit end of file? */ fclose (bf); /* yup, close the file */ bf = NIL; } } if (f) { /* still have newsrc file open? */ ret = ((fputs (group,f) != EOF) && ((putc (':',f)) != EOF) && newsrc_newmessages (f,stream,nl[0] ? nl : "\n")) ? LONGT : NIL; if (fclose (f) == EOF) ret = newsrc_write_error (newsrc,NIL,NIL); } else ret = LONGT; return ret; } /* Get newsgroup state as text stream * Accepts: MAIL stream * newsgroup name * Returns: string containing newsgroup state, or NIL if not found */ char *newsrc_state (MAILSTREAM *stream,char *group) { int c = 0; char *s,tmp[MAILTMPLEN]; long pos; size_t size; FILE *f = fopen ((char *) mail_parameters (stream,GET_NEWSRC,stream),"rb"); if (f) do { /* read newsrc */ for (s = tmp; (s < (tmp + MAILTMPLEN - 1)) && ((c = getc (f)) != EOF) && (c != ':') && (c != '!') && (c != '\015') && (c != '\012'); *s++ = c); *s = '\0'; /* tie off name */ if ((c==':') || (c=='!')) { /* found newsgroup? */ if (strcmp (tmp,group)) /* group name match? */ while ((c != '\015') && (c != '\012') && (c != EOF)) c = getc (f); else { /* yes, skip leading whitespace */ do pos = ftell (f); while ((c = getc (f)) == ' '); /* count characters in state */ for (size = 0; (c != '\015') && (c != '\012') && (c != EOF); size++) c = getc (f); /* now copy it */ s = (char *) fs_get (size + 1); fseek (f,pos,SEEK_SET); fread (s,(size_t) 1,size,f); s[size] = '\0'; /* tie off string */ fclose (f); /* all done - close the file */ return s; } } } while (f && (c != EOF)); /* until file closed or EOF */ sprintf (tmp,"No state for newsgroup %.80s found",group); MM_LOG (tmp,WARN); if (f) fclose (f); /* close the file */ return NIL; /* not found return */ } /* Check UID in newsgroup state * Accepts: newsgroup state string * uid * returned recent count * returned unseen count */ void newsrc_check_uid (unsigned char *state,unsigned long uid, unsigned long *recent,unsigned long *unseen) { unsigned long i,j; while (*state) { /* until run out of state string */ /* collect a number */ for (i = 0; isdigit (*state); i = i*10 + (*state++ - '0')); if (*state != '-') j = i; /* coerce single mesage into range */ else { /* have a range */ for (j = 0; isdigit (*++state); j = j*10 + (*state - '0')); if (!j) j = i; /* guard against -0 */ if (j < i) return; /* bogon if end less than start */ } if (*state == ',') state++; /* skip past comma */ else if (*state) return; /* otherwise it's a bogon */ if (uid <= j) { /* covered by upper bound? */ if (uid < i) ++*unseen; /* unseen if not covered by lower bound */ return; /* don't need to look further */ } } ++*unseen; /* not found in any range, message is unseen */ ++*recent; /* and recent */ }