JFIF       %%-))-969KKd       %%-))-969KKd! f%eK_.T  v_/n6q>e}&Cx@t7OuqySN%y%tz@ Un(quo{tS]\~LzǚPk;fϛϹ2y-=_z.NWW7DW@'4`3w3rr;hP8B%ַBe]`7Ҽo1e)弆O|4Wk*}7Su[9=U 9 |_+:@}@˵u@ g<4N<@=/ I(~}qq=y- u|. y'`3S+4$e= k4P]M^_Nou*R-,X0EI}m&LtVȱa|R\@ ʟ+YeIlY`XV^HV/c-eb du ̈́_2+DpV ` ^^->t7JydE]I 8:7#j̀iiVbp~o݃[}zwGF@-(RTJY@ Ty}X 1!2AQaq"3BR`r@PSb #4CTs0DU$EFcd?Lc4\K#E1$@CV8OƂZ5g;.141;%]6e laǃpv8)80D1ŌxLgWYc+z%:( w^PtdԣV Z:qDsh W) ͷ+~FO]"բ?eN 4)WREZ;T+}]:FRtI ѱއ>'s_[\qNhK ' ^qJv9 ]ʜ1FMzwF8ѯBIp-g`?si;|Hr%>jOh29-+-gQmBH?3P9e')>[k^OaxtLiS30ҿ6*o--I$ 1 z2+OЪ+i˺,_n3(~}StUMc \xSmGD0jMB06%') #1c6s/iaIɉgC%Yoi**MHЛ=rh ĭ總 E>Jў2+ct/^$[_kAOʕicR4qm#Lw!Squ/:e%~zMBfa|e7PUC|"/)CD\cy gڰF9(?\jU+>Cwl#>x^'a7C}LYX<@X`W8P hۂx͍q֜?de1qe* NDuTm-ߣ y+pUy*9aĺ:P4n$2&BTϵ@ a>v3uc,(uF0jˊ́a~32f2=ήZe[r!F !Bu)b FŌt%41N/֑41n1|> 1^;1=IĖEpq%"{/~M.QWDdUA6~z>kPh2Oi?Uc[`+l;՚':۾ږtoZjQ7\:Z3}~ &ڮRQH{mDq0TaM5i:5sC0x<]=Mp c!C<6]~vpxeH[AmY'iԖ_~ a(Ȕ@+a< w] wbk1#aD 9. ?p$ Qؒi-8S㨸f45t:ʙѾ.{mMshU1k\z^*#It@ v:%#iSZ.{.Vemm,Z3*;HtU8E.v'e ޴ 4WwLDe)jY*R'?wM֣ b+IfO('Y J$o޼ l.蕁~ Y Em>Y^m"r^4w}2PI7R1gV\wtVT׿w'*N{ZGN8qzrM/LO~ O~|ڞ櫮o{\dV斀AJmn E#HQg$!{XM'{u* 4O)>F.";l2z3IJ2?Fh7)rjrv@ AJlУ 0`StpGD&nƒpxΡ}P늿D@cEH҆2[9a}U/biEzu)xYR>߹q (yA~ُp \U\L\6~" U'>GJOP,ko:JGI*٢C8f8굟m#GV̐Cj]}N_]aJulE.+I&y5 6*TGHZRů}efjv"\3/3_hq՝g !ir,ܐv%~*lXccyo) 拏Qp_tT3!,Dur!CH7;9GQQmE:ÑCaƅ;zeij;d+% z#e%gdI9E5BB&۟S"=C(>{֠ ɫNUळiu>;P}حW]ouBmJS0ktRtDm+$ԫU_dq)$ ʃnLGSፑf'vlzP/_]QԂ]ȗ|W\;wTSf!m,ri{w了enP(`*.1i2.}e@;HA&_N᷸1|:Gjڒj~i/֬]1(N +^ bQq:›m*o5Y(.JPV[3ޭj֭j+i(uָ]kV)A/%X Fa?8'o>ꝣKks\_k)S%zDTRw#h#e#1Euk&,Yw+Ap"PIZ*j*Ug">m>|ڇ(#FXzCi9%J'H3Xwi-9s0S`R^֮ YLJz+q^i}i1jLK+ [ NzDSq[+Q'ݖl=s<[iIWz=%}[jɁ֠$$N7IUm83SVŭw)#0$g C26^ʓW<=B>{R)&繻8j3cbbce7TE1r\'}FūLO+KʢXm/=H 6FaRHI^Lȹ83g9CM93쑑nE)=q4I$s'ݠajm]"O>L4Vb;(eHm$֫ӆyYtYYr(<Ɠ2Fm "f֒;Tξu8jZR$b!E*9 yy+V:Dm Œ9@-f*l2#ٿPt#T҂ӵ&;AȃWlf xϜZكfj%bs ,/uN{,Gz*kkP M6f/0[I;S)ml-؉)~q9v`ǣ4gZJ}h&dﺥ#{}uDa7j(I'2OҒMF7 .Ey<$5;2ժTI %)TwG54Ŭ Kb6rG;uq\[8DJ'i$?Pq-ݗs\JGkYO2%}b\9;Tk⾜3%qSd( [O4i'jQՃ &F Ҧ T2!G{N j~:Cz J3|xd(6TZ a b5gfK\I)WYARA(RVE$G8at̖qWq{B:Q^g3QzcAZrH|GMcjb{+)r=>:de:¹[QOe@>ISP1nIq!:3G).!ŶB꠲#0Eb2"Lt4ƺKCGn9P=PeoX8@fղ Gi9k ^aHAV<)GG*k_aUΜWsX4ʷ\%m,W*F}<1E/&NJIʳ:PmeRuń%A<ᶧ2s^s-9$PHw]ZB#[>9Fm*>Ut.HugK9uaAF.%fW&J~$k^S:iގT9_5`_bR`ܒ(8Fa?jMc4Pŭ!VB7 W+߀ i>b٠,]?<{aXgpJ]璹نrV53-)p:,R%>#W۲4K{%L%]ͅP,7"[NI:ܴ- AJr)#"=k#Eoa PP$C>7m_t ڠcJZymA [qwDw|*3(FMۭ\KP-'1WK, suu;~ZaTnyi$A =46i֑AUU"l:gA ]"8&ד<{z&O!WF^XGhViWM\q(*p#Fk?p\Ym*J3B3'%jn+ IG{VcVL-f7 #/u}5bD7XMi!{#b$U]q\RGa ;OZXv^WZ\ܭ( lhSˎ6 V'h GY{49$r8AIȃ#V$HL/~l.]:>29:EkSO%N$Ϋkͯ⫝̸yˮ0mE+IVwuIu>Xj%6@[k)aqJz|؏!Υ֔RP.l@tⵅkZg'5nrqDU^kJBEBfrG)+J$"dB3#ٔk4yQCz9S\8'#/5cˑYO(4dhIM<6BߢJNDZFEgD6vnl|^kr;^hϨ1!ʌ:įZBᝋx|T+'!c t"YH=)"g6-t+.Ur$+ZzRG s*f9_QY4El>DI[}B=>v)iTg[?oWwۿlWG69k{Qx]-*$<-=W¹nUĂ}G4tZ]^Q8m!])SyR)vOR(_Aiϵei#{$hਧ.SLN}߬e}EgZwgAWPBcZÖ']P ;2/hy}1M9Fj'.ӖZy-,r ND|jlC)jqSʚV)]p3;❀[:tBH##HqhZr\j"tG-тtHtB24PJ:w;xI0$ wEQ#)FejK rSw|">Tҙ#2Xc8g,(L`S2 tM>5@<)A71iXSlHڛ9(y4KUu:xARdf5\Zq|m{ӭjI8%. ڟ5pxvqd(9P$#"8CQ NKFۘ;RTPE8^`WãRxL髍{}ġͭ緗Ҍ/<xcKOVy0\{Uk85A07)_uCuopN>~3e e޽ytYnDm3)ܠ&,![y3CcؽK+raޱX~aRbm<wE #+ԺQXfGq+h[71_A* [V٣sCEXb\fNiXNݔz NҲ wrG"+ kлYI`ϼUՄ o9Vc7^[Y"E]W>(GSkt]Gcx~hM`?WV8q w< `bJb̑ NNG[xr̈>Kþ7<7H56pIEKgoE`?4e)ޛ)7M(-4ot}LDG6"qycg~x{>8.,7W_ɦ/nG|MFU^VYpa",BBBH;GC#2JerK*ZIqbIphت݉)c繥ՅVtLnEcf62:;\Rw@{ S5Q $ϑTz;EzFO5Pn.NA<~ҌoXR|Ig$^]A|^_mmҷj8mbMbՅHmvI_MqƊFCq&Б%z>ΧKEAg4y;/0f[|@$SG,h5@0RȁцEH-qm%Kb%Dx:0XNHWIᰵ$G)|^ χ,m,#%6צIpO FDFUH5JKlI>Vxn;ĶY;dZkarnƭaeG< W#9+؄l?jEmDo<~W++0#π*<.ۘZ+H$VfF|J&#N ?*<<⢌՞\.#I: !#Sh-4'F |-[WQFH7 )d`JFCbFɞ9N9vՅW4xPOBHc2a"*90Iv5IGI<hI I*'Ƿ.-m1ȼѹKF2ٷ;*A*T6FDSKsipI tGx f$9 Ǐzf{kd@r:/?(i^b 3)_g;&IEWu̓*2t7qL Ti5, wdXr&Gwmŏy)IJD+iE:v6[=9ʰ;q` =}#q:<>~mFU631TqQ (t2/c~ iK'y˴TlxsF_$ {a8[yfc>Y͘k8&9x\Նڻ{I&7+ fv F=,ꌼcCA[c:麑î6B겦&|mFm㪈Rfw .xJês1?_UnuQGǪ?6wR5b-:q{wK  !1A2Qq"@PRa #03BCSbr4$T`c?K)o<rzѸUL<6K4F̘E¹?Q7 QZtʄSV9iE$m6vU>8_F!zaS# j_4Jzm_bȚ;/:Iq7A9Qڜp͖!QTaOSTQzqS5U{LHOWc;TWUA}YWqUNKURѾĴ:gfYnQ*dv?F6i1G6[H?W*!Wl 8OlE?U$jv<&Rا@TG"X޺51?Ikymc{TLʧA4Y+#a=[#j Ge;@֍Xًv_(uVgJjbէz;5$۱ʡ)zv|eS u̎b{ean<6\;CQ<@΍b{ZM%[*n,z{EZR++e`w޹bh9cWF2ǴU:RMWd架;UJcDtK_G@y5GāYzF 8cWb㖈qw4ecqMis,)',o=ߘq5e-0j.}xNGq?d;D5T Dbng2!zN%i`IJ4]JN Kv ./iLZFOii h=yn%wdԲ:d뉆2 ]|1jnvBV@XkxN_;J Kӯ$ΟVlXm x[0'id =qcamjdӚȹaE4rY26!۩PS#U v{-51~q<'x;Z *'Fg"pojg9l:5W媴txyyUU%`_58Mngv[+jz>XwbIt$]ɞ*{ &b^F=C4ЏZ+ F\pR]9c1b * @@K,\ϔ =0<9N{U^ozﺊ<˒D4p2 ,Ƿ˗:#]j*&*jFTܪTdF@x8׭CX2U&y({9b駴to90\DUaaƏ@J:tš#x]d0pUiJ!Џ_1Ke9s$\t%ZiW-]ZVp[!c8OڋGPmM 'ÈX$I"s)Ȍ[ڦT ׫wJsn$QӨ]dJ[;~ԕ$lŧt}7RU@&778ܷK "$4C^iQ􄆺h(Cg#P QҤ1 7~V=6~8:#7/N5qz=8ȂiEʀJpnx8.9@~1m3sE? :zqGY}:O#yw23$1%m}8`E毑s_PznQ[LF%D;S)י -YW < quTݪҒl>I£$qG,Ȑf=g + `~}m5dO+ipyOfv]ishu*8tx"4n7putfV]D`i=ZHWIwȩ<[.P\xӊF)jbKfzASi{*u#8 9p뚰 H@ff>,`2 L6b8 mw{Hn3|b3Fg1e6C<eH /_~B#L *t0xbS% 웞: Aɔ89hjd[OY墪9sŎzNZ:&Yiu%MGw=Y ]QӍ -u@'p[wK%suԘse^wbiɫ:f䲯4ֶCP JFE32 X;yVeAbFyyX%H ,vgb~Ksʊ&V φ 5f̅2K7ZVԎBLǑ=zv-yq,nȇ'(:8$(rH*!S RI.Lj"9\W>])|›\o?-tEs#678PI:e5n$i0ScudA F(ET lq{讬3 28xۆ1IPԲ v0r$0{[J*cyA 1OQ-3f5;׆!`;mV[g{*d$221VR8jk.aH)7c=BO>~ T77XӇʧ _NاVV:Gye)NKk Ǵ`ՏS=Wy\cu`}@8C2su XqC Պ̜xEU ڭ{$KόI@F؛NLOA$F[X2rĔG L\wE2J3S8IJ2e`A7),b +noĐ<{XA"Lj%W̮RI7=e0O {F 3t6ǽN7aNHmo!_5G/GGz`ǻwl${wzd2X,!a/@X{wh]S MARIJUANA
— DIOS — NO — CREA — NADA — EN — VANO —
Linux vps-ed8565de 5.10.0-32-cloud-amd64 #1 SMP Debian 5.10.223-1 (2024-08-10) x86_64
  SOFT : Apache/2.4.65 (Debian) PHP : 7.4.33
/bin/
51.178.36.14

 
[ NAME ] [ SIZE ] [ PERM ] [ DATE ] [ ACT ]
+FILE +DIR
X11 dir drwxr-xr-x 2025-11-05 06:33 R D
[ 58.813 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
aa-enabled 30.367 KB -rwxr-xr-x 2021-04-03 06:09 R E G D
aa-exec 30.367 KB -rwxr-xr-x 2021-04-03 06:09 R E G D
ab 58.344 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
addpart 26.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
apropos 51.203 KB -rwxr-xr-x 2021-02-19 10:14 R E G D
apt 18.227 KB -rwxr-xr-x 2021-06-10 08:53 R E G D
apt-cache 86.305 KB -rwxr-xr-x 2021-06-10 08:53 R E G D
apt-cdrom 26.305 KB -rwxr-xr-x 2021-06-10 08:53 R E G D
apt-config 26.227 KB -rwxr-xr-x 2021-06-10 08:53 R E G D
apt-extracttemplates 22.313 KB -rwxr-xr-x 2021-06-10 08:53 R E G D
apt-ftparchive 270.313 KB -rwxr-xr-x 2021-06-10 08:53 R E G D
apt-get 46.305 KB -rwxr-xr-x 2021-06-10 08:53 R E G D
apt-key 27.53 KB -rwxr-xr-x 2021-06-10 08:53 R E G D
apt-listchanges 11.955 KB -rwxr-xr-x 2021-03-28 11:06 R E G D
apt-mark 50.305 KB -rwxr-xr-x 2021-06-10 08:53 R E G D
apt-sortpkgs 38.234 KB -rwxr-xr-x 2021-06-10 08:53 R E G D
arch 38.813 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
aria_chk 4.32 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
aria_dump_log 4.13 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
aria_ftdump 4.14 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
aria_pack 4.16 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
aria_read_log 4.28 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
awk 678.344 KB -rwxr-xr-x 2021-02-10 08:42 R E G D
b2sum 58.938 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
base32 42.844 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
base64 42.844 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
basename 38.781 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
basenc 54.844 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
bash 1.18 MB -rwxr-xr-x 2022-03-27 18:40 R E G D
bashbug 6.601 KB -rwxr-xr-x 2022-03-27 18:40 R E G D
bootctl 62.336 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
broadwayd 118.227 KB -rwxr-xr-x 2024-07-19 13:30 R E G D
bunzip2 38.07 KB -rwxr-xr-x 2020-07-20 13:00 R E G D
busctl 82.336 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
bzcat 38.07 KB -rwxr-xr-x 2020-07-20 13:00 R E G D
bzcmp 2.173 KB -rwxr-xr-x 2020-07-20 13:00 R E G D
bzdiff 2.173 KB -rwxr-xr-x 2020-07-20 13:00 R E G D
bzegrep 3.687 KB -rwxr-xr-x 2020-07-20 13:00 R E G D
bzexe 4.763 KB -rwxr-xr-x 2019-09-04 13:22 R E G D
bzfgrep 3.687 KB -rwxr-xr-x 2020-07-20 13:00 R E G D
bzgrep 3.687 KB -rwxr-xr-x 2020-07-20 13:00 R E G D
bzip2 38.07 KB -rwxr-xr-x 2020-07-20 13:00 R E G D
bzip2recover 17.992 KB -rwxr-xr-x 2020-07-20 13:00 R E G D
bzless 1.267 KB -rwxr-xr-x 2020-07-20 13:00 R E G D
bzmore 1.267 KB -rwxr-xr-x 2020-07-20 13:00 R E G D
c_rehash 6.527 KB -rwxr-xr-x 2025-10-03 09:54 R E G D
captoinfo 90.266 KB -rwxr-xr-x 2023-05-26 18:31 R E G D
cat 42.906 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
catchsegv 3.228 KB -rwxr-xr-x 2025-05-27 10:40 R E G D
catman 38.688 KB -rwxr-xr-x 2021-02-19 10:14 R E G D
certbot 0.938 KB -rwxr-xr-x 2021-02-13 18:56 R E G D
cgi-fcgi 18 KB -rwxr-xr-x 2025-10-12 09:03 R E G D
chage 78.375 KB -rwxr-sr-x 2025-04-18 13:46 R E G D
chardet 0.942 KB -rwxr-xr-x 2020-12-30 16:42 R E G D
chardetect 0.942 KB -rwxr-xr-x 2020-12-30 16:42 R E G D
chattr 14.156 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
chcon 71.063 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
checkgid 14.156 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
chfn 57.047 KB -rwsr-xr-x 2025-04-18 13:46 R E G D
chgrp 70.969 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
chmod 62.938 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
choom 50.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
chown 70.969 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
chronyc 111.016 KB -rwxr-xr-x 2022-03-14 21:17 R E G D
chrt 34.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
chsh 51.641 KB -rwsr-xr-x 2025-04-18 13:46 R E G D
cksum 38.781 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
clear 14.156 KB -rwxr-xr-x 2023-05-26 18:31 R E G D
clear_console 14.305 KB -rwxr-xr-x 2022-03-27 18:40 R E G D
cloud-id 0.949 KB -rwxr-xr-x 2021-08-13 00:47 R E G D
cloud-init 0.953 KB -rwxr-xr-x 2021-08-13 00:47 R E G D
cloud-init-per 2.059 KB -rwxr-xr-x 2021-01-15 17:33 R E G D
cloud-localds 7.232 KB -rwxr-xr-x 2020-05-28 22:11 R E G D
cmp 46.781 KB -rwxr-xr-x 2021-01-01 17:52 R E G D
col 34.234 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
colcrt 14.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
colrm 30.234 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
column 50.234 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
comm 42.844 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
compose 18.053 KB -rwxr-xr-x 2021-02-25 18:24 R E G D
corelist 15.012 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
cp 147.625 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
cpan 8.161 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
cpan5.32-x86_64-linux-gnu 8.182 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
cpio 158.547 KB -rwxr-xr-x 2023-09-30 12:18 R E G D
crontab 42.547 KB -rwxr-sr-x 2021-02-22 22:43 R E G D
csplit 119.063 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
ctags 151.555 KB -rwxr-xr-x 2025-02-27 02:24 R E G D
ctags.emacs 151.555 KB -rwxr-xr-x 2025-02-27 02:24 R E G D
ctstat 22.508 KB -rwxr-xr-x 2021-02-05 23:34 R E G D
curl 250.07 KB -rwxr-xr-x 2025-06-09 01:01 R E G D
cut 46.906 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
cvtsudoers 274.977 KB -rwxr-xr-x 2025-06-26 17:03 R E G D
dash 122.617 KB -rwxr-xr-x 2020-12-10 13:23 R E G D
date 111 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
dbilogstrip 1.348 KB -rwxr-xr-x 2020-11-08 20:20 R E G D
dbiprof 6.061 KB -rwxr-xr-x 2020-11-08 20:20 R E G D
dbiproxy 5.268 KB -rwxr-xr-x 2020-11-08 20:20 R E G D
dbus-cleanup-sockets 14.133 KB -rwxr-xr-x 2023-06-06 14:07 R E G D
dbus-daemon 239.188 KB -rwxr-xr-x 2023-06-06 14:07 R E G D
dbus-monitor 26.141 KB -rwxr-xr-x 2023-06-06 14:07 R E G D
dbus-run-session 14.133 KB -rwxr-xr-x 2023-06-06 14:07 R E G D
dbus-send 30.133 KB -rwxr-xr-x 2023-06-06 14:07 R E G D
dbus-update-activation-environment 14.133 KB -rwxr-xr-x 2023-06-06 14:07 R E G D
dbus-uuidgen 14.133 KB -rwxr-xr-x 2023-06-06 14:07 R E G D
dd 79.07 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
deb-systemd-helper 20.893 KB -rwxr-xr-x 2020-12-14 20:19 R E G D
deb-systemd-invoke 4.308 KB -rwxr-xr-x 2020-12-14 20:19 R E G D
debconf 2.792 KB -rwxr-xr-x 2021-06-10 17:17 R E G D
debconf-apt-progress 11.271 KB -rwxr-xr-x 2021-06-10 17:17 R E G D
debconf-communicate 0.594 KB -rwxr-xr-x 2021-06-10 17:17 R E G D
debconf-copydb 1.679 KB -rwxr-xr-x 2021-06-10 17:17 R E G D
debconf-escape 0.632 KB -rwxr-xr-x 2021-06-10 17:17 R E G D
debconf-set-selections 2.866 KB -rwxr-xr-x 2021-06-10 17:17 R E G D
debconf-show 1.784 KB -rwxr-xr-x 2021-06-10 17:17 R E G D
debianbts 0.966 KB -rwxr-xr-x 2020-12-18 08:20 R E G D
decodemail 34.609 KB -rwxr-xr-x 2020-11-19 05:02 R E G D
delpart 26.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
devdump 171.914 KB -rwxr-xr-x 2021-02-04 21:36 R E G D
df 91.734 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
dh_bash-completion 4.302 KB -rwxr-xr-x 2020-07-31 14:30 R E G D
dh_perl_dbi 1.17 KB -rwxr-xr-x 2020-11-08 20:20 R E G D
diff 203.438 KB -rwxr-xr-x 2021-01-01 17:52 R E G D
diff3 63 KB -rwxr-xr-x 2021-01-01 17:52 R E G D
dir 143.727 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
dircolors 46.82 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
dirmngr 565.641 KB -rwxr-xr-x 2022-07-01 07:03 R E G D
dirmngr-client 106.781 KB -rwxr-xr-x 2022-07-01 07:03 R E G D
dirname 38.781 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
dirsplit 16.741 KB -rwxr-xr-x 2006-11-25 23:13 R E G D
dmesg 82.461 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
dnsdomainname 22.07 KB -rwxr-xr-x 2019-11-07 11:31 R E G D
domainname 22.07 KB -rwxr-xr-x 2019-11-07 11:31 R E G D
dotlock 14.852 KB -rwxr-sr-x 2020-11-19 05:02 R E G D
dotlock.mailutils 14.852 KB -rwxr-sr-x 2020-11-19 05:02 R E G D
dpkg 306.531 KB -rwxr-xr-x 2023-09-13 21:38 R E G D
dpkg-deb 158.383 KB -rwxr-xr-x 2023-09-13 21:38 R E G D
dpkg-divert 150.438 KB -rwxr-xr-x 2023-09-13 21:38 R E G D
dpkg-maintscript-helper 20.667 KB -rwxr-xr-x 2023-09-13 21:38 R E G D
dpkg-query 162.43 KB -rwxr-xr-x 2023-09-13 21:38 R E G D
dpkg-realpath 4.053 KB -rwxr-xr-x 2023-09-13 21:38 R E G D
dpkg-split 122.336 KB -rwxr-xr-x 2023-09-13 21:38 R E G D
dpkg-statoverride 62.117 KB -rwxr-xr-x 2023-09-13 21:38 R E G D
dpkg-trigger 78.336 KB -rwxr-xr-x 2023-09-13 21:38 R E G D
du 171.25 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
ebrowse 42.414 KB -rwxr-xr-x 2025-02-27 02:24 R E G D
ebrowse.emacs 42.414 KB -rwxr-xr-x 2025-02-27 02:24 R E G D
ec2metadata 8.189 KB -rwxr-xr-x 2020-05-28 22:11 R E G D
echo 38.781 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
edit 18.053 KB -rwxr-xr-x 2021-02-25 18:24 R E G D
editor 340.641 KB -rwxr-xr-x 2024-06-17 12:31 R E G D
egrep 0.027 KB -rwxr-xr-x 2023-01-25 08:23 R E G D
emacs 5.97 MB -rwxr-xr-x 2025-02-27 02:24 R E G D
emacs-gtk 5.97 MB -rwxr-xr-x 2025-02-27 02:24 R E G D
emacsclient 30.625 KB -rwxr-xr-x 2025-02-27 02:24 R E G D
emacsclient.emacs 30.625 KB -rwxr-xr-x 2025-02-27 02:24 R E G D
enc2xs 40.836 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
encguess 2.994 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
env 47.344 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
envsubst 34.227 KB -rwxr-xr-x 2021-02-02 21:35 R E G D
eqn 201.344 KB -rwxr-xr-x 2021-01-27 09:42 R E G D
etags 147.336 KB -rwxr-xr-x 2025-02-27 02:24 R E G D
etags.emacs 147.336 KB -rwxr-xr-x 2025-02-27 02:24 R E G D
ex 3.03 MB -rwxr-xr-x 2025-03-30 03:33 R E G D
expand 42.844 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
expiry 30.43 KB -rwxr-sr-x 2025-04-18 13:46 R E G D
expr 114.969 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
factor 79.156 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
faillog 22.445 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
fallocate 34.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
false 38.75 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
fc-cache 18.508 KB -rwxr-xr-x 2020-05-15 10:55 R E G D
fc-cat 14.453 KB -rwxr-xr-x 2020-05-15 10:55 R E G D
fc-conflist 14.273 KB -rwxr-xr-x 2020-05-15 10:55 R E G D
fc-list 14.336 KB -rwxr-xr-x 2020-05-15 10:55 R E G D
fc-match 14.398 KB -rwxr-xr-x 2020-05-15 10:55 R E G D
fc-pattern 14.328 KB -rwxr-xr-x 2020-05-15 10:55 R E G D
fc-query 14.297 KB -rwxr-xr-x 2020-05-15 10:55 R E G D
fc-scan 14.344 KB -rwxr-xr-x 2020-05-15 10:55 R E G D
fc-validate 14.344 KB -rwxr-xr-x 2020-05-15 10:55 R E G D
fcgistarter 14.156 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
fgrep 0.027 KB -rwxr-xr-x 2023-01-25 08:23 R E G D
filan 91.961 KB -rwxr-xr-x 2021-02-03 12:58 R E G D
file 26.422 KB -rwxr-xr-x 2023-08-30 18:51 R E G D
fincore 34.273 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
find 303.719 KB -rwxr-xr-x 2021-01-09 17:36 R E G D
findmnt 67.414 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
flock 34.305 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
fmt 46.813 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
fold 42.813 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
free 26.227 KB -rwxr-xr-x 2021-04-06 07:17 R E G D
frm 27.156 KB -rwxr-xr-x 2020-11-19 05:02 R E G D
frm.mailutils 27.156 KB -rwxr-xr-x 2020-11-19 05:02 R E G D
from 22.703 KB -rwxr-xr-x 2020-11-19 05:02 R E G D
from.mailutils 22.703 KB -rwxr-xr-x 2020-11-19 05:02 R E G D
fuser 39.773 KB -rwxr-xr-x 2021-02-08 10:19 R E G D
galera_new_cluster 0.896 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
galera_recovery 3.287 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
gawk 678.344 KB -rwxr-xr-x 2021-02-10 08:42 R E G D
gdk-pixbuf-csource 14.172 KB -rwxr-xr-x 2025-10-11 01:47 R E G D
gdk-pixbuf-pixdata 14.156 KB -rwxr-xr-x 2025-10-11 01:47 R E G D
gdk-pixbuf-thumbnailer 14.234 KB -rwxr-xr-x 2025-10-11 01:47 R E G D
genisoimage 622.945 KB -rwxr-xr-x 2021-02-04 21:36 R E G D
geqn 201.344 KB -rwxr-xr-x 2021-01-27 09:42 R E G D
getconf 34.367 KB -rwxr-xr-x 2025-05-27 10:40 R E G D
geteltorito 6.064 KB -rwxr-xr-x 2021-02-04 21:36 R E G D
getent 31.344 KB -rwxr-xr-x 2025-05-27 10:40 R E G D
getopt 22.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
gettext 34.227 KB -rwxr-xr-x 2021-02-02 21:35 R E G D
gettext.sh 5.066 KB -rwxr-xr-x 2021-02-02 21:35 R E G D
ginstall-info 111.758 KB -rwxr-xr-x 2021-01-08 21:54 R E G D
gpasswd 86.234 KB -rwsr-xr-x 2025-04-18 13:46 R E G D
gpg 1.05 MB -rwxr-xr-x 2022-07-01 07:03 R E G D
gpg-agent 400.82 KB -rwxr-xr-x 2022-07-01 07:03 R E G D
gpg-connect-agent 146.875 KB -rwxr-xr-x 2022-07-01 07:03 R E G D
gpg-wks-server 190.922 KB -rwxr-xr-x 2022-07-01 07:03 R E G D
gpg-zip 3.434 KB -rwxr-xr-x 2022-07-01 07:03 R E G D
gpgcompose 894.141 KB -rwxr-xr-x 2022-07-01 07:03 R E G D
gpgconf 162.594 KB -rwxr-xr-x 2022-07-01 07:03 R E G D
gpgparsemail 30.227 KB -rwxr-xr-x 2022-07-01 07:03 R E G D
gpgsm 499 KB -rwxr-xr-x 2022-07-01 07:03 R E G D
gpgsplit 70.484 KB -rwxr-xr-x 2022-07-01 07:03 R E G D
gpgtar 143.25 KB -rwxr-xr-x 2022-07-01 07:03 R E G D
gpgv 438.867 KB -rwxr-xr-x 2022-07-01 07:03 R E G D
gpic 220.188 KB -rwxr-xr-x 2021-01-27 09:42 R E G D
grep 198.313 KB -rwxr-xr-x 2023-01-25 08:23 R E G D
groff 121.375 KB -rwxr-xr-x 2021-01-27 09:42 R E G D
grog 2.711 KB -rwxr-xr-x 2021-01-27 09:42 R E G D
grops 181.781 KB -rwxr-xr-x 2021-01-27 09:42 R E G D
grotty 133.406 KB -rwxr-xr-x 2021-01-27 09:42 R E G D
groups 42.813 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
growpart 21.985 KB -rwxr-xr-x 2020-05-28 22:11 R E G D
grub-editenv 374.117 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-file 813.367 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-fstest 935.055 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-glue-efi 244.93 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-kbdcomp 1.642 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-menulst2cfg 228.977 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-mkfont 269.617 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-mkimage 354.117 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-mklayout 249.242 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-mknetdir 406.914 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-mkpasswd-pbkdf2 249.305 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-mkrelpath 240.648 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-mkrescue 991.789 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-mkstandalone 483.242 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-mount 758.008 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-render-label 825.93 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-script-check 268.773 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-syslinux2cfg 774.445 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
gtbl 142.352 KB -rwxr-xr-x 2021-01-27 09:42 R E G D
gtk-builder-tool 34.578 KB -rwxr-xr-x 2024-07-19 13:30 R E G D
gtk-encode-symbolic-svg 18.258 KB -rwxr-xr-x 2024-07-19 13:30 R E G D
gtk-launch 18.305 KB -rwxr-xr-x 2024-07-19 13:30 R E G D
gtk-query-settings 14.148 KB -rwxr-xr-x 2024-07-19 13:30 R E G D
gtk-update-icon-cache 38.469 KB -rwxr-xr-x 2024-07-19 13:30 R E G D
gunzip 2.291 KB -rwxr-xr-x 2022-04-10 05:50 R E G D
gzexe 6.296 KB -rwxr-xr-x 2022-04-10 05:50 R E G D
gzip 95.75 KB -rwxr-xr-x 2022-04-10 05:50 R E G D
h2ph 28.539 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
h2xs 59.503 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
hd 54.242 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
head 46.875 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
helpztags 2.455 KB -rwxr-xr-x 2025-02-07 08:22 R E G D
hexdump 54.242 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
host 102.625 KB -rwxr-xr-x 2025-10-30 09:48 R E G D
hostid 38.75 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
hostname 22.07 KB -rwxr-xr-x 2019-11-07 11:31 R E G D
hostnamectl 26.211 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
htcacheclean 34.164 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
htdbm 26.156 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
htdigest 14.156 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
htpasswd 26.156 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
i386 26.5 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
iconv 59.008 KB -rwxr-xr-x 2025-05-27 10:40 R E G D
id 46.938 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
infocmp 62.227 KB -rwxr-xr-x 2023-05-26 18:31 R E G D
infotocap 90.266 KB -rwxr-xr-x 2023-05-26 18:31 R E G D
innochecksum 3.5 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
innotop 445.378 KB -rwxr-xr-x 2025-05-30 04:33 R E G D
install 155.789 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
install-info 111.758 KB -rwxr-xr-x 2021-01-08 21:54 R E G D
instmodsh 4.268 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
ionice 30.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
ip 617.805 KB -rwxr-xr-x 2021-02-05 23:34 R E G D
ipcmk 30.297 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
ipcrm 34.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
ipcs 70.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
iptables-xml 96.813 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
ischroot 14.266 KB -rwxr-xr-x 2020-09-27 17:25 R E G D
isodump 179.914 KB -rwxr-xr-x 2021-02-04 21:36 R E G D
isoinfo 339.156 KB -rwxr-xr-x 2021-02-04 21:36 R E G D
isovfy 175.883 KB -rwxr-xr-x 2021-02-04 21:36 R E G D
join 54.906 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
journalctl 74.234 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
json-patch-jsondiff 0.98 KB -rwxr-xr-x 2020-05-11 08:59 R E G D
json_pp 4.872 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
jsondiff 0.98 KB -rwxr-xr-x 2020-05-11 08:59 R E G D
jsonpatch 3.576 KB -rwxr-xr-x 2020-05-11 08:59 R E G D
jsonpointer 1.795 KB -rwxr-xr-x 2020-05-08 09:01 R E G D
jsonschema 0.388 KB -rwxr-xr-x 2020-05-08 09:04 R E G D
kbxutil 158.695 KB -rwxr-xr-x 2022-07-01 07:03 R E G D
kernel-install 4.838 KB -rwxr-xr-x 2021-02-02 15:29 R E G D
kill 30.227 KB -rwxr-xr-x 2021-04-06 07:17 R E G D
killall 31.867 KB -rwxr-xr-x 2021-02-08 10:19 R E G D
kmod 166.18 KB -rwxr-xr-x 2021-01-08 01:37 R E G D
last 46.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
lastb 46.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
lastlog 31.5 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
lcf 7.602 KB -rwxr-xr-x 2025-01-16 16:53 R E G D
ldd 5.275 KB -rwxr-xr-x 2025-05-27 10:40 R E G D
less 179.695 KB -rwxr-xr-x 2024-05-02 18:29 R E G D
lessecho 14.164 KB -rwxr-xr-x 2024-05-02 18:29 R E G D
lessfile 8.343 KB -rwxr-xr-x 2024-05-02 18:29 R E G D
lesskey 23.57 KB -rwxr-xr-x 2024-05-02 18:29 R E G D
lesspipe 8.343 KB -rwxr-xr-x 2024-05-02 18:29 R E G D
letsencrypt 0.938 KB -rwxr-xr-x 2021-02-13 18:56 R E G D
lexgrog 98.969 KB -rwxr-xr-x 2021-02-19 10:14 R E G D
lft 2.435 KB -rwxr-xr-x 2022-12-29 07:27 R E G D
lft.db 2.435 KB -rwxr-xr-x 2022-12-29 07:27 R E G D
libnetcfg 15.405 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
link 38.75 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
linux-check-removal 4.564 KB -rwxr-xr-x 2018-09-05 17:52 R E G D
linux-update-symlinks 6.172 KB -rwxr-xr-x 2016-06-05 01:13 R E G D
linux-version 2.633 KB -rwxr-xr-x 2015-08-11 15:45 R E G D
linux32 26.5 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
linux64 26.5 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
ln 71.133 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
lnstat 22.508 KB -rwxr-xr-x 2021-02-05 23:34 R E G D
locale 54.039 KB -rwxr-xr-x 2025-05-27 10:40 R E G D
localectl 26.219 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
localedef 307.75 KB -rwxr-xr-x 2025-05-27 10:40 R E G D
logger 50.82 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
login 55.617 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
loginctl 54.328 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
logname 38.781 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
logresolve 14.164 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
look 14.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
ls 143.727 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
lsattr 14.156 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
lsb_release 3.553 KB -rwxr-xr-x 2019-03-09 18:30 R E G D
lsblk 146.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
lscpu 98.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
lsinitramfs 0.689 KB -rwxr-xr-x 2021-01-14 18:04 R E G D
lsipc 94.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
lslocks 38.555 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
lslogins 66.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
lsmem 66.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
lsmod 166.18 KB -rwxr-xr-x 2021-01-08 01:37 R E G D
lsns 50.234 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
lsof 167.469 KB -rwxr-xr-x 2020-11-19 12:35 R E G D
lspci 91.945 KB -rwxr-xr-x 2020-12-24 17:49 R E G D
lspgpot 1.056 KB -rwxr-xr-x 2017-08-28 10:22 R E G D
lzcat 79.289 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
lzcmp 6.858 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
lzdiff 6.858 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
lzegrep 5.874 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
lzfgrep 5.874 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
lzgrep 5.874 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
lzless 1.757 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
lzma 79.289 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
lzmainfo 14.313 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
lzmore 2.111 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
m17n-db 3.646 KB -rwxr-xr-x 2019-11-20 23:46 R E G D
mail 213.047 KB -rwxr-xr-x 2020-11-19 05:02 R E G D
mail.mailutils 213.047 KB -rwxr-xr-x 2020-11-19 05:02 R E G D
mailq 30.148 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
mailx 213.047 KB -rwxr-xr-x 2020-11-19 05:02 R E G D
man 112.891 KB -rwxr-xr-x 2021-02-19 10:14 R E G D
man-recode 26.922 KB -rwxr-xr-x 2021-02-19 10:14 R E G D
mandb 135.148 KB -rwxr-xr-x 2021-02-19 10:14 R E G D
manpath 34.695 KB -rwxr-xr-x 2021-02-19 10:14 R E G D
mariadb 3.98 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-access 109.3 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-admin 3.74 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-analyze 3.74 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-binlog 4 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-check 3.74 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-conv 3.51 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-convert-table-format 4.122 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-dump 3.82 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-dumpslow 8.049 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-find-rows 3.213 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-fix-extensions 1.221 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-hotcopy 34.153 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-import 3.73 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-install-db 22.349 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-optimize 3.74 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-plugin 3.46 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-repair 3.74 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-report 49.22 KB -rwxr-xr-x 2025-05-30 04:33 R E G D
mariadb-secure-installation 13.477 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-service-convert 2.447 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-setpermission 17.556 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-show 3.73 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-slap 3.74 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-tzinfo-to-sql 3.46 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-upgrade 3.56 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadb-waitpid 3.45 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadbcheck 3.74 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadbd-multi 26.674 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadbd-safe 30.395 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mariadbd-safe-helper 3.42 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mawk 154.586 KB -rwxr-xr-x 2020-02-16 19:41 R E G D
mcookie 34.297 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
md5sum 46.906 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
md5sum.textutils 46.906 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
mesg 14.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
messages 14.516 KB -rwxr-xr-x 2020-11-19 05:02 R E G D
messages.mailutils 14.516 KB -rwxr-xr-x 2020-11-19 05:02 R E G D
migrate-pubring-from-classic-gpg 2.988 KB -rwxr-xr-x 2022-04-27 19:31 R E G D
mimeview 59.555 KB -rwxr-xr-x 2020-11-19 05:02 R E G D
mkdir 83.188 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
mkfifo 67.094 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
mkisofs 622.945 KB -rwxr-xr-x 2021-02-04 21:36 R E G D
mknod 75.094 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
mktemp 46.938 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
mkzftree 26.578 KB -rwxr-xr-x 2021-02-04 21:36 R E G D
mokutil 60.188 KB -rwxr-xr-x 2022-06-12 20:41 R E G D
more 58.234 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
mount 54.227 KB -rwsr-xr-x 2024-03-28 10:09 R E G D
mount-image-callback 13.808 KB -rwxr-xr-x 2020-05-28 22:11 R E G D
mountpoint 18.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
movemail 40.102 KB -rwxr-xr-x 2020-11-19 05:02 R E G D
movemail.mailutils 40.102 KB -rwxr-xr-x 2020-11-19 05:02 R E G D
msql2mysql 1.412 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mt 83.32 KB -rwxr-xr-x 2023-09-30 12:18 R E G D
mt-gnu 83.32 KB -rwxr-xr-x 2023-09-30 12:18 R E G D
mv 143.633 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
my_print_defaults 3.45 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
myisam_ftdump 3.73 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
myisamchk 3.85 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
myisamlog 3.72 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
myisampack 3.76 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysql 3.98 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysql_convert_table_format 4.122 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysql_find_rows 3.213 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysql_fix_extensions 1.221 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysql_install_db 22.349 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysql_plugin 3.46 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysql_secure_installation 13.477 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysql_setpermission 17.556 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysql_tzinfo_to_sql 3.46 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysql_upgrade 3.56 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysql_waitpid 3.45 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysqlaccess 109.3 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysqladmin 3.74 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysqlanalyze 3.74 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysqlbinlog 4 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysqlcheck 3.74 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysqld_multi 26.674 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysqld_safe 30.395 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysqld_safe_helper 3.42 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysqldump 3.82 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysqldumpslow 8.049 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysqlhotcopy 34.153 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysqlimport 3.73 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysqloptimize 3.74 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysqlrepair 3.74 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysqlreport 49.22 KB -rwxr-xr-x 2025-05-30 04:33 R E G D
mysqlshow 3.73 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mysqlslap 3.74 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mytop 71.954 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
namei 34.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
nano 340.641 KB -rwxr-xr-x 2024-06-17 12:31 R E G D
nawk 678.344 KB -rwxr-xr-x 2021-02-10 08:42 R E G D
neqn 0.892 KB -rwxr-xr-x 2021-01-27 09:42 R E G D
netstat 151.648 KB -rwxr-xr-x 2025-05-30 20:08 R E G D
networkctl 94.219 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
newaliases 30.148 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
newgrp 43.586 KB -rwsr-xr-x 2025-04-18 13:46 R E G D
ngettext 34.227 KB -rwxr-xr-x 2021-02-02 21:35 R E G D
nice 42.813 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
nisdomainname 22.07 KB -rwxr-xr-x 2019-11-07 11:31 R E G D
nl 111.031 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
nohup 42.844 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
nproc 42.813 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
nroff 3.216 KB -rwxr-xr-x 2021-01-27 09:42 R E G D
nsenter 34.453 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
nstat 78.234 KB -rwxr-xr-x 2021-02-05 23:34 R E G D
numfmt 66.969 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
od 70.938 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
open 18.053 KB -rwxr-xr-x 2021-02-25 18:24 R E G D
openssl 719.523 KB -rwxr-xr-x 2025-10-03 09:54 R E G D
pager 179.695 KB -rwxr-xr-x 2024-05-02 18:29 R E G D
partx 118.234 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
passwd 62.461 KB -rwsr-xr-x 2025-04-18 13:46 R E G D
paste 42.844 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
pathchk 38.781 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
pdb3 61.262 KB -rwxr-xr-x 2025-03-20 02:07 R E G D
pdb3.9 61.262 KB -rwxr-xr-x 2025-03-20 02:07 R E G D
peekfd 14.445 KB -rwxr-xr-x 2021-02-08 10:19 R E G D
perf 0.516 KB -rwxr-xr-x 2018-07-20 01:35 R E G D
perl 3.51 MB -rwxr-xr-x 2024-10-20 21:53 R E G D
perl5.32-x86_64-linux-gnu 14.344 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
perl5.32.1 3.51 MB -rwxr-xr-x 2024-10-20 21:53 R E G D
perlbug 44.201 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
perldoc 0.122 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
perlivp 10.609 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
perlthanks 44.201 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
perror 3.64 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
pgrep 30.234 KB -rwxr-xr-x 2021-04-06 07:17 R E G D
phar 14.536 KB -rwxr-xr-x 2025-07-27 11:10 R E G D
phar.default 14.536 KB -rwxr-xr-x 2025-07-27 11:10 R E G D
phar.phar 14.536 KB -rwxr-xr-x 2025-07-27 11:10 R E G D
phar.phar.default 14.536 KB -rwxr-xr-x 2025-07-27 11:10 R E G D
phar.phar7.4 14.536 KB -rwxr-xr-x 2025-07-27 11:10 R E G D
phar7.4 14.536 KB -rwxr-xr-x 2025-07-27 11:10 R E G D
phar7.4.phar 14.536 KB -rwxr-xr-x 2025-07-27 11:10 R E G D
php 4.55 MB -rwxr-xr-x 2025-07-27 11:10 R E G D
php.default 4.55 MB -rwxr-xr-x 2025-07-27 11:10 R E G D
php7.4 4.55 MB -rwxr-xr-x 2025-07-27 11:10 R E G D
pic 220.188 KB -rwxr-xr-x 2021-01-27 09:42 R E G D
pico 340.641 KB -rwxr-xr-x 2024-06-17 12:31 R E G D
piconv 8.161 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
pidof 26.227 KB -rwxr-xr-x 2021-12-16 18:12 R E G D
pidwait 30.234 KB -rwxr-xr-x 2021-04-06 07:17 R E G D
pinentry 62.492 KB -rwxr-xr-x 2020-05-08 17:10 R E G D
pinentry-curses 62.492 KB -rwxr-xr-x 2020-05-08 17:10 R E G D
ping 75.617 KB -rwxr-xr-x 2021-02-02 17:49 R E G D
ping4 75.617 KB -rwxr-xr-x 2021-02-02 17:49 R E G D
ping6 75.617 KB -rwxr-xr-x 2021-02-02 17:49 R E G D
pinky 42.969 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
pkill 30.234 KB -rwxr-xr-x 2021-04-06 07:17 R E G D
pl2pm 4.427 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
pldd 22.57 KB -rwxr-xr-x 2025-05-27 10:40 R E G D
pmap 34.234 KB -rwxr-xr-x 2021-04-06 07:17 R E G D
pod2html 4.037 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
pod2man 14.682 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
pod2text 10.55 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
pod2usage 3.855 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
podchecker 3.572 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
pr 75.094 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
preconv 62.352 KB -rwxr-xr-x 2021-01-27 09:42 R E G D
print 18.053 KB -rwxr-xr-x 2021-02-25 18:24 R E G D
printenv 38.75 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
printf 58.844 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
prlimit 38.742 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
procan 79.859 KB -rwxr-xr-x 2021-02-03 12:58 R E G D
prove 13.335 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
prtstat 18.508 KB -rwxr-xr-x 2021-02-08 10:19 R E G D
ps 134.453 KB -rwxr-xr-x 2021-04-06 07:17 R E G D
pslog 14.383 KB -rwxr-xr-x 2021-02-08 10:19 R E G D
pstree 35.727 KB -rwxr-xr-x 2021-02-08 10:19 R E G D
pstree.x11 35.727 KB -rwxr-xr-x 2021-02-08 10:19 R E G D
ptar 3.466 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
ptardiff 2.566 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
ptargrep 4.289 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
ptx 135.094 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
pwd 42.844 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
pwdx 14.219 KB -rwxr-xr-x 2021-04-06 07:17 R E G D
py3clean 7.623 KB -rwxr-xr-x 2021-04-05 12:00 R E G D
py3compile 12.875 KB -rwxr-xr-x 2021-04-05 12:00 R E G D
py3versions 11.442 KB -rwxr-xr-x 2021-04-05 12:00 R E G D
pydoc3 0.076 KB -rwxr-xr-x 2025-03-20 02:07 R E G D
pydoc3.9 0.076 KB -rwxr-xr-x 2025-03-20 02:07 R E G D
pygettext3 21.032 KB -rwxr-xr-x 2021-02-19 12:31 R E G D
pygettext3.9 21.032 KB -rwxr-xr-x 2021-02-19 12:31 R E G D
pyjwt3 0.363 KB -rwxr-xr-x 2019-10-27 00:17 R E G D
python3 5.23 MB -rwxr-xr-x 2025-03-20 02:07 R E G D
python3.9 5.23 MB -rwxr-xr-x 2025-03-20 02:07 R E G D
qemu-img 1.93 MB -rwxr-xr-x 2025-09-08 21:30 R E G D
qemu-io 1.87 MB -rwxr-xr-x 2025-09-08 21:30 R E G D
qemu-nbd 2.02 MB -rwxr-xr-x 2025-09-08 21:30 R E G D
querybts 10.815 KB -rwxr-xr-x 2024-06-19 11:11 R E G D
rbash 1.18 MB -rwxr-xr-x 2022-03-27 18:40 R E G D
rcp 114.141 KB -rwxr-xr-x 2025-05-08 11:03 R E G D
rdma 130.234 KB -rwxr-xr-x 2021-02-05 23:34 R E G D
readlink 50.813 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
readmsg 35.758 KB -rwxr-xr-x 2020-11-19 05:02 R E G D
readmsg.mailutils 35.758 KB -rwxr-xr-x 2020-11-19 05:02 R E G D
realpath 54.844 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
renice 14.219 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
replace 3.44 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
reportbug 110.004 KB -rwxr-xr-x 2024-06-19 11:11 R E G D
reset 30.156 KB -rwxr-xr-x 2023-05-26 18:31 R E G D
resize-part-image 4.244 KB -rwxr-xr-x 2020-05-28 22:11 R E G D
resizepart 62.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
resolve_stack_dump 3.45 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
resolvectl 126.367 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
resolveip 3.45 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
rev 14.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
rgrep 0.029 KB -rwxr-xr-x 2020-01-29 12:09 R E G D
rlogin 778.789 KB -rwxr-xr-x 2025-05-08 11:03 R E G D
rm 71 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
rmail 13.992 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
rmdir 50.813 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
rnano 340.641 KB -rwxr-xr-x 2024-06-17 12:31 R E G D
rotatelogs 26.227 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
routef 0.203 KB -rwxr-xr-x 2021-02-05 23:34 R E G D
routel 1.617 KB -rwxr-xr-x 2021-02-05 23:34 R E G D
rrsync 7.352 KB -rwxr-xr-x 2025-01-17 21:03 R E G D
rsh 778.789 KB -rwxr-xr-x 2025-05-08 11:03 R E G D
rsync 481.57 KB -rwxr-xr-x 2025-01-17 21:03 R E G D
rsync-ssl 4.826 KB -rwxr-xr-x 2025-01-17 21:03 R E G D
rtstat 22.508 KB -rwxr-xr-x 2021-02-05 23:34 R E G D
run-mailcap 18.053 KB -rwxr-xr-x 2021-02-25 18:24 R E G D
run-parts 26.828 KB -rwxr-xr-x 2020-09-27 17:25 R E G D
runcon 42.906 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
rview 3.03 MB -rwxr-xr-x 2025-03-30 03:33 R E G D
rvim 3.03 MB -rwxr-xr-x 2025-03-30 03:33 R E G D
savelog 10.235 KB -rwxr-xr-x 2020-09-27 17:25 R E G D
scp 114.141 KB -rwxr-xr-x 2025-05-08 11:03 R E G D
screen 471.008 KB -rwxr-xr-x 2021-02-27 00:52 R E G D
script 66.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
scriptlive 54.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
scriptreplay 42.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
sdiff 46.906 KB -rwxr-xr-x 2021-01-01 17:52 R E G D
sed 119.359 KB -rwxr-xr-x 2018-12-22 14:24 R E G D
see 18.053 KB -rwxr-xr-x 2021-02-25 18:24 R E G D
select-editor 2.389 KB -rwxr-xr-x 2021-01-12 22:01 R E G D
sensible-browser 1.201 KB -rwxr-xr-x 2021-01-12 22:01 R E G D
sensible-editor 1.15 KB -rwxr-xr-x 2021-01-12 22:01 R E G D
sensible-pager 0.441 KB -rwxr-xr-x 2021-01-12 22:01 R E G D
seq 54.875 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
setarch 26.5 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
setpci 30.227 KB -rwxr-xr-x 2020-12-24 17:49 R E G D
setpriv 50.234 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
setsid 14.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
setterm 46.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
sftp 170.352 KB -rwxr-xr-x 2025-05-08 11:03 R E G D
sg 43.586 KB -rwsr-xr-x 2025-04-18 13:46 R E G D
sh 122.617 KB -rwxr-xr-x 2020-12-10 13:23 R E G D
sha1sum 50.906 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
sha224sum 62.906 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
sha256sum 62.906 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
sha384sum 66.906 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
sha512sum 66.906 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
shasum 9.742 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
shred 63.094 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
shuf 58.969 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
sieve 31.891 KB -rwxr-xr-x 2020-11-19 05:02 R E G D
skill 30.227 KB -rwxr-xr-x 2021-04-06 07:17 R E G D
slabtop 22.227 KB -rwxr-xr-x 2021-04-06 07:17 R E G D
sleep 42.781 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
slogin 778.789 KB -rwxr-xr-x 2025-05-08 11:03 R E G D
snice 30.227 KB -rwxr-xr-x 2021-04-06 07:17 R E G D
socat 397.93 KB -rwxr-xr-x 2021-02-03 12:58 R E G D
soelim 46.352 KB -rwxr-xr-x 2021-01-27 09:42 R E G D
sort 115.633 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
splain 18.956 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
split 59.469 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
ss 177.063 KB -rwxr-xr-x 2021-02-05 23:34 R E G D
ssh 778.789 KB -rwxr-xr-x 2025-05-08 11:03 R E G D
ssh-add 366.125 KB -rwxr-xr-x 2025-05-08 11:03 R E G D
ssh-agent 346.133 KB -rwxr-sr-x 2025-05-08 11:03 R E G D
ssh-argv0 1.421 KB -rwxr-xr-x 2025-04-29 13:14 R E G D
ssh-copy-id 10.693 KB -rwxr-xr-x 2025-05-08 11:03 R E G D
ssh-keygen 474.195 KB -rwxr-xr-x 2025-05-08 11:03 R E G D
ssh-keyscan 458.227 KB -rwxr-xr-x 2025-05-08 11:03 R E G D
stat 83.188 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
stdbuf 50.844 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
streamzip 5.392 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
stty 82.938 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
su 70.227 KB -rwsr-xr-x 2024-03-28 10:09 R E G D
sudo 178.32 KB -rwsr-xr-x 2025-06-26 17:03 R E G D
sudoedit 178.32 KB -rwsr-xr-x 2025-06-26 17:03 R E G D
sudoreplay 115.391 KB -rwxr-xr-x 2025-06-26 17:03 R E G D
sum 46.883 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
sync 38.813 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
systemctl 1.02 MB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd 1.66 MB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-analyze 1.62 MB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-ask-password 14.328 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-cat 14.219 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-cgls 18.32 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-cgtop 34.234 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-delta 26.219 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-detect-virt 14.211 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-escape 18.211 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-hwdb 110.516 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-id128 22.211 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-inhibit 22.234 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-machine-id-setup 22.313 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-mount 50.438 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-notify 18.219 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-path 18.211 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-resolve 126.367 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-run 54.414 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-socket-activate 26.219 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-stdio-bridge 18.219 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-sysusers 54.523 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-tmpfiles 86.414 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-tty-ask-password-agent 30.219 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
systemd-umount 50.438 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
tabs 18.148 KB -rwxr-xr-x 2023-05-26 18:31 R E G D
tac 106.969 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
tail 75.063 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
tar 519.461 KB -rwxr-xr-x 2024-01-20 09:59 R E G D
taskset 34.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
tbl 142.352 KB -rwxr-xr-x 2021-01-27 09:42 R E G D
tcpdump 1.2 MB -rwxr-xr-x 2022-05-22 16:22 R E G D
tee 42.875 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
tempfile 14.117 KB -rwxr-xr-x 2020-09-27 17:25 R E G D
test 54.813 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
tic 90.266 KB -rwxr-xr-x 2023-05-26 18:31 R E G D
timedatectl 42.211 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
timeout 43.406 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
tload 14.234 KB -rwxr-xr-x 2021-04-06 07:17 R E G D
toe 22.148 KB -rwxr-xr-x 2023-05-26 18:31 R E G D
top 122.07 KB -rwxr-xr-x 2021-04-06 07:17 R E G D
touch 99.031 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
tput 26.18 KB -rwxr-xr-x 2023-05-26 18:31 R E G D
tr 54.844 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
traceproto 2.817 KB -rwxr-xr-x 2022-12-29 07:27 R E G D
traceproto.db 2.817 KB -rwxr-xr-x 2022-12-29 07:27 R E G D
traceroute 71.156 KB -rwxr-xr-x 2022-12-29 07:27 R E G D
traceroute-nanog 1.58 KB -rwxr-xr-x 2022-12-29 07:27 R E G D
traceroute.db 71.156 KB -rwxr-xr-x 2022-12-29 07:27 R E G D
traceroute6 71.156 KB -rwxr-xr-x 2022-12-29 07:27 R E G D
traceroute6.db 71.156 KB -rwxr-xr-x 2022-12-29 07:27 R E G D
tree 79.602 KB -rwxr-xr-x 2019-08-06 19:31 R E G D
troff 751.75 KB -rwxr-xr-x 2021-01-27 09:42 R E G D
true 38.75 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
truncate 42.813 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
tset 30.156 KB -rwxr-xr-x 2023-05-26 18:31 R E G D
tsort 54.813 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
tty 38.781 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
tzselect 14.993 KB -rwxr-xr-x 2025-05-27 10:40 R E G D
ubuntu-cloudimg-query 8.383 KB -rwxr-xr-x 2020-05-28 22:11 R E G D
ucf 40.908 KB -rwxr-xr-x 2025-01-16 16:53 R E G D
ucfq 18.913 KB -rwxr-xr-x 2025-01-16 16:53 R E G D
ucfr 10.468 KB -rwxr-xr-x 2025-01-16 16:53 R E G D
udevadm 1021.094 KB -rwxr-xr-x 2025-06-26 00:44 R E G D
ul 22.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
umount 34.219 KB -rwsr-xr-x 2024-03-28 10:09 R E G D
uname 38.813 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
unattended-upgrade 97.214 KB -rwxr-xr-x 2021-02-19 12:11 R E G D
unattended-upgrades 97.214 KB -rwxr-xr-x 2021-02-19 12:11 R E G D
uncompress 2.291 KB -rwxr-xr-x 2022-04-10 05:50 R E G D
unexpand 42.844 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
uniq 50.906 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
unlink 38.75 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
unlzma 79.289 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
unmkinitramfs 3.59 KB -rwxr-xr-x 2021-01-14 18:04 R E G D
unshare 46.461 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
unxz 79.289 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
update-alternatives 58.086 KB -rwxr-xr-x 2023-09-13 21:38 R E G D
update-mime-database 59.188 KB -rwxr-xr-x 2020-10-09 17:26 R E G D
uptime 14.219 KB -rwxr-xr-x 2021-04-06 07:17 R E G D
users 38.813 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
utmpdump 30.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
uuidgen 14.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
uuidparse 38.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
vcs-run 6.75 KB -rwxr-xr-x 2020-05-28 22:11 R E G D
vdir 143.727 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
vi 3.03 MB -rwxr-xr-x 2025-03-30 03:33 R E G D
view 3.03 MB -rwxr-xr-x 2025-03-30 03:33 R E G D
vim 3.03 MB -rwxr-xr-x 2025-03-30 03:33 R E G D
vim.basic 3.03 MB -rwxr-xr-x 2025-03-30 03:33 R E G D
vim.tiny 1.34 MB -rwxr-xr-x 2025-03-30 03:33 R E G D
vimdiff 3.03 MB -rwxr-xr-x 2025-03-30 03:33 R E G D
vimtutor 2.071 KB -rwxr-xr-x 2025-03-30 03:33 R E G D
vmstat 38.242 KB -rwxr-xr-x 2021-04-06 07:17 R E G D
w 22.219 KB -rwxr-xr-x 2021-04-06 07:17 R E G D
wall 34.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
watch 26.602 KB -rwxr-xr-x 2021-04-06 07:17 R E G D
watchgnupg 18.148 KB -rwxr-xr-x 2022-07-01 07:03 R E G D
wc 46.945 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
wdctl 62.25 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
wget 527.281 KB -rwxr-xr-x 2025-04-20 10:39 R E G D
whatis 51.203 KB -rwxr-xr-x 2021-02-19 10:14 R E G D
whereis 30.664 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
which 0.924 KB -rwxr-xr-x 2020-09-27 17:25 R E G D
whiptail 26.703 KB -rwxr-xr-x 2020-12-08 01:18 R E G D
who 58.969 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
whoami 38.781 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
write 22.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
write-mime-multipart 3.514 KB -rwxr-xr-x 2020-05-28 22:11 R E G D
write.ul 22.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
wsrep_sst_backup 2.394 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
wsrep_sst_common 66.822 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
wsrep_sst_mariabackup 49.47 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
wsrep_sst_mysqldump 8.088 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
wsrep_sst_rsync 29.723 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
wsrep_sst_rsync_wan 29.723 KB -rwxr-xr-x 2025-05-30 06:25 R E G D
x86_64 26.5 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
xargs 74.367 KB -rwxr-xr-x 2021-01-09 17:36 R E G D
xsubpp 5.043 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
xxd 18.117 KB -rwxr-xr-x 2025-03-30 03:33 R E G D
xz 79.289 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
xzcat 79.289 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
xzcmp 6.858 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
xzdiff 6.858 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
xzegrep 5.874 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
xzfgrep 5.874 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
xzgrep 5.874 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
xzless 1.757 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
xzmore 2.111 KB -rwxr-xr-x 2022-04-11 14:36 R E G D
yes 38.75 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
ypdomainname 22.07 KB -rwxr-xr-x 2019-11-07 11:31 R E G D
zcat 1.938 KB -rwxr-xr-x 2022-04-10 05:50 R E G D
zcmp 1.639 KB -rwxr-xr-x 2022-04-10 05:50 R E G D
zdiff 5.76 KB -rwxr-xr-x 2022-04-10 05:50 R E G D
zdump 22.398 KB -rwxr-xr-x 2025-05-27 10:40 R E G D
zegrep 0.028 KB -rwxr-xr-x 2022-04-10 05:50 R E G D
zfgrep 0.028 KB -rwxr-xr-x 2022-04-10 05:50 R E G D
zforce 2.032 KB -rwxr-xr-x 2022-04-10 05:50 R E G D
zgrep 7.86 KB -rwxr-xr-x 2022-04-10 05:50 R E G D
zipdetails 50.038 KB -rwxr-xr-x 2024-10-20 21:53 R E G D
zless 2.154 KB -rwxr-xr-x 2022-04-10 05:50 R E G D
zmore 1.799 KB -rwxr-xr-x 2022-04-10 05:50 R E G D
znew 4.47 KB -rwxr-xr-x 2022-04-10 05:50 R E G D
REQUEST EXIT
©TheAlmightyZeus
#!/usr/bin/perl eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' if $running_under_some_shell; BEGIN { pop @INC if $INC[-1] eq '.' } use warnings; =head1 NAME h2xs - convert .h C header files to Perl extensions =head1 SYNOPSIS B [B ...] [headerfile ... [extra_libraries]] B B<-h>|B<-?>|B<--help> =head1 DESCRIPTION I builds a Perl extension from C header files. The extension will include functions which can be used to retrieve the value of any #define statement which was in the C header files. The I will be used for the name of the extension. If module_name is not supplied then the name of the first header file will be used, with the first character capitalized. If the extension might need extra libraries, they should be included here. The extension Makefile.PL will take care of checking whether the libraries actually exist and how they should be loaded. The extra libraries should be specified in the form -lm -lposix, etc, just as on the cc command line. By default, the Makefile.PL will search through the library path determined by Configure. That path can be augmented by including arguments of the form B<-L/another/library/path> in the extra-libraries argument. In spite of its name, I may also be used to create a skeleton pure Perl module. See the B<-X> option. =head1 OPTIONS =over 5 =item B<-A>, B<--omit-autoload> Omit all autoload facilities. This is the same as B<-c> but also removes the S> statement from the .pm file. =item B<-B>, B<--beta-version> Use an alpha/beta style version number. Causes version number to be "0.00_01" unless B<-v> is specified. =item B<-C>, B<--omit-changes> Omits creation of the F file, and adds a HISTORY section to the POD template. =item B<-F>, B<--cpp-flags>=I Additional flags to specify to C preprocessor when scanning header for function declarations. Writes these options in the generated F too. =item B<-M>, B<--func-mask>=I selects functions/macros to process. =item B<-O>, B<--overwrite-ok> Allows a pre-existing extension directory to be overwritten. =item B<-P>, B<--omit-pod> Omit the autogenerated stub POD section. =item B<-X>, B<--omit-XS> Omit the XS portion. Used to generate a skeleton pure Perl module. C<-c> and C<-f> are implicitly enabled. =item B<-a>, B<--gen-accessors> Generate an accessor method for each element of structs and unions. The generated methods are named after the element name; will return the current value of the element if called without additional arguments; and will set the element to the supplied value (and return the new value) if called with an additional argument. Embedded structures and unions are returned as a pointer rather than the complete structure, to facilitate chained calls. These methods all apply to the Ptr type for the structure; additionally two methods are constructed for the structure type itself, C<_to_ptr> which returns a Ptr type pointing to the same structure, and a C method to construct and return a new structure, initialised to zeroes. =item B<-b>, B<--compat-version>=I Generates a .pm file which is backwards compatible with the specified perl version. For versions < 5.6.0, the changes are. - no use of 'our' (uses 'use vars' instead) - no 'use warnings' Specifying a compatibility version higher than the version of perl you are using to run h2xs will have no effect. If unspecified h2xs will default to compatibility with the version of perl you are using to run h2xs. =item B<-c>, B<--omit-constant> Omit C from the .xs file and corresponding specialised C from the .pm file. =item B<-d>, B<--debugging> Turn on debugging messages. =item B<-e>, B<--omit-enums>=[I] If I is not given, skip all constants that are defined in a C enumeration. Otherwise skip only those constants that are defined in an enum whose name matches I. Since I is optional, make sure that this switch is followed by at least one other switch if you omit I and have some pending arguments such as header-file names. This is ok: h2xs -e -n Module::Foo foo.h This is not ok: h2xs -n Module::Foo -e foo.h In the latter, foo.h is taken as I. =item B<-f>, B<--force> Allows an extension to be created for a header even if that header is not found in standard include directories. =item B<-g>, B<--global> Include code for safely storing static data in the .xs file. Extensions that do no make use of static data can ignore this option. =item B<-h>, B<-?>, B<--help> Print the usage, help and version for this h2xs and exit. =item B<-k>, B<--omit-const-func> For function arguments declared as C, omit the const attribute in the generated XS code. =item B<-m>, B<--gen-tied-var> B: for each variable declared in the header file(s), declare a perl variable of the same name magically tied to the C variable. =item B<-n>, B<--name>=I Specifies a name to be used for the extension, e.g., S<-n RPC::DCE> =item B<-o>, B<--opaque-re>=I Use "opaque" data type for the C types matched by the regular expression, even if these types are C-equivalent to types from typemaps. Should not be used without B<-x>. This may be useful since, say, types which are C-equivalent to integers may represent OS-related handles, and one may want to work with these handles in OO-way, as in C<$handle-Edo_something()>. Use C<-o .> if you want to handle all the Ced types as opaque types. The type-to-match is whitewashed (except for commas, which have no whitespace before them, and multiple C<*> which have no whitespace between them). =item B<-p>, B<--remove-prefix>=I Specify a prefix which should be removed from the Perl function names, e.g., S<-p sec_rgy_> This sets up the XS B keyword and removes the prefix from functions that are autoloaded via the C mechanism. =item B<-s>, B<--const-subs>=I Create a perl subroutine for the specified macros rather than autoload with the constant() subroutine. These macros are assumed to have a return type of B, e.g., S<-s sec_rgy_wildcard_name,sec_rgy_wildcard_sid>. =item B<-t>, B<--default-type>=I Specify the internal type that the constant() mechanism uses for macros. The default is IV (signed integer). Currently all macros found during the header scanning process will be assumed to have this type. Future versions of C may gain the ability to make educated guesses. =item B<--use-new-tests> When B<--compat-version> (B<-b>) is present the generated tests will use C rather than C which is the default for versions before 5.6.2. C will be added to PREREQ_PM in the generated C. =item B<--use-old-tests> Will force the generation of test code that uses the older C module. =item B<--skip-exporter> Do not use C and/or export any symbol. =item B<--skip-ppport> Do not use C: no portability to older version. =item B<--skip-autoloader> Do not use the module C; but keep the constant() function and C for constants. =item B<--skip-strict> Do not use the pragma C. =item B<--skip-warnings> Do not use the pragma C. =item B<-v>, B<--version>=I Specify a version number for this extension. This version number is added to the templates. The default is 0.01, or 0.00_01 if C<-B> is specified. The version specified should be numeric. =item B<-x>, B<--autogen-xsubs> Automatically generate XSUBs basing on function declarations in the header file. The package C should be installed. If this option is specified, the name of the header file may look like C. In this case NAME1 is used instead of the specified string, but XSUBs are emitted only for the declarations included from file NAME2. Note that some types of arguments/return-values for functions may result in XSUB-declarations/typemap-entries which need hand-editing. Such may be objects which cannot be converted from/to a pointer (like C), pointers to functions, or arrays. See also the section on L>. =back =head1 EXAMPLES # Default behavior, extension is Rusers h2xs rpcsvc/rusers # Same, but extension is RUSERS h2xs -n RUSERS rpcsvc/rusers # Extension is rpcsvc::rusers. Still finds h2xs rpcsvc::rusers # Extension is ONC::RPC. Still finds h2xs -n ONC::RPC rpcsvc/rusers # Without constant() or AUTOLOAD h2xs -c rpcsvc/rusers # Creates templates for an extension named RPC h2xs -cfn RPC # Extension is ONC::RPC. h2xs -cfn ONC::RPC # Extension is a pure Perl module with no XS code. h2xs -X My::Module # Extension is Lib::Foo which works at least with Perl5.005_03. # Constants are created for all #defines and enums h2xs can find # in foo.h. h2xs -b 5.5.3 -n Lib::Foo foo.h # Extension is Lib::Foo which works at least with Perl5.005_03. # Constants are created for all #defines but only for enums # whose names do not start with 'bar_'. h2xs -b 5.5.3 -e '^bar_' -n Lib::Foo foo.h # Makefile.PL will look for library -lrpc in # additional directory /opt/net/lib h2xs rpcsvc/rusers -L/opt/net/lib -lrpc # Extension is DCE::rgynbase # prefix "sec_rgy_" is dropped from perl function names h2xs -n DCE::rgynbase -p sec_rgy_ dce/rgynbase # Extension is DCE::rgynbase # prefix "sec_rgy_" is dropped from perl function names # subroutines are created for sec_rgy_wildcard_name and # sec_rgy_wildcard_sid h2xs -n DCE::rgynbase -p sec_rgy_ \ -s sec_rgy_wildcard_name,sec_rgy_wildcard_sid dce/rgynbase # Make XS without defines in perl.h, but with function declarations # visible from perl.h. Name of the extension is perl1. # When scanning perl.h, define -DEXT=extern -DdEXT= -DINIT(x)= # Extra backslashes below because the string is passed to shell. # Note that a directory with perl header files would # be added automatically to include path. h2xs -xAn perl1 -F "-DEXT=extern -DdEXT= -DINIT\(x\)=" perl.h # Same with function declaration in proto.h as visible from perl.h. h2xs -xAn perl2 perl.h,proto.h # Same but select only functions which match /^av_/ h2xs -M '^av_' -xAn perl2 perl.h,proto.h # Same but treat SV* etc as "opaque" types h2xs -o '^[S]V \*$' -M '^av_' -xAn perl2 perl.h,proto.h =head2 Extension based on F<.h> and F<.c> files Suppose that you have some C files implementing some functionality, and the corresponding header files. How to create an extension which makes this functionality accessible in Perl? The example below assumes that the header files are F and I, and you want the perl module be named as C. If you need some preprocessor directives and/or linking with external libraries, see the flags C<-F>, C<-L> and C<-l> in L<"OPTIONS">. =over =item Find the directory name Start with a dummy run of h2xs: h2xs -Afn Ext::Ension The only purpose of this step is to create the needed directories, and let you know the names of these directories. From the output you can see that the directory for the extension is F. =item Copy C files Copy your header files and C files to this directory F. =item Create the extension Run h2xs, overwriting older autogenerated files: h2xs -Oxan Ext::Ension interface_simple.h interface_hairy.h h2xs looks for header files I changing to the extension directory, so it will find your header files OK. =item Archive and test As usual, run cd Ext/Ension perl Makefile.PL make dist make make test =item Hints It is important to do C as early as possible. This way you can easily merge(1) your changes to autogenerated files if you decide to edit your C<.h> files and rerun h2xs. Do not forget to edit the documentation in the generated F<.pm> file. Consider the autogenerated files as skeletons only, you may invent better interfaces than what h2xs could guess. Consider this section as a guideline only, some other options of h2xs may better suit your needs. =back =head1 ENVIRONMENT No environment variables are used. =head1 AUTHOR Larry Wall and others =head1 SEE ALSO L, L, L, and L. =head1 DIAGNOSTICS The usual warnings if it cannot read or write the files involved. =head1 LIMITATIONS of B<-x> F would not distinguish whether an argument to a C function which is of the form, say, C, is an input, output, or input/output parameter. In particular, argument declarations of the form int foo(n) int *n should be better rewritten as int foo(n) int &n if C is an input parameter. Additionally, F has no facilities to intuit that a function int foo(addr,l) char *addr int l takes a pair of address and length of data at this address, so it is better to rewrite this function as int foo(sv) SV *addr PREINIT: STRLEN len; char *s; CODE: s = SvPV(sv,len); RETVAL = foo(s, len); OUTPUT: RETVAL or alternately static int my_foo(SV *sv) { STRLEN len; char *s = SvPV(sv,len); return foo(s, len); } MODULE = foo PACKAGE = foo PREFIX = my_ int foo(sv) SV *sv See L and L for additional details. =cut # ' # Grr use strict; my( $H2XS_VERSION ) = ' $Revision: 1.23 $ ' =~ /\$Revision:\s+([^\s]+)/; my $TEMPLATE_VERSION = '0.01'; my @ARGS = @ARGV; my $compat_version = $]; use Getopt::Long; use Config; use Text::Wrap; $Text::Wrap::huge = 'overflow'; $Text::Wrap::columns = 80; use ExtUtils::Constant qw (WriteConstants WriteMakefileSnippet autoload); use File::Compare; use File::Path; sub usage { warn "@_\n" if @_; die <. --skip-strict Do not use the pragma C. --skip-warnings Do not use the pragma C. -v, --version Specify a version number for this extension. -x, --autogen-xsubs Autogenerate XSUBs using C::Scan. --use-xsloader Use XSLoader in backward compatible modules (ignored when used with -X). extra_libraries are any libraries that might be needed for loading the extension, e.g. -lm would try to link in the math library. EOFUSAGE } my ($opt_A, $opt_B, $opt_C, $opt_F, $opt_M, $opt_O, $opt_P, $opt_X, $opt_a, $opt_c, $opt_d, $opt_e, $opt_f, $opt_g, $opt_h, $opt_k, $opt_m, $opt_n, $opt_o, $opt_p, $opt_s, $opt_v, $opt_x, $opt_b, $opt_t, $new_test, $old_test, $skip_exporter, $skip_ppport, $skip_autoloader, $skip_strict, $skip_warnings, $use_xsloader ); Getopt::Long::Configure('bundling'); Getopt::Long::Configure('pass_through'); my %options = ( 'omit-autoload|A' => \$opt_A, 'beta-version|B' => \$opt_B, 'omit-changes|C' => \$opt_C, 'cpp-flags|F=s' => \$opt_F, 'func-mask|M=s' => \$opt_M, 'overwrite_ok|O' => \$opt_O, 'omit-pod|P' => \$opt_P, 'omit-XS|X' => \$opt_X, 'gen-accessors|a' => \$opt_a, 'compat-version|b=s' => \$opt_b, 'omit-constant|c' => \$opt_c, 'debugging|d' => \$opt_d, 'omit-enums|e:s' => \$opt_e, 'force|f' => \$opt_f, 'global|g' => \$opt_g, 'help|h|?' => \$opt_h, 'omit-const-func|k' => \$opt_k, 'gen-tied-var|m' => \$opt_m, 'name|n=s' => \$opt_n, 'opaque-re|o=s' => \$opt_o, 'remove-prefix|p=s' => \$opt_p, 'const-subs|s=s' => \$opt_s, 'default-type|t=s' => \$opt_t, 'version|v=s' => \$opt_v, 'autogen-xsubs|x' => \$opt_x, 'use-new-tests' => \$new_test, 'use-old-tests' => \$old_test, 'skip-exporter' => \$skip_exporter, 'skip-ppport' => \$skip_ppport, 'skip-autoloader' => \$skip_autoloader, 'skip-warnings' => \$skip_warnings, 'skip-strict' => \$skip_strict, 'use-xsloader' => \$use_xsloader, ); GetOptions(%options) || usage; usage if $opt_h; if( $opt_b ){ usage "You cannot use -b and -m at the same time.\n" if ($opt_b && $opt_m); $opt_b =~ /^v?(\d+)\.(\d+)\.(\d+)/ || usage "You must provide the backwards compatibility version in X.Y.Z form. " . "(i.e. 5.5.0)\n"; my ($maj,$min,$sub) = ($1,$2,$3); if ($maj < 5 || ($maj == 5 && $min < 6)) { $compat_version = $sub ? sprintf("%d.%03d%02d",$maj,$min,$sub) : sprintf("%d.%03d", $maj,$min); } else { $compat_version = sprintf("%d.%03d%03d",$maj,$min,$sub); } } else { my ($maj,$min,$sub) = $compat_version =~ /(\d+)\.(\d\d\d)(\d*)/; $sub ||= 0; warn sprintf <<'EOF', $maj,$min,$sub; Defaulting to backwards compatibility with perl %d.%d.%d If you intend this module to be compatible with earlier perl versions, please specify a minimum perl version with the -b option. EOF } if( $opt_B ){ $TEMPLATE_VERSION = '0.00_01'; } if( $opt_v ){ $TEMPLATE_VERSION = $opt_v; # check if it is numeric my $temp_version = $TEMPLATE_VERSION; my $beta_version = $temp_version =~ s/(\d)_(\d\d)/$1$2/; my $notnum; { local $SIG{__WARN__} = sub { $notnum = 1 }; use warnings 'numeric'; $temp_version = 0+$temp_version; } if ($notnum) { my $module = $opt_n || 'Your::Module'; warn <<"EOF"; You have specified a non-numeric version. Unless you supply an appropriate VERSION class method, users may not be able to specify a minimum required version with C. EOF } else { $opt_B = $beta_version; } } # -A implies -c. $skip_autoloader = $opt_c = 1 if $opt_A; # -X implies -c and -f $opt_c = $opt_f = 1 if $opt_X; $opt_t ||= 'IV'; my %const_xsub; %const_xsub = map { $_,1 } split(/,+/, $opt_s) if $opt_s; my $extralibs = ''; my @path_h; while (my $arg = shift) { if ($arg =~ /^-l/i) { $extralibs .= "$arg "; next; } last if $extralibs; push(@path_h, $arg); } usage "Must supply header file or module name\n" unless (@path_h or $opt_n); my $fmask; my $tmask; $fmask = qr{$opt_M} if defined $opt_M; $tmask = qr{$opt_o} if defined $opt_o; my $tmask_all = $tmask && $opt_o eq '.'; if ($opt_x) { eval {require C::Scan; 1} or die <= 0.70 or die <curdir(), $Config{usrinc}, (split / +/, $Config{locincpth} // ""), '/usr/include'); } foreach my $path_h (@path_h) { $name ||= $path_h; $module ||= do { $name =~ s/\.h$//; if ( $name !~ /::/ ) { $name =~ s#^.*/##; $name = "\u$name"; } $name; }; if( $path_h =~ s#::#/#g && $opt_n ){ warn "Nesting of headerfile ignored with -n\n"; } $path_h .= ".h" unless $path_h =~ /\.h$/; my $fullpath = $path_h; $path_h =~ s/,.*$// if $opt_x; $fullpath{$path_h} = $fullpath; # Minor trickery: we can't chdir() before we processed the headers # (so know the name of the extension), but the header may be in the # extension directory... my $tmp_path_h = $path_h; my $rel_path_h = $path_h; my @dirs = @paths; if (not -f $path_h) { my $found; for my $dir (@paths) { $found++, last if -f ($path_h = File::Spec->catfile($dir, $tmp_path_h)); } if ($found) { $rel_path_h = $path_h; $fullpath{$path_h} = $fullpath; } else { (my $epath = $module) =~ s,::,/,g; $epath = File::Spec->catdir('ext', $epath) if -d 'ext'; $rel_path_h = File::Spec->catfile($epath, $tmp_path_h); $path_h = $tmp_path_h; # Used during -x push @dirs, $epath; } } if (!$opt_c) { die "Can't find $tmp_path_h in @dirs\n" if ( ! $opt_f && ! -f "$rel_path_h" ); # Scan the header file (we should deal with nested header files) # Record the names of simple #define constants into const_names # Function prototypes are processed below. open(CH, "<", "$rel_path_h") || die "Can't open $rel_path_h: $!\n"; defines: while () { if ($pre_sub_tri_graphs) { # Preprocess all tri-graphs # including things stuck in quoted string constants. s/\?\?=/#/g; # | ??=| #| s/\?\?\!/|/g; # | ??!| || s/\?\?'/^/g; # | ??'| ^| s/\?\?\(/[/g; # | ??(| [| s/\?\?\)/]/g; # | ??)| ]| s/\?\?\-/~/g; # | ??-| ~| s/\?\?\//\\/g; # | ??/| \| s/\?\?/}/g; # | ??>| }| } if (/^[ \t]*#[ \t]*define\s+([\$\w]+)\b(?!\()\s*(?=[^"\s])(.*)/) { my $def = $1; my $rest = $2; $rest =~ s!/\*.*?(\*/|\n)|//.*!!g; # Remove comments $rest =~ s/^\s+//; $rest =~ s/\s+$//; if ($rest eq '') { print("Skip empty $def\n") if $opt_d; next defines; } # Cannot do: (-1) and ((LHANDLE)3) are OK: #print("Skip non-wordy $def => $rest\n"), # next defines if $rest =~ /[^\w\$]/; if ($rest =~ /"/) { print("Skip stringy $def => $rest\n") if $opt_d; next defines; } print "Matched $_ ($def)\n" if $opt_d; $seen_define{$def} = $rest; $_ = $def; next if /^_.*_h_*$/i; # special case, but for what? if (defined $opt_p) { if (!/^$opt_p(\d)/) { ++$prefix{$_} if s/^$opt_p//; } else { warn "can't remove $opt_p prefix from '$_'!\n"; } } $prefixless{$def} = $_; if (!$fmask or /$fmask/) { print "... Passes mask of -M.\n" if $opt_d and $fmask; $const_names{$_}++; } } } if (defined $opt_e and !$opt_e) { close(CH); } else { # Work from miniperl too - on "normal" systems my $SEEK_SET = eval 'use Fcntl qw/SEEK_SET/; SEEK_SET' || 0; seek CH, 0, $SEEK_SET; my $src = do { local $/; }; close CH; no warnings 'uninitialized'; # Remove C and C++ comments $src =~ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#$2#gs; $src =~ s#//.*$##gm; while ($src =~ /\benum\s*([\w_]*)\s*\{\s([^}]+)\}/gsc) { my ($enum_name, $enum_body) = ($1, $2); # skip enums matching $opt_e next if $opt_e && $enum_name =~ /$opt_e/; my $val = 0; for my $item (split /,/, $enum_body) { next if $item =~ /\A\s*\Z/; my ($key, $declared_val) = $item =~ /(\w+)\s*(?:=\s*(.*))?/; $val = defined($declared_val) && length($declared_val) ? $declared_val : 1 + $val; $seen_define{$key} = $val; $const_names{$key} = { name => $key, macro => 1 }; } } # while (...) } # if (!defined $opt_e or $opt_e) } } } # Save current directory so that C::Scan can use it my $cwd = File::Spec->rel2abs( File::Spec->curdir ); # As Ilya suggested, use a name that contains - and then it can't clash with # the names of any packages. A directory 'fallback' will clash with any # new pragmata down the fallback:: tree, but that seems unlikely. my $constscfname = 'const-c.inc'; my $constsxsfname = 'const-xs.inc'; my $fallbackdirname = 'fallback'; my $ext = chdir 'ext' ? 'ext/' : ''; my @modparts = split(/::/,$module); my $modpname = join('-', @modparts); my $modfname = pop @modparts; my $modpmdir = join '/', 'lib', @modparts; my $modpmname = join '/', $modpmdir, $modfname.'.pm'; if ($opt_O) { warn "Overwriting existing $ext$modpname!!!\n" if -e $modpname; } else { die "Won't overwrite existing $ext$modpname\n" if -e $modpname; } -d "$modpname" || mkpath([$modpname], 0, 0775); chdir($modpname) || die "Can't chdir $ext$modpname: $!\n"; my %types_seen; my %std_types; my $fdecls = []; my $fdecls_parsed = []; my $typedef_rex; my %typedefs_pre; my %known_fnames; my %structs; my @fnames; my @fnames_no_prefix; my %vdecl_hash; my @vdecls; if( ! $opt_X ){ # use XS, unless it was disabled unless ($skip_ppport) { require Devel::PPPort; warn "Writing $ext$modpname/ppport.h\n"; Devel::PPPort::WriteFile('ppport.h') || die "Can't create $ext$modpname/ppport.h: $!\n"; } open(XS, ">", "$modfname.xs") || die "Can't create $ext$modpname/$modfname.xs: $!\n"; if ($opt_x) { warn "Scanning typemaps...\n"; get_typemap(); my @td; my @good_td; my $addflags = $opt_F || ''; foreach my $filename (@path_h) { my $c; my $filter; if ($fullpath{$filename} =~ /,/) { $filename = $`; $filter = $'; } warn "Scanning $filename for functions...\n"; my @styles = $Config{gccversion} ? qw(C++ C9X GNU) : qw(C++ C9X); $c = C::Scan->new('filename' => $filename, 'filename_filter' => $filter, 'add_cppflags' => $addflags, 'c_styles' => \@styles); $c->set('includeDirs' => ["$Config::Config{archlib}/CORE", $cwd]); $c->get('keywords')->{'__restrict'} = 1; push @$fdecls_parsed, @{ $c->get('parsed_fdecls') }; push(@$fdecls, @{$c->get('fdecls')}); push @td, @{$c->get('typedefs_maybe')}; if ($opt_a) { my $structs = $c->get('typedef_structs'); @structs{keys %$structs} = values %$structs; } if ($opt_m) { %vdecl_hash = %{ $c->get('vdecl_hash') }; @vdecls = sort keys %vdecl_hash; for (local $_ = 0; $_ < @vdecls; ++$_) { my $var = $vdecls[$_]; my($type, $post) = @{ $vdecl_hash{$var} }; if (defined $post) { warn "Can't handle variable '$type $var $post', skipping.\n"; splice @vdecls, $_, 1; redo; } $type = normalize_type($type); $vdecl_hash{$var} = $type; } } unless ($tmask_all) { warn "Scanning $filename for typedefs...\n"; my $td = $c->get('typedef_hash'); # eval {require 'dumpvar.pl'; ::dumpValue($td)} or warn $@ if $opt_d; my @f_good_td = grep $td->{$_}[1] eq '', keys %$td; push @good_td, @f_good_td; @typedefs_pre{@f_good_td} = map $_->[0], @$td{@f_good_td}; } } { local $" = '|'; $typedef_rex = qr(\b(?[$i][1] =~ /$fmask/; # [1] is NAME push @good, $i; print "... Function $fdecls_parsed->[$i][1] passes -M mask.\n" if $opt_d; } $fdecls = [@$fdecls[@good]]; $fdecls_parsed = [@$fdecls_parsed[@good]]; } @fnames = sort map $_->[1], @$fdecls_parsed; # 1 is NAME # Sort declarations: { my %h = map( ($_->[1], $_), @$fdecls_parsed); $fdecls_parsed = [ @h{@fnames} ]; } @fnames_no_prefix = @fnames; @fnames_no_prefix = sort map { ++$prefix{$_} if s/^$opt_p(?!\d)//; $_ } @fnames_no_prefix if defined $opt_p; # Remove macros which expand to typedefs print "Typedefs are @td.\n" if $opt_d; my %td = map {($_, $_)} @td; # Add some other possible but meaningless values for macros for my $k (qw(char double float int long short unsigned signed void)) { $td{"$_$k"} = "$_$k" for ('', 'signed ', 'unsigned '); } # eval {require 'dumpvar.pl'; ::dumpValue( [\@td, \%td] ); 1} or warn $@; my $n = 0; my %bad_macs; while (keys %td > $n) { $n = keys %td; my ($k, $v); while (($k, $v) = each %seen_define) { # print("found '$k'=>'$v'\n"), $bad_macs{$k} = $td{$k} = $td{$v} if exists $td{$v}; } } # Now %bad_macs contains names of bad macros for my $k (keys %bad_macs) { delete $const_names{$prefixless{$k}}; print "Ignoring macro $k which expands to a typedef name '$bad_macs{$k}'\n" if $opt_d; } } } my (@const_specs, @const_names); for (sort(keys(%const_names))) { my $v = $const_names{$_}; push(@const_specs, ref($v) ? $v : $_); push(@const_names, $_); } -d $modpmdir || mkpath([$modpmdir], 0, 0775); open(PM, ">", "$modpmname") || die "Can't create $ext$modpname/$modpmname: $!\n"; $" = "\n\t"; warn "Writing $ext$modpname/$modpmname\n"; print PM <<"END"; package $module; use $compat_version; END print PM <<"END" unless $skip_strict; use strict; END print PM "use warnings;\n" unless $skip_warnings or $compat_version < 5.006; unless( $opt_X || $opt_c || $opt_A ){ # we'll have an AUTOLOAD(), and it will have $AUTOLOAD and # will want Carp. print PM <<'END'; use Carp; END } print PM <<'END' unless $skip_exporter; require Exporter; END my $use_Dyna = (not $opt_X and $compat_version < 5.006 and not $use_xsloader); print PM <<"END" if $use_Dyna; # use DynaLoader, unless XS was disabled require DynaLoader; END # Are we using AutoLoader or not? unless ($skip_autoloader) { # no autoloader whatsoever. unless ($opt_c) { # we're doing the AUTOLOAD print PM "use AutoLoader;\n"; } else { print PM "use AutoLoader qw(AUTOLOAD);\n" } } if ( $compat_version < 5.006 ) { my $vars = '$VERSION @ISA'; $vars .= ' @EXPORT @EXPORT_OK %EXPORT_TAGS' unless $skip_exporter; $vars .= ' $AUTOLOAD' unless $opt_X || $opt_c || $opt_A; $vars .= ' $XS_VERSION' if $opt_B && !$opt_X; print PM "use vars qw($vars);"; } # Determine @ISA. my @modISA; push @modISA, 'Exporter' unless $skip_exporter; push @modISA, 'DynaLoader' if $use_Dyna; # no XS my $myISA = "our \@ISA = qw(@modISA);"; $myISA =~ s/^our // if $compat_version < 5.006; print PM "\n$myISA\n\n"; my @exported_names = (@const_names, @fnames_no_prefix, map '$'.$_, @vdecls); my $tmp=''; $tmp .= <<"END" unless $skip_exporter; # Items to export into callers namespace by default. Note: do not export # names by default without a very good reason. Use EXPORT_OK instead. # Do not simply export all your public functions/methods/constants. # This allows declaration use $module ':all'; # If you do not need this, moving things directly into \@EXPORT or \@EXPORT_OK # will save memory. our %EXPORT_TAGS = ( 'all' => [ qw( @exported_names ) ] ); our \@EXPORT_OK = ( \@{ \$EXPORT_TAGS{'all'} } ); our \@EXPORT = qw( @const_names ); END $tmp .= "our \$VERSION = '$TEMPLATE_VERSION';\n"; if ($opt_B) { $tmp .= "our \$XS_VERSION = \$VERSION;\n" unless $opt_X; $tmp .= "\$VERSION = eval \$VERSION; # see L\n"; } $tmp .= "\n"; $tmp =~ s/^our //mg if $compat_version < 5.006; print PM $tmp; if (@vdecls) { printf PM "our(@{[ join ', ', map '$'.$_, @vdecls ]});\n\n"; } print PM autoload ($module, $compat_version) unless $opt_c or $opt_X; if( ! $opt_X ){ # print bootstrap, unless XS is disabled if ($use_Dyna) { $tmp = <<"END"; bootstrap $module \$VERSION; END } else { $tmp = <<"END"; require XSLoader; XSLoader::load('$module', \$VERSION); END } $tmp =~ s:\$VERSION:\$XS_VERSION:g if $opt_B; print PM $tmp; } # tying the variables can happen only after bootstrap if (@vdecls) { printf PM <))[0,6]; if (defined $username && defined $author) { $author =~ s/,.*$//; # in case of sub fields my $domain = $Config{'mydomain'}; $domain =~ s/^\.//; $email = "$username\@$domain"; } }; $author =~ s/'/\\'/g if defined $author; $author ||= "A. U. Thor"; $email ||= 'a.u.thor@a.galaxy.far.far.away'; $licence = sprintf << "DEFAULT", $^V; Copyright (C) ${\(1900 + (localtime) [5])} by $author This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version %vd or, at your option, any later version of Perl 5 you may have available. DEFAULT my $revhist = ''; $revhist = < should be removed. # #EOD $exp_doc .= <${email}E # #=head1 COPYRIGHT AND LICENSE # $licence_hash # #=cut END $pod =~ s/^\#//gm unless $opt_P; print PM $pod unless $opt_P; close PM; if( ! $opt_X ){ # print XS, unless it is disabled warn "Writing $ext$modpname/$modfname.xs\n"; print XS <<"END"; #define PERL_NO_GET_CONTEXT #include "EXTERN.h" #include "perl.h" #include "XSUB.h" END print XS <<"END" unless $skip_ppport; #include "ppport.h" END if( @path_h ){ foreach my $path_h (@path_h_ini) { my($h) = $path_h; $h =~ s#^/usr/include/##; if ($^O eq 'VMS') { $h =~ s#.*vms\]#sys/# or $h =~ s#.*[:>\]]##; } print XS qq{#include <$h>\n}; } print XS "\n"; } print XS <<"END" if $opt_g; /* Global Data */ #define MY_CXT_KEY "${module}::_guts" XS_VERSION typedef struct { /* Put Global Data in here */ int dummy; /* you can access this elsewhere as MY_CXT.dummy */ } my_cxt_t; START_MY_CXT END my %pointer_typedefs; my %struct_typedefs; sub td_is_pointer { my $type = shift; my $out = $pointer_typedefs{$type}; return $out if defined $out; my $otype = $type; $out = ($type =~ /\*$/); # This converts only the guys which do not have trailing part in the typedef if (not $out and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) { $type = normalize_type($type); print "Is-Pointer: Type mutation via typedefs: $otype ==> $type\n" if $opt_d; $out = td_is_pointer($type); } return ($pointer_typedefs{$otype} = $out); } sub td_is_struct { my $type = shift; my $out = $struct_typedefs{$type}; return $out if defined $out; my $otype = $type; $out = ($type =~ /^(struct|union)\b/) && !td_is_pointer($type); # This converts only the guys which do not have trailing part in the typedef if (not $out and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) { $type = normalize_type($type); print "Is-Struct: Type mutation via typedefs: $otype ==> $type\n" if $opt_d; $out = td_is_struct($type); } return ($struct_typedefs{$otype} = $out); } print_tievar_subs(\*XS, $_, $vdecl_hash{$_}) for @vdecls; if( ! $opt_c ) { # We write the "sample" files used when this module is built by perl without # ExtUtils::Constant. # h2xs will later check that these are the same as those generated by the # code embedded into Makefile.PL unless (-d $fallbackdirname) { mkdir "$fallbackdirname" or die "Cannot mkdir $fallbackdirname: $!\n"; } warn "Writing $ext$modpname/$fallbackdirname/$constscfname\n"; warn "Writing $ext$modpname/$fallbackdirname/$constsxsfname\n"; my $cfallback = File::Spec->catfile($fallbackdirname, $constscfname); my $xsfallback = File::Spec->catfile($fallbackdirname, $constsxsfname); WriteConstants ( C_FILE => $cfallback, XS_FILE => $xsfallback, DEFAULT_TYPE => $opt_t, NAME => $module, NAMES => \@const_specs, ); print XS "#include \"$constscfname\"\n"; } my $prefix = defined $opt_p ? "PREFIX = $opt_p" : ''; # Now switch from C to XS by issuing the first MODULE declaration: print XS <<"END"; MODULE = $module PACKAGE = $module $prefix END # If a constant() function was #included then output a corresponding # XS declaration: print XS "INCLUDE: $constsxsfname\n" unless $opt_c; print XS <<"END" if $opt_g; BOOT: { MY_CXT_INIT; /* If any of the fields in the my_cxt_t struct need to be initialised, do it here. */ } END foreach (sort keys %const_xsub) { print XS <<"END"; char * $_() CODE: #ifdef $_ RETVAL = $_; #else croak("Your vendor has not defined the $module macro $_"); #endif OUTPUT: RETVAL END } my %seen_decl; my %typemap; sub print_decl { my $fh = shift; my $decl = shift; my ($type, $name, $args) = @$decl; return if $seen_decl{$name}++; # Need to do the same for docs as well? my @argnames = map {$_->[1]} @$args; my @argtypes = map { normalize_type( $_->[0], 1 ) } @$args; if ($opt_k) { s/^\s*const\b\s*// for @argtypes; } my @argarrays = map { $_->[4] || '' } @$args; my $numargs = @$args; if ($numargs and $argtypes[-1] eq '...') { $numargs--; $argnames[-1] = '...'; } local $" = ', '; $type = normalize_type($type, 1); print $fh <<"EOP"; $type $name(@argnames) EOP for my $arg (0 .. $numargs - 1) { print $fh <<"EOP"; $argtypes[$arg] $argnames[$arg]$argarrays[$arg] EOP } } sub print_tievar_subs { my($fh, $name, $type) = @_; print $fh <[0] =~ /_ANON/) { if (defined $item->[2]) { push @items, map [ @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]", ], @{ $structs{$item->[0]} }; } else { push @items, @{ $structs{$item->[0]} }; } } else { my $type = normalize_type($item->[0]); my $ttype = $structs{$type} ? normalize_type("$type *") : $type; print $fh <<"EOF"; $ttype $item->[2](THIS, __value = NO_INIT) $ptrname THIS $type __value PROTOTYPE: \$;\$ CODE: if (items > 1) THIS->$item->[-1] = __value; RETVAL = @{[ $type eq $ttype ? "THIS->$item->[-1]" : "&(THIS->$item->[-1])" ]}; OUTPUT: RETVAL EOF } } } sub accessor_docs { my($name, $struct) = @_; return unless defined $struct && $name !~ /\s|_ANON/; $name = normalize_type($name); my $ptrname = $name . 'Ptr'; my @items = @$struct; my @list; while (@items) { my $item = shift @items; if ($item->[0] =~ /_ANON/) { if (defined $item->[2]) { push @items, map [ @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]", ], @{ $structs{$item->[0]} }; } else { push @items, @{ $structs{$item->[0]} }; } } else { push @list, $item->[2]; } } my $methods = (join '(...)>, C<', @list) . '(...)'; my $pod = <<"EOF"; # #=head2 Object and class methods for C<$name>/C<$ptrname> # #The principal Perl representation of a C object of type C<$name> is an #object of class C<$ptrname> which is a reference to an integer #representation of a C pointer. To create such an object, one may use #a combination # # my \$buffer = $name->new(); # my \$obj = \$buffer->_to_ptr(); # #This exercises the following two methods, and an additional class #C<$name>, the internal representation of which is a reference to a #packed string with the C structure. Keep in mind that \$buffer should #better survive longer than \$obj. # #=over # #=item C<\$object_of_type_$name-E_to_ptr()> # #Converts an object of type C<$name> to an object of type C<$ptrname>. # #=item C<$name-Enew()> # #Creates an empty object of type C<$name>. The corresponding packed #string is zeroed out. # #=item C<$methods> # #return the current value of the corresponding element if called #without additional arguments. Set the element to the supplied value #(and return the new value) if called with an additional argument. # #Applicable to objects of type C<$ptrname>. # #=back # EOF $pod =~ s/^\#//gm; return $pod; } # Should be called before any actual call to normalize_type(). sub get_typemap { # We do not want to read ./typemap by obvios reasons. my @tm = qw(../../../typemap ../../typemap ../typemap); my $stdtypemap = "$Config::Config{privlib}/ExtUtils/typemap"; unshift @tm, $stdtypemap; my $proto_re = "[" . quotemeta('\$%&*@;') . "]" ; # Start with useful default values $typemap{float} = 'T_NV'; foreach my $typemap (@tm) { next unless -e $typemap ; # skip directories, binary files etc. warn " Scanning $typemap\n"; warn("Warning: ignoring non-text typemap file '$typemap'\n"), next unless -T $typemap ; open(TYPEMAP, "<", $typemap) or warn ("Warning: could not open typemap file '$typemap': $!\n"), next; my $mode = 'Typemap'; while () { next if /^\s*\#/; if (/^INPUT\s*$/) { $mode = 'Input'; next; } elsif (/^OUTPUT\s*$/) { $mode = 'Output'; next; } elsif (/^TYPEMAP\s*$/) { $mode = 'Typemap'; next; } elsif ($mode eq 'Typemap') { next if /^\s*($|\#)/ ; my ($type, $image); if ( ($type, $image) = /^\s*(.*?\S)\s+(\S+)\s*($proto_re*)\s*$/o # This may reference undefined functions: and not ($image eq 'T_PACKED' and $typemap eq $stdtypemap)) { $typemap{normalize_type($type)} = $image; } } } close(TYPEMAP) or die "Cannot close $typemap: $!"; } %std_types = %types_seen; %types_seen = (); } sub normalize_type { # Second arg: do not strip const's before \* my $type = shift; my $do_keep_deep_const = shift; # If $do_keep_deep_const this is heuristic only my $keep_deep_const = ($do_keep_deep_const ? '\b(?![^(,)]*\*)' : ''); my $ignore_mods = "(?:\\b(?:(?:__const__|const)$keep_deep_const|static|inline|__inline__)\\b\\s*)*"; if ($do_keep_deep_const) { # Keep different compiled /RExen/o separately! $type =~ s/$ignore_mods//go; } else { $type =~ s/$ignore_mods//go; } $type =~ s/([^\s\w])/ $1 /g; $type =~ s/\s+$//; $type =~ s/^\s+//; $type =~ s/\s+/ /g; $type =~ s/\* (?=\*)/*/g; $type =~ s/\. \. \./.../g; $type =~ s/ ,/,/g; $types_seen{$type}++ unless $type eq '...' or $type eq 'void' or $std_types{$type}; $type; } my $need_opaque; sub assign_typemap_entry { my $type = shift; my $otype = $type; my $entry; if ($tmask and $type =~ /$tmask/) { print "Type $type matches -o mask\n" if $opt_d; $entry = (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ"); } elsif ($typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) { $type = normalize_type $type; print "Type mutation via typedefs: $otype ==> $type\n" if $opt_d; $entry = assign_typemap_entry($type); } # XXX good do better if our UV happens to be long long return "T_NV" if $type =~ /^(unsigned\s+)?long\s+(long|double)\z/; $entry ||= $typemap{$otype} || (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ"); $typemap{$otype} = $entry; $need_opaque = 1 if $entry eq "T_OPAQUE_STRUCT"; return $entry; } for (@vdecls) { print_tievar_xsubs(\*XS, $_, $vdecl_hash{$_}); } if ($opt_x) { for my $decl (@$fdecls_parsed) { print_decl(\*XS, $decl) } if ($opt_a) { while (my($name, $struct) = each %structs) { print_accessors(\*XS, $name, $struct); } } } close XS; if (%types_seen) { my $type; warn "Writing $ext$modpname/typemap\n"; open TM, ">", "typemap" or die "Cannot open typemap file for write: $!"; for $type (sort keys %types_seen) { my $entry = assign_typemap_entry $type; print TM $type, "\t" x (5 - int((length $type)/8)), "\t$entry\n" } print TM <<'EOP' if $need_opaque; # Older Perls do not have correct entry ############################################################################# INPUT T_OPAQUE_STRUCT if (sv_derived_from($arg, \"${ntype}\")) { STRLEN len; char *s = SvPV((SV*)SvRV($arg), len); if (len != sizeof($var)) croak(\"Size %d of packed data != expected %d\", len, sizeof($var)); $var = *($type *)s; } else croak(\"$var is not of type ${ntype}\") ############################################################################# OUTPUT T_OPAQUE_STRUCT sv_setref_pvn($arg, \"${ntype}\", (char *)&$var, sizeof($var)); EOP close TM or die "Cannot close typemap file for write: $!"; } } # if( ! $opt_X ) warn "Writing $ext$modpname/Makefile.PL\n"; open(PL, ">", "Makefile.PL") || die "Can't create $ext$modpname/Makefile.PL: $!\n"; my $prereq_pm = ''; if ( $compat_version < 5.006002 and $new_test ) { $prereq_pm .= q%'Test::More' => 0, %; } elsif ( $compat_version < 5.006002 ) { $prereq_pm .= q%'Test' => 0, %; } if (!$opt_X and $use_xsloader) { $prereq_pm .= q%'XSLoader' => 0, %; } print PL <<"END"; use $compat_version; use ExtUtils::MakeMaker; # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. WriteMakefile( NAME => '$module', VERSION_FROM => '$modpmname', # finds \$VERSION, requires EU::MM from perl >= 5.5 PREREQ_PM => {$prereq_pm}, # e.g., Module::Name => 1.1 ABSTRACT_FROM => '$modpmname', # retrieve abstract from module AUTHOR => '$author <$email>', #LICENSE => 'perl', #Value must be from legacy list of licenses here #https://metacpan.org/pod/Module::Build::API END if (!$opt_X) { # print C stuff, unless XS is disabled $opt_F = '' unless defined $opt_F; my $I = (((glob '*.h') || (glob '*.hh')) ? '-I.' : ''); my $Ihelp = ($I ? '-I. ' : ''); my $Icomment = ($I ? '' : < ['$extralibs'], # e.g., '-lm' DEFINE => '$opt_F', # e.g., '-DHAVE_SOMETHING' $Icomment INC => '$I', # e.g., '${Ihelp}-I/usr/include/other' END my $C = grep {$_ ne "$modfname.c"} (glob '*.c'), (glob '*.cc'), (glob '*.C'); my $Cpre = ($C ? '' : '# '); my $Ccomment = ($C ? '' : < '\$(O_FILES)', # link all the C files too END } # ' # Grr print PL ");\n"; if (!$opt_c) { my $generate_code = WriteMakefileSnippet ( C_FILE => $constscfname, XS_FILE => $constsxsfname, DEFAULT_TYPE => $opt_t, NAME => $module, NAMES => \@const_specs, ); print PL <<"END"; if (eval {require ExtUtils::Constant; 1}) { # If you edit these definitions to change the constants used by this module, # you will need to use the generated $constscfname and $constsxsfname # files to replace their "fallback" counterparts before distributing your # changes. $generate_code } else { use File::Copy; use File::Spec; foreach my \$file ('$constscfname', '$constsxsfname') { my \$fallback = File::Spec->catfile('$fallbackdirname', \$file); copy (\$fallback, \$file) or die "Can't copy \$fallback to \$file: \$!"; } } END eval $generate_code; if ($@) { warn <<"EOM"; Attempting to test constant code in $ext$modpname/Makefile.PL: $generate_code __END__ gave unexpected error $@ Please report the circumstances of this bug in h2xs version $H2XS_VERSION using the issue tracker at https://github.com/Perl/perl5/issues. EOM } else { my $fail; foreach my $file ($constscfname, $constsxsfname) { my $fallback = File::Spec->catfile($fallbackdirname, $file); if (compare($file, $fallback)) { warn << "EOM"; Files "$ext$modpname/$fallbackdirname/$file" and "$ext$modpname/$file" differ. EOM $fail++; } } if ($fail) { warn fill ('','', <<"EOM") . "\n"; It appears that the code in $ext$modpname/Makefile.PL does not autogenerate the files $ext$modpname/$constscfname and $ext$modpname/$constsxsfname correctly. Please report the circumstances of this bug in h2xs version $H2XS_VERSION using the issue tracker at https://github.com/Perl/perl5/issues. EOM } else { unlink $constscfname, $constsxsfname; } } } close(PL) || die "Can't close $ext$modpname/Makefile.PL: $!\n"; # Create a simple README since this is a CPAN requirement # and it doesn't hurt to have one warn "Writing $ext$modpname/README\n"; open(RM, ">", "README") || die "Can't create $ext$modpname/README:$!\n"; my $thisyear = (gmtime)[5] + 1900; my $rmhead = "$modpname version $TEMPLATE_VERSION"; my $rmheadeq = "=" x length($rmhead); my $rm_prereq; if ( $compat_version < 5.006002 and $new_test ) { $rm_prereq = 'Test::More'; } elsif ( $compat_version < 5.006002 ) { $rm_prereq = 'Test'; } else { $rm_prereq = 'blah blah blah'; } print RM <<_RMEND_; $rmhead $rmheadeq The README is used to introduce the module and provide instructions on how to install the module, any machine dependencies it may have (for example C compilers and installed libraries) and any other information that should be provided before the module is installed. A README file is required for CPAN modules since CPAN extracts the README file from a module distribution so that people browsing the archive can use it get an idea of the modules uses. It is usually a good idea to provide version information here so that people can decide whether fixes for the module are worth downloading. INSTALLATION To install this module type the following: perl Makefile.PL make make test make install DEPENDENCIES This module requires these other modules and libraries: $rm_prereq COPYRIGHT AND LICENCE Put the correct copyright and licence information here. $licence _RMEND_ close(RM) || die "Can't close $ext$modpname/README: $!\n"; my $testdir = "t"; my $testfile = "$testdir/$modpname.t"; unless (-d "$testdir") { mkdir "$testdir" or die "Cannot mkdir $testdir: $!\n"; } warn "Writing $ext$modpname/$testfile\n"; my $tests = @const_names ? 2 : 1; open EX, ">", "$testfile" or die "Can't create $ext$modpname/$testfile: $!\n"; print EX <<_END_; # Before 'make install' is performed this script should be runnable with # 'make test'. After 'make install' it should work as 'perl $modpname.t' ######################### # change 'tests => $tests' to 'tests => last_test_to_print'; use strict; use warnings; _END_ my $test_mod = 'Test::More'; if ( $old_test or ($compat_version < 5.006002 and not $new_test )) { my $test_mod = 'Test'; print EX <<_END_; use Test; BEGIN { plan tests => $tests }; use $module; ok(1); # If we made it this far, we're ok. _END_ if (@const_names) { my $const_names = join " ", @const_names; print EX <<'_END_'; my $fail; foreach my $constname (qw( _END_ print EX wrap ("\t", "\t", $const_names); print EX (")) {\n"); print EX <<_END_; next if (eval "my \\\$a = \$constname; 1"); if (\$\@ =~ /^Your vendor has not defined $module macro \$constname/) { print "# pass: \$\@"; } else { print "# fail: \$\@"; \$fail = 1; } } if (\$fail) { print "not ok 2\\n"; } else { print "ok 2\\n"; } _END_ } } else { print EX <<_END_; use Test::More tests => $tests; BEGIN { use_ok('$module') }; _END_ if (@const_names) { my $const_names = join " ", @const_names; print EX <<'_END_'; my $fail = 0; foreach my $constname (qw( _END_ print EX wrap ("\t", "\t", $const_names); print EX (")) {\n"); print EX <<_END_; next if (eval "my \\\$a = \$constname; 1"); if (\$\@ =~ /^Your vendor has not defined $module macro \$constname/) { print "# pass: \$\@"; } else { print "# fail: \$\@"; \$fail = 1; } } ok( \$fail == 0 , 'Constants' ); _END_ } } print EX <<_END_; ######################### # Insert your test code below, the $test_mod module is use()ed here so read # its man page ( perldoc $test_mod ) for help writing this test script. _END_ close(EX) || die "Can't close $ext$modpname/$testfile: $!\n"; unless ($opt_C) { warn "Writing $ext$modpname/Changes\n"; $" = ' '; open(EX, ">", "Changes") || die "Can't create $ext$modpname/Changes: $!\n"; @ARGS = map {/[\s\"\'\`\$*?^|&<>\[\]\{\}\(\)]/ ? "'$_'" : $_} @ARGS; print EX <', 'MANIFEST') or die "Can't create MANIFEST: $!"; my @files = grep { -f } (<*>, , <$fallbackdirname/*>, <$modpmdir/*>); if (!@files) { eval {opendir(D,'.');}; unless ($@) { @files = readdir(D); closedir(D); } } if (!@files) { @files = map {chomp && $_} `ls`; } if ($^O eq 'VMS') { foreach (@files) { # Clip trailing '.' for portability -- non-VMS OSs don't expect it s%\.$%%; # Fix up for case-sensitive file systems s/$modfname/$modfname/i && next; $_ = "\U$_" if $_ eq 'manifest' or $_ eq 'changes'; $_ = 'Makefile.PL' if $_ eq 'makefile.pl'; } } print MANI join("\n",@files), "\n"; close MANI;