From 7ce5f1adec1ffd9041b474b30e1b860dd0f5b1ad Mon Sep 17 00:00:00 2001 From: CrazyRedMachine Date: Sun, 14 Jul 2024 21:58:44 +0200 Subject: [PATCH] tachi scorehook, rivals --- Makefile | 2 +- dist/popnhax/libcurl.dll | Bin 0 -> 720896 bytes dist/popnhax/normaliz.dll | Bin 0 -> 20480 bytes dist/popnhax/popnhax.xml | 10 + libcurl/README.md | 14 + libcurl/curl/Makefile.am | 39 + libcurl/curl/Makefile.in | 714 ++++++++ libcurl/curl/curl.h | 3067 ++++++++++++++++++++++++++++++++++ libcurl/curl/curlver.h | 77 + libcurl/curl/easy.h | 123 ++ libcurl/curl/mprintf.h | 50 + libcurl/curl/multi.h | 456 +++++ libcurl/curl/options.h | 68 + libcurl/curl/stdcheaders.h | 33 + libcurl/curl/system.h | 504 ++++++ libcurl/curl/typecheck-gcc.h | 705 ++++++++ libcurl/curl/urlapi.h | 126 ++ libcurl/libcurl.def | 105 ++ libcurl/libcurl.lib | Bin 0 -> 23156 bytes popnhax/Module.mk | 3 +- popnhax/config.h | 3 + popnhax/custom_categs.h | 1 + popnhax/dllmain.cc | 60 +- popnhax/tachi.cc | 1202 +++++++++++++ popnhax/tachi.h | 9 + util/chash.h | 469 ++++++ util/jsmn-find.h | 725 ++++++++ util/jsmn.h | 471 ++++++ 28 files changed, 9032 insertions(+), 4 deletions(-) create mode 100644 dist/popnhax/libcurl.dll create mode 100644 dist/popnhax/normaliz.dll create mode 100644 libcurl/README.md create mode 100644 libcurl/curl/Makefile.am create mode 100644 libcurl/curl/Makefile.in create mode 100644 libcurl/curl/curl.h create mode 100644 libcurl/curl/curlver.h create mode 100644 libcurl/curl/easy.h create mode 100644 libcurl/curl/mprintf.h create mode 100644 libcurl/curl/multi.h create mode 100644 libcurl/curl/options.h create mode 100644 libcurl/curl/stdcheaders.h create mode 100644 libcurl/curl/system.h create mode 100644 libcurl/curl/typecheck-gcc.h create mode 100644 libcurl/curl/urlapi.h create mode 100644 libcurl/libcurl.def create mode 100644 libcurl/libcurl.lib create mode 100644 popnhax/tachi.cc create mode 100644 popnhax/tachi.h create mode 100644 util/chash.h create mode 100644 util/jsmn-find.h create mode 100644 util/jsmn.h diff --git a/Makefile b/Makefile index 9a45936..8cd648e 100644 --- a/Makefile +++ b/Makefile @@ -49,7 +49,7 @@ cflags := -O3 -pipe -ffunction-sections -fdata-sections \ cxxflags := -O3 -pipe -ffunction-sections -fdata-sections \ -std=c++11 $(wxxflags) -ldflags := -Wl,--gc-sections -static -static-libgcc -lstdc++ \ +ldflags := -Wl,--gc-sections -static -static-libgcc -lstdc++ -L./libcurl/ -llibcurl \ -fdiagnostics-color -Werror \ -Wl,--gc-keep-exported \ -Wl,--enable-auto-image-base \ diff --git a/dist/popnhax/libcurl.dll b/dist/popnhax/libcurl.dll new file mode 100644 index 0000000000000000000000000000000000000000..5d94996bf307c8104116ad7c1713180a33c26800 GIT binary patch literal 720896 zcmeFaeSDME-9Mh>O54x|5+p!X#A>T!*11Y_Qd_jp2a3>=wlu*(K{w{Eb!@AUAZ{&d zNdvihxD+?=VH@6TW1IKpJ((gF2iUZ%0aPBH6l99Z^s4Q&2+{%_`My8rTvr+%c7K1n z?>~P3eBssPJbs?e=X}oRJf`gHYfO^KWU}Hf7BiVz@lF2<_~(EBVKbXdBd&jSglY4z zH*aV)&wTTS+46UmWYjJG!M7Jb_`Qs8KKT9b|G=N|jc;Wv4tzi3JKxVJnpKtYy&o+6 z)@{Rwr)KG(Q$HCeuuFlIa`CPd{XoIc~DtkY-Lb zndaC`ru`P4{JjSdb|P4ZZwgTuSxF`c1OJR~(*tQjs64v>nJ7qQg1;$;bQLa7(G9q8;8q+eE+5^nQa#Jby|NZ;-B~ZmhE>`57-=8ZQ%PlaPkg}KVh`W#!#KF5|vlOo4$Y3)d~ z7y-!$SR)_U(hj2xpiNKV5&Ag5_C&g^?p;mqJMhmPiM(%hBaITA_~(uwwky(|6nx*o z?CP42hdG%9n0U&(?5>EYNqXD1Hq3SiD_nOH>E~Cvt5!Q85zz? zGE$6;;X@g$E7CJsiUmJ(q~)(CeA4d7$4L<_J$M``AxdHGO+ zkFAlOk%C}?9r@&H(EkCbT}M%=O={EWjk*si)q}xvmiqC*b2k6g!E+A3iyZ)mpIie` z>|y&U(AG189f*8#t&wsqu(pG_n1k{yO&>sUEo`9aV|<&_4o5yo77?e3B32P;MC8CH z)P|@g%33K~;*kQ_mBZ{T2f>q*cruJ2)e_~+dN}xT0aX+jVf~DX89WsH*c|ydl^tpN za0SRoI}c${#FUX3!BCKPUW)My3l`|Uoz{*R&d>a`wfKeF5pvF#~ zjDQ84>V<*BNQICEIFqRniKOBwAOb|OE+W=q0pFh`iHHq+L_V|d2

{XM#br70)2) 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

-86F3KCTrlTF8weC8o2LEH^_}rTbo%F;qAMV9V#`*E1!sr-b z33LinKolOscF6Xfg?Gxca!>%LZ_0!?t+qdssSdjg|xK+~@LU#6cryfeYi(Il7bVJmx+|-g%b2 znHxBVG_y5$U!G--y6EOhsaVzc=AEm-c+bFg<%1*n?mbtL1rz{J%kPL7)IZL=#7f{$ zA{3z;-x-9&3yz=SZqn5^XT&OxzQ!L zK0|I9>@*UD>oa*}pJ-7H0Fn_Y%HQBkMNTxZ7B{BBn+C~uv|*Wz zI?Kn7N|2(VXl%nWdqsnH9A9Co6rW$-o?wE9(Tm#m;KeS3_~227UMv`(HjL4O(`Y!lh~QL`liIsgf3dr2tOOP-s0xfQYi#^Mf8HVe^m|-I zw!=eLsw74=PL$jFMm2h-eV|+h^JwnIF7_U%`@Vo1;jn3A3PRl z9Bz~pl+R_`!jl^wY-}RCE>aPt=hg=seZZ5^zo~GiD17C4(Yd+w4>VbbzRuYPVysJI zm~wd`XXC<{(O(HUqKz`53g=xpahXbR#3+LyqIWdBSUQHJ4Gs+DR4j^7p&^C`Dhv*Q z5+A83V>~HP6yy}sHoe!#w?`KrQ8}hA~W;YpFKhw%a^f;fq%Xnx43eMN?=cb(nK?6 z7X~7MuZT#@G#bz8OcP@{S2fxbTIziyb`5hBWYp@Taqe*%J9y8^z``GlrmQQ!iHRfz zBYY5}m-lIO%IA%u7+h*6OiD1T!N>&}Njq9{e3XQ=r4aOB*8v%0q}DE4LUc|9mtPhr zh0cKa5OoT8LWDC2$bSHcOJfRjLFWq`9v@Tm!VumkaMZKYR+kG02Op5F52l?E(J|OD z39l7IVEe8J7Ry%DMb@}ogH3?bfe5@!fKLAh$C}qR4B>Ykwh87ix8D|;zy4k=SRhl9xwi{@n!V*bd~XC8mZuU z9R02KU|RGPZ5`716JBpKmDwX?TSy*yt7-AtEq7$YYwn;jXShYR6u`C$riE}TR0f)M z%X4i~@%xx>!Znt!L~et(H8r2M|6zA$#VrAE(FrMLWbmVvn1fYn$#9Mr3)S&CUMyfs z5^}s|a`@3=SsXec7kA6$?}xuXh_$j@d|L8b~ zFqVcDiDcT@=o~-8`vp*GC_&t^A-VkgjE9DyA>Q!d7x*5Y@z5YK$%8|@mwv~}zR>Hw zyp=ZGs^qbf()vd@|L7S5N|fNtB#$(QCQ9&4XTgRme7JzrsD$jZ?IJbqJBkPIC>}7k zfJWv|?|^q>zfJNu;9`?@9AkD*`i2C}2hc8Zxzi`lfR$osNqD^j2j_KE|KjxQLsGGA zxEQ)0q3eJPPGR3xAEd(=Z1L{HGT z=T8R5)_$HCgqHOb4z%z5T)KabvcV#aS8H&Bgfj%|@}ydh!xbEp%w5Z+LaQ_$r@lt_ z3{<~xuZ?{Yqcc#?@SOL8^6Kgdgg;piO@e59Mp0`~!=*50;W?(X9yO{@IB3JS>&>5^wu)0nmC!bSuDCGF(nk zdoelah`uy35S?~VS>GqO!>n0Va6SOE-iD_JtY6Kr!1wfe;S@o&1U2+w28G>mIGjy$ z4}~V^hKiNZBRU#YNy_>G0c{BgrztS3L7{n`0o+G}7uZW@w_oU<++2Cv3wkzOZJ;8GIL+;h(d(w?uxA!f^utosQC09bM0)l=qgZpRdvh zk&YvBDH(NfcLcL4mq%k&!F!Av;enUzk;h3?5`OmjDR>S12kJpY;=)M-Q7hzE2!|oP zIRvgb?FH${-fFyF-WaZeJu)94qOiL*<$3zxAfWjC-T|B&>-*D_+~cp{pL}}b_*s*L zfAU)zOA==JHUH#J%|E#fIG28)F%rosrTDa3`$eq!N2$2bVDNflJ-KfGPBAM7gGGU# z;w@IIr68$b_uB+jW!&M`q5f4+`up&a9UMOjR>%)Hq12dhXMlBQbTXM^0JF7b!kn%{ zeNh0+Ag9~Ep_>_kHvug5Br#?Uyc9&;;*C$N*G8)F;POMl*F#_MIllj07TT zT~lpta_Bz`qy*)03x&*K)<+xGLQQ0v! z9SuphJCGD&dF{tIkDbeLau=BqB&_>RZQj>It7c2%P;HEE%NT6v+w%SBJ?xQiCpr!~ z)c5l455f&bRYLpRjD*-#B+^{clY2n!?l}smdC9?CN-`>XI-+Gwei1R*wTdRXV&9NH zBE0rJ$T@y3gLv=2iW3zb4&Dy`{^J@G@^e<*lApKsCOJ{D)S8a zy`hf7+)u2NXJeDUCKMiUKT!=&U`649F>AjAi^ksHvsZ@G_=(<(#65GOQ|QMnAFKP& z4E6O#lNN>#49*Fm)%-u%`v~GL3|GQM_&B-!CvR;+@4qmFuaxLblq)HkfggC3g0Nd> zb$32tLCdvqWh!tF)drNZ5l;jU&f635AOF!=9_>q`G0uPGPxIh=^hvr|Y!_xI!`X)t zuv6Hf{uj5UJ+c82u%N&^A~8HLV|`M%`4K6xF7bQto3)n+-Z6(nHMI4Z;`S$tkUl@p z{&WF;4y0cq&B1o|4NQ6j%}$V#Lx;57(1|daHZ@vnFXq^vq>G4ZFCup$*^P>BX zwDM(qarsYD{)G;$d`wbf#%pu3FhKhejvTC?tMc41QZE&vEMI;!s#C*D1<< z4?-4KDv`&%3AMQog>G72P>I3hK*h?l62vZSU&bu2gti%aE^+(+Q(4O52 zL9jkGy7i=(6Er54KCP(LBVz^6Lcx#) zFfkvLk1d9s?<$*2*IX%c5~Kv=qp1%Brk;djg_r^=d8N7x1z<|pJQNTL1##yO+-IIlcEW2m4+xeL7IY@ zsC+Ms>$QR8-)nPoLT}PQLT#_^;#{Eva;h2L*4wjNE_7E;ZmziPg%gH$)-eWsp|6Ne zXVg#f2Ov6NP618sVcal>!_DK;4rrzgw@08~J#11Np27(j45jE|b9?=DNUZA6w;CNvKT07U3tD0zoH`~iM(MO-(0j{T$Fyc03& z@&>HP9M9zF!37*6LKw_e4Gfuz5g1ol z)~-pay|{H%YQx4Ps%ek4y`EpbQQ$6gtm;&nD6}--;F7dBla4rKf6WYc$Lg<9NsWaW z4NMw&4K7x;N1)n?Nv|~MR)!IHwgr+J zL>|aon}peJPa3>vvh4Q^y86KuOG*C=%crrB3~S&U$cj!DoK@uRi#mbvs-)-v3rLL# zvwf!x7sjWLAQ%l*_XGV|D2!@=c~YUfZ`F49Y)kOQK<0?FAa2cdNINc@eEWz>p(AOrX;petpIrKAS*TeKPY1bzD zaqMcQpVVD_^pl92yfMlqYk-RZcpm^q2@K9@duB%o6209UC1CXS)hNNEx2aJANpCkq z2`atWqXd}VlA?qj)Nqq<8AMOgF8Y$!SbVsbVj59X)3s%zftqokW*Vs3M#KaqnUHwV zf92udznkbdiRVK+XYusmxq#(Mz_}r2ec(Nx7QX*hryTI>j2yZPIr-WgSAq_j+T=K z;R*gB#>Z`IpJn&aY}{HQ7ISTlj`|}t6YM)%rIg`>>>DcFH!q*u96r4jdg@2QA3m`# ze93Ho`j@C0ytF+3UZNvBl(-IY-UMkXD#u{vSOyuy91&aAfY|llM zS1HQFT|HbLe`-r8@-Bwb;Hn>fhJrb;R9u@akMB>c4P}x493KBB$aykU=)OUOd{3G< zoKO_{EB0XsD5J-38X8J+hpX~QZ)@eVg8OOqPrTk=!ZfRBle zm2FC4f;8U>|K15=RT@71LdA#;C5Ze>m^xrN%Iz&SGb+$n<{)|vw-zW{{gRfp%L&k<76x>iKzA;HV5&CT zYEFS;g|^iD@jgUhunA_v{dwM$RllGjt%6V;b9l}VdWm)?N{F`~>2J&d zR6m@SLWs!c#J1SFyD&YXITTZmN2}OW>6y=oiuTBJRKElvb0{Ts5>AOFJ8Dg<_V}89 z-6^WwZwLr4+!rvAP>H_6w#o_c!!i*SiW1J+39;tzk^ru>4kt)vk=Z6PJK@J|d_n?n z;C(Ww%t|%IJfRzcG~=fnXW88W}G5tN&y@Vx_%77G@9i0v|IJld`QKg(-6zER`&$!2=9beI z`M}|`R?7`@=0ivLO=dzYwEqSXqE&eV)T@`8 zvbdoNTUv0UpuVET(L^=Ug*b9Zj*?2$IbM;A4y_|QDHmJ^4>;DQd6jat^eo+mDtlCT zCC3RA7y$QTJzzmbG);*FS6bh~0)z^M26gE1DhK6}TfAz1yu8pO*v}>`{H5w`hTvk^ z1M~zEV-4YV6AaYZtNua@1!|$2!AD9V+y`c^HY>CHkWDSYK}eZ8gbR!?e~vDrN)>O^ z_5*c&1X|xBseXP0y$IL?k{^cGk49|@ffsjZY8rOp%AE2(UEvOQN4kDrp;||xOY76R-c0P8#PA&?WHE(QBBvo__-0V~ zlKRo3K$H$WY$d*`bfx%=`XsM;AzniFDV{TmLaCLehk?HOI?#(r zVk1Yz(6j;qCao#409+ngsXkYuqfPzw%s{wzy1;jzG%sr!$}f{w+I$i;SaBGHMT!H# z8Pd`$CxS9N=4J8j3Mf4(S_>N?l4Faqra^OZmIk*B7Zo>Pl}#Op`d@un61Z(?R(h!x zK|{g3ELzpo=TcM`rmRnWjo#XnWeK`d>o#*=?fsddgu>eU$MWAadnA<-&C5zJL^|Hz zDX8Bcx|rQ&ZmrEl(t_GtB*ot}`~_B-*&W%(qy*s1yP)Aq6YU#+icOU_$fsy@5oYf4 zJ93^o*B;r3(D26=aYPxuWLd2?I%bWxM}i1%EJ&Dzd(R^QO4B|O=nz1(vPnm)5i#<* zEL&mrP#P zsnL=Q*K}GY;XOP&aXokl7q-N!(jO945iPVeUW+?MKok_bUaJMQhXb5pI$MW7B5O3B z_4X@dy-v%TMpk`#@ISXMX!5a_K;Clt$n2m6~K6m4tK+(Mef~FI*-+@@S zZ^Ug8!%-I4q74Jsj-^>iF2cj@nc;QlPq^L%Uok!p-B;)iX4zKXBd^G^`4lKCmu8=; zGF6%6qw0g0t%c!Odf?sA*P`!Y?2Xgzji8`i)bxol_-9%$`i;#Sn~;eeG3vu3V64#- zFQt;9&0bOpPZ8>$pGLLNopJOWbP*sK*PTMH2yHraYi(Ced1_?YU(vv!mgE+e{8-@C zX$sA_29T&}1WWvRwWtp<6QQny(ONXP`lc3am{GFj@OY>ups~_uJQMAOm5_WN zwU~GKJ!mYH48I4`@pM*xr&3G9Gdhe97^ZMxdlp7p3?v{u+22j{DIurNTQv+Lqpwn6LNA!;Q}58IFRq14}}Ghow);h_w-+P2*9o!zZt` z;0QylXvA8LeVDrY>=Ck*s2eh2`_umP19*2e|3vO{ol`u6W!dLgQv*lzilPQafr?`ic?Kn)(6ZklCr-r~?s@cBx^^rWz#%adOq3F! z1)OI?fN^<9$7SA#G#MhzJT4VS%5gNQ)S+hyuMM~B@K+cUsHa72>`WaV==N%h|M;7M zcVg|414?5?04)V3_ZffoIdV;Df=-a~fK~ByvHDq;wEkUn9m=5N*bCj5lfg~1RE#7b zryNg@ZSCNyft$kXdrhH99Uj_kh41c= zog0~i2t*6e2(Rxmh3^q;R>%m4Hr1!_3xWlxn`>0; zm=L^8neSA0Avx{Oq$4l7wEE~q>V%J`LN1FQbCwautI%BRJZ!nGd2Y@s{|2`@B;1-|sW#xJ8+B;YSKtQVBe;S>u8%++k zw+od@oIOItUR^5_1!_{>#F}QfX9fv#e*jD0^JR)3cN})A$uEg)Ht2Otz$ylrN-()S z1ZZeD?CzAqhAVh8E(w5>dEnAP(gwFlSc*dDG2m!Z4Y2N5C0x5F#%FvZ_K4+}SWiwf z+UL{y7bf~A<#T>%M<0#`r3hVsB`NRYZ%5<|{<3V_qEhIVUi{5_X)B5k{-g5NM*RBy zI7NRR*RpfP>9+PiA_IJQQ+V%BM7V{*e}`~+50z2ZK?4Eje8`ydXGlTWc5t?{KcoyB zEK6{0Ge)^J=}bTwCowo>!op2GQ6(k@es~W7*OZo!hY%a|q$Vm63V=7#m#85155$vL zh7%Z(R^LC+*00?(0ljTRach4lHxUi|igF%57}=YMFem_wN(E4ySJ^@oQiCH4K#-XK z>+4L0|F1wrQ7CCR+|@*l3I>}dN2rmR$F39j zUzyWD{mKftjrLdk|0J3~>qh9$b-m4__zTB-D;<2eCq=qZfTZjuT;|V1KP8V{CZE)_ zg2E%69NUb)Y9jv7b`vI7v98CB{=WfHB6j3=Fi%DZeTnNQ?byWc&-35S^moUL{Jxd{ zzRV%isv4Iw`SKX6V3xGwVUBr({{}ei_xQb<{|50__FGEJ6ww)W9OU3G{`)Td-LakD zU*o?~4x!U_DYB0L)^bQazc=vTjrgnH8;&);J<^F~8%a)u>ZayH1VD78G3TFsh2pr4 zyh?-stJ5Eg@rXU5AX?PLUjHNP8OcgF(v-+dZuvcR7+r!oDR;()3D%FP1D9$b)k8Gs zlk}p_T0rrP1O%{EZc%Ufk)f!Y5X(BNa?4L#t=X+oWFLx>BFpesY2v??)0G{I=rh7? zqR_jfcGSJKM3zxJ_L<5!z_6RBSRavT1IwHgZ#Cg(|(|D7(6US7vAV5--xqUsW z<>4}A2PN%bnMg}ni8)4nc^!*pDe?+pk-q2+I;vJ8b}Xt~{X~y#i0Da{`B!H6(Boyx zhD0Spmfs2g$xL2I%=?d?E=)Bq4E;f7Sh|QpZaVKCAwT{JZK|+bE>W6@sA#!|@uN;u z3=KDzT7E|-0oX#ZIJJ37(kXpAMK)<9Qbl`RwtdQZgK zMsW5{0>PQ22q#&cpezZNU@n7A%Yy_`ZsMjA-Te#9GpPq+B4Cd^L3y981%Z$rv%4k| zE=bRCMEc(w(=Va)EP<3Q1X^@!H8q9|JI$o&k=CsvluA90MP;nlCld^Tn6h@d2H`8( z5Y2Mq4DexebUDO8o;Lz%p(HFEl`Vv`2FApbBdXa}B+!KJEah1q37b?Tgafr!b%7Do z8Um%2wAQL_(Z)Dn5~@&^1V9*^EJW(55KN^sq51mrF)D^~g`iXvN~8X@j>Ks&<;~jN z;Fb*e35(1lk46!Uipw`JqsiSoFopMQMm87-$dTvqA~(?|kB<{ZjgQ&wq0i!7peKp5 z%gW10k2}W1u(XF@NDR__D0rJ3*@|yySC4^>Ngj2hj?mxbCdv|rB=dYh8^!ie25Aqa z5CBeJ0f3kh#AbyO3ovO9C6)G^!QZ?+Boc#@6&~)?M^_CE;~WD)>ObREL%a{)DC16< zM^_-}VE;BoOchE~5-Uhn-o>{zChzH`cb@ABOuGo)=&Di%V^yOJfEY^JLm8w!ltKV_ zjowB9h)@Qv0fUW{Nese!D1)?zQV0MI^fn5BLK%!zsHIFh>gn$u${_8b6av6HdK(3x zi892i;Qk;u30DDWQ*fTH+=GFZH?L^UL~it!t5dZg%$az9XKCzkWKf(B7Krn~-E=;< zT}`9pDG&-$D2l14Wkz$4xv{{C6$s8ECC@9gffJ>E0(p#Ef83p`v6_BOPNCBTKGuUZ zQGo;A^R)9jd!!MmDL(iFj_l;}?IrRO3!Lpaanm2A!Qo-3isLIW-GQEA6;1-9SAhH35{Un| zOuxZsUqHwg?`HX{?Z=TOAD`b{fG(h63B&YqkV#M|m8XS*v{t!p8-QqvP9H(hY3b*1 z2Im=Mjj5SAY`l=7Q_rnA1>;RPnRzZau31~?6QXl(7(^R?E}GFufd#r3SCDNPD&;KHSk)H{6Gb z*V^~wD6?tD7vbULwfl#&_7n|+O(V2J!<|a$@n(Ge1!1zmC`vXQmXf!i?h$Y@(zL} zMYi(am-+8D{FMtchr6T*1)v4yF*_zau(qaTyy|?r|wG2R6G=jQ5T6?%oY+z_hN} z?$1`86NzLdYc^Ba)enzwu9GvcHf6Hycm+^kR;FSY2Y>ersGt;z1sZXL7aeJU0yVry{(AlLF+q4;hUMW$I5I>iA zarcnWjTt^W6Y)4Fd3i9=u^Ue(o_Fz_#?y;uJ03&#q4A84@q5XYQ$48}`7!%hPacTs z!}!WRP^LUIj57sH`DtiE&mJ%zYB_r|7V~h}b26AOU%c?a7})CHeBlH6y$eTRcG_cx zIclRV$G&q#4zw8ePd$MWrXCt|ydfi}0MKxg;we&QEADHYHxYV?7!vzrD1nb@!8ITk zx~F>j<~JY$Shz2(dUiSQYsOIK{+>Cyze`PLKnDmDsp&MmcrDPe3fZKlK755+|4u3Z zdFAPAfm!;DlR`R}q$U-y9g$xArK;H@i|7zs%hOkPi9~??>3b3A_o1tiA4>Hg&KhI< zcL9@c`_9N0h_LV6LGfDdK4|i?Dae>UNf|)6`#t+pzd{+xoFR9|x^Kt*Pc+uwNBML{ zYW_GS?L=c+e|K72f0un{7orI|7|wj)YH64osSvI3jzm~Ly9ZXi?7p=6Ygd9V(#1<@ zZc$StCWD!gO;Cs=_ML4qT=S0U#Eg=FZy{=-<-^SbXr~3?KP8OmgdZp9gN~eVO(eU5QQ$HPZ4jO&%5pc77_`-=XhsSU+@&N99x$xd?rrEF{Ix+Q9 z-Cs=eOr|jdf){WT1C5k+{+6vLMKM=dnQ%k)CyZ*R46@UlteFN2fm zip}s_Jd8=@o4~hpCuH$fT;B#IGh)}E(>N&9YQQm(Q{}}L%qKD2dbIh~G0d;FCz*vJ zdCxS~BJa6{Rmgj8Wc~4;39LNcV`I&6D2vmm1Px&vNIB%Ew5ggOC(Uag1gwLAwU@>} zF=EY|oQOGW`N&b~lcj2AUWB4O$L5@A>F^7&b!DBHSdU0K4oybLch7-JYCK zf_cWbD5+me)Xbkro^6_J00aOAd4bsFQIVMx16aKj6tF8-K+akkJ}`51~&Cu;CR-|6=} zpQ6l9z*VQ7&2;r!aWwmAS$5Y#U#YoM0VeA{18ZtCMa(5%3^!ZVf$suf@oQptD!UW6 zAcRIgLJYj=8`BjQ`o{#YS70-D* zhw7`*AdJQ zH#_svL+1tG@Ts7%wD^Otw0K8YT673Yi)LYIu}fH5{EzIAm%;RJHhdwP;l=~U*|xfi zwJ3V^cEy|K?ppOrM5JN5`yZG;x-YJJA)5?9K1u7bk)|Mm239?dfZ;K#YSB~E!=IQj zhxNA?CeYPg0iwQ7O)O0^nJ*w5bSvaD%^OMM&EqKb`qU3fc*L%N4l1MGSd5s#_T-$z zw`*JImhkq%#2lr}(%>`WX659vhKeLFu6y^XKSxH)uW`-rN*nHQO)?>&1<__)L~QY? zPg6AcD@ZqgrZ}OXm+n3n{0W4Cjn{Wt`&Sr9Y=)Qq1w7bIYowE*`@xJj25ncr__GMa4tVGen6p4mf{Hkb zn|F$)x!5?OwSCVxg!`c8TIFS;%XiZWoPYQj(t3xF0g+0%O_*Nu{G!G*!X_y+^8%Hzaf}yzve1dig3|N~LP|^2hk+dJIpU;h2f}N2-}Ea)>{fV= ziBl4q?ZuA9_AU`!4?QwdnNRF*fBG@xQeVJk9_63eV z{cKJPZ>}`A!uk`t+9(;aLM$!R_U{Z~;!J4%HsQ{<6Za?XFT$VBBOgnVjR>qiVvh`A zZnG@~`|3M>jgSYF`HAjs`;&AXICQk%fs2gDW`s+T7x^zu_hrUPS$e}TJoZXWR3a9? zoB)kHRpCV#i&k|au%#8Ob}ZPoSQ9&pCU(@2)sF%B&;lIU?xAwzcO;(ks_TsNuY6#m z*!~D!Gi57;xV(i*)rH^O;Y_ZhyKi+GEkcvXf~>zWxiCK=sG~z|pgv8zlyP)s>gZsp ze=0mM9JIK*Lx&WF5K$)+>O2&@g@W;9sE~?)5FJ zd%^d&!N0;p;a}lK@~`02{40zl{|beP!KA&kp(>h0ZGcXWq55|hi`L+-&L@X-Zg{g6 zsta!Im*qDdNaI#+zppC6by72zKqbju^_vLOLeO{7O@m8Fd9B>R8)qe@UiA{|y*Y&_ z$U~1pfAg29Q{f^U8AR}{P;xzr6ViV^0hVJ+9NPZjJz?Jd0jHs?8{~HAr}bY!sSm|Y zlG`{6_9Kf!7h&J29l}Ed5FbLIagBU_%#&JKZt?5{d$iF&(%&-TgvZsj5 zX@-10Ty=Tne3{qGcU62>=Uy`(sn=b(yy@4>cXd3S*UWcyJgwKvcU3%Jt^HE%admuy z*DUwy_^!BSzN_N9+I!7>SI2YSHS=8!&r03)g*pKGGx{HF#e%qzJUIxhO>DanZ)^QS z#KWM}+)V$C*o%wjXK5g>&u|Z|hO>X_r%3Ez~bWz-4%q+Yr=^JBSvApL7k`Cn#%r|J)5bCd9bsdDEP@PJ3Uw{`CQwNQy zakMmi;V!K_LrROIki7tga)bf!8VOV`&IIr*ulh~wssXf?fMz*1ioh==aFnR0`?Ult zIm92WykdvD$bu4TMG3K*8;dQ^(CYyV05KDgQS6g8Gzjk6dh(6}43e~w0hs2?ka zKp6kvIPWCpkSCpX_0Qt#RxH1uzpBpsHqBZ>6QD3hI%T(sPw2FfH8E**X>H^Syn@z` zjS<4$B6zz9#T@#rLY}d8JVm@i|2lXzN^dxDXd`^UEmn0NHW}kWJ-$cG?P0_5g;HYe zAg=+YjslByE&SwqtdXBBcZTD-O6nAr5uHM7?}BCV z{!!OURl-2BXDP-dbs?@|0|*>dZhZ_$W9mQ`tb@+5efLn4LiK?Xma3;~&^`9q_7V@@ zXL=1A)rr{kk5Hsn{a3!x&7y?5)EXZS07LJq)%>ff0scL&K8#-)$76$;z<(4zZ?x+8 zICOmO#GwTD0w}k6pf3*=!Aq8+P|?6JQ;n=8)SN&^!_^W;=WMw^=TH2rs>k{Fym}bF zqtOxah1z4~+27)V?}Pr4?XS%mQdB2l*-=UUMKIl_nZ!L%@>3NAV}7NqU8k<1V*b4W zq~_86GxeJku-c|R$iL}o34SY<8`c)oL@|D-YoV+iYI^gC zre{V0Je>Eew_5DavoK`%)VNsG>g`*qCNueL+^Fy|K@A+|myyH=X>|HC<;UPeJ=WV9 ze=aY7CKG@8#`vP;8>_gTVdTmS2YybxV~t4ww93(#O)R0GqzD2M*LDfz0BVN-#g?t zaX^6=Mo9Bwt1t*i2jJj!Xfq^`789kV3Wu~9hlEaPaTbJ!RFTp0abn9SiPDBl39c>5 zr%Ar07)+#!MVw_iI<~YJXS`Wb#Wbm6CI{w9zI>^oK&qJ6QCQUVDsJg~?Ln*`3zsQ{ zi_~A@wNffvAyqt#y@|{5#bE(Ap)Zn^}sS9P;9MA zRemr{n!QYIB&iAXfoJIJ=qgp%!6{IKhS14iSY`E0)l`C%kgpwcR}2AZUNj)8Ouev& z3!=FAN`l1${B`yD)b|jt%qJYB`{8xV{`Aivb+EU!b+Xw}l^$r`mP$X{#Lp)D1ZwEr z6ir7lRi?nh_>wz23Loi026aCl2v4hMtI7z}{{rbU0vjI_KmUxZy~{Z(skb3(H?k^4 z7UZqH8F`gh-poMFFOe`auuS~q;wO+!@1|&`$UC4H`|z#ES{lom6Ik|NNS70sCVmDe zYp2MXBeHJB7h~LaJF-rSWt|sj{uQ#$3)G08bo>Om2#hH@Ph@St7iZl%9a-PUR(yCL zRW?1a=oO?(56l!l8Tbh}35HHU z*Rt;>R94`RQk0JDjvQpKFl3+hYoyH#SjCS@+0PiVpQeCj{85TBkUfX8-)zXPihP~o zXB&P34gAj34g@Hm2!EhmuJW9g>YNi8_-~Y&6X+B_oADC}@OzXf9mu5sEB+wcZ)4dC z0)g$wRuGsbe$?L})i(U8D&URaK!5_K;SaJsrf2g3?T5b#w9^@FO9k%TyXj5l>}c(8 zA@0c+$fxOM$MhS_jsTvY;W>rp*o|h#Sa9Y%JdfkK0pH8;{1^}98@zQ1k-ypk7lyXg z--5oOZNx4?C{3B)r}Z6qE}384t=M*;ex?$yU)_-p;Xl_RKS0*Tw2^7lahA)BtKqp8 z8!}0cTV?z|*P_^-W^<@?xx>|u4FekM6LRu$>03JIA#76d@&6BspHs; zx(~yU`$5a;fm&K;oh0? z^GG^JhlSkxewcMgo_Af%9iD@{V)ArZslHd4h{3{o_4m=w$Bo$g3qhd=dfM8g?)R{q z=fkE#t;g>HK=k-BwT)t6sI~ZtJ$}UgN1=sGxTOlKyum8_GvpL^tNpo_>{i)7z5h79 zw`I59`L>io(eo{jI_z)Z1e(+IAJ1;>NwdGT-`oN{vFBQFAgHC6{W*8O9nTBfAD=9wchGh*{?*Umi6-3lW<`*W>#9-vB`$X?lPZX8Xiz-xn> zZUmP(8eEP5=U{NoF99yc2rg?hxS0eFP^9@zKqP$A2|I{D_hI{U&Hdfkhl$KB<}P;^ zzU3t|-G^au2#Vj?A}^UHAE(M5rL--HEs{UIzIj8E{jE-RhUT+M3p3dBM&4q}nhB6k z=-(X{(n>SUb}zQ9>Z@;l6jt8F2i4Db7{kOF+qpt(^ZWM*{?a&G{9Ml8Bqqqh%L7Br z5&WG>j76bWUTcJh9IJz1amO`S{NuYd7N1Wno*x_3%GA>o1I}8avG@c{J{tS04BNT* z&g*=OgAjs^8mv1OXJYl_%hFgEEl@Zetj_I_T{!*Dqi6;nnvL0C_Qg38S8yA-Gnrr& zUb|bM6w$y0a~c(u6E7-96g4weR2)36M>ZCP?o4G}yB9HhjqQEJ_JuR!Wz7_2<;Kby z37_dwcRnIJl6Y8NJQKMJGpT5j z!`X$IIFdwg7DLExx$~%0m`;T+&Y;R-zUDq41j_*uEUo5FcP9xJU%vSO#k83ZB({xs zX-#aEeVK?|%oRkM*6hVpK?G0dl-a}vcZyu}K2v+Yvn~68v^c{kll+iLnY&0hXOR@i!#U+1oCp3<2Ce! zFC|+vwvWTST(&GV!2DA3gnEr$bxn-K$e@QWCH!;aB*_&$YnfJ->|62wU6K$?z#rMK z3k=8@iFq}|h{#tEaVug(h`mT(PTFX#HWI6O2CR%tV8l?XPP}Of;^Zn|4${TXwZ$E= z%4K9JG9X}VFC#Kcih1!u=ZQjD>=d%tx$3mhx5xnB*aXJ12(iMVIQ$|3KZE;4=CvzD zT}tOABQdG0!bNeIiv-L}hM9G3m_~vd=|k`fy>Xac624gsaa!VmYe@cOnkXQ_y~yxh zM6!J;0Ti-*Dam%Ja2kPJJiY$NwI%urA<_kE z+}GjR#!E;K^fj(qV~vt)D`*)i&In#0f32nA<^rYoHE)Sjyj?wjj1cU6n+E9xZdkyl zXt_vN_izCjz(#TXhAD5pWz9rQADf1sCka-8dp?FAC>VONnDvOoETdDYeoMngUoRJ3 z0e`Cjf0veCDZ1!m^D-%f8;cHxFQ%@s^2mn|5K{5H3n%!VE?2X8e@VDC1M}x=%$MOm z;a#t)-YIH$GcZ<)JJlD9Si31gW~DG{N(dcKv{j51H&r_WYt$$3CVMj^ZwCAI zqWVwL>c0f_uS05+xt$2`iQM zlMMMMKOpvQiwCi6s8n--->CDmaIb-0*k+;Yf-cIH7Wtg})anVsX9G9;;2k0_+gVGV z=Im4CQ>7RRySr%zL@M4Vc@APH0n7EO=}K`IhIjQ8sj~y^SqWJeIp3J#b=(=7Z{tU&_hJ=dd92HN> zd*)@TgzH@P#B0}F*(TMBsM=gh5MeKY`(S@0!pNoS1~`mW z`~Q=VzHcCxs^siGWHoo;KC$uYmS3>iVH(*i=|zx(SaxuKqX-$j9)-V1bnJMS#DN<2 zOW{N69DE+2Hrh^>at7~GgxuWM4b`HmYbKJ1bErva`zhUOe%O_bJ+c{~u{m|U=wFSt^oEU|i-<13?M|P{dng~y zhvh8<5ob&Ossxxg6P{&C@Sa4U5}|UTHmq=Az2N-tz6_kb%!Lj;Vz5hfFHSr$8O52D z&0m!Wcesi|d9*BEH7fGZejoR%mv0vpgW{oB-7i;vs0C@~i$?kl1g!YP;T}N3U8TB? zl9pR>_~#(sr2Z<4&$VBzM{Jl60vEuoX%(Egat3wXa>yYM9nIUInWqpCwG&~G%6uCd z5^E;@ySSJpN}(J5v;AoQZAK;s|JL=ALRq|h!}slbHq}8&x@D557PO!(HYrjAPV;wo z>XFtIZAOZq3;P|oT?!T#)-Y63L!U)W;Gh^;6s;h(TU&?RIKYBZsWC~Fo@Bm5uC#hv zddy{t=b)DknDM~*YjLki_jy3Tke2FSQFK)S^w%4_ss~w7X(iO4=B~k(DICVxBQ($` z&OZ{0u3=^6L8MfxwAfHURtO7u0i4bDD(f56W<6#xIBddN0R)ce_E1&n1iH9ZDX%Z} zL&>wep;R5uDR9;en^c@C*DDz*%KCaL;>YAPgFMzHy=D3k_NSSIM)5&|{i$$ISRA`g zQ1RyM>7^a{7{M;bc>Dl7(dO<(i#ozMOXI7$Dwg>ix2npglz7i zwTbct2!0s0snd`UWHF!09t!=rqH?(|r}R$E?fozqINsiM>#emw7#!t?RUW8KRlg)D zQM}rpcEQMKR{`SliXHZ+Z^Kt!vD5x^240}xTSg`qp; zyoRLc1iSI$m9`KNbq)cBvSt%u3K8F~DEZVMy732nL{_LW=;;XGP2tV>gT79h?y%!V zoc*c4p)2;>0!MAIebvxCcB?>F8^5_uaueYz&t;=$aTaTjyoS7bgcCA?P-DAgB!Ho; zJ@T*A&l#l>m{D-W)fb6UI)qh}Kyx*#CwSbLpo9{X?^YD9? z73L361Nab^IF^*V=^#SpHo)Wsh9X32G@bf=H)i-+Z*o)m4qYv1|eSZXx;&ib*G71oO|Ic$}?8t{#9T+q5;N$5Cdoh7o` zw5+VJO8KdAuauv{wfxlP_NVVcfNMBfi^_<0k#*xJEsSz#olj2%ob-?a%J=_>dms3y zsw;s%$xM=g49p-=qDD+LZLzU!V5p)&4Z;Kz0+Yl^uo7_l$Fi)o3K_wbXmAppm&dd2 zuh7!1TH4yy-O^pURSXK6AuK^a1Vjyz+Sq3GVPcJvLV!qq-*ex4lSu$;Kfm98)|Sb8 z_uY5jx#!kRgRH!xU)I^KamWk(_ z8O8|YLP>d$ z6EgCOQ`zHqoQ2HG8M@ScO|B%I6vnOQp}mOcMl@8^&aLY9)9OBT&pgW-I@L(WR>w>|@T~$E9wf=5A=bm-Fvd{@u>M@9^&~{>|o} zWqBp+uVMK^2-zgZ)mU5+MC%!W1Dawtd}*tSwnaR#wf9rrHG+suu?D%+)(TcM#Q-}R zmUEp-ED2xzkD%XUtYOe&Y03N-dSi3U148KxVTJ~-tek@?=`y&oK32>LmP)rwXKZek zfZ*0E<%w5jNm->G&`Ak#(hC>y(5T*GHbQ+7hmqX-HfO=cI2bCiF#*t~i@m48q_=fb!6NTredj<(!%@31`?7rWdl) zQ?97ZF%;5Wf0V?Lq}q^Nc~?F5OdU z1xg-IPOFa#j!RCf%%(L!u(0LkSeiCQVQyiIO3_HdUb|A-%EPf62Z-gNrS3>sCCgPQ zQinzB<(E5kTq~cWPTcgwZamF#cB%PL6O(#s>J!O~`6l%TQkH+7OdTtYSjm9CkEvAL z^v5bs$4WjiO8VuEsPb%G*b+TS7B>+>ry{j@!OV%j&kLW#O8SkGQ}RN66LCKIL_!1@ ze^{=TGtB1x0z_=Aad&3?FRr3Dmwrp%R?y0t-U8NF3*I1nu{PEm%?wVlKxDSeZ>~)x zIlSvwN*yu4b{4$KWN77AW@#=at0g#C?=~f$8!p+Gx_WdMxtQOST+E|Xg|tOv5@SZB za5?Ne76-RaFsugHLADzmKTF=$GH6(u@XeCTblYLFYn0W95K+eUjH1@1%jM0Y-Alg* zlobUnT2p^rl{cQb>+mE18$DM%T6kcJ1>doGg<6T8o82`QuT!po+aJ7gVud z<$@~CmRwMBoG$5Y^?vn{U;j_PlNS$qRUeu8ZsMNYQ^OBO`6%LK)Kg=u{>mw+!T+rJ zCez;0P4j_8-(}CH2OWuq0wDas8kcNiZI+ZWM}L`2EvJ979BPg^+%L>=#{2NrXYPM% zaZb-W2T1efv?B0IMutcl!OL-`moJ6PAASQ)AefoTFARSIp4a@`H≈Iqx|=PKJNn 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 literal 0 HcmV?d00001 diff --git a/dist/popnhax/popnhax.xml b/dist/popnhax/popnhax.xml index b235d66..3d660f1 100644 --- a/dist/popnhax/popnhax.xml +++ b/dist/popnhax/popnhax.xml @@ -18,6 +18,12 @@ 0 + + + 0 + + 0 + 0 @@ -147,6 +153,10 @@ 0 + + + 0 + 0 diff --git a/libcurl/README.md b/libcurl/README.md new file mode 100644 index 0000000..bd28a30 --- /dev/null +++ b/libcurl/README.md @@ -0,0 +1,14 @@ +# include + +Public include files for libcurl, external users. + +They're all placed in the curl subdirectory here for better fit in any kind of +environment. You must include files from here using... + + #include + +... style and point the compiler's include path to the directory holding the +curl subdirectory. It makes it more likely to survive future modifications. + +The public curl include files can be shared freely between different platforms +and different architectures. diff --git a/libcurl/curl/Makefile.am b/libcurl/curl/Makefile.am new file mode 100644 index 0000000..e772737 --- /dev/null +++ b/libcurl/curl/Makefile.am @@ -0,0 +1,39 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2020, Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://curl.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### +pkginclude_HEADERS = \ + curl.h curlver.h easy.h mprintf.h stdcheaders.h multi.h \ + typecheck-gcc.h system.h urlapi.h options.h + +pkgincludedir= $(includedir)/curl + +CHECKSRC = $(CS_$(V)) +CS_0 = @echo " RUN " $@; +CS_1 = +CS_ = $(CS_0) + +checksrc: + $(CHECKSRC)@PERL@ $(top_srcdir)/lib/checksrc.pl -D$(top_srcdir)/include/curl $(pkginclude_HEADERS) + +if CURLDEBUG +# for debug builds, we scan the sources on all regular make invokes +all-local: checksrc +endif diff --git a/libcurl/curl/Makefile.in b/libcurl/curl/Makefile.in new file mode 100644 index 0000000..ea34ffb --- /dev/null +++ b/libcurl/curl/Makefile.in @@ -0,0 +1,714 @@ +# Makefile.in generated by automake 1.16.4 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = include/curl +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \ + $(top_srcdir)/m4/curl-amissl.m4 \ + $(top_srcdir)/m4/curl-bearssl.m4 \ + $(top_srcdir)/m4/curl-compilers.m4 \ + $(top_srcdir)/m4/curl-confopts.m4 \ + $(top_srcdir)/m4/curl-functions.m4 \ + $(top_srcdir)/m4/curl-gnutls.m4 \ + $(top_srcdir)/m4/curl-mbedtls.m4 \ + $(top_srcdir)/m4/curl-mesalink.m4 $(top_srcdir)/m4/curl-nss.m4 \ + $(top_srcdir)/m4/curl-openssl.m4 \ + $(top_srcdir)/m4/curl-override.m4 \ + $(top_srcdir)/m4/curl-reentrant.m4 \ + $(top_srcdir)/m4/curl-rustls.m4 \ + $(top_srcdir)/m4/curl-schannel.m4 \ + $(top_srcdir)/m4/curl-sectransp.m4 \ + $(top_srcdir)/m4/curl-sysconfig.m4 \ + $(top_srcdir)/m4/curl-wolfssl.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/xc-am-iface.m4 \ + $(top_srcdir)/m4/xc-cc-check.m4 \ + $(top_srcdir)/m4/xc-lt-iface.m4 \ + $(top_srcdir)/m4/xc-translit.m4 \ + $(top_srcdir)/m4/xc-val-flgs.m4 \ + $(top_srcdir)/m4/zz40-xc-ovr.m4 \ + $(top_srcdir)/m4/zz50-xc-ovr.m4 \ + $(top_srcdir)/m4/zz60-xc-ovr.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/lib/curl_config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(pkgincludedir)" +HEADERS = $(pkginclude_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +pkgincludedir = $(includedir)/curl +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AR_FLAGS = @AR_FLAGS@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BLANK_AT_MAKETIME = @BLANK_AT_MAKETIME@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@ +CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPPFLAG_CURL_STATICLIB = @CPPFLAG_CURL_STATICLIB@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CURLVERSION = @CURLVERSION@ +CURL_CA_BUNDLE = @CURL_CA_BUNDLE@ +CURL_CFLAG_EXTRAS = @CURL_CFLAG_EXTRAS@ +CURL_DISABLE_DICT = @CURL_DISABLE_DICT@ +CURL_DISABLE_FILE = @CURL_DISABLE_FILE@ +CURL_DISABLE_FTP = @CURL_DISABLE_FTP@ +CURL_DISABLE_GOPHER = @CURL_DISABLE_GOPHER@ +CURL_DISABLE_HTTP = @CURL_DISABLE_HTTP@ +CURL_DISABLE_IMAP = @CURL_DISABLE_IMAP@ +CURL_DISABLE_LDAP = @CURL_DISABLE_LDAP@ +CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ +CURL_DISABLE_MQTT = @CURL_DISABLE_MQTT@ +CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ +CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ +CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ +CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ +CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ +CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ +CURL_LT_SHLIB_VERSIONED_FLAVOUR = @CURL_LT_SHLIB_VERSIONED_FLAVOUR@ +CURL_NETWORK_AND_TIME_LIBS = @CURL_NETWORK_AND_TIME_LIBS@ +CURL_NETWORK_LIBS = @CURL_NETWORK_LIBS@ +CURL_WITH_MULTI_SSL = @CURL_WITH_MULTI_SSL@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_SSL_BACKEND = @DEFAULT_SSL_BACKEND@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_SHARED = @ENABLE_SHARED@ +ENABLE_STATIC = @ENABLE_STATIC@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@ +GCOV = @GCOV@ +GREP = @GREP@ +HAVE_BROTLI = @HAVE_BROTLI@ +HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ +HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ +HAVE_LIBZ = @HAVE_LIBZ@ +HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@ +HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@ +HAVE_ZSTD = @HAVE_ZSTD@ +IDN_ENABLED = @IDN_ENABLED@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +IPV6_ENABLED = @IPV6_ENABLED@ +LCOV = @LCOV@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBCURL_NO_SHARED = @LIBCURL_NO_SHARED@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MANOPT = @MANOPT@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PKGADD_NAME = @PKGADD_NAME@ +PKGADD_PKG = @PKGADD_PKG@ +PKGADD_VENDOR = @PKGADD_VENDOR@ +PKGCONFIG = @PKGCONFIG@ +RANDOM_FILE = @RANDOM_FILE@ +RANLIB = @RANLIB@ +REQUIRE_LIB_DEPS = @REQUIRE_LIB_DEPS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SSL_BACKENDS = @SSL_BACKENDS@ +SSL_ENABLED = @SSL_ENABLED@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +SUPPORT_FEATURES = @SUPPORT_FEATURES@ +SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@ +USE_ARES = @USE_ARES@ +USE_BEARSSL = @USE_BEARSSL@ +USE_GNUTLS = @USE_GNUTLS@ +USE_HYPER = @USE_HYPER@ +USE_LIBRTMP = @USE_LIBRTMP@ +USE_LIBSSH = @USE_LIBSSH@ +USE_LIBSSH2 = @USE_LIBSSH2@ +USE_MBEDTLS = @USE_MBEDTLS@ +USE_MESALINK = @USE_MESALINK@ +USE_NGHTTP2 = @USE_NGHTTP2@ +USE_NGHTTP3 = @USE_NGHTTP3@ +USE_NGTCP2 = @USE_NGTCP2@ +USE_NGTCP2_CRYPTO_GNUTLS = @USE_NGTCP2_CRYPTO_GNUTLS@ +USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@ +USE_NSS = @USE_NSS@ +USE_OPENLDAP = @USE_OPENLDAP@ +USE_QUICHE = @USE_QUICHE@ +USE_RUSTLS = @USE_RUSTLS@ +USE_SCHANNEL = @USE_SCHANNEL@ +USE_SECTRANSP = @USE_SECTRANSP@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ +USE_WIN32_CRYPTO = @USE_WIN32_CRYPTO@ +USE_WIN32_LARGE_FILES = @USE_WIN32_LARGE_FILES@ +USE_WIN32_SMALL_FILES = @USE_WIN32_SMALL_FILES@ +USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ +USE_WOLFSSH = @USE_WOLFSSH@ +USE_WOLFSSL = @USE_WOLFSSL@ +VERSION = @VERSION@ +VERSIONNUM = @VERSIONNUM@ +ZLIB_LIBS = @ZLIB_LIBS@ +ZSH_FUNCTIONS_DIR = @ZSH_FUNCTIONS_DIR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +libext = @libext@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2020, Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://curl.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### +pkginclude_HEADERS = \ + curl.h curlver.h easy.h mprintf.h stdcheaders.h multi.h \ + typecheck-gcc.h system.h urlapi.h options.h + +CHECKSRC = $(CS_$(V)) +CS_0 = @echo " RUN " $@; +CS_1 = +CS_ = $(CS_0) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/curl/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign include/curl/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-pkgincludeHEADERS: $(pkginclude_HEADERS) + @$(NORMAL_INSTALL) + @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ + done + +uninstall-pkgincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +@CURLDEBUG_FALSE@all-local: +all-am: Makefile $(HEADERS) all-local +installdirs: + for dir in "$(DESTDIR)$(pkgincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pkgincludeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pkgincludeHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \ + clean-generic clean-libtool cscopelist-am ctags ctags-am \ + distclean distclean-generic distclean-libtool distclean-tags \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pkgincludeHEADERS \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-pkgincludeHEADERS + +.PRECIOUS: Makefile + + +checksrc: + $(CHECKSRC)@PERL@ $(top_srcdir)/lib/checksrc.pl -D$(top_srcdir)/include/curl $(pkginclude_HEADERS) + +# for debug builds, we scan the sources on all regular make invokes +@CURLDEBUG_TRUE@all-local: checksrc + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libcurl/curl/curl.h b/libcurl/curl/curl.h new file mode 100644 index 0000000..835c3d8 --- /dev/null +++ b/libcurl/curl/curl.h @@ -0,0 +1,3067 @@ +#ifndef CURLINC_CURL_H +#define CURLINC_CURL_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* + * If you have libcurl problems, all docs and details are found here: + * https://curl.se/libcurl/ + */ + +#ifdef CURL_NO_OLDIES +#define CURL_STRICTER +#endif + +#include "curlver.h" /* libcurl version defines */ +#include "system.h" /* determine things run-time */ + +/* + * Define CURL_WIN32 when build target is Win32 API + */ + +#if (defined(_WIN32) || defined(__WIN32__) || defined(WIN32)) && \ + !defined(__SYMBIAN32__) +#define CURL_WIN32 +#endif + +#include +#include + +#if defined(__FreeBSD__) && (__FreeBSD__ >= 2) +/* Needed for __FreeBSD_version symbol definition */ +#include +#endif + +/* The include stuff here below is mainly for time_t! */ +#include +#include + +#if defined(CURL_WIN32) && !defined(_WIN32_WCE) && !defined(__CYGWIN__) +#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H) || \ + defined(__LWIP_OPT_H__) || defined(LWIP_HDR_OPT_H)) +/* The check above prevents the winsock2 inclusion if winsock.h already was + included, since they can't co-exist without problems */ +#include +#include +#endif +#endif + +/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish + libc5-based Linux systems. Only include it on systems that are known to + require it! */ +#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ + defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ + defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \ + defined(__CYGWIN__) || defined(AMIGA) || defined(__NuttX__) || \ + (defined(__FreeBSD_version) && (__FreeBSD_version < 800000)) || \ + defined(__VXWORKS__) +#include +#endif + +#if !defined(CURL_WIN32) && !defined(_WIN32_WCE) +#include +#endif + +#if !defined(CURL_WIN32) && !defined(__WATCOMC__) && !defined(__VXWORKS__) +#include +#endif + +#ifdef __BEOS__ +#include +#endif + +/* Compatibility for non-Clang compilers */ +#ifndef __has_declspec_attribute +# define __has_declspec_attribute(x) 0 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER) +typedef struct Curl_easy CURL; +typedef struct Curl_share CURLSH; +#else +typedef void CURL; +typedef void CURLSH; +#endif + +/* + * libcurl external API function linkage decorations. + */ + +#ifdef CURL_STATICLIB +# define CURL_EXTERN +#elif defined(CURL_WIN32) || defined(__SYMBIAN32__) || \ + (__has_declspec_attribute(dllexport) && \ + __has_declspec_attribute(dllimport)) +# if defined(BUILDING_LIBCURL) +# define CURL_EXTERN __declspec(dllexport) +# else +# define CURL_EXTERN __declspec(dllimport) +# endif +#elif defined(BUILDING_LIBCURL) && defined(CURL_HIDDEN_SYMBOLS) +# define CURL_EXTERN CURL_EXTERN_SYMBOL +#else +# define CURL_EXTERN +#endif + +#ifndef curl_socket_typedef +/* socket typedef */ +#if defined(CURL_WIN32) && !defined(__LWIP_OPT_H__) && !defined(LWIP_HDR_OPT_H) +typedef SOCKET curl_socket_t; +#define CURL_SOCKET_BAD INVALID_SOCKET +#else +typedef int curl_socket_t; +#define CURL_SOCKET_BAD -1 +#endif +#define curl_socket_typedef +#endif /* curl_socket_typedef */ + +/* enum for the different supported SSL backends */ +typedef enum { + CURLSSLBACKEND_NONE = 0, + CURLSSLBACKEND_OPENSSL = 1, + CURLSSLBACKEND_GNUTLS = 2, + CURLSSLBACKEND_NSS = 3, + CURLSSLBACKEND_OBSOLETE4 = 4, /* Was QSOSSL. */ + CURLSSLBACKEND_GSKIT = 5, + CURLSSLBACKEND_POLARSSL = 6, + CURLSSLBACKEND_WOLFSSL = 7, + CURLSSLBACKEND_SCHANNEL = 8, + CURLSSLBACKEND_SECURETRANSPORT = 9, + CURLSSLBACKEND_AXTLS = 10, /* never used since 7.63.0 */ + CURLSSLBACKEND_MBEDTLS = 11, + CURLSSLBACKEND_MESALINK = 12, + CURLSSLBACKEND_BEARSSL = 13, + CURLSSLBACKEND_RUSTLS = 14 +} curl_sslbackend; + +/* aliases for library clones and renames */ +#define CURLSSLBACKEND_LIBRESSL CURLSSLBACKEND_OPENSSL +#define CURLSSLBACKEND_BORINGSSL CURLSSLBACKEND_OPENSSL + +/* deprecated names: */ +#define CURLSSLBACKEND_CYASSL CURLSSLBACKEND_WOLFSSL +#define CURLSSLBACKEND_DARWINSSL CURLSSLBACKEND_SECURETRANSPORT + +struct curl_httppost { + struct curl_httppost *next; /* next entry in the list */ + char *name; /* pointer to allocated name */ + long namelength; /* length of name length */ + char *contents; /* pointer to allocated data contents */ + long contentslength; /* length of contents field, see also + CURL_HTTPPOST_LARGE */ + char *buffer; /* pointer to allocated buffer contents */ + long bufferlength; /* length of buffer field */ + char *contenttype; /* Content-Type */ + struct curl_slist *contentheader; /* list of extra headers for this form */ + struct curl_httppost *more; /* if one field name has more than one + file, this link should link to following + files */ + long flags; /* as defined below */ + +/* specified content is a file name */ +#define CURL_HTTPPOST_FILENAME (1<<0) +/* specified content is a file name */ +#define CURL_HTTPPOST_READFILE (1<<1) +/* name is only stored pointer do not free in formfree */ +#define CURL_HTTPPOST_PTRNAME (1<<2) +/* contents is only stored pointer do not free in formfree */ +#define CURL_HTTPPOST_PTRCONTENTS (1<<3) +/* upload file from buffer */ +#define CURL_HTTPPOST_BUFFER (1<<4) +/* upload file from pointer contents */ +#define CURL_HTTPPOST_PTRBUFFER (1<<5) +/* upload file contents by using the regular read callback to get the data and + pass the given pointer as custom pointer */ +#define CURL_HTTPPOST_CALLBACK (1<<6) +/* use size in 'contentlen', added in 7.46.0 */ +#define CURL_HTTPPOST_LARGE (1<<7) + + char *showfilename; /* The file name to show. If not set, the + actual file name will be used (if this + is a file part) */ + void *userp; /* custom pointer used for + HTTPPOST_CALLBACK posts */ + curl_off_t contentlen; /* alternative length of contents + field. Used if CURL_HTTPPOST_LARGE is + set. Added in 7.46.0 */ +}; + + +/* This is a return code for the progress callback that, when returned, will + signal libcurl to continue executing the default progress function */ +#define CURL_PROGRESSFUNC_CONTINUE 0x10000001 + +/* This is the CURLOPT_PROGRESSFUNCTION callback prototype. It is now + considered deprecated but was the only choice up until 7.31.0 */ +typedef int (*curl_progress_callback)(void *clientp, + double dltotal, + double dlnow, + double ultotal, + double ulnow); + +/* This is the CURLOPT_XFERINFOFUNCTION callback prototype. It was introduced + in 7.32.0, avoids the use of floating point numbers and provides more + detailed information. */ +typedef int (*curl_xferinfo_callback)(void *clientp, + curl_off_t dltotal, + curl_off_t dlnow, + curl_off_t ultotal, + curl_off_t ulnow); + +#ifndef CURL_MAX_READ_SIZE + /* The maximum receive buffer size configurable via CURLOPT_BUFFERSIZE. */ +#define CURL_MAX_READ_SIZE 524288 +#endif + +#ifndef CURL_MAX_WRITE_SIZE + /* Tests have proven that 20K is a very bad buffer size for uploads on + Windows, while 16K for some odd reason performed a lot better. + We do the ifndef check to allow this value to easier be changed at build + time for those who feel adventurous. The practical minimum is about + 400 bytes since libcurl uses a buffer of this size as a scratch area + (unrelated to network send operations). */ +#define CURL_MAX_WRITE_SIZE 16384 +#endif + +#ifndef CURL_MAX_HTTP_HEADER +/* The only reason to have a max limit for this is to avoid the risk of a bad + server feeding libcurl with a never-ending header that will cause reallocs + infinitely */ +#define CURL_MAX_HTTP_HEADER (100*1024) +#endif + +/* This is a magic return code for the write callback that, when returned, + will signal libcurl to pause receiving on the current transfer. */ +#define CURL_WRITEFUNC_PAUSE 0x10000001 + +typedef size_t (*curl_write_callback)(char *buffer, + size_t size, + size_t nitems, + void *outstream); + +/* This callback will be called when a new resolver request is made */ +typedef int (*curl_resolver_start_callback)(void *resolver_state, + void *reserved, void *userdata); + +/* enumeration of file types */ +typedef enum { + CURLFILETYPE_FILE = 0, + CURLFILETYPE_DIRECTORY, + CURLFILETYPE_SYMLINK, + CURLFILETYPE_DEVICE_BLOCK, + CURLFILETYPE_DEVICE_CHAR, + CURLFILETYPE_NAMEDPIPE, + CURLFILETYPE_SOCKET, + CURLFILETYPE_DOOR, /* is possible only on Sun Solaris now */ + + CURLFILETYPE_UNKNOWN /* should never occur */ +} curlfiletype; + +#define CURLFINFOFLAG_KNOWN_FILENAME (1<<0) +#define CURLFINFOFLAG_KNOWN_FILETYPE (1<<1) +#define CURLFINFOFLAG_KNOWN_TIME (1<<2) +#define CURLFINFOFLAG_KNOWN_PERM (1<<3) +#define CURLFINFOFLAG_KNOWN_UID (1<<4) +#define CURLFINFOFLAG_KNOWN_GID (1<<5) +#define CURLFINFOFLAG_KNOWN_SIZE (1<<6) +#define CURLFINFOFLAG_KNOWN_HLINKCOUNT (1<<7) + +/* Information about a single file, used when doing FTP wildcard matching */ +struct curl_fileinfo { + char *filename; + curlfiletype filetype; + time_t time; /* always zero! */ + unsigned int perm; + int uid; + int gid; + curl_off_t size; + long int hardlinks; + + struct { + /* If some of these fields is not NULL, it is a pointer to b_data. */ + char *time; + char *perm; + char *user; + char *group; + char *target; /* pointer to the target filename of a symlink */ + } strings; + + unsigned int flags; + + /* used internally */ + char *b_data; + size_t b_size; + size_t b_used; +}; + +/* return codes for CURLOPT_CHUNK_BGN_FUNCTION */ +#define CURL_CHUNK_BGN_FUNC_OK 0 +#define CURL_CHUNK_BGN_FUNC_FAIL 1 /* tell the lib to end the task */ +#define CURL_CHUNK_BGN_FUNC_SKIP 2 /* skip this chunk over */ + +/* if splitting of data transfer is enabled, this callback is called before + download of an individual chunk started. Note that parameter "remains" works + only for FTP wildcard downloading (for now), otherwise is not used */ +typedef long (*curl_chunk_bgn_callback)(const void *transfer_info, + void *ptr, + int remains); + +/* return codes for CURLOPT_CHUNK_END_FUNCTION */ +#define CURL_CHUNK_END_FUNC_OK 0 +#define CURL_CHUNK_END_FUNC_FAIL 1 /* tell the lib to end the task */ + +/* If splitting of data transfer is enabled this callback is called after + download of an individual chunk finished. + Note! After this callback was set then it have to be called FOR ALL chunks. + Even if downloading of this chunk was skipped in CHUNK_BGN_FUNC. + This is the reason why we don't need "transfer_info" parameter in this + callback and we are not interested in "remains" parameter too. */ +typedef long (*curl_chunk_end_callback)(void *ptr); + +/* return codes for FNMATCHFUNCTION */ +#define CURL_FNMATCHFUNC_MATCH 0 /* string corresponds to the pattern */ +#define CURL_FNMATCHFUNC_NOMATCH 1 /* pattern doesn't match the string */ +#define CURL_FNMATCHFUNC_FAIL 2 /* an error occurred */ + +/* callback type for wildcard downloading pattern matching. If the + string matches the pattern, return CURL_FNMATCHFUNC_MATCH value, etc. */ +typedef int (*curl_fnmatch_callback)(void *ptr, + const char *pattern, + const char *string); + +/* These are the return codes for the seek callbacks */ +#define CURL_SEEKFUNC_OK 0 +#define CURL_SEEKFUNC_FAIL 1 /* fail the entire transfer */ +#define CURL_SEEKFUNC_CANTSEEK 2 /* tell libcurl seeking can't be done, so + libcurl might try other means instead */ +typedef int (*curl_seek_callback)(void *instream, + curl_off_t offset, + int origin); /* 'whence' */ + +/* This is a return code for the read callback that, when returned, will + signal libcurl to immediately abort the current transfer. */ +#define CURL_READFUNC_ABORT 0x10000000 +/* This is a return code for the read callback that, when returned, will + signal libcurl to pause sending data on the current transfer. */ +#define CURL_READFUNC_PAUSE 0x10000001 + +/* Return code for when the trailing headers' callback has terminated + without any errors*/ +#define CURL_TRAILERFUNC_OK 0 +/* Return code for when was an error in the trailing header's list and we + want to abort the request */ +#define CURL_TRAILERFUNC_ABORT 1 + +typedef size_t (*curl_read_callback)(char *buffer, + size_t size, + size_t nitems, + void *instream); + +typedef int (*curl_trailer_callback)(struct curl_slist **list, + void *userdata); + +typedef enum { + CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */ + CURLSOCKTYPE_ACCEPT, /* socket created by accept() call */ + CURLSOCKTYPE_LAST /* never use */ +} curlsocktype; + +/* The return code from the sockopt_callback can signal information back + to libcurl: */ +#define CURL_SOCKOPT_OK 0 +#define CURL_SOCKOPT_ERROR 1 /* causes libcurl to abort and return + CURLE_ABORTED_BY_CALLBACK */ +#define CURL_SOCKOPT_ALREADY_CONNECTED 2 + +typedef int (*curl_sockopt_callback)(void *clientp, + curl_socket_t curlfd, + curlsocktype purpose); + +struct curl_sockaddr { + int family; + int socktype; + int protocol; + unsigned int addrlen; /* addrlen was a socklen_t type before 7.18.0 but it + turned really ugly and painful on the systems that + lack this type */ + struct sockaddr addr; +}; + +typedef curl_socket_t +(*curl_opensocket_callback)(void *clientp, + curlsocktype purpose, + struct curl_sockaddr *address); + +typedef int +(*curl_closesocket_callback)(void *clientp, curl_socket_t item); + +typedef enum { + CURLIOE_OK, /* I/O operation successful */ + CURLIOE_UNKNOWNCMD, /* command was unknown to callback */ + CURLIOE_FAILRESTART, /* failed to restart the read */ + CURLIOE_LAST /* never use */ +} curlioerr; + +typedef enum { + CURLIOCMD_NOP, /* no operation */ + CURLIOCMD_RESTARTREAD, /* restart the read stream from start */ + CURLIOCMD_LAST /* never use */ +} curliocmd; + +typedef curlioerr (*curl_ioctl_callback)(CURL *handle, + int cmd, + void *clientp); + +#ifndef CURL_DID_MEMORY_FUNC_TYPEDEFS +/* + * The following typedef's are signatures of malloc, free, realloc, strdup and + * calloc respectively. Function pointers of these types can be passed to the + * curl_global_init_mem() function to set user defined memory management + * callback routines. + */ +typedef void *(*curl_malloc_callback)(size_t size); +typedef void (*curl_free_callback)(void *ptr); +typedef void *(*curl_realloc_callback)(void *ptr, size_t size); +typedef char *(*curl_strdup_callback)(const char *str); +typedef void *(*curl_calloc_callback)(size_t nmemb, size_t size); + +#define CURL_DID_MEMORY_FUNC_TYPEDEFS +#endif + +/* the kind of data that is passed to information_callback*/ +typedef enum { + CURLINFO_TEXT = 0, + CURLINFO_HEADER_IN, /* 1 */ + CURLINFO_HEADER_OUT, /* 2 */ + CURLINFO_DATA_IN, /* 3 */ + CURLINFO_DATA_OUT, /* 4 */ + CURLINFO_SSL_DATA_IN, /* 5 */ + CURLINFO_SSL_DATA_OUT, /* 6 */ + CURLINFO_END +} curl_infotype; + +typedef int (*curl_debug_callback) + (CURL *handle, /* the handle/transfer this concerns */ + curl_infotype type, /* what kind of data */ + char *data, /* points to the data */ + size_t size, /* size of the data pointed to */ + void *userptr); /* whatever the user please */ + +/* All possible error codes from all sorts of curl functions. Future versions + may return other values, stay prepared. + + Always add new return codes last. Never *EVER* remove any. The return + codes must remain the same! + */ + +typedef enum { + CURLE_OK = 0, + CURLE_UNSUPPORTED_PROTOCOL, /* 1 */ + CURLE_FAILED_INIT, /* 2 */ + CURLE_URL_MALFORMAT, /* 3 */ + CURLE_NOT_BUILT_IN, /* 4 - [was obsoleted in August 2007 for + 7.17.0, reused in April 2011 for 7.21.5] */ + CURLE_COULDNT_RESOLVE_PROXY, /* 5 */ + CURLE_COULDNT_RESOLVE_HOST, /* 6 */ + CURLE_COULDNT_CONNECT, /* 7 */ + CURLE_WEIRD_SERVER_REPLY, /* 8 */ + CURLE_REMOTE_ACCESS_DENIED, /* 9 a service was denied by the server + due to lack of access - when login fails + this is not returned. */ + CURLE_FTP_ACCEPT_FAILED, /* 10 - [was obsoleted in April 2006 for + 7.15.4, reused in Dec 2011 for 7.24.0]*/ + CURLE_FTP_WEIRD_PASS_REPLY, /* 11 */ + CURLE_FTP_ACCEPT_TIMEOUT, /* 12 - timeout occurred accepting server + [was obsoleted in August 2007 for 7.17.0, + reused in Dec 2011 for 7.24.0]*/ + CURLE_FTP_WEIRD_PASV_REPLY, /* 13 */ + CURLE_FTP_WEIRD_227_FORMAT, /* 14 */ + CURLE_FTP_CANT_GET_HOST, /* 15 */ + CURLE_HTTP2, /* 16 - A problem in the http2 framing layer. + [was obsoleted in August 2007 for 7.17.0, + reused in July 2014 for 7.38.0] */ + CURLE_FTP_COULDNT_SET_TYPE, /* 17 */ + CURLE_PARTIAL_FILE, /* 18 */ + CURLE_FTP_COULDNT_RETR_FILE, /* 19 */ + CURLE_OBSOLETE20, /* 20 - NOT USED */ + CURLE_QUOTE_ERROR, /* 21 - quote command failure */ + CURLE_HTTP_RETURNED_ERROR, /* 22 */ + CURLE_WRITE_ERROR, /* 23 */ + CURLE_OBSOLETE24, /* 24 - NOT USED */ + CURLE_UPLOAD_FAILED, /* 25 - failed upload "command" */ + CURLE_READ_ERROR, /* 26 - couldn't open/read from file */ + CURLE_OUT_OF_MEMORY, /* 27 */ + /* Note: CURLE_OUT_OF_MEMORY may sometimes indicate a conversion error + instead of a memory allocation error if CURL_DOES_CONVERSIONS + is defined + */ + CURLE_OPERATION_TIMEDOUT, /* 28 - the timeout time was reached */ + CURLE_OBSOLETE29, /* 29 - NOT USED */ + CURLE_FTP_PORT_FAILED, /* 30 - FTP PORT operation failed */ + CURLE_FTP_COULDNT_USE_REST, /* 31 - the REST command failed */ + CURLE_OBSOLETE32, /* 32 - NOT USED */ + CURLE_RANGE_ERROR, /* 33 - RANGE "command" didn't work */ + CURLE_HTTP_POST_ERROR, /* 34 */ + CURLE_SSL_CONNECT_ERROR, /* 35 - wrong when connecting with SSL */ + CURLE_BAD_DOWNLOAD_RESUME, /* 36 - couldn't resume download */ + CURLE_FILE_COULDNT_READ_FILE, /* 37 */ + CURLE_LDAP_CANNOT_BIND, /* 38 */ + CURLE_LDAP_SEARCH_FAILED, /* 39 */ + CURLE_OBSOLETE40, /* 40 - NOT USED */ + CURLE_FUNCTION_NOT_FOUND, /* 41 - NOT USED starting with 7.53.0 */ + CURLE_ABORTED_BY_CALLBACK, /* 42 */ + CURLE_BAD_FUNCTION_ARGUMENT, /* 43 */ + CURLE_OBSOLETE44, /* 44 - NOT USED */ + CURLE_INTERFACE_FAILED, /* 45 - CURLOPT_INTERFACE failed */ + CURLE_OBSOLETE46, /* 46 - NOT USED */ + CURLE_TOO_MANY_REDIRECTS, /* 47 - catch endless re-direct loops */ + CURLE_UNKNOWN_OPTION, /* 48 - User specified an unknown option */ + CURLE_SETOPT_OPTION_SYNTAX, /* 49 - Malformed setopt option */ + CURLE_OBSOLETE50, /* 50 - NOT USED */ + CURLE_OBSOLETE51, /* 51 - NOT USED */ + CURLE_GOT_NOTHING, /* 52 - when this is a specific error */ + CURLE_SSL_ENGINE_NOTFOUND, /* 53 - SSL crypto engine not found */ + CURLE_SSL_ENGINE_SETFAILED, /* 54 - can not set SSL crypto engine as + default */ + CURLE_SEND_ERROR, /* 55 - failed sending network data */ + CURLE_RECV_ERROR, /* 56 - failure in receiving network data */ + CURLE_OBSOLETE57, /* 57 - NOT IN USE */ + CURLE_SSL_CERTPROBLEM, /* 58 - problem with the local certificate */ + CURLE_SSL_CIPHER, /* 59 - couldn't use specified cipher */ + CURLE_PEER_FAILED_VERIFICATION, /* 60 - peer's certificate or fingerprint + wasn't verified fine */ + CURLE_BAD_CONTENT_ENCODING, /* 61 - Unrecognized/bad encoding */ + CURLE_LDAP_INVALID_URL, /* 62 - Invalid LDAP URL */ + CURLE_FILESIZE_EXCEEDED, /* 63 - Maximum file size exceeded */ + CURLE_USE_SSL_FAILED, /* 64 - Requested FTP SSL level failed */ + CURLE_SEND_FAIL_REWIND, /* 65 - Sending the data requires a rewind + that failed */ + CURLE_SSL_ENGINE_INITFAILED, /* 66 - failed to initialise ENGINE */ + CURLE_LOGIN_DENIED, /* 67 - user, password or similar was not + accepted and we failed to login */ + CURLE_TFTP_NOTFOUND, /* 68 - file not found on server */ + CURLE_TFTP_PERM, /* 69 - permission problem on server */ + CURLE_REMOTE_DISK_FULL, /* 70 - out of disk space on server */ + CURLE_TFTP_ILLEGAL, /* 71 - Illegal TFTP operation */ + CURLE_TFTP_UNKNOWNID, /* 72 - Unknown transfer ID */ + CURLE_REMOTE_FILE_EXISTS, /* 73 - File already exists */ + CURLE_TFTP_NOSUCHUSER, /* 74 - No such user */ + CURLE_CONV_FAILED, /* 75 - conversion failed */ + CURLE_CONV_REQD, /* 76 - caller must register conversion + callbacks using curl_easy_setopt options + CURLOPT_CONV_FROM_NETWORK_FUNCTION, + CURLOPT_CONV_TO_NETWORK_FUNCTION, and + CURLOPT_CONV_FROM_UTF8_FUNCTION */ + CURLE_SSL_CACERT_BADFILE, /* 77 - could not load CACERT file, missing + or wrong format */ + CURLE_REMOTE_FILE_NOT_FOUND, /* 78 - remote file not found */ + CURLE_SSH, /* 79 - error from the SSH layer, somewhat + generic so the error message will be of + interest when this has happened */ + + CURLE_SSL_SHUTDOWN_FAILED, /* 80 - Failed to shut down the SSL + connection */ + CURLE_AGAIN, /* 81 - socket is not ready for send/recv, + wait till it's ready and try again (Added + in 7.18.2) */ + CURLE_SSL_CRL_BADFILE, /* 82 - could not load CRL file, missing or + wrong format (Added in 7.19.0) */ + CURLE_SSL_ISSUER_ERROR, /* 83 - Issuer check failed. (Added in + 7.19.0) */ + CURLE_FTP_PRET_FAILED, /* 84 - a PRET command failed */ + CURLE_RTSP_CSEQ_ERROR, /* 85 - mismatch of RTSP CSeq numbers */ + CURLE_RTSP_SESSION_ERROR, /* 86 - mismatch of RTSP Session Ids */ + CURLE_FTP_BAD_FILE_LIST, /* 87 - unable to parse FTP file list */ + CURLE_CHUNK_FAILED, /* 88 - chunk callback reported error */ + CURLE_NO_CONNECTION_AVAILABLE, /* 89 - No connection available, the + session will be queued */ + CURLE_SSL_PINNEDPUBKEYNOTMATCH, /* 90 - specified pinned public key did not + match */ + CURLE_SSL_INVALIDCERTSTATUS, /* 91 - invalid certificate status */ + CURLE_HTTP2_STREAM, /* 92 - stream error in HTTP/2 framing layer + */ + CURLE_RECURSIVE_API_CALL, /* 93 - an api function was called from + inside a callback */ + CURLE_AUTH_ERROR, /* 94 - an authentication function returned an + error */ + CURLE_HTTP3, /* 95 - An HTTP/3 layer problem */ + CURLE_QUIC_CONNECT_ERROR, /* 96 - QUIC connection error */ + CURLE_PROXY, /* 97 - proxy handshake error */ + CURLE_SSL_CLIENTCERT, /* 98 - client-side certificate required */ + CURL_LAST /* never use! */ +} CURLcode; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Previously obsolete error code re-used in 7.38.0 */ +#define CURLE_OBSOLETE16 CURLE_HTTP2 + +/* Previously obsolete error codes re-used in 7.24.0 */ +#define CURLE_OBSOLETE10 CURLE_FTP_ACCEPT_FAILED +#define CURLE_OBSOLETE12 CURLE_FTP_ACCEPT_TIMEOUT + +/* compatibility with older names */ +#define CURLOPT_ENCODING CURLOPT_ACCEPT_ENCODING +#define CURLE_FTP_WEIRD_SERVER_REPLY CURLE_WEIRD_SERVER_REPLY + +/* The following were added in 7.62.0 */ +#define CURLE_SSL_CACERT CURLE_PEER_FAILED_VERIFICATION + +/* The following were added in 7.21.5, April 2011 */ +#define CURLE_UNKNOWN_TELNET_OPTION CURLE_UNKNOWN_OPTION + +/* Added for 7.78.0 */ +#define CURLE_TELNET_OPTION_SYNTAX CURLE_SETOPT_OPTION_SYNTAX + +/* The following were added in 7.17.1 */ +/* These are scheduled to disappear by 2009 */ +#define CURLE_SSL_PEER_CERTIFICATE CURLE_PEER_FAILED_VERIFICATION + +/* The following were added in 7.17.0 */ +/* These are scheduled to disappear by 2009 */ +#define CURLE_OBSOLETE CURLE_OBSOLETE50 /* no one should be using this! */ +#define CURLE_BAD_PASSWORD_ENTERED CURLE_OBSOLETE46 +#define CURLE_BAD_CALLING_ORDER CURLE_OBSOLETE44 +#define CURLE_FTP_USER_PASSWORD_INCORRECT CURLE_OBSOLETE10 +#define CURLE_FTP_CANT_RECONNECT CURLE_OBSOLETE16 +#define CURLE_FTP_COULDNT_GET_SIZE CURLE_OBSOLETE32 +#define CURLE_FTP_COULDNT_SET_ASCII CURLE_OBSOLETE29 +#define CURLE_FTP_WEIRD_USER_REPLY CURLE_OBSOLETE12 +#define CURLE_FTP_WRITE_ERROR CURLE_OBSOLETE20 +#define CURLE_LIBRARY_NOT_FOUND CURLE_OBSOLETE40 +#define CURLE_MALFORMAT_USER CURLE_OBSOLETE24 +#define CURLE_SHARE_IN_USE CURLE_OBSOLETE57 +#define CURLE_URL_MALFORMAT_USER CURLE_NOT_BUILT_IN + +#define CURLE_FTP_ACCESS_DENIED CURLE_REMOTE_ACCESS_DENIED +#define CURLE_FTP_COULDNT_SET_BINARY CURLE_FTP_COULDNT_SET_TYPE +#define CURLE_FTP_QUOTE_ERROR CURLE_QUOTE_ERROR +#define CURLE_TFTP_DISKFULL CURLE_REMOTE_DISK_FULL +#define CURLE_TFTP_EXISTS CURLE_REMOTE_FILE_EXISTS +#define CURLE_HTTP_RANGE_ERROR CURLE_RANGE_ERROR +#define CURLE_FTP_SSL_FAILED CURLE_USE_SSL_FAILED + +/* The following were added earlier */ + +#define CURLE_OPERATION_TIMEOUTED CURLE_OPERATION_TIMEDOUT + +#define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR +#define CURLE_HTTP_PORT_FAILED CURLE_INTERFACE_FAILED +#define CURLE_FTP_COULDNT_STOR_FILE CURLE_UPLOAD_FAILED + +#define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE +#define CURLE_FTP_BAD_DOWNLOAD_RESUME CURLE_BAD_DOWNLOAD_RESUME + +/* This was the error code 50 in 7.7.3 and a few earlier versions, this + is no longer used by libcurl but is instead #defined here only to not + make programs break */ +#define CURLE_ALREADY_COMPLETE 99999 + +/* Provide defines for really old option names */ +#define CURLOPT_FILE CURLOPT_WRITEDATA /* name changed in 7.9.7 */ +#define CURLOPT_INFILE CURLOPT_READDATA /* name changed in 7.9.7 */ +#define CURLOPT_WRITEHEADER CURLOPT_HEADERDATA + +/* Since long deprecated options with no code in the lib that does anything + with them. */ +#define CURLOPT_WRITEINFO CURLOPT_OBSOLETE40 +#define CURLOPT_CLOSEPOLICY CURLOPT_OBSOLETE72 + +#endif /*!CURL_NO_OLDIES*/ + +/* + * Proxy error codes. Returned in CURLINFO_PROXY_ERROR if CURLE_PROXY was + * return for the transfers. + */ +typedef enum { + CURLPX_OK, + CURLPX_BAD_ADDRESS_TYPE, + CURLPX_BAD_VERSION, + CURLPX_CLOSED, + CURLPX_GSSAPI, + CURLPX_GSSAPI_PERMSG, + CURLPX_GSSAPI_PROTECTION, + CURLPX_IDENTD, + CURLPX_IDENTD_DIFFER, + CURLPX_LONG_HOSTNAME, + CURLPX_LONG_PASSWD, + CURLPX_LONG_USER, + CURLPX_NO_AUTH, + CURLPX_RECV_ADDRESS, + CURLPX_RECV_AUTH, + CURLPX_RECV_CONNECT, + CURLPX_RECV_REQACK, + CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED, + CURLPX_REPLY_COMMAND_NOT_SUPPORTED, + CURLPX_REPLY_CONNECTION_REFUSED, + CURLPX_REPLY_GENERAL_SERVER_FAILURE, + CURLPX_REPLY_HOST_UNREACHABLE, + CURLPX_REPLY_NETWORK_UNREACHABLE, + CURLPX_REPLY_NOT_ALLOWED, + CURLPX_REPLY_TTL_EXPIRED, + CURLPX_REPLY_UNASSIGNED, + CURLPX_REQUEST_FAILED, + CURLPX_RESOLVE_HOST, + CURLPX_SEND_AUTH, + CURLPX_SEND_CONNECT, + CURLPX_SEND_REQUEST, + CURLPX_UNKNOWN_FAIL, + CURLPX_UNKNOWN_MODE, + CURLPX_USER_REJECTED, + CURLPX_LAST /* never use */ +} CURLproxycode; + +/* This prototype applies to all conversion callbacks */ +typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length); + +typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl, /* easy handle */ + void *ssl_ctx, /* actually an OpenSSL + or WolfSSL SSL_CTX, + or an mbedTLS + mbedtls_ssl_config */ + void *userptr); + +typedef enum { + CURLPROXY_HTTP = 0, /* added in 7.10, new in 7.19.4 default is to use + CONNECT HTTP/1.1 */ + CURLPROXY_HTTP_1_0 = 1, /* added in 7.19.4, force to use CONNECT + HTTP/1.0 */ + CURLPROXY_HTTPS = 2, /* added in 7.52.0 */ + CURLPROXY_SOCKS4 = 4, /* support added in 7.15.2, enum existed already + in 7.10 */ + CURLPROXY_SOCKS5 = 5, /* added in 7.10 */ + CURLPROXY_SOCKS4A = 6, /* added in 7.18.0 */ + CURLPROXY_SOCKS5_HOSTNAME = 7 /* Use the SOCKS5 protocol but pass along the + host name rather than the IP address. added + in 7.18.0 */ +} curl_proxytype; /* this enum was added in 7.10 */ + +/* + * Bitmasks for CURLOPT_HTTPAUTH and CURLOPT_PROXYAUTH options: + * + * CURLAUTH_NONE - No HTTP authentication + * CURLAUTH_BASIC - HTTP Basic authentication (default) + * CURLAUTH_DIGEST - HTTP Digest authentication + * CURLAUTH_NEGOTIATE - HTTP Negotiate (SPNEGO) authentication + * CURLAUTH_GSSNEGOTIATE - Alias for CURLAUTH_NEGOTIATE (deprecated) + * CURLAUTH_NTLM - HTTP NTLM authentication + * CURLAUTH_DIGEST_IE - HTTP Digest authentication with IE flavour + * CURLAUTH_NTLM_WB - HTTP NTLM authentication delegated to winbind helper + * CURLAUTH_BEARER - HTTP Bearer token authentication + * CURLAUTH_ONLY - Use together with a single other type to force no + * authentication or just that single type + * CURLAUTH_ANY - All fine types set + * CURLAUTH_ANYSAFE - All fine types except Basic + */ + +#define CURLAUTH_NONE ((unsigned long)0) +#define CURLAUTH_BASIC (((unsigned long)1)<<0) +#define CURLAUTH_DIGEST (((unsigned long)1)<<1) +#define CURLAUTH_NEGOTIATE (((unsigned long)1)<<2) +/* Deprecated since the advent of CURLAUTH_NEGOTIATE */ +#define CURLAUTH_GSSNEGOTIATE CURLAUTH_NEGOTIATE +/* Used for CURLOPT_SOCKS5_AUTH to stay terminologically correct */ +#define CURLAUTH_GSSAPI CURLAUTH_NEGOTIATE +#define CURLAUTH_NTLM (((unsigned long)1)<<3) +#define CURLAUTH_DIGEST_IE (((unsigned long)1)<<4) +#define CURLAUTH_NTLM_WB (((unsigned long)1)<<5) +#define CURLAUTH_BEARER (((unsigned long)1)<<6) +#define CURLAUTH_AWS_SIGV4 (((unsigned long)1)<<7) +#define CURLAUTH_ONLY (((unsigned long)1)<<31) +#define CURLAUTH_ANY (~CURLAUTH_DIGEST_IE) +#define CURLAUTH_ANYSAFE (~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE)) + +#define CURLSSH_AUTH_ANY ~0 /* all types supported by the server */ +#define CURLSSH_AUTH_NONE 0 /* none allowed, silly but complete */ +#define CURLSSH_AUTH_PUBLICKEY (1<<0) /* public/private key files */ +#define CURLSSH_AUTH_PASSWORD (1<<1) /* password */ +#define CURLSSH_AUTH_HOST (1<<2) /* host key files */ +#define CURLSSH_AUTH_KEYBOARD (1<<3) /* keyboard interactive */ +#define CURLSSH_AUTH_AGENT (1<<4) /* agent (ssh-agent, pageant...) */ +#define CURLSSH_AUTH_GSSAPI (1<<5) /* gssapi (kerberos, ...) */ +#define CURLSSH_AUTH_DEFAULT CURLSSH_AUTH_ANY + +#define CURLGSSAPI_DELEGATION_NONE 0 /* no delegation (default) */ +#define CURLGSSAPI_DELEGATION_POLICY_FLAG (1<<0) /* if permitted by policy */ +#define CURLGSSAPI_DELEGATION_FLAG (1<<1) /* delegate always */ + +#define CURL_ERROR_SIZE 256 + +enum curl_khtype { + CURLKHTYPE_UNKNOWN, + CURLKHTYPE_RSA1, + CURLKHTYPE_RSA, + CURLKHTYPE_DSS, + CURLKHTYPE_ECDSA, + CURLKHTYPE_ED25519 +}; + +struct curl_khkey { + const char *key; /* points to a null-terminated string encoded with base64 + if len is zero, otherwise to the "raw" data */ + size_t len; + enum curl_khtype keytype; +}; + +/* this is the set of return values expected from the curl_sshkeycallback + callback */ +enum curl_khstat { + CURLKHSTAT_FINE_ADD_TO_FILE, + CURLKHSTAT_FINE, + CURLKHSTAT_REJECT, /* reject the connection, return an error */ + CURLKHSTAT_DEFER, /* do not accept it, but we can't answer right now so + this causes a CURLE_DEFER error but otherwise the + connection will be left intact etc */ + CURLKHSTAT_FINE_REPLACE, /* accept and replace the wrong key*/ + CURLKHSTAT_LAST /* not for use, only a marker for last-in-list */ +}; + +/* this is the set of status codes pass in to the callback */ +enum curl_khmatch { + CURLKHMATCH_OK, /* match */ + CURLKHMATCH_MISMATCH, /* host found, key mismatch! */ + CURLKHMATCH_MISSING, /* no matching host/key found */ + CURLKHMATCH_LAST /* not for use, only a marker for last-in-list */ +}; + +typedef int + (*curl_sshkeycallback) (CURL *easy, /* easy handle */ + const struct curl_khkey *knownkey, /* known */ + const struct curl_khkey *foundkey, /* found */ + enum curl_khmatch, /* libcurl's view on the keys */ + void *clientp); /* custom pointer passed from app */ + +/* parameter for the CURLOPT_USE_SSL option */ +typedef enum { + CURLUSESSL_NONE, /* do not attempt to use SSL */ + CURLUSESSL_TRY, /* try using SSL, proceed anyway otherwise */ + CURLUSESSL_CONTROL, /* SSL for the control connection or fail */ + CURLUSESSL_ALL, /* SSL for all communication or fail */ + CURLUSESSL_LAST /* not an option, never use */ +} curl_usessl; + +/* Definition of bits for the CURLOPT_SSL_OPTIONS argument: */ + +/* - ALLOW_BEAST tells libcurl to allow the BEAST SSL vulnerability in the + name of improving interoperability with older servers. Some SSL libraries + have introduced work-arounds for this flaw but those work-arounds sometimes + make the SSL communication fail. To regain functionality with those broken + servers, a user can this way allow the vulnerability back. */ +#define CURLSSLOPT_ALLOW_BEAST (1<<0) + +/* - NO_REVOKE tells libcurl to disable certificate revocation checks for those + SSL backends where such behavior is present. */ +#define CURLSSLOPT_NO_REVOKE (1<<1) + +/* - NO_PARTIALCHAIN tells libcurl to *NOT* accept a partial certificate chain + if possible. The OpenSSL backend has this ability. */ +#define CURLSSLOPT_NO_PARTIALCHAIN (1<<2) + +/* - REVOKE_BEST_EFFORT tells libcurl to ignore certificate revocation offline + checks and ignore missing revocation list for those SSL backends where such + behavior is present. */ +#define CURLSSLOPT_REVOKE_BEST_EFFORT (1<<3) + +/* - CURLSSLOPT_NATIVE_CA tells libcurl to use standard certificate store of + operating system. Currently implemented under MS-Windows. */ +#define CURLSSLOPT_NATIVE_CA (1<<4) + +/* - CURLSSLOPT_AUTO_CLIENT_CERT tells libcurl to automatically locate and use + a client certificate for authentication. (Schannel) */ +#define CURLSSLOPT_AUTO_CLIENT_CERT (1<<5) + +/* The default connection attempt delay in milliseconds for happy eyeballs. + CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3 and happy-eyeballs-timeout-ms.d document + this value, keep them in sync. */ +#define CURL_HET_DEFAULT 200L + +/* The default connection upkeep interval in milliseconds. */ +#define CURL_UPKEEP_INTERVAL_DEFAULT 60000L + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Backwards compatibility with older names */ +/* These are scheduled to disappear by 2009 */ + +#define CURLFTPSSL_NONE CURLUSESSL_NONE +#define CURLFTPSSL_TRY CURLUSESSL_TRY +#define CURLFTPSSL_CONTROL CURLUSESSL_CONTROL +#define CURLFTPSSL_ALL CURLUSESSL_ALL +#define CURLFTPSSL_LAST CURLUSESSL_LAST +#define curl_ftpssl curl_usessl +#endif /*!CURL_NO_OLDIES*/ + +/* parameter for the CURLOPT_FTP_SSL_CCC option */ +typedef enum { + CURLFTPSSL_CCC_NONE, /* do not send CCC */ + CURLFTPSSL_CCC_PASSIVE, /* Let the server initiate the shutdown */ + CURLFTPSSL_CCC_ACTIVE, /* Initiate the shutdown */ + CURLFTPSSL_CCC_LAST /* not an option, never use */ +} curl_ftpccc; + +/* parameter for the CURLOPT_FTPSSLAUTH option */ +typedef enum { + CURLFTPAUTH_DEFAULT, /* let libcurl decide */ + CURLFTPAUTH_SSL, /* use "AUTH SSL" */ + CURLFTPAUTH_TLS, /* use "AUTH TLS" */ + CURLFTPAUTH_LAST /* not an option, never use */ +} curl_ftpauth; + +/* parameter for the CURLOPT_FTP_CREATE_MISSING_DIRS option */ +typedef enum { + CURLFTP_CREATE_DIR_NONE, /* do NOT create missing dirs! */ + CURLFTP_CREATE_DIR, /* (FTP/SFTP) if CWD fails, try MKD and then CWD + again if MKD succeeded, for SFTP this does + similar magic */ + CURLFTP_CREATE_DIR_RETRY, /* (FTP only) if CWD fails, try MKD and then CWD + again even if MKD failed! */ + CURLFTP_CREATE_DIR_LAST /* not an option, never use */ +} curl_ftpcreatedir; + +/* parameter for the CURLOPT_FTP_FILEMETHOD option */ +typedef enum { + CURLFTPMETHOD_DEFAULT, /* let libcurl pick */ + CURLFTPMETHOD_MULTICWD, /* single CWD operation for each path part */ + CURLFTPMETHOD_NOCWD, /* no CWD at all */ + CURLFTPMETHOD_SINGLECWD, /* one CWD to full dir, then work on file */ + CURLFTPMETHOD_LAST /* not an option, never use */ +} curl_ftpmethod; + +/* bitmask defines for CURLOPT_HEADEROPT */ +#define CURLHEADER_UNIFIED 0 +#define CURLHEADER_SEPARATE (1<<0) + +/* CURLALTSVC_* are bits for the CURLOPT_ALTSVC_CTRL option */ +#define CURLALTSVC_READONLYFILE (1<<2) +#define CURLALTSVC_H1 (1<<3) +#define CURLALTSVC_H2 (1<<4) +#define CURLALTSVC_H3 (1<<5) + + +struct curl_hstsentry { + char *name; + size_t namelen; + unsigned int includeSubDomains:1; + char expire[18]; /* YYYYMMDD HH:MM:SS [null-terminated] */ +}; + +struct curl_index { + size_t index; /* the provided entry's "index" or count */ + size_t total; /* total number of entries to save */ +}; + +typedef enum { + CURLSTS_OK, + CURLSTS_DONE, + CURLSTS_FAIL +} CURLSTScode; + +typedef CURLSTScode (*curl_hstsread_callback)(CURL *easy, + struct curl_hstsentry *e, + void *userp); +typedef CURLSTScode (*curl_hstswrite_callback)(CURL *easy, + struct curl_hstsentry *e, + struct curl_index *i, + void *userp); + +/* CURLHSTS_* are bits for the CURLOPT_HSTS option */ +#define CURLHSTS_ENABLE (long)(1<<0) +#define CURLHSTS_READONLYFILE (long)(1<<1) + +/* CURLPROTO_ defines are for the CURLOPT_*PROTOCOLS options */ +#define CURLPROTO_HTTP (1<<0) +#define CURLPROTO_HTTPS (1<<1) +#define CURLPROTO_FTP (1<<2) +#define CURLPROTO_FTPS (1<<3) +#define CURLPROTO_SCP (1<<4) +#define CURLPROTO_SFTP (1<<5) +#define CURLPROTO_TELNET (1<<6) +#define CURLPROTO_LDAP (1<<7) +#define CURLPROTO_LDAPS (1<<8) +#define CURLPROTO_DICT (1<<9) +#define CURLPROTO_FILE (1<<10) +#define CURLPROTO_TFTP (1<<11) +#define CURLPROTO_IMAP (1<<12) +#define CURLPROTO_IMAPS (1<<13) +#define CURLPROTO_POP3 (1<<14) +#define CURLPROTO_POP3S (1<<15) +#define CURLPROTO_SMTP (1<<16) +#define CURLPROTO_SMTPS (1<<17) +#define CURLPROTO_RTSP (1<<18) +#define CURLPROTO_RTMP (1<<19) +#define CURLPROTO_RTMPT (1<<20) +#define CURLPROTO_RTMPE (1<<21) +#define CURLPROTO_RTMPTE (1<<22) +#define CURLPROTO_RTMPS (1<<23) +#define CURLPROTO_RTMPTS (1<<24) +#define CURLPROTO_GOPHER (1<<25) +#define CURLPROTO_SMB (1<<26) +#define CURLPROTO_SMBS (1<<27) +#define CURLPROTO_MQTT (1<<28) +#define CURLPROTO_GOPHERS (1<<29) +#define CURLPROTO_ALL (~0) /* enable everything */ + +/* long may be 32 or 64 bits, but we should never depend on anything else + but 32 */ +#define CURLOPTTYPE_LONG 0 +#define CURLOPTTYPE_OBJECTPOINT 10000 +#define CURLOPTTYPE_FUNCTIONPOINT 20000 +#define CURLOPTTYPE_OFF_T 30000 +#define CURLOPTTYPE_BLOB 40000 + +/* *STRINGPOINT is an alias for OBJECTPOINT to allow tools to extract the + string options from the header file */ + + +#define CURLOPT(na,t,nu) na = t + nu + +/* CURLOPT aliases that make no run-time difference */ + +/* 'char *' argument to a string with a trailing zero */ +#define CURLOPTTYPE_STRINGPOINT CURLOPTTYPE_OBJECTPOINT + +/* 'struct curl_slist *' argument */ +#define CURLOPTTYPE_SLISTPOINT CURLOPTTYPE_OBJECTPOINT + +/* 'void *' argument passed untouched to callback */ +#define CURLOPTTYPE_CBPOINT CURLOPTTYPE_OBJECTPOINT + +/* 'long' argument with a set of values/bitmask */ +#define CURLOPTTYPE_VALUES CURLOPTTYPE_LONG + +/* + * All CURLOPT_* values. + */ + +typedef enum { + /* This is the FILE * or void * the regular output should be written to. */ + CURLOPT(CURLOPT_WRITEDATA, CURLOPTTYPE_CBPOINT, 1), + + /* The full URL to get/put */ + CURLOPT(CURLOPT_URL, CURLOPTTYPE_STRINGPOINT, 2), + + /* Port number to connect to, if other than default. */ + CURLOPT(CURLOPT_PORT, CURLOPTTYPE_LONG, 3), + + /* Name of proxy to use. */ + CURLOPT(CURLOPT_PROXY, CURLOPTTYPE_STRINGPOINT, 4), + + /* "user:password;options" to use when fetching. */ + CURLOPT(CURLOPT_USERPWD, CURLOPTTYPE_STRINGPOINT, 5), + + /* "user:password" to use with proxy. */ + CURLOPT(CURLOPT_PROXYUSERPWD, CURLOPTTYPE_STRINGPOINT, 6), + + /* Range to get, specified as an ASCII string. */ + CURLOPT(CURLOPT_RANGE, CURLOPTTYPE_STRINGPOINT, 7), + + /* not used */ + + /* Specified file stream to upload from (use as input): */ + CURLOPT(CURLOPT_READDATA, CURLOPTTYPE_CBPOINT, 9), + + /* Buffer to receive error messages in, must be at least CURL_ERROR_SIZE + * bytes big. */ + CURLOPT(CURLOPT_ERRORBUFFER, CURLOPTTYPE_OBJECTPOINT, 10), + + /* Function that will be called to store the output (instead of fwrite). The + * parameters will use fwrite() syntax, make sure to follow them. */ + CURLOPT(CURLOPT_WRITEFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 11), + + /* Function that will be called to read the input (instead of fread). The + * parameters will use fread() syntax, make sure to follow them. */ + CURLOPT(CURLOPT_READFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 12), + + /* Time-out the read operation after this amount of seconds */ + CURLOPT(CURLOPT_TIMEOUT, CURLOPTTYPE_LONG, 13), + + /* If the CURLOPT_INFILE is used, this can be used to inform libcurl about + * how large the file being sent really is. That allows better error + * checking and better verifies that the upload was successful. -1 means + * unknown size. + * + * For large file support, there is also a _LARGE version of the key + * which takes an off_t type, allowing platforms with larger off_t + * sizes to handle larger files. See below for INFILESIZE_LARGE. + */ + CURLOPT(CURLOPT_INFILESIZE, CURLOPTTYPE_LONG, 14), + + /* POST static input fields. */ + CURLOPT(CURLOPT_POSTFIELDS, CURLOPTTYPE_OBJECTPOINT, 15), + + /* Set the referrer page (needed by some CGIs) */ + CURLOPT(CURLOPT_REFERER, CURLOPTTYPE_STRINGPOINT, 16), + + /* Set the FTP PORT string (interface name, named or numerical IP address) + Use i.e '-' to use default address. */ + CURLOPT(CURLOPT_FTPPORT, CURLOPTTYPE_STRINGPOINT, 17), + + /* Set the User-Agent string (examined by some CGIs) */ + CURLOPT(CURLOPT_USERAGENT, CURLOPTTYPE_STRINGPOINT, 18), + + /* If the download receives less than "low speed limit" bytes/second + * during "low speed time" seconds, the operations is aborted. + * You could i.e if you have a pretty high speed connection, abort if + * it is less than 2000 bytes/sec during 20 seconds. + */ + + /* Set the "low speed limit" */ + CURLOPT(CURLOPT_LOW_SPEED_LIMIT, CURLOPTTYPE_LONG, 19), + + /* Set the "low speed time" */ + CURLOPT(CURLOPT_LOW_SPEED_TIME, CURLOPTTYPE_LONG, 20), + + /* Set the continuation offset. + * + * Note there is also a _LARGE version of this key which uses + * off_t types, allowing for large file offsets on platforms which + * use larger-than-32-bit off_t's. Look below for RESUME_FROM_LARGE. + */ + CURLOPT(CURLOPT_RESUME_FROM, CURLOPTTYPE_LONG, 21), + + /* Set cookie in request: */ + CURLOPT(CURLOPT_COOKIE, CURLOPTTYPE_STRINGPOINT, 22), + + /* This points to a linked list of headers, struct curl_slist kind. This + list is also used for RTSP (in spite of its name) */ + CURLOPT(CURLOPT_HTTPHEADER, CURLOPTTYPE_SLISTPOINT, 23), + + /* This points to a linked list of post entries, struct curl_httppost */ + CURLOPT(CURLOPT_HTTPPOST, CURLOPTTYPE_OBJECTPOINT, 24), + + /* name of the file keeping your private SSL-certificate */ + CURLOPT(CURLOPT_SSLCERT, CURLOPTTYPE_STRINGPOINT, 25), + + /* password for the SSL or SSH private key */ + CURLOPT(CURLOPT_KEYPASSWD, CURLOPTTYPE_STRINGPOINT, 26), + + /* send TYPE parameter? */ + CURLOPT(CURLOPT_CRLF, CURLOPTTYPE_LONG, 27), + + /* send linked-list of QUOTE commands */ + CURLOPT(CURLOPT_QUOTE, CURLOPTTYPE_SLISTPOINT, 28), + + /* send FILE * or void * to store headers to, if you use a callback it + is simply passed to the callback unmodified */ + CURLOPT(CURLOPT_HEADERDATA, CURLOPTTYPE_CBPOINT, 29), + + /* point to a file to read the initial cookies from, also enables + "cookie awareness" */ + CURLOPT(CURLOPT_COOKIEFILE, CURLOPTTYPE_STRINGPOINT, 31), + + /* What version to specifically try to use. + See CURL_SSLVERSION defines below. */ + CURLOPT(CURLOPT_SSLVERSION, CURLOPTTYPE_VALUES, 32), + + /* What kind of HTTP time condition to use, see defines */ + CURLOPT(CURLOPT_TIMECONDITION, CURLOPTTYPE_VALUES, 33), + + /* Time to use with the above condition. Specified in number of seconds + since 1 Jan 1970 */ + CURLOPT(CURLOPT_TIMEVALUE, CURLOPTTYPE_LONG, 34), + + /* 35 = OBSOLETE */ + + /* Custom request, for customizing the get command like + HTTP: DELETE, TRACE and others + FTP: to use a different list command + */ + CURLOPT(CURLOPT_CUSTOMREQUEST, CURLOPTTYPE_STRINGPOINT, 36), + + /* FILE handle to use instead of stderr */ + CURLOPT(CURLOPT_STDERR, CURLOPTTYPE_OBJECTPOINT, 37), + + /* 38 is not used */ + + /* send linked-list of post-transfer QUOTE commands */ + CURLOPT(CURLOPT_POSTQUOTE, CURLOPTTYPE_SLISTPOINT, 39), + + /* OBSOLETE, do not use! */ + CURLOPT(CURLOPT_OBSOLETE40, CURLOPTTYPE_OBJECTPOINT, 40), + + /* talk a lot */ + CURLOPT(CURLOPT_VERBOSE, CURLOPTTYPE_LONG, 41), + + /* throw the header out too */ + CURLOPT(CURLOPT_HEADER, CURLOPTTYPE_LONG, 42), + + /* shut off the progress meter */ + CURLOPT(CURLOPT_NOPROGRESS, CURLOPTTYPE_LONG, 43), + + /* use HEAD to get http document */ + CURLOPT(CURLOPT_NOBODY, CURLOPTTYPE_LONG, 44), + + /* no output on http error codes >= 400 */ + CURLOPT(CURLOPT_FAILONERROR, CURLOPTTYPE_LONG, 45), + + /* this is an upload */ + CURLOPT(CURLOPT_UPLOAD, CURLOPTTYPE_LONG, 46), + + /* HTTP POST method */ + CURLOPT(CURLOPT_POST, CURLOPTTYPE_LONG, 47), + + /* bare names when listing directories */ + CURLOPT(CURLOPT_DIRLISTONLY, CURLOPTTYPE_LONG, 48), + + /* Append instead of overwrite on upload! */ + CURLOPT(CURLOPT_APPEND, CURLOPTTYPE_LONG, 50), + + /* Specify whether to read the user+password from the .netrc or the URL. + * This must be one of the CURL_NETRC_* enums below. */ + CURLOPT(CURLOPT_NETRC, CURLOPTTYPE_VALUES, 51), + + /* use Location: Luke! */ + CURLOPT(CURLOPT_FOLLOWLOCATION, CURLOPTTYPE_LONG, 52), + + /* transfer data in text/ASCII format */ + CURLOPT(CURLOPT_TRANSFERTEXT, CURLOPTTYPE_LONG, 53), + + /* HTTP PUT */ + CURLOPT(CURLOPT_PUT, CURLOPTTYPE_LONG, 54), + + /* 55 = OBSOLETE */ + + /* DEPRECATED + * Function that will be called instead of the internal progress display + * function. This function should be defined as the curl_progress_callback + * prototype defines. */ + CURLOPT(CURLOPT_PROGRESSFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 56), + + /* Data passed to the CURLOPT_PROGRESSFUNCTION and CURLOPT_XFERINFOFUNCTION + callbacks */ + CURLOPT(CURLOPT_XFERINFODATA, CURLOPTTYPE_CBPOINT, 57), +#define CURLOPT_PROGRESSDATA CURLOPT_XFERINFODATA + + /* We want the referrer field set automatically when following locations */ + CURLOPT(CURLOPT_AUTOREFERER, CURLOPTTYPE_LONG, 58), + + /* Port of the proxy, can be set in the proxy string as well with: + "[host]:[port]" */ + CURLOPT(CURLOPT_PROXYPORT, CURLOPTTYPE_LONG, 59), + + /* size of the POST input data, if strlen() is not good to use */ + CURLOPT(CURLOPT_POSTFIELDSIZE, CURLOPTTYPE_LONG, 60), + + /* tunnel non-http operations through a HTTP proxy */ + CURLOPT(CURLOPT_HTTPPROXYTUNNEL, CURLOPTTYPE_LONG, 61), + + /* Set the interface string to use as outgoing network interface */ + CURLOPT(CURLOPT_INTERFACE, CURLOPTTYPE_STRINGPOINT, 62), + + /* Set the krb4/5 security level, this also enables krb4/5 awareness. This + * is a string, 'clear', 'safe', 'confidential' or 'private'. If the string + * is set but doesn't match one of these, 'private' will be used. */ + CURLOPT(CURLOPT_KRBLEVEL, CURLOPTTYPE_STRINGPOINT, 63), + + /* Set if we should verify the peer in ssl handshake, set 1 to verify. */ + CURLOPT(CURLOPT_SSL_VERIFYPEER, CURLOPTTYPE_LONG, 64), + + /* The CApath or CAfile used to validate the peer certificate + this option is used only if SSL_VERIFYPEER is true */ + CURLOPT(CURLOPT_CAINFO, CURLOPTTYPE_STRINGPOINT, 65), + + /* 66 = OBSOLETE */ + /* 67 = OBSOLETE */ + + /* Maximum number of http redirects to follow */ + CURLOPT(CURLOPT_MAXREDIRS, CURLOPTTYPE_LONG, 68), + + /* Pass a long set to 1 to get the date of the requested document (if + possible)! Pass a zero to shut it off. */ + CURLOPT(CURLOPT_FILETIME, CURLOPTTYPE_LONG, 69), + + /* This points to a linked list of telnet options */ + CURLOPT(CURLOPT_TELNETOPTIONS, CURLOPTTYPE_SLISTPOINT, 70), + + /* Max amount of cached alive connections */ + CURLOPT(CURLOPT_MAXCONNECTS, CURLOPTTYPE_LONG, 71), + + /* OBSOLETE, do not use! */ + CURLOPT(CURLOPT_OBSOLETE72, CURLOPTTYPE_LONG, 72), + + /* 73 = OBSOLETE */ + + /* Set to explicitly use a new connection for the upcoming transfer. + Do not use this unless you're absolutely sure of this, as it makes the + operation slower and is less friendly for the network. */ + CURLOPT(CURLOPT_FRESH_CONNECT, CURLOPTTYPE_LONG, 74), + + /* Set to explicitly forbid the upcoming transfer's connection to be re-used + when done. Do not use this unless you're absolutely sure of this, as it + makes the operation slower and is less friendly for the network. */ + CURLOPT(CURLOPT_FORBID_REUSE, CURLOPTTYPE_LONG, 75), + + /* Set to a file name that contains random data for libcurl to use to + seed the random engine when doing SSL connects. */ + CURLOPT(CURLOPT_RANDOM_FILE, CURLOPTTYPE_STRINGPOINT, 76), + + /* Set to the Entropy Gathering Daemon socket pathname */ + CURLOPT(CURLOPT_EGDSOCKET, CURLOPTTYPE_STRINGPOINT, 77), + + /* Time-out connect operations after this amount of seconds, if connects are + OK within this time, then fine... This only aborts the connect phase. */ + CURLOPT(CURLOPT_CONNECTTIMEOUT, CURLOPTTYPE_LONG, 78), + + /* Function that will be called to store headers (instead of fwrite). The + * parameters will use fwrite() syntax, make sure to follow them. */ + CURLOPT(CURLOPT_HEADERFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 79), + + /* Set this to force the HTTP request to get back to GET. Only really usable + if POST, PUT or a custom request have been used first. + */ + CURLOPT(CURLOPT_HTTPGET, CURLOPTTYPE_LONG, 80), + + /* Set if we should verify the Common name from the peer certificate in ssl + * handshake, set 1 to check existence, 2 to ensure that it matches the + * provided hostname. */ + CURLOPT(CURLOPT_SSL_VERIFYHOST, CURLOPTTYPE_LONG, 81), + + /* Specify which file name to write all known cookies in after completed + operation. Set file name to "-" (dash) to make it go to stdout. */ + CURLOPT(CURLOPT_COOKIEJAR, CURLOPTTYPE_STRINGPOINT, 82), + + /* Specify which SSL ciphers to use */ + CURLOPT(CURLOPT_SSL_CIPHER_LIST, CURLOPTTYPE_STRINGPOINT, 83), + + /* Specify which HTTP version to use! This must be set to one of the + CURL_HTTP_VERSION* enums set below. */ + CURLOPT(CURLOPT_HTTP_VERSION, CURLOPTTYPE_VALUES, 84), + + /* Specifically switch on or off the FTP engine's use of the EPSV command. By + default, that one will always be attempted before the more traditional + PASV command. */ + CURLOPT(CURLOPT_FTP_USE_EPSV, CURLOPTTYPE_LONG, 85), + + /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") */ + CURLOPT(CURLOPT_SSLCERTTYPE, CURLOPTTYPE_STRINGPOINT, 86), + + /* name of the file keeping your private SSL-key */ + CURLOPT(CURLOPT_SSLKEY, CURLOPTTYPE_STRINGPOINT, 87), + + /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") */ + CURLOPT(CURLOPT_SSLKEYTYPE, CURLOPTTYPE_STRINGPOINT, 88), + + /* crypto engine for the SSL-sub system */ + CURLOPT(CURLOPT_SSLENGINE, CURLOPTTYPE_STRINGPOINT, 89), + + /* set the crypto engine for the SSL-sub system as default + the param has no meaning... + */ + CURLOPT(CURLOPT_SSLENGINE_DEFAULT, CURLOPTTYPE_LONG, 90), + + /* Non-zero value means to use the global dns cache */ + /* DEPRECATED, do not use! */ + CURLOPT(CURLOPT_DNS_USE_GLOBAL_CACHE, CURLOPTTYPE_LONG, 91), + + /* DNS cache timeout */ + CURLOPT(CURLOPT_DNS_CACHE_TIMEOUT, CURLOPTTYPE_LONG, 92), + + /* send linked-list of pre-transfer QUOTE commands */ + CURLOPT(CURLOPT_PREQUOTE, CURLOPTTYPE_SLISTPOINT, 93), + + /* set the debug function */ + CURLOPT(CURLOPT_DEBUGFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 94), + + /* set the data for the debug function */ + CURLOPT(CURLOPT_DEBUGDATA, CURLOPTTYPE_CBPOINT, 95), + + /* mark this as start of a cookie session */ + CURLOPT(CURLOPT_COOKIESESSION, CURLOPTTYPE_LONG, 96), + + /* The CApath directory used to validate the peer certificate + this option is used only if SSL_VERIFYPEER is true */ + CURLOPT(CURLOPT_CAPATH, CURLOPTTYPE_STRINGPOINT, 97), + + /* Instruct libcurl to use a smaller receive buffer */ + CURLOPT(CURLOPT_BUFFERSIZE, CURLOPTTYPE_LONG, 98), + + /* Instruct libcurl to not use any signal/alarm handlers, even when using + timeouts. This option is useful for multi-threaded applications. + See libcurl-the-guide for more background information. */ + CURLOPT(CURLOPT_NOSIGNAL, CURLOPTTYPE_LONG, 99), + + /* Provide a CURLShare for mutexing non-ts data */ + CURLOPT(CURLOPT_SHARE, CURLOPTTYPE_OBJECTPOINT, 100), + + /* indicates type of proxy. accepted values are CURLPROXY_HTTP (default), + CURLPROXY_HTTPS, CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A and + CURLPROXY_SOCKS5. */ + CURLOPT(CURLOPT_PROXYTYPE, CURLOPTTYPE_VALUES, 101), + + /* Set the Accept-Encoding string. Use this to tell a server you would like + the response to be compressed. Before 7.21.6, this was known as + CURLOPT_ENCODING */ + CURLOPT(CURLOPT_ACCEPT_ENCODING, CURLOPTTYPE_STRINGPOINT, 102), + + /* Set pointer to private data */ + CURLOPT(CURLOPT_PRIVATE, CURLOPTTYPE_OBJECTPOINT, 103), + + /* Set aliases for HTTP 200 in the HTTP Response header */ + CURLOPT(CURLOPT_HTTP200ALIASES, CURLOPTTYPE_SLISTPOINT, 104), + + /* Continue to send authentication (user+password) when following locations, + even when hostname changed. This can potentially send off the name + and password to whatever host the server decides. */ + CURLOPT(CURLOPT_UNRESTRICTED_AUTH, CURLOPTTYPE_LONG, 105), + + /* Specifically switch on or off the FTP engine's use of the EPRT command ( + it also disables the LPRT attempt). By default, those ones will always be + attempted before the good old traditional PORT command. */ + CURLOPT(CURLOPT_FTP_USE_EPRT, CURLOPTTYPE_LONG, 106), + + /* Set this to a bitmask value to enable the particular authentications + methods you like. Use this in combination with CURLOPT_USERPWD. + Note that setting multiple bits may cause extra network round-trips. */ + CURLOPT(CURLOPT_HTTPAUTH, CURLOPTTYPE_VALUES, 107), + + /* Set the ssl context callback function, currently only for OpenSSL or + WolfSSL ssl_ctx, or mbedTLS mbedtls_ssl_config in the second argument. + The function must match the curl_ssl_ctx_callback prototype. */ + CURLOPT(CURLOPT_SSL_CTX_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 108), + + /* Set the userdata for the ssl context callback function's third + argument */ + CURLOPT(CURLOPT_SSL_CTX_DATA, CURLOPTTYPE_CBPOINT, 109), + + /* FTP Option that causes missing dirs to be created on the remote server. + In 7.19.4 we introduced the convenience enums for this option using the + CURLFTP_CREATE_DIR prefix. + */ + CURLOPT(CURLOPT_FTP_CREATE_MISSING_DIRS, CURLOPTTYPE_LONG, 110), + + /* Set this to a bitmask value to enable the particular authentications + methods you like. Use this in combination with CURLOPT_PROXYUSERPWD. + Note that setting multiple bits may cause extra network round-trips. */ + CURLOPT(CURLOPT_PROXYAUTH, CURLOPTTYPE_VALUES, 111), + + /* FTP option that changes the timeout, in seconds, associated with + getting a response. This is different from transfer timeout time and + essentially places a demand on the FTP server to acknowledge commands + in a timely manner. */ + CURLOPT(CURLOPT_FTP_RESPONSE_TIMEOUT, CURLOPTTYPE_LONG, 112), +#define CURLOPT_SERVER_RESPONSE_TIMEOUT CURLOPT_FTP_RESPONSE_TIMEOUT + + /* Set this option to one of the CURL_IPRESOLVE_* defines (see below) to + tell libcurl to use those IP versions only. This only has effect on + systems with support for more than one, i.e IPv4 _and_ IPv6. */ + CURLOPT(CURLOPT_IPRESOLVE, CURLOPTTYPE_VALUES, 113), + + /* Set this option to limit the size of a file that will be downloaded from + an HTTP or FTP server. + + Note there is also _LARGE version which adds large file support for + platforms which have larger off_t sizes. See MAXFILESIZE_LARGE below. */ + CURLOPT(CURLOPT_MAXFILESIZE, CURLOPTTYPE_LONG, 114), + + /* See the comment for INFILESIZE above, but in short, specifies + * the size of the file being uploaded. -1 means unknown. + */ + CURLOPT(CURLOPT_INFILESIZE_LARGE, CURLOPTTYPE_OFF_T, 115), + + /* Sets the continuation offset. There is also a CURLOPTTYPE_LONG version + * of this; look above for RESUME_FROM. + */ + CURLOPT(CURLOPT_RESUME_FROM_LARGE, CURLOPTTYPE_OFF_T, 116), + + /* Sets the maximum size of data that will be downloaded from + * an HTTP or FTP server. See MAXFILESIZE above for the LONG version. + */ + CURLOPT(CURLOPT_MAXFILESIZE_LARGE, CURLOPTTYPE_OFF_T, 117), + + /* Set this option to the file name of your .netrc file you want libcurl + to parse (using the CURLOPT_NETRC option). If not set, libcurl will do + a poor attempt to find the user's home directory and check for a .netrc + file in there. */ + CURLOPT(CURLOPT_NETRC_FILE, CURLOPTTYPE_STRINGPOINT, 118), + + /* Enable SSL/TLS for FTP, pick one of: + CURLUSESSL_TRY - try using SSL, proceed anyway otherwise + CURLUSESSL_CONTROL - SSL for the control connection or fail + CURLUSESSL_ALL - SSL for all communication or fail + */ + CURLOPT(CURLOPT_USE_SSL, CURLOPTTYPE_VALUES, 119), + + /* The _LARGE version of the standard POSTFIELDSIZE option */ + CURLOPT(CURLOPT_POSTFIELDSIZE_LARGE, CURLOPTTYPE_OFF_T, 120), + + /* Enable/disable the TCP Nagle algorithm */ + CURLOPT(CURLOPT_TCP_NODELAY, CURLOPTTYPE_LONG, 121), + + /* 122 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 123 OBSOLETE. Gone in 7.16.0 */ + /* 124 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 125 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 126 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 127 OBSOLETE. Gone in 7.16.0 */ + /* 128 OBSOLETE. Gone in 7.16.0 */ + + /* When FTP over SSL/TLS is selected (with CURLOPT_USE_SSL), this option + can be used to change libcurl's default action which is to first try + "AUTH SSL" and then "AUTH TLS" in this order, and proceed when a OK + response has been received. + + Available parameters are: + CURLFTPAUTH_DEFAULT - let libcurl decide + CURLFTPAUTH_SSL - try "AUTH SSL" first, then TLS + CURLFTPAUTH_TLS - try "AUTH TLS" first, then SSL + */ + CURLOPT(CURLOPT_FTPSSLAUTH, CURLOPTTYPE_VALUES, 129), + + CURLOPT(CURLOPT_IOCTLFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 130), + CURLOPT(CURLOPT_IOCTLDATA, CURLOPTTYPE_CBPOINT, 131), + + /* 132 OBSOLETE. Gone in 7.16.0 */ + /* 133 OBSOLETE. Gone in 7.16.0 */ + + /* null-terminated string for pass on to the FTP server when asked for + "account" info */ + CURLOPT(CURLOPT_FTP_ACCOUNT, CURLOPTTYPE_STRINGPOINT, 134), + + /* feed cookie into cookie engine */ + CURLOPT(CURLOPT_COOKIELIST, CURLOPTTYPE_STRINGPOINT, 135), + + /* ignore Content-Length */ + CURLOPT(CURLOPT_IGNORE_CONTENT_LENGTH, CURLOPTTYPE_LONG, 136), + + /* Set to non-zero to skip the IP address received in a 227 PASV FTP server + response. Typically used for FTP-SSL purposes but is not restricted to + that. libcurl will then instead use the same IP address it used for the + control connection. */ + CURLOPT(CURLOPT_FTP_SKIP_PASV_IP, CURLOPTTYPE_LONG, 137), + + /* Select "file method" to use when doing FTP, see the curl_ftpmethod + above. */ + CURLOPT(CURLOPT_FTP_FILEMETHOD, CURLOPTTYPE_VALUES, 138), + + /* Local port number to bind the socket to */ + CURLOPT(CURLOPT_LOCALPORT, CURLOPTTYPE_LONG, 139), + + /* Number of ports to try, including the first one set with LOCALPORT. + Thus, setting it to 1 will make no additional attempts but the first. + */ + CURLOPT(CURLOPT_LOCALPORTRANGE, CURLOPTTYPE_LONG, 140), + + /* no transfer, set up connection and let application use the socket by + extracting it with CURLINFO_LASTSOCKET */ + CURLOPT(CURLOPT_CONNECT_ONLY, CURLOPTTYPE_LONG, 141), + + /* Function that will be called to convert from the + network encoding (instead of using the iconv calls in libcurl) */ + CURLOPT(CURLOPT_CONV_FROM_NETWORK_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 142), + + /* Function that will be called to convert to the + network encoding (instead of using the iconv calls in libcurl) */ + CURLOPT(CURLOPT_CONV_TO_NETWORK_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 143), + + /* Function that will be called to convert from UTF8 + (instead of using the iconv calls in libcurl) + Note that this is used only for SSL certificate processing */ + CURLOPT(CURLOPT_CONV_FROM_UTF8_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 144), + + /* if the connection proceeds too quickly then need to slow it down */ + /* limit-rate: maximum number of bytes per second to send or receive */ + CURLOPT(CURLOPT_MAX_SEND_SPEED_LARGE, CURLOPTTYPE_OFF_T, 145), + CURLOPT(CURLOPT_MAX_RECV_SPEED_LARGE, CURLOPTTYPE_OFF_T, 146), + + /* Pointer to command string to send if USER/PASS fails. */ + CURLOPT(CURLOPT_FTP_ALTERNATIVE_TO_USER, CURLOPTTYPE_STRINGPOINT, 147), + + /* callback function for setting socket options */ + CURLOPT(CURLOPT_SOCKOPTFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 148), + CURLOPT(CURLOPT_SOCKOPTDATA, CURLOPTTYPE_CBPOINT, 149), + + /* set to 0 to disable session ID re-use for this transfer, default is + enabled (== 1) */ + CURLOPT(CURLOPT_SSL_SESSIONID_CACHE, CURLOPTTYPE_LONG, 150), + + /* allowed SSH authentication methods */ + CURLOPT(CURLOPT_SSH_AUTH_TYPES, CURLOPTTYPE_VALUES, 151), + + /* Used by scp/sftp to do public/private key authentication */ + CURLOPT(CURLOPT_SSH_PUBLIC_KEYFILE, CURLOPTTYPE_STRINGPOINT, 152), + CURLOPT(CURLOPT_SSH_PRIVATE_KEYFILE, CURLOPTTYPE_STRINGPOINT, 153), + + /* Send CCC (Clear Command Channel) after authentication */ + CURLOPT(CURLOPT_FTP_SSL_CCC, CURLOPTTYPE_LONG, 154), + + /* Same as TIMEOUT and CONNECTTIMEOUT, but with ms resolution */ + CURLOPT(CURLOPT_TIMEOUT_MS, CURLOPTTYPE_LONG, 155), + CURLOPT(CURLOPT_CONNECTTIMEOUT_MS, CURLOPTTYPE_LONG, 156), + + /* set to zero to disable the libcurl's decoding and thus pass the raw body + data to the application even when it is encoded/compressed */ + CURLOPT(CURLOPT_HTTP_TRANSFER_DECODING, CURLOPTTYPE_LONG, 157), + CURLOPT(CURLOPT_HTTP_CONTENT_DECODING, CURLOPTTYPE_LONG, 158), + + /* Permission used when creating new files and directories on the remote + server for protocols that support it, SFTP/SCP/FILE */ + CURLOPT(CURLOPT_NEW_FILE_PERMS, CURLOPTTYPE_LONG, 159), + CURLOPT(CURLOPT_NEW_DIRECTORY_PERMS, CURLOPTTYPE_LONG, 160), + + /* Set the behavior of POST when redirecting. Values must be set to one + of CURL_REDIR* defines below. This used to be called CURLOPT_POST301 */ + CURLOPT(CURLOPT_POSTREDIR, CURLOPTTYPE_VALUES, 161), + + /* used by scp/sftp to verify the host's public key */ + CURLOPT(CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, CURLOPTTYPE_STRINGPOINT, 162), + + /* Callback function for opening socket (instead of socket(2)). Optionally, + callback is able change the address or refuse to connect returning + CURL_SOCKET_BAD. The callback should have type + curl_opensocket_callback */ + CURLOPT(CURLOPT_OPENSOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 163), + CURLOPT(CURLOPT_OPENSOCKETDATA, CURLOPTTYPE_CBPOINT, 164), + + /* POST volatile input fields. */ + CURLOPT(CURLOPT_COPYPOSTFIELDS, CURLOPTTYPE_OBJECTPOINT, 165), + + /* set transfer mode (;type=) when doing FTP via an HTTP proxy */ + CURLOPT(CURLOPT_PROXY_TRANSFER_MODE, CURLOPTTYPE_LONG, 166), + + /* Callback function for seeking in the input stream */ + CURLOPT(CURLOPT_SEEKFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 167), + CURLOPT(CURLOPT_SEEKDATA, CURLOPTTYPE_CBPOINT, 168), + + /* CRL file */ + CURLOPT(CURLOPT_CRLFILE, CURLOPTTYPE_STRINGPOINT, 169), + + /* Issuer certificate */ + CURLOPT(CURLOPT_ISSUERCERT, CURLOPTTYPE_STRINGPOINT, 170), + + /* (IPv6) Address scope */ + CURLOPT(CURLOPT_ADDRESS_SCOPE, CURLOPTTYPE_LONG, 171), + + /* Collect certificate chain info and allow it to get retrievable with + CURLINFO_CERTINFO after the transfer is complete. */ + CURLOPT(CURLOPT_CERTINFO, CURLOPTTYPE_LONG, 172), + + /* "name" and "pwd" to use when fetching. */ + CURLOPT(CURLOPT_USERNAME, CURLOPTTYPE_STRINGPOINT, 173), + CURLOPT(CURLOPT_PASSWORD, CURLOPTTYPE_STRINGPOINT, 174), + + /* "name" and "pwd" to use with Proxy when fetching. */ + CURLOPT(CURLOPT_PROXYUSERNAME, CURLOPTTYPE_STRINGPOINT, 175), + CURLOPT(CURLOPT_PROXYPASSWORD, CURLOPTTYPE_STRINGPOINT, 176), + + /* Comma separated list of hostnames defining no-proxy zones. These should + match both hostnames directly, and hostnames within a domain. For + example, local.com will match local.com and www.local.com, but NOT + notlocal.com or www.notlocal.com. For compatibility with other + implementations of this, .local.com will be considered to be the same as + local.com. A single * is the only valid wildcard, and effectively + disables the use of proxy. */ + CURLOPT(CURLOPT_NOPROXY, CURLOPTTYPE_STRINGPOINT, 177), + + /* block size for TFTP transfers */ + CURLOPT(CURLOPT_TFTP_BLKSIZE, CURLOPTTYPE_LONG, 178), + + /* Socks Service */ + /* DEPRECATED, do not use! */ + CURLOPT(CURLOPT_SOCKS5_GSSAPI_SERVICE, CURLOPTTYPE_STRINGPOINT, 179), + + /* Socks Service */ + CURLOPT(CURLOPT_SOCKS5_GSSAPI_NEC, CURLOPTTYPE_LONG, 180), + + /* set the bitmask for the protocols that are allowed to be used for the + transfer, which thus helps the app which takes URLs from users or other + external inputs and want to restrict what protocol(s) to deal + with. Defaults to CURLPROTO_ALL. */ + CURLOPT(CURLOPT_PROTOCOLS, CURLOPTTYPE_LONG, 181), + + /* set the bitmask for the protocols that libcurl is allowed to follow to, + as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs + to be set in both bitmasks to be allowed to get redirected to. */ + CURLOPT(CURLOPT_REDIR_PROTOCOLS, CURLOPTTYPE_LONG, 182), + + /* set the SSH knownhost file name to use */ + CURLOPT(CURLOPT_SSH_KNOWNHOSTS, CURLOPTTYPE_STRINGPOINT, 183), + + /* set the SSH host key callback, must point to a curl_sshkeycallback + function */ + CURLOPT(CURLOPT_SSH_KEYFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 184), + + /* set the SSH host key callback custom pointer */ + CURLOPT(CURLOPT_SSH_KEYDATA, CURLOPTTYPE_CBPOINT, 185), + + /* set the SMTP mail originator */ + CURLOPT(CURLOPT_MAIL_FROM, CURLOPTTYPE_STRINGPOINT, 186), + + /* set the list of SMTP mail receiver(s) */ + CURLOPT(CURLOPT_MAIL_RCPT, CURLOPTTYPE_SLISTPOINT, 187), + + /* FTP: send PRET before PASV */ + CURLOPT(CURLOPT_FTP_USE_PRET, CURLOPTTYPE_LONG, 188), + + /* RTSP request method (OPTIONS, SETUP, PLAY, etc...) */ + CURLOPT(CURLOPT_RTSP_REQUEST, CURLOPTTYPE_VALUES, 189), + + /* The RTSP session identifier */ + CURLOPT(CURLOPT_RTSP_SESSION_ID, CURLOPTTYPE_STRINGPOINT, 190), + + /* The RTSP stream URI */ + CURLOPT(CURLOPT_RTSP_STREAM_URI, CURLOPTTYPE_STRINGPOINT, 191), + + /* The Transport: header to use in RTSP requests */ + CURLOPT(CURLOPT_RTSP_TRANSPORT, CURLOPTTYPE_STRINGPOINT, 192), + + /* Manually initialize the client RTSP CSeq for this handle */ + CURLOPT(CURLOPT_RTSP_CLIENT_CSEQ, CURLOPTTYPE_LONG, 193), + + /* Manually initialize the server RTSP CSeq for this handle */ + CURLOPT(CURLOPT_RTSP_SERVER_CSEQ, CURLOPTTYPE_LONG, 194), + + /* The stream to pass to INTERLEAVEFUNCTION. */ + CURLOPT(CURLOPT_INTERLEAVEDATA, CURLOPTTYPE_CBPOINT, 195), + + /* Let the application define a custom write method for RTP data */ + CURLOPT(CURLOPT_INTERLEAVEFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 196), + + /* Turn on wildcard matching */ + CURLOPT(CURLOPT_WILDCARDMATCH, CURLOPTTYPE_LONG, 197), + + /* Directory matching callback called before downloading of an + individual file (chunk) started */ + CURLOPT(CURLOPT_CHUNK_BGN_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 198), + + /* Directory matching callback called after the file (chunk) + was downloaded, or skipped */ + CURLOPT(CURLOPT_CHUNK_END_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 199), + + /* Change match (fnmatch-like) callback for wildcard matching */ + CURLOPT(CURLOPT_FNMATCH_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 200), + + /* Let the application define custom chunk data pointer */ + CURLOPT(CURLOPT_CHUNK_DATA, CURLOPTTYPE_CBPOINT, 201), + + /* FNMATCH_FUNCTION user pointer */ + CURLOPT(CURLOPT_FNMATCH_DATA, CURLOPTTYPE_CBPOINT, 202), + + /* send linked-list of name:port:address sets */ + CURLOPT(CURLOPT_RESOLVE, CURLOPTTYPE_SLISTPOINT, 203), + + /* Set a username for authenticated TLS */ + CURLOPT(CURLOPT_TLSAUTH_USERNAME, CURLOPTTYPE_STRINGPOINT, 204), + + /* Set a password for authenticated TLS */ + CURLOPT(CURLOPT_TLSAUTH_PASSWORD, CURLOPTTYPE_STRINGPOINT, 205), + + /* Set authentication type for authenticated TLS */ + CURLOPT(CURLOPT_TLSAUTH_TYPE, CURLOPTTYPE_STRINGPOINT, 206), + + /* Set to 1 to enable the "TE:" header in HTTP requests to ask for + compressed transfer-encoded responses. Set to 0 to disable the use of TE: + in outgoing requests. The current default is 0, but it might change in a + future libcurl release. + + libcurl will ask for the compressed methods it knows of, and if that + isn't any, it will not ask for transfer-encoding at all even if this + option is set to 1. + + */ + CURLOPT(CURLOPT_TRANSFER_ENCODING, CURLOPTTYPE_LONG, 207), + + /* Callback function for closing socket (instead of close(2)). The callback + should have type curl_closesocket_callback */ + CURLOPT(CURLOPT_CLOSESOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 208), + CURLOPT(CURLOPT_CLOSESOCKETDATA, CURLOPTTYPE_CBPOINT, 209), + + /* allow GSSAPI credential delegation */ + CURLOPT(CURLOPT_GSSAPI_DELEGATION, CURLOPTTYPE_VALUES, 210), + + /* Set the name servers to use for DNS resolution */ + CURLOPT(CURLOPT_DNS_SERVERS, CURLOPTTYPE_STRINGPOINT, 211), + + /* Time-out accept operations (currently for FTP only) after this amount + of milliseconds. */ + CURLOPT(CURLOPT_ACCEPTTIMEOUT_MS, CURLOPTTYPE_LONG, 212), + + /* Set TCP keepalive */ + CURLOPT(CURLOPT_TCP_KEEPALIVE, CURLOPTTYPE_LONG, 213), + + /* non-universal keepalive knobs (Linux, AIX, HP-UX, more) */ + CURLOPT(CURLOPT_TCP_KEEPIDLE, CURLOPTTYPE_LONG, 214), + CURLOPT(CURLOPT_TCP_KEEPINTVL, CURLOPTTYPE_LONG, 215), + + /* Enable/disable specific SSL features with a bitmask, see CURLSSLOPT_* */ + CURLOPT(CURLOPT_SSL_OPTIONS, CURLOPTTYPE_VALUES, 216), + + /* Set the SMTP auth originator */ + CURLOPT(CURLOPT_MAIL_AUTH, CURLOPTTYPE_STRINGPOINT, 217), + + /* Enable/disable SASL initial response */ + CURLOPT(CURLOPT_SASL_IR, CURLOPTTYPE_LONG, 218), + + /* Function that will be called instead of the internal progress display + * function. This function should be defined as the curl_xferinfo_callback + * prototype defines. (Deprecates CURLOPT_PROGRESSFUNCTION) */ + CURLOPT(CURLOPT_XFERINFOFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 219), + + /* The XOAUTH2 bearer token */ + CURLOPT(CURLOPT_XOAUTH2_BEARER, CURLOPTTYPE_STRINGPOINT, 220), + + /* Set the interface string to use as outgoing network + * interface for DNS requests. + * Only supported by the c-ares DNS backend */ + CURLOPT(CURLOPT_DNS_INTERFACE, CURLOPTTYPE_STRINGPOINT, 221), + + /* Set the local IPv4 address to use for outgoing DNS requests. + * Only supported by the c-ares DNS backend */ + CURLOPT(CURLOPT_DNS_LOCAL_IP4, CURLOPTTYPE_STRINGPOINT, 222), + + /* Set the local IPv6 address to use for outgoing DNS requests. + * Only supported by the c-ares DNS backend */ + CURLOPT(CURLOPT_DNS_LOCAL_IP6, CURLOPTTYPE_STRINGPOINT, 223), + + /* Set authentication options directly */ + CURLOPT(CURLOPT_LOGIN_OPTIONS, CURLOPTTYPE_STRINGPOINT, 224), + + /* Enable/disable TLS NPN extension (http2 over ssl might fail without) */ + CURLOPT(CURLOPT_SSL_ENABLE_NPN, CURLOPTTYPE_LONG, 225), + + /* Enable/disable TLS ALPN extension (http2 over ssl might fail without) */ + CURLOPT(CURLOPT_SSL_ENABLE_ALPN, CURLOPTTYPE_LONG, 226), + + /* Time to wait for a response to a HTTP request containing an + * Expect: 100-continue header before sending the data anyway. */ + CURLOPT(CURLOPT_EXPECT_100_TIMEOUT_MS, CURLOPTTYPE_LONG, 227), + + /* This points to a linked list of headers used for proxy requests only, + struct curl_slist kind */ + CURLOPT(CURLOPT_PROXYHEADER, CURLOPTTYPE_SLISTPOINT, 228), + + /* Pass in a bitmask of "header options" */ + CURLOPT(CURLOPT_HEADEROPT, CURLOPTTYPE_VALUES, 229), + + /* The public key in DER form used to validate the peer public key + this option is used only if SSL_VERIFYPEER is true */ + CURLOPT(CURLOPT_PINNEDPUBLICKEY, CURLOPTTYPE_STRINGPOINT, 230), + + /* Path to Unix domain socket */ + CURLOPT(CURLOPT_UNIX_SOCKET_PATH, CURLOPTTYPE_STRINGPOINT, 231), + + /* Set if we should verify the certificate status. */ + CURLOPT(CURLOPT_SSL_VERIFYSTATUS, CURLOPTTYPE_LONG, 232), + + /* Set if we should enable TLS false start. */ + CURLOPT(CURLOPT_SSL_FALSESTART, CURLOPTTYPE_LONG, 233), + + /* Do not squash dot-dot sequences */ + CURLOPT(CURLOPT_PATH_AS_IS, CURLOPTTYPE_LONG, 234), + + /* Proxy Service Name */ + CURLOPT(CURLOPT_PROXY_SERVICE_NAME, CURLOPTTYPE_STRINGPOINT, 235), + + /* Service Name */ + CURLOPT(CURLOPT_SERVICE_NAME, CURLOPTTYPE_STRINGPOINT, 236), + + /* Wait/don't wait for pipe/mutex to clarify */ + CURLOPT(CURLOPT_PIPEWAIT, CURLOPTTYPE_LONG, 237), + + /* Set the protocol used when curl is given a URL without a protocol */ + CURLOPT(CURLOPT_DEFAULT_PROTOCOL, CURLOPTTYPE_STRINGPOINT, 238), + + /* Set stream weight, 1 - 256 (default is 16) */ + CURLOPT(CURLOPT_STREAM_WEIGHT, CURLOPTTYPE_LONG, 239), + + /* Set stream dependency on another CURL handle */ + CURLOPT(CURLOPT_STREAM_DEPENDS, CURLOPTTYPE_OBJECTPOINT, 240), + + /* Set E-xclusive stream dependency on another CURL handle */ + CURLOPT(CURLOPT_STREAM_DEPENDS_E, CURLOPTTYPE_OBJECTPOINT, 241), + + /* Do not send any tftp option requests to the server */ + CURLOPT(CURLOPT_TFTP_NO_OPTIONS, CURLOPTTYPE_LONG, 242), + + /* Linked-list of host:port:connect-to-host:connect-to-port, + overrides the URL's host:port (only for the network layer) */ + CURLOPT(CURLOPT_CONNECT_TO, CURLOPTTYPE_SLISTPOINT, 243), + + /* Set TCP Fast Open */ + CURLOPT(CURLOPT_TCP_FASTOPEN, CURLOPTTYPE_LONG, 244), + + /* Continue to send data if the server responds early with an + * HTTP status code >= 300 */ + CURLOPT(CURLOPT_KEEP_SENDING_ON_ERROR, CURLOPTTYPE_LONG, 245), + + /* The CApath or CAfile used to validate the proxy certificate + this option is used only if PROXY_SSL_VERIFYPEER is true */ + CURLOPT(CURLOPT_PROXY_CAINFO, CURLOPTTYPE_STRINGPOINT, 246), + + /* The CApath directory used to validate the proxy certificate + this option is used only if PROXY_SSL_VERIFYPEER is true */ + CURLOPT(CURLOPT_PROXY_CAPATH, CURLOPTTYPE_STRINGPOINT, 247), + + /* Set if we should verify the proxy in ssl handshake, + set 1 to verify. */ + CURLOPT(CURLOPT_PROXY_SSL_VERIFYPEER, CURLOPTTYPE_LONG, 248), + + /* Set if we should verify the Common name from the proxy certificate in ssl + * handshake, set 1 to check existence, 2 to ensure that it matches + * the provided hostname. */ + CURLOPT(CURLOPT_PROXY_SSL_VERIFYHOST, CURLOPTTYPE_LONG, 249), + + /* What version to specifically try to use for proxy. + See CURL_SSLVERSION defines below. */ + CURLOPT(CURLOPT_PROXY_SSLVERSION, CURLOPTTYPE_VALUES, 250), + + /* Set a username for authenticated TLS for proxy */ + CURLOPT(CURLOPT_PROXY_TLSAUTH_USERNAME, CURLOPTTYPE_STRINGPOINT, 251), + + /* Set a password for authenticated TLS for proxy */ + CURLOPT(CURLOPT_PROXY_TLSAUTH_PASSWORD, CURLOPTTYPE_STRINGPOINT, 252), + + /* Set authentication type for authenticated TLS for proxy */ + CURLOPT(CURLOPT_PROXY_TLSAUTH_TYPE, CURLOPTTYPE_STRINGPOINT, 253), + + /* name of the file keeping your private SSL-certificate for proxy */ + CURLOPT(CURLOPT_PROXY_SSLCERT, CURLOPTTYPE_STRINGPOINT, 254), + + /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") for + proxy */ + CURLOPT(CURLOPT_PROXY_SSLCERTTYPE, CURLOPTTYPE_STRINGPOINT, 255), + + /* name of the file keeping your private SSL-key for proxy */ + CURLOPT(CURLOPT_PROXY_SSLKEY, CURLOPTTYPE_STRINGPOINT, 256), + + /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") for + proxy */ + CURLOPT(CURLOPT_PROXY_SSLKEYTYPE, CURLOPTTYPE_STRINGPOINT, 257), + + /* password for the SSL private key for proxy */ + CURLOPT(CURLOPT_PROXY_KEYPASSWD, CURLOPTTYPE_STRINGPOINT, 258), + + /* Specify which SSL ciphers to use for proxy */ + CURLOPT(CURLOPT_PROXY_SSL_CIPHER_LIST, CURLOPTTYPE_STRINGPOINT, 259), + + /* CRL file for proxy */ + CURLOPT(CURLOPT_PROXY_CRLFILE, CURLOPTTYPE_STRINGPOINT, 260), + + /* Enable/disable specific SSL features with a bitmask for proxy, see + CURLSSLOPT_* */ + CURLOPT(CURLOPT_PROXY_SSL_OPTIONS, CURLOPTTYPE_LONG, 261), + + /* Name of pre proxy to use. */ + CURLOPT(CURLOPT_PRE_PROXY, CURLOPTTYPE_STRINGPOINT, 262), + + /* The public key in DER form used to validate the proxy public key + this option is used only if PROXY_SSL_VERIFYPEER is true */ + CURLOPT(CURLOPT_PROXY_PINNEDPUBLICKEY, CURLOPTTYPE_STRINGPOINT, 263), + + /* Path to an abstract Unix domain socket */ + CURLOPT(CURLOPT_ABSTRACT_UNIX_SOCKET, CURLOPTTYPE_STRINGPOINT, 264), + + /* Suppress proxy CONNECT response headers from user callbacks */ + CURLOPT(CURLOPT_SUPPRESS_CONNECT_HEADERS, CURLOPTTYPE_LONG, 265), + + /* The request target, instead of extracted from the URL */ + CURLOPT(CURLOPT_REQUEST_TARGET, CURLOPTTYPE_STRINGPOINT, 266), + + /* bitmask of allowed auth methods for connections to SOCKS5 proxies */ + CURLOPT(CURLOPT_SOCKS5_AUTH, CURLOPTTYPE_LONG, 267), + + /* Enable/disable SSH compression */ + CURLOPT(CURLOPT_SSH_COMPRESSION, CURLOPTTYPE_LONG, 268), + + /* Post MIME data. */ + CURLOPT(CURLOPT_MIMEPOST, CURLOPTTYPE_OBJECTPOINT, 269), + + /* Time to use with the CURLOPT_TIMECONDITION. Specified in number of + seconds since 1 Jan 1970. */ + CURLOPT(CURLOPT_TIMEVALUE_LARGE, CURLOPTTYPE_OFF_T, 270), + + /* Head start in milliseconds to give happy eyeballs. */ + CURLOPT(CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS, CURLOPTTYPE_LONG, 271), + + /* Function that will be called before a resolver request is made */ + CURLOPT(CURLOPT_RESOLVER_START_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 272), + + /* User data to pass to the resolver start callback. */ + CURLOPT(CURLOPT_RESOLVER_START_DATA, CURLOPTTYPE_CBPOINT, 273), + + /* send HAProxy PROXY protocol header? */ + CURLOPT(CURLOPT_HAPROXYPROTOCOL, CURLOPTTYPE_LONG, 274), + + /* shuffle addresses before use when DNS returns multiple */ + CURLOPT(CURLOPT_DNS_SHUFFLE_ADDRESSES, CURLOPTTYPE_LONG, 275), + + /* Specify which TLS 1.3 ciphers suites to use */ + CURLOPT(CURLOPT_TLS13_CIPHERS, CURLOPTTYPE_STRINGPOINT, 276), + CURLOPT(CURLOPT_PROXY_TLS13_CIPHERS, CURLOPTTYPE_STRINGPOINT, 277), + + /* Disallow specifying username/login in URL. */ + CURLOPT(CURLOPT_DISALLOW_USERNAME_IN_URL, CURLOPTTYPE_LONG, 278), + + /* DNS-over-HTTPS URL */ + CURLOPT(CURLOPT_DOH_URL, CURLOPTTYPE_STRINGPOINT, 279), + + /* Preferred buffer size to use for uploads */ + CURLOPT(CURLOPT_UPLOAD_BUFFERSIZE, CURLOPTTYPE_LONG, 280), + + /* Time in ms between connection upkeep calls for long-lived connections. */ + CURLOPT(CURLOPT_UPKEEP_INTERVAL_MS, CURLOPTTYPE_LONG, 281), + + /* Specify URL using CURL URL API. */ + CURLOPT(CURLOPT_CURLU, CURLOPTTYPE_OBJECTPOINT, 282), + + /* add trailing data just after no more data is available */ + CURLOPT(CURLOPT_TRAILERFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 283), + + /* pointer to be passed to HTTP_TRAILER_FUNCTION */ + CURLOPT(CURLOPT_TRAILERDATA, CURLOPTTYPE_CBPOINT, 284), + + /* set this to 1L to allow HTTP/0.9 responses or 0L to disallow */ + CURLOPT(CURLOPT_HTTP09_ALLOWED, CURLOPTTYPE_LONG, 285), + + /* alt-svc control bitmask */ + CURLOPT(CURLOPT_ALTSVC_CTRL, CURLOPTTYPE_LONG, 286), + + /* alt-svc cache file name to possibly read from/write to */ + CURLOPT(CURLOPT_ALTSVC, CURLOPTTYPE_STRINGPOINT, 287), + + /* maximum age of a connection to consider it for reuse (in seconds) */ + CURLOPT(CURLOPT_MAXAGE_CONN, CURLOPTTYPE_LONG, 288), + + /* SASL authorisation identity */ + CURLOPT(CURLOPT_SASL_AUTHZID, CURLOPTTYPE_STRINGPOINT, 289), + + /* allow RCPT TO command to fail for some recipients */ + CURLOPT(CURLOPT_MAIL_RCPT_ALLLOWFAILS, CURLOPTTYPE_LONG, 290), + + /* the private SSL-certificate as a "blob" */ + CURLOPT(CURLOPT_SSLCERT_BLOB, CURLOPTTYPE_BLOB, 291), + CURLOPT(CURLOPT_SSLKEY_BLOB, CURLOPTTYPE_BLOB, 292), + CURLOPT(CURLOPT_PROXY_SSLCERT_BLOB, CURLOPTTYPE_BLOB, 293), + CURLOPT(CURLOPT_PROXY_SSLKEY_BLOB, CURLOPTTYPE_BLOB, 294), + CURLOPT(CURLOPT_ISSUERCERT_BLOB, CURLOPTTYPE_BLOB, 295), + + /* Issuer certificate for proxy */ + CURLOPT(CURLOPT_PROXY_ISSUERCERT, CURLOPTTYPE_STRINGPOINT, 296), + CURLOPT(CURLOPT_PROXY_ISSUERCERT_BLOB, CURLOPTTYPE_BLOB, 297), + + /* the EC curves requested by the TLS client (RFC 8422, 5.1); + * OpenSSL support via 'set_groups'/'set_curves': + * https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set1_groups.html + */ + CURLOPT(CURLOPT_SSL_EC_CURVES, CURLOPTTYPE_STRINGPOINT, 298), + + /* HSTS bitmask */ + CURLOPT(CURLOPT_HSTS_CTRL, CURLOPTTYPE_LONG, 299), + /* HSTS file name */ + CURLOPT(CURLOPT_HSTS, CURLOPTTYPE_STRINGPOINT, 300), + + /* HSTS read callback */ + CURLOPT(CURLOPT_HSTSREADFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 301), + CURLOPT(CURLOPT_HSTSREADDATA, CURLOPTTYPE_CBPOINT, 302), + + /* HSTS write callback */ + CURLOPT(CURLOPT_HSTSWRITEFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 303), + CURLOPT(CURLOPT_HSTSWRITEDATA, CURLOPTTYPE_CBPOINT, 304), + + /* Parameters for V4 signature */ + CURLOPT(CURLOPT_AWS_SIGV4, CURLOPTTYPE_STRINGPOINT, 305), + + /* Same as CURLOPT_SSL_VERIFYPEER but for DoH (DNS-over-HTTPS) servers. */ + CURLOPT(CURLOPT_DOH_SSL_VERIFYPEER, CURLOPTTYPE_LONG, 306), + + /* Same as CURLOPT_SSL_VERIFYHOST but for DoH (DNS-over-HTTPS) servers. */ + CURLOPT(CURLOPT_DOH_SSL_VERIFYHOST, CURLOPTTYPE_LONG, 307), + + /* Same as CURLOPT_SSL_VERIFYSTATUS but for DoH (DNS-over-HTTPS) servers. */ + CURLOPT(CURLOPT_DOH_SSL_VERIFYSTATUS, CURLOPTTYPE_LONG, 308), + + /* The CA certificates as "blob" used to validate the peer certificate + this option is used only if SSL_VERIFYPEER is true */ + CURLOPT(CURLOPT_CAINFO_BLOB, CURLOPTTYPE_BLOB, 309), + + /* The CA certificates as "blob" used to validate the proxy certificate + this option is used only if PROXY_SSL_VERIFYPEER is true */ + CURLOPT(CURLOPT_PROXY_CAINFO_BLOB, CURLOPTTYPE_BLOB, 310), + + CURLOPT_LASTENTRY /* the last unused */ +} CURLoption; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Backwards compatibility with older names */ +/* These are scheduled to disappear by 2011 */ + +/* This was added in version 7.19.1 */ +#define CURLOPT_POST301 CURLOPT_POSTREDIR + +/* These are scheduled to disappear by 2009 */ + +/* The following were added in 7.17.0 */ +#define CURLOPT_SSLKEYPASSWD CURLOPT_KEYPASSWD +#define CURLOPT_FTPAPPEND CURLOPT_APPEND +#define CURLOPT_FTPLISTONLY CURLOPT_DIRLISTONLY +#define CURLOPT_FTP_SSL CURLOPT_USE_SSL + +/* The following were added earlier */ + +#define CURLOPT_SSLCERTPASSWD CURLOPT_KEYPASSWD +#define CURLOPT_KRB4LEVEL CURLOPT_KRBLEVEL + +#else +/* This is set if CURL_NO_OLDIES is defined at compile-time */ +#undef CURLOPT_DNS_USE_GLOBAL_CACHE /* soon obsolete */ +#endif + + + /* Below here follows defines for the CURLOPT_IPRESOLVE option. If a host + name resolves addresses using more than one IP protocol version, this + option might be handy to force libcurl to use a specific IP version. */ +#define CURL_IPRESOLVE_WHATEVER 0 /* default, uses addresses to all IP + versions that your system allows */ +#define CURL_IPRESOLVE_V4 1 /* uses only IPv4 addresses/connections */ +#define CURL_IPRESOLVE_V6 2 /* uses only IPv6 addresses/connections */ + + /* three convenient "aliases" that follow the name scheme better */ +#define CURLOPT_RTSPHEADER CURLOPT_HTTPHEADER + + /* These enums are for use with the CURLOPT_HTTP_VERSION option. */ +enum { + CURL_HTTP_VERSION_NONE, /* setting this means we don't care, and that we'd + like the library to choose the best possible + for us! */ + CURL_HTTP_VERSION_1_0, /* please use HTTP 1.0 in the request */ + CURL_HTTP_VERSION_1_1, /* please use HTTP 1.1 in the request */ + CURL_HTTP_VERSION_2_0, /* please use HTTP 2 in the request */ + CURL_HTTP_VERSION_2TLS, /* use version 2 for HTTPS, version 1.1 for HTTP */ + CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE, /* please use HTTP 2 without HTTP/1.1 + Upgrade */ + CURL_HTTP_VERSION_3 = 30, /* Makes use of explicit HTTP/3 without fallback. + Use CURLOPT_ALTSVC to enable HTTP/3 upgrade */ + CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */ +}; + +/* Convenience definition simple because the name of the version is HTTP/2 and + not 2.0. The 2_0 version of the enum name was set while the version was + still planned to be 2.0 and we stick to it for compatibility. */ +#define CURL_HTTP_VERSION_2 CURL_HTTP_VERSION_2_0 + +/* + * Public API enums for RTSP requests + */ +enum { + CURL_RTSPREQ_NONE, /* first in list */ + CURL_RTSPREQ_OPTIONS, + CURL_RTSPREQ_DESCRIBE, + CURL_RTSPREQ_ANNOUNCE, + CURL_RTSPREQ_SETUP, + CURL_RTSPREQ_PLAY, + CURL_RTSPREQ_PAUSE, + CURL_RTSPREQ_TEARDOWN, + CURL_RTSPREQ_GET_PARAMETER, + CURL_RTSPREQ_SET_PARAMETER, + CURL_RTSPREQ_RECORD, + CURL_RTSPREQ_RECEIVE, + CURL_RTSPREQ_LAST /* last in list */ +}; + + /* These enums are for use with the CURLOPT_NETRC option. */ +enum CURL_NETRC_OPTION { + CURL_NETRC_IGNORED, /* The .netrc will never be read. + * This is the default. */ + CURL_NETRC_OPTIONAL, /* A user:password in the URL will be preferred + * to one in the .netrc. */ + CURL_NETRC_REQUIRED, /* A user:password in the URL will be ignored. + * Unless one is set programmatically, the .netrc + * will be queried. */ + CURL_NETRC_LAST +}; + +enum { + CURL_SSLVERSION_DEFAULT, + CURL_SSLVERSION_TLSv1, /* TLS 1.x */ + CURL_SSLVERSION_SSLv2, + CURL_SSLVERSION_SSLv3, + CURL_SSLVERSION_TLSv1_0, + CURL_SSLVERSION_TLSv1_1, + CURL_SSLVERSION_TLSv1_2, + CURL_SSLVERSION_TLSv1_3, + + CURL_SSLVERSION_LAST /* never use, keep last */ +}; + +enum { + CURL_SSLVERSION_MAX_NONE = 0, + CURL_SSLVERSION_MAX_DEFAULT = (CURL_SSLVERSION_TLSv1 << 16), + CURL_SSLVERSION_MAX_TLSv1_0 = (CURL_SSLVERSION_TLSv1_0 << 16), + CURL_SSLVERSION_MAX_TLSv1_1 = (CURL_SSLVERSION_TLSv1_1 << 16), + CURL_SSLVERSION_MAX_TLSv1_2 = (CURL_SSLVERSION_TLSv1_2 << 16), + CURL_SSLVERSION_MAX_TLSv1_3 = (CURL_SSLVERSION_TLSv1_3 << 16), + + /* never use, keep last */ + CURL_SSLVERSION_MAX_LAST = (CURL_SSLVERSION_LAST << 16) +}; + +enum CURL_TLSAUTH { + CURL_TLSAUTH_NONE, + CURL_TLSAUTH_SRP, + CURL_TLSAUTH_LAST /* never use, keep last */ +}; + +/* symbols to use with CURLOPT_POSTREDIR. + CURL_REDIR_POST_301, CURL_REDIR_POST_302 and CURL_REDIR_POST_303 + can be bitwise ORed so that CURL_REDIR_POST_301 | CURL_REDIR_POST_302 + | CURL_REDIR_POST_303 == CURL_REDIR_POST_ALL */ + +#define CURL_REDIR_GET_ALL 0 +#define CURL_REDIR_POST_301 1 +#define CURL_REDIR_POST_302 2 +#define CURL_REDIR_POST_303 4 +#define CURL_REDIR_POST_ALL \ + (CURL_REDIR_POST_301|CURL_REDIR_POST_302|CURL_REDIR_POST_303) + +typedef enum { + CURL_TIMECOND_NONE, + + CURL_TIMECOND_IFMODSINCE, + CURL_TIMECOND_IFUNMODSINCE, + CURL_TIMECOND_LASTMOD, + + CURL_TIMECOND_LAST +} curl_TimeCond; + +/* Special size_t value signaling a null-terminated string. */ +#define CURL_ZERO_TERMINATED ((size_t) -1) + +/* curl_strequal() and curl_strnequal() are subject for removal in a future + release */ +CURL_EXTERN int curl_strequal(const char *s1, const char *s2); +CURL_EXTERN int curl_strnequal(const char *s1, const char *s2, size_t n); + +/* Mime/form handling support. */ +typedef struct curl_mime curl_mime; /* Mime context. */ +typedef struct curl_mimepart curl_mimepart; /* Mime part context. */ + +/* + * NAME curl_mime_init() + * + * DESCRIPTION + * + * Create a mime context and return its handle. The easy parameter is the + * target handle. + */ +CURL_EXTERN curl_mime *curl_mime_init(CURL *easy); + +/* + * NAME curl_mime_free() + * + * DESCRIPTION + * + * release a mime handle and its substructures. + */ +CURL_EXTERN void curl_mime_free(curl_mime *mime); + +/* + * NAME curl_mime_addpart() + * + * DESCRIPTION + * + * Append a new empty part to the given mime context and return a handle to + * the created part. + */ +CURL_EXTERN curl_mimepart *curl_mime_addpart(curl_mime *mime); + +/* + * NAME curl_mime_name() + * + * DESCRIPTION + * + * Set mime/form part name. + */ +CURL_EXTERN CURLcode curl_mime_name(curl_mimepart *part, const char *name); + +/* + * NAME curl_mime_filename() + * + * DESCRIPTION + * + * Set mime part remote file name. + */ +CURL_EXTERN CURLcode curl_mime_filename(curl_mimepart *part, + const char *filename); + +/* + * NAME curl_mime_type() + * + * DESCRIPTION + * + * Set mime part type. + */ +CURL_EXTERN CURLcode curl_mime_type(curl_mimepart *part, const char *mimetype); + +/* + * NAME curl_mime_encoder() + * + * DESCRIPTION + * + * Set mime data transfer encoder. + */ +CURL_EXTERN CURLcode curl_mime_encoder(curl_mimepart *part, + const char *encoding); + +/* + * NAME curl_mime_data() + * + * DESCRIPTION + * + * Set mime part data source from memory data, + */ +CURL_EXTERN CURLcode curl_mime_data(curl_mimepart *part, + const char *data, size_t datasize); + +/* + * NAME curl_mime_filedata() + * + * DESCRIPTION + * + * Set mime part data source from named file. + */ +CURL_EXTERN CURLcode curl_mime_filedata(curl_mimepart *part, + const char *filename); + +/* + * NAME curl_mime_data_cb() + * + * DESCRIPTION + * + * Set mime part data source from callback function. + */ +CURL_EXTERN CURLcode curl_mime_data_cb(curl_mimepart *part, + curl_off_t datasize, + curl_read_callback readfunc, + curl_seek_callback seekfunc, + curl_free_callback freefunc, + void *arg); + +/* + * NAME curl_mime_subparts() + * + * DESCRIPTION + * + * Set mime part data source from subparts. + */ +CURL_EXTERN CURLcode curl_mime_subparts(curl_mimepart *part, + curl_mime *subparts); +/* + * NAME curl_mime_headers() + * + * DESCRIPTION + * + * Set mime part headers. + */ +CURL_EXTERN CURLcode curl_mime_headers(curl_mimepart *part, + struct curl_slist *headers, + int take_ownership); + +typedef enum { + CURLFORM_NOTHING, /********* the first one is unused ************/ + CURLFORM_COPYNAME, + CURLFORM_PTRNAME, + CURLFORM_NAMELENGTH, + CURLFORM_COPYCONTENTS, + CURLFORM_PTRCONTENTS, + CURLFORM_CONTENTSLENGTH, + CURLFORM_FILECONTENT, + CURLFORM_ARRAY, + CURLFORM_OBSOLETE, + CURLFORM_FILE, + + CURLFORM_BUFFER, + CURLFORM_BUFFERPTR, + CURLFORM_BUFFERLENGTH, + + CURLFORM_CONTENTTYPE, + CURLFORM_CONTENTHEADER, + CURLFORM_FILENAME, + CURLFORM_END, + CURLFORM_OBSOLETE2, + + CURLFORM_STREAM, + CURLFORM_CONTENTLEN, /* added in 7.46.0, provide a curl_off_t length */ + + CURLFORM_LASTENTRY /* the last unused */ +} CURLformoption; + +/* structure to be used as parameter for CURLFORM_ARRAY */ +struct curl_forms { + CURLformoption option; + const char *value; +}; + +/* use this for multipart formpost building */ +/* Returns code for curl_formadd() + * + * Returns: + * CURL_FORMADD_OK on success + * CURL_FORMADD_MEMORY if the FormInfo allocation fails + * CURL_FORMADD_OPTION_TWICE if one option is given twice for one Form + * CURL_FORMADD_NULL if a null pointer was given for a char + * CURL_FORMADD_MEMORY if the allocation of a FormInfo struct failed + * CURL_FORMADD_UNKNOWN_OPTION if an unknown option was used + * CURL_FORMADD_INCOMPLETE if the some FormInfo is not complete (or error) + * CURL_FORMADD_MEMORY if a curl_httppost struct cannot be allocated + * CURL_FORMADD_MEMORY if some allocation for string copying failed. + * CURL_FORMADD_ILLEGAL_ARRAY if an illegal option is used in an array + * + ***************************************************************************/ +typedef enum { + CURL_FORMADD_OK, /* first, no error */ + + CURL_FORMADD_MEMORY, + CURL_FORMADD_OPTION_TWICE, + CURL_FORMADD_NULL, + CURL_FORMADD_UNKNOWN_OPTION, + CURL_FORMADD_INCOMPLETE, + CURL_FORMADD_ILLEGAL_ARRAY, + CURL_FORMADD_DISABLED, /* libcurl was built with this disabled */ + + CURL_FORMADD_LAST /* last */ +} CURLFORMcode; + +/* + * NAME curl_formadd() + * + * DESCRIPTION + * + * Pretty advanced function for building multi-part formposts. Each invoke + * adds one part that together construct a full post. Then use + * CURLOPT_HTTPPOST to send it off to libcurl. + */ +CURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost, + struct curl_httppost **last_post, + ...); + +/* + * callback function for curl_formget() + * The void *arg pointer will be the one passed as second argument to + * curl_formget(). + * The character buffer passed to it must not be freed. + * Should return the buffer length passed to it as the argument "len" on + * success. + */ +typedef size_t (*curl_formget_callback)(void *arg, const char *buf, + size_t len); + +/* + * NAME curl_formget() + * + * DESCRIPTION + * + * Serialize a curl_httppost struct built with curl_formadd(). + * Accepts a void pointer as second argument which will be passed to + * the curl_formget_callback function. + * Returns 0 on success. + */ +CURL_EXTERN int curl_formget(struct curl_httppost *form, void *arg, + curl_formget_callback append); +/* + * NAME curl_formfree() + * + * DESCRIPTION + * + * Free a multipart formpost previously built with curl_formadd(). + */ +CURL_EXTERN void curl_formfree(struct curl_httppost *form); + +/* + * NAME curl_getenv() + * + * DESCRIPTION + * + * Returns a malloc()'ed string that MUST be curl_free()ed after usage is + * complete. DEPRECATED - see lib/README.curlx + */ +CURL_EXTERN char *curl_getenv(const char *variable); + +/* + * NAME curl_version() + * + * DESCRIPTION + * + * Returns a static ascii string of the libcurl version. + */ +CURL_EXTERN char *curl_version(void); + +/* + * NAME curl_easy_escape() + * + * DESCRIPTION + * + * Escapes URL strings (converts all letters consider illegal in URLs to their + * %XX versions). This function returns a new allocated string or NULL if an + * error occurred. + */ +CURL_EXTERN char *curl_easy_escape(CURL *handle, + const char *string, + int length); + +/* the previous version: */ +CURL_EXTERN char *curl_escape(const char *string, + int length); + + +/* + * NAME curl_easy_unescape() + * + * DESCRIPTION + * + * Unescapes URL encoding in strings (converts all %XX codes to their 8bit + * versions). This function returns a new allocated string or NULL if an error + * occurred. + * Conversion Note: On non-ASCII platforms the ASCII %XX codes are + * converted into the host encoding. + */ +CURL_EXTERN char *curl_easy_unescape(CURL *handle, + const char *string, + int length, + int *outlength); + +/* the previous version */ +CURL_EXTERN char *curl_unescape(const char *string, + int length); + +/* + * NAME curl_free() + * + * DESCRIPTION + * + * Provided for de-allocation in the same translation unit that did the + * allocation. Added in libcurl 7.10 + */ +CURL_EXTERN void curl_free(void *p); + +/* + * NAME curl_global_init() + * + * DESCRIPTION + * + * curl_global_init() should be invoked exactly once for each application that + * uses libcurl and before any call of other libcurl functions. + * + * This function is not thread-safe! + */ +CURL_EXTERN CURLcode curl_global_init(long flags); + +/* + * NAME curl_global_init_mem() + * + * DESCRIPTION + * + * curl_global_init() or curl_global_init_mem() should be invoked exactly once + * for each application that uses libcurl. This function can be used to + * initialize libcurl and set user defined memory management callback + * functions. Users can implement memory management routines to check for + * memory leaks, check for mis-use of the curl library etc. User registered + * callback routines will be invoked by this library instead of the system + * memory management routines like malloc, free etc. + */ +CURL_EXTERN CURLcode curl_global_init_mem(long flags, + curl_malloc_callback m, + curl_free_callback f, + curl_realloc_callback r, + curl_strdup_callback s, + curl_calloc_callback c); + +/* + * NAME curl_global_cleanup() + * + * DESCRIPTION + * + * curl_global_cleanup() should be invoked exactly once for each application + * that uses libcurl + */ +CURL_EXTERN void curl_global_cleanup(void); + +/* linked-list structure for the CURLOPT_QUOTE option (and other) */ +struct curl_slist { + char *data; + struct curl_slist *next; +}; + +/* + * NAME curl_global_sslset() + * + * DESCRIPTION + * + * When built with multiple SSL backends, curl_global_sslset() allows to + * choose one. This function can only be called once, and it must be called + * *before* curl_global_init(). + * + * The backend can be identified by the id (e.g. CURLSSLBACKEND_OPENSSL). The + * backend can also be specified via the name parameter (passing -1 as id). + * If both id and name are specified, the name will be ignored. If neither id + * nor name are specified, the function will fail with + * CURLSSLSET_UNKNOWN_BACKEND and set the "avail" pointer to the + * NULL-terminated list of available backends. + * + * Upon success, the function returns CURLSSLSET_OK. + * + * If the specified SSL backend is not available, the function returns + * CURLSSLSET_UNKNOWN_BACKEND and sets the "avail" pointer to a NULL-terminated + * list of available SSL backends. + * + * The SSL backend can be set only once. If it has already been set, a + * subsequent attempt to change it will result in a CURLSSLSET_TOO_LATE. + */ + +struct curl_ssl_backend { + curl_sslbackend id; + const char *name; +}; +typedef struct curl_ssl_backend curl_ssl_backend; + +typedef enum { + CURLSSLSET_OK = 0, + CURLSSLSET_UNKNOWN_BACKEND, + CURLSSLSET_TOO_LATE, + CURLSSLSET_NO_BACKENDS /* libcurl was built without any SSL support */ +} CURLsslset; + +CURL_EXTERN CURLsslset curl_global_sslset(curl_sslbackend id, const char *name, + const curl_ssl_backend ***avail); + +/* + * NAME curl_slist_append() + * + * DESCRIPTION + * + * Appends a string to a linked list. If no list exists, it will be created + * first. Returns the new list, after appending. + */ +CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *, + const char *); + +/* + * NAME curl_slist_free_all() + * + * DESCRIPTION + * + * free a previously built curl_slist. + */ +CURL_EXTERN void curl_slist_free_all(struct curl_slist *); + +/* + * NAME curl_getdate() + * + * DESCRIPTION + * + * Returns the time, in seconds since 1 Jan 1970 of the time string given in + * the first argument. The time argument in the second parameter is unused + * and should be set to NULL. + */ +CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused); + +/* info about the certificate chain, only for OpenSSL, GnuTLS, Schannel, NSS + and GSKit builds. Asked for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */ +struct curl_certinfo { + int num_of_certs; /* number of certificates with information */ + struct curl_slist **certinfo; /* for each index in this array, there's a + linked list with textual information in the + format "name: value" */ +}; + +/* Information about the SSL library used and the respective internal SSL + handle, which can be used to obtain further information regarding the + connection. Asked for with CURLINFO_TLS_SSL_PTR or CURLINFO_TLS_SESSION. */ +struct curl_tlssessioninfo { + curl_sslbackend backend; + void *internals; +}; + +#define CURLINFO_STRING 0x100000 +#define CURLINFO_LONG 0x200000 +#define CURLINFO_DOUBLE 0x300000 +#define CURLINFO_SLIST 0x400000 +#define CURLINFO_PTR 0x400000 /* same as SLIST */ +#define CURLINFO_SOCKET 0x500000 +#define CURLINFO_OFF_T 0x600000 +#define CURLINFO_MASK 0x0fffff +#define CURLINFO_TYPEMASK 0xf00000 + +typedef enum { + CURLINFO_NONE, /* first, never use this */ + CURLINFO_EFFECTIVE_URL = CURLINFO_STRING + 1, + CURLINFO_RESPONSE_CODE = CURLINFO_LONG + 2, + CURLINFO_TOTAL_TIME = CURLINFO_DOUBLE + 3, + CURLINFO_NAMELOOKUP_TIME = CURLINFO_DOUBLE + 4, + CURLINFO_CONNECT_TIME = CURLINFO_DOUBLE + 5, + CURLINFO_PRETRANSFER_TIME = CURLINFO_DOUBLE + 6, + CURLINFO_SIZE_UPLOAD = CURLINFO_DOUBLE + 7, + CURLINFO_SIZE_UPLOAD_T = CURLINFO_OFF_T + 7, + CURLINFO_SIZE_DOWNLOAD = CURLINFO_DOUBLE + 8, + CURLINFO_SIZE_DOWNLOAD_T = CURLINFO_OFF_T + 8, + CURLINFO_SPEED_DOWNLOAD = CURLINFO_DOUBLE + 9, + CURLINFO_SPEED_DOWNLOAD_T = CURLINFO_OFF_T + 9, + CURLINFO_SPEED_UPLOAD = CURLINFO_DOUBLE + 10, + CURLINFO_SPEED_UPLOAD_T = CURLINFO_OFF_T + 10, + CURLINFO_HEADER_SIZE = CURLINFO_LONG + 11, + CURLINFO_REQUEST_SIZE = CURLINFO_LONG + 12, + CURLINFO_SSL_VERIFYRESULT = CURLINFO_LONG + 13, + CURLINFO_FILETIME = CURLINFO_LONG + 14, + CURLINFO_FILETIME_T = CURLINFO_OFF_T + 14, + CURLINFO_CONTENT_LENGTH_DOWNLOAD = CURLINFO_DOUBLE + 15, + CURLINFO_CONTENT_LENGTH_DOWNLOAD_T = CURLINFO_OFF_T + 15, + CURLINFO_CONTENT_LENGTH_UPLOAD = CURLINFO_DOUBLE + 16, + CURLINFO_CONTENT_LENGTH_UPLOAD_T = CURLINFO_OFF_T + 16, + CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17, + CURLINFO_CONTENT_TYPE = CURLINFO_STRING + 18, + CURLINFO_REDIRECT_TIME = CURLINFO_DOUBLE + 19, + CURLINFO_REDIRECT_COUNT = CURLINFO_LONG + 20, + CURLINFO_PRIVATE = CURLINFO_STRING + 21, + CURLINFO_HTTP_CONNECTCODE = CURLINFO_LONG + 22, + CURLINFO_HTTPAUTH_AVAIL = CURLINFO_LONG + 23, + CURLINFO_PROXYAUTH_AVAIL = CURLINFO_LONG + 24, + CURLINFO_OS_ERRNO = CURLINFO_LONG + 25, + CURLINFO_NUM_CONNECTS = CURLINFO_LONG + 26, + CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27, + CURLINFO_COOKIELIST = CURLINFO_SLIST + 28, + CURLINFO_LASTSOCKET = CURLINFO_LONG + 29, + CURLINFO_FTP_ENTRY_PATH = CURLINFO_STRING + 30, + CURLINFO_REDIRECT_URL = CURLINFO_STRING + 31, + CURLINFO_PRIMARY_IP = CURLINFO_STRING + 32, + CURLINFO_APPCONNECT_TIME = CURLINFO_DOUBLE + 33, + CURLINFO_CERTINFO = CURLINFO_PTR + 34, + CURLINFO_CONDITION_UNMET = CURLINFO_LONG + 35, + CURLINFO_RTSP_SESSION_ID = CURLINFO_STRING + 36, + CURLINFO_RTSP_CLIENT_CSEQ = CURLINFO_LONG + 37, + CURLINFO_RTSP_SERVER_CSEQ = CURLINFO_LONG + 38, + CURLINFO_RTSP_CSEQ_RECV = CURLINFO_LONG + 39, + CURLINFO_PRIMARY_PORT = CURLINFO_LONG + 40, + CURLINFO_LOCAL_IP = CURLINFO_STRING + 41, + CURLINFO_LOCAL_PORT = CURLINFO_LONG + 42, + CURLINFO_TLS_SESSION = CURLINFO_PTR + 43, + CURLINFO_ACTIVESOCKET = CURLINFO_SOCKET + 44, + CURLINFO_TLS_SSL_PTR = CURLINFO_PTR + 45, + CURLINFO_HTTP_VERSION = CURLINFO_LONG + 46, + CURLINFO_PROXY_SSL_VERIFYRESULT = CURLINFO_LONG + 47, + CURLINFO_PROTOCOL = CURLINFO_LONG + 48, + CURLINFO_SCHEME = CURLINFO_STRING + 49, + CURLINFO_TOTAL_TIME_T = CURLINFO_OFF_T + 50, + CURLINFO_NAMELOOKUP_TIME_T = CURLINFO_OFF_T + 51, + CURLINFO_CONNECT_TIME_T = CURLINFO_OFF_T + 52, + CURLINFO_PRETRANSFER_TIME_T = CURLINFO_OFF_T + 53, + CURLINFO_STARTTRANSFER_TIME_T = CURLINFO_OFF_T + 54, + CURLINFO_REDIRECT_TIME_T = CURLINFO_OFF_T + 55, + CURLINFO_APPCONNECT_TIME_T = CURLINFO_OFF_T + 56, + CURLINFO_RETRY_AFTER = CURLINFO_OFF_T + 57, + CURLINFO_EFFECTIVE_METHOD = CURLINFO_STRING + 58, + CURLINFO_PROXY_ERROR = CURLINFO_LONG + 59, + CURLINFO_REFERER = CURLINFO_STRING + 60, + + CURLINFO_LASTONE = 60 +} CURLINFO; + +/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as + CURLINFO_HTTP_CODE */ +#define CURLINFO_HTTP_CODE CURLINFO_RESPONSE_CODE + +typedef enum { + CURLCLOSEPOLICY_NONE, /* first, never use this */ + + CURLCLOSEPOLICY_OLDEST, + CURLCLOSEPOLICY_LEAST_RECENTLY_USED, + CURLCLOSEPOLICY_LEAST_TRAFFIC, + CURLCLOSEPOLICY_SLOWEST, + CURLCLOSEPOLICY_CALLBACK, + + CURLCLOSEPOLICY_LAST /* last, never use this */ +} curl_closepolicy; + +#define CURL_GLOBAL_SSL (1<<0) /* no purpose since since 7.57.0 */ +#define CURL_GLOBAL_WIN32 (1<<1) +#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32) +#define CURL_GLOBAL_NOTHING 0 +#define CURL_GLOBAL_DEFAULT CURL_GLOBAL_ALL +#define CURL_GLOBAL_ACK_EINTR (1<<2) + + +/***************************************************************************** + * Setup defines, protos etc for the sharing stuff. + */ + +/* Different data locks for a single share */ +typedef enum { + CURL_LOCK_DATA_NONE = 0, + /* CURL_LOCK_DATA_SHARE is used internally to say that + * the locking is just made to change the internal state of the share + * itself. + */ + CURL_LOCK_DATA_SHARE, + CURL_LOCK_DATA_COOKIE, + CURL_LOCK_DATA_DNS, + CURL_LOCK_DATA_SSL_SESSION, + CURL_LOCK_DATA_CONNECT, + CURL_LOCK_DATA_PSL, + CURL_LOCK_DATA_LAST +} curl_lock_data; + +/* Different lock access types */ +typedef enum { + CURL_LOCK_ACCESS_NONE = 0, /* unspecified action */ + CURL_LOCK_ACCESS_SHARED = 1, /* for read perhaps */ + CURL_LOCK_ACCESS_SINGLE = 2, /* for write perhaps */ + CURL_LOCK_ACCESS_LAST /* never use */ +} curl_lock_access; + +typedef void (*curl_lock_function)(CURL *handle, + curl_lock_data data, + curl_lock_access locktype, + void *userptr); +typedef void (*curl_unlock_function)(CURL *handle, + curl_lock_data data, + void *userptr); + + +typedef enum { + CURLSHE_OK, /* all is fine */ + CURLSHE_BAD_OPTION, /* 1 */ + CURLSHE_IN_USE, /* 2 */ + CURLSHE_INVALID, /* 3 */ + CURLSHE_NOMEM, /* 4 out of memory */ + CURLSHE_NOT_BUILT_IN, /* 5 feature not present in lib */ + CURLSHE_LAST /* never use */ +} CURLSHcode; + +typedef enum { + CURLSHOPT_NONE, /* don't use */ + CURLSHOPT_SHARE, /* specify a data type to share */ + CURLSHOPT_UNSHARE, /* specify which data type to stop sharing */ + CURLSHOPT_LOCKFUNC, /* pass in a 'curl_lock_function' pointer */ + CURLSHOPT_UNLOCKFUNC, /* pass in a 'curl_unlock_function' pointer */ + CURLSHOPT_USERDATA, /* pass in a user data pointer used in the lock/unlock + callback functions */ + CURLSHOPT_LAST /* never use */ +} CURLSHoption; + +CURL_EXTERN CURLSH *curl_share_init(void); +CURL_EXTERN CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...); +CURL_EXTERN CURLSHcode curl_share_cleanup(CURLSH *); + +/**************************************************************************** + * Structures for querying information about the curl library at runtime. + */ + +typedef enum { + CURLVERSION_FIRST, + CURLVERSION_SECOND, + CURLVERSION_THIRD, + CURLVERSION_FOURTH, + CURLVERSION_FIFTH, + CURLVERSION_SIXTH, + CURLVERSION_SEVENTH, + CURLVERSION_EIGHTH, + CURLVERSION_NINTH, + CURLVERSION_TENTH, + CURLVERSION_LAST /* never actually use this */ +} CURLversion; + +/* The 'CURLVERSION_NOW' is the symbolic name meant to be used by + basically all programs ever that want to get version information. It is + meant to be a built-in version number for what kind of struct the caller + expects. If the struct ever changes, we redefine the NOW to another enum + from above. */ +#define CURLVERSION_NOW CURLVERSION_TENTH + +struct curl_version_info_data { + CURLversion age; /* age of the returned struct */ + const char *version; /* LIBCURL_VERSION */ + unsigned int version_num; /* LIBCURL_VERSION_NUM */ + const char *host; /* OS/host/cpu/machine when configured */ + int features; /* bitmask, see defines below */ + const char *ssl_version; /* human readable string */ + long ssl_version_num; /* not used anymore, always 0 */ + const char *libz_version; /* human readable string */ + /* protocols is terminated by an entry with a NULL protoname */ + const char * const *protocols; + + /* The fields below this were added in CURLVERSION_SECOND */ + const char *ares; + int ares_num; + + /* This field was added in CURLVERSION_THIRD */ + const char *libidn; + + /* These field were added in CURLVERSION_FOURTH */ + + /* Same as '_libiconv_version' if built with HAVE_ICONV */ + int iconv_ver_num; + + const char *libssh_version; /* human readable string */ + + /* These fields were added in CURLVERSION_FIFTH */ + unsigned int brotli_ver_num; /* Numeric Brotli version + (MAJOR << 24) | (MINOR << 12) | PATCH */ + const char *brotli_version; /* human readable string. */ + + /* These fields were added in CURLVERSION_SIXTH */ + unsigned int nghttp2_ver_num; /* Numeric nghttp2 version + (MAJOR << 16) | (MINOR << 8) | PATCH */ + const char *nghttp2_version; /* human readable string. */ + const char *quic_version; /* human readable quic (+ HTTP/3) library + + version or NULL */ + + /* These fields were added in CURLVERSION_SEVENTH */ + const char *cainfo; /* the built-in default CURLOPT_CAINFO, might + be NULL */ + const char *capath; /* the built-in default CURLOPT_CAPATH, might + be NULL */ + + /* These fields were added in CURLVERSION_EIGHTH */ + unsigned int zstd_ver_num; /* Numeric Zstd version + (MAJOR << 24) | (MINOR << 12) | PATCH */ + const char *zstd_version; /* human readable string. */ + + /* These fields were added in CURLVERSION_NINTH */ + const char *hyper_version; /* human readable string. */ + + /* These fields were added in CURLVERSION_TENTH */ + const char *gsasl_version; /* human readable string. */ +}; +typedef struct curl_version_info_data curl_version_info_data; + +#define CURL_VERSION_IPV6 (1<<0) /* IPv6-enabled */ +#define CURL_VERSION_KERBEROS4 (1<<1) /* Kerberos V4 auth is supported + (deprecated) */ +#define CURL_VERSION_SSL (1<<2) /* SSL options are present */ +#define CURL_VERSION_LIBZ (1<<3) /* libz features are present */ +#define CURL_VERSION_NTLM (1<<4) /* NTLM auth is supported */ +#define CURL_VERSION_GSSNEGOTIATE (1<<5) /* Negotiate auth is supported + (deprecated) */ +#define CURL_VERSION_DEBUG (1<<6) /* Built with debug capabilities */ +#define CURL_VERSION_ASYNCHDNS (1<<7) /* Asynchronous DNS resolves */ +#define CURL_VERSION_SPNEGO (1<<8) /* SPNEGO auth is supported */ +#define CURL_VERSION_LARGEFILE (1<<9) /* Supports files larger than 2GB */ +#define CURL_VERSION_IDN (1<<10) /* Internationized Domain Names are + supported */ +#define CURL_VERSION_SSPI (1<<11) /* Built against Windows SSPI */ +#define CURL_VERSION_CONV (1<<12) /* Character conversions supported */ +#define CURL_VERSION_CURLDEBUG (1<<13) /* Debug memory tracking supported */ +#define CURL_VERSION_TLSAUTH_SRP (1<<14) /* TLS-SRP auth is supported */ +#define CURL_VERSION_NTLM_WB (1<<15) /* NTLM delegation to winbind helper + is supported */ +#define CURL_VERSION_HTTP2 (1<<16) /* HTTP2 support built-in */ +#define CURL_VERSION_GSSAPI (1<<17) /* Built against a GSS-API library */ +#define CURL_VERSION_KERBEROS5 (1<<18) /* Kerberos V5 auth is supported */ +#define CURL_VERSION_UNIX_SOCKETS (1<<19) /* Unix domain sockets support */ +#define CURL_VERSION_PSL (1<<20) /* Mozilla's Public Suffix List, used + for cookie domain verification */ +#define CURL_VERSION_HTTPS_PROXY (1<<21) /* HTTPS-proxy support built-in */ +#define CURL_VERSION_MULTI_SSL (1<<22) /* Multiple SSL backends available */ +#define CURL_VERSION_BROTLI (1<<23) /* Brotli features are present. */ +#define CURL_VERSION_ALTSVC (1<<24) /* Alt-Svc handling built-in */ +#define CURL_VERSION_HTTP3 (1<<25) /* HTTP3 support built-in */ +#define CURL_VERSION_ZSTD (1<<26) /* zstd features are present */ +#define CURL_VERSION_UNICODE (1<<27) /* Unicode support on Windows */ +#define CURL_VERSION_HSTS (1<<28) /* HSTS is supported */ +#define CURL_VERSION_GSASL (1<<29) /* libgsasl is supported */ + + /* + * NAME curl_version_info() + * + * DESCRIPTION + * + * This function returns a pointer to a static copy of the version info + * struct. See above. + */ +CURL_EXTERN curl_version_info_data *curl_version_info(CURLversion); + +/* + * NAME curl_easy_strerror() + * + * DESCRIPTION + * + * The curl_easy_strerror function may be used to turn a CURLcode value + * into the equivalent human readable error string. This is useful + * for printing meaningful error messages. + */ +CURL_EXTERN const char *curl_easy_strerror(CURLcode); + +/* + * NAME curl_share_strerror() + * + * DESCRIPTION + * + * The curl_share_strerror function may be used to turn a CURLSHcode value + * into the equivalent human readable error string. This is useful + * for printing meaningful error messages. + */ +CURL_EXTERN const char *curl_share_strerror(CURLSHcode); + +/* + * NAME curl_easy_pause() + * + * DESCRIPTION + * + * The curl_easy_pause function pauses or unpauses transfers. Select the new + * state by setting the bitmask, use the convenience defines below. + * + */ +CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask); + +#define CURLPAUSE_RECV (1<<0) +#define CURLPAUSE_RECV_CONT (0) + +#define CURLPAUSE_SEND (1<<2) +#define CURLPAUSE_SEND_CONT (0) + +#define CURLPAUSE_ALL (CURLPAUSE_RECV|CURLPAUSE_SEND) +#define CURLPAUSE_CONT (CURLPAUSE_RECV_CONT|CURLPAUSE_SEND_CONT) + +#ifdef __cplusplus +} +#endif + +/* unfortunately, the easy.h and multi.h include files need options and info + stuff before they can be included! */ +#include "easy.h" /* nothing in curl is fun without the easy stuff */ +#include "multi.h" +#include "urlapi.h" +#include "options.h" + +/* the typechecker doesn't work in C++ (yet) */ +#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \ + ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && \ + !defined(__cplusplus) && !defined(CURL_DISABLE_TYPECHECK) +#include "typecheck-gcc.h" +#else +#if defined(__STDC__) && (__STDC__ >= 1) +/* This preprocessor magic that replaces a call with the exact same call is + only done to make sure application authors pass exactly three arguments + to these functions. */ +#define curl_easy_setopt(handle,opt,param) curl_easy_setopt(handle,opt,param) +#define curl_easy_getinfo(handle,info,arg) curl_easy_getinfo(handle,info,arg) +#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) +#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) +#endif /* __STDC__ >= 1 */ +#endif /* gcc >= 4.3 && !__cplusplus */ + +#endif /* CURLINC_CURL_H */ diff --git a/libcurl/curl/curlver.h b/libcurl/curl/curlver.h new file mode 100644 index 0000000..556a229 --- /dev/null +++ b/libcurl/curl/curlver.h @@ -0,0 +1,77 @@ +#ifndef CURLINC_CURLVER_H +#define CURLINC_CURLVER_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* This header file contains nothing but libcurl version info, generated by + a script at release-time. This was made its own header file in 7.11.2 */ + +/* This is the global package copyright */ +#define LIBCURL_COPYRIGHT "1996 - 2021 Daniel Stenberg, ." + +/* This is the version number of the libcurl package from which this header + file origins: */ +#define LIBCURL_VERSION "7.79.1" + +/* The numeric version number is also available "in parts" by using these + defines: */ +#define LIBCURL_VERSION_MAJOR 7 +#define LIBCURL_VERSION_MINOR 79 +#define LIBCURL_VERSION_PATCH 1 + +/* This is the numeric version of the libcurl version number, meant for easier + parsing and comparisons by programs. The LIBCURL_VERSION_NUM define will + always follow this syntax: + + 0xXXYYZZ + + Where XX, YY and ZZ are the main version, release and patch numbers in + hexadecimal (using 8 bits each). All three numbers are always represented + using two digits. 1.2 would appear as "0x010200" while version 9.11.7 + appears as "0x090b07". + + This 6-digit (24 bits) hexadecimal number does not show pre-release number, + and it is always a greater number in a more recent release. It makes + comparisons with greater than and less than work. + + Note: This define is the full hex number and _does not_ use the + CURL_VERSION_BITS() macro since curl's own configure script greps for it + and needs it to contain the full number. +*/ +#define LIBCURL_VERSION_NUM 0x074f01 + +/* + * This is the date and time when the full source package was created. The + * timestamp is not stored in git, as the timestamp is properly set in the + * tarballs by the maketgz script. + * + * The format of the date follows this template: + * + * "2007-11-23" + */ +#define LIBCURL_TIMESTAMP "2021-09-22" + +#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|(z)) +#define CURL_AT_LEAST_VERSION(x,y,z) \ + (LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z)) + +#endif /* CURLINC_CURLVER_H */ diff --git a/libcurl/curl/easy.h b/libcurl/curl/easy.h new file mode 100644 index 0000000..2dbfb26 --- /dev/null +++ b/libcurl/curl/easy.h @@ -0,0 +1,123 @@ +#ifndef CURLINC_EASY_H +#define CURLINC_EASY_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#ifdef __cplusplus +extern "C" { +#endif + +/* Flag bits in the curl_blob struct: */ +#define CURL_BLOB_COPY 1 /* tell libcurl to copy the data */ +#define CURL_BLOB_NOCOPY 0 /* tell libcurl to NOT copy the data */ + +struct curl_blob { + void *data; + size_t len; + unsigned int flags; /* bit 0 is defined, the rest are reserved and should be + left zeroes */ +}; + +CURL_EXTERN CURL *curl_easy_init(void); +CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...); +CURL_EXTERN CURLcode curl_easy_perform(CURL *curl); +CURL_EXTERN void curl_easy_cleanup(CURL *curl); + +/* + * NAME curl_easy_getinfo() + * + * DESCRIPTION + * + * Request internal information from the curl session with this function. The + * third argument MUST be a pointer to a long, a pointer to a char * or a + * pointer to a double (as the documentation describes elsewhere). The data + * pointed to will be filled in accordingly and can be relied upon only if the + * function returns CURLE_OK. This function is intended to get used *AFTER* a + * performed transfer, all results from this function are undefined until the + * transfer is completed. + */ +CURL_EXTERN CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...); + + +/* + * NAME curl_easy_duphandle() + * + * DESCRIPTION + * + * Creates a new curl session handle with the same options set for the handle + * passed in. Duplicating a handle could only be a matter of cloning data and + * options, internal state info and things like persistent connections cannot + * be transferred. It is useful in multithreaded applications when you can run + * curl_easy_duphandle() for each new thread to avoid a series of identical + * curl_easy_setopt() invokes in every thread. + */ +CURL_EXTERN CURL *curl_easy_duphandle(CURL *curl); + +/* + * NAME curl_easy_reset() + * + * DESCRIPTION + * + * Re-initializes a CURL handle to the default values. This puts back the + * handle to the same state as it was in when it was just created. + * + * It does keep: live connections, the Session ID cache, the DNS cache and the + * cookies. + */ +CURL_EXTERN void curl_easy_reset(CURL *curl); + +/* + * NAME curl_easy_recv() + * + * DESCRIPTION + * + * Receives data from the connected socket. Use after successful + * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. + */ +CURL_EXTERN CURLcode curl_easy_recv(CURL *curl, void *buffer, size_t buflen, + size_t *n); + +/* + * NAME curl_easy_send() + * + * DESCRIPTION + * + * Sends data over the connected socket. Use after successful + * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. + */ +CURL_EXTERN CURLcode curl_easy_send(CURL *curl, const void *buffer, + size_t buflen, size_t *n); + + +/* + * NAME curl_easy_upkeep() + * + * DESCRIPTION + * + * Performs connection upkeep for the given session handle. + */ +CURL_EXTERN CURLcode curl_easy_upkeep(CURL *curl); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libcurl/curl/mprintf.h b/libcurl/curl/mprintf.h new file mode 100644 index 0000000..3549552 --- /dev/null +++ b/libcurl/curl/mprintf.h @@ -0,0 +1,50 @@ +#ifndef CURLINC_MPRINTF_H +#define CURLINC_MPRINTF_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include +#include /* needed for FILE */ +#include "curl.h" /* for CURL_EXTERN */ + +#ifdef __cplusplus +extern "C" { +#endif + +CURL_EXTERN int curl_mprintf(const char *format, ...); +CURL_EXTERN int curl_mfprintf(FILE *fd, const char *format, ...); +CURL_EXTERN int curl_msprintf(char *buffer, const char *format, ...); +CURL_EXTERN int curl_msnprintf(char *buffer, size_t maxlength, + const char *format, ...); +CURL_EXTERN int curl_mvprintf(const char *format, va_list args); +CURL_EXTERN int curl_mvfprintf(FILE *fd, const char *format, va_list args); +CURL_EXTERN int curl_mvsprintf(char *buffer, const char *format, va_list args); +CURL_EXTERN int curl_mvsnprintf(char *buffer, size_t maxlength, + const char *format, va_list args); +CURL_EXTERN char *curl_maprintf(const char *format, ...); +CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args); + +#ifdef __cplusplus +} +#endif + +#endif /* CURLINC_MPRINTF_H */ diff --git a/libcurl/curl/multi.h b/libcurl/curl/multi.h new file mode 100644 index 0000000..37f9829 --- /dev/null +++ b/libcurl/curl/multi.h @@ -0,0 +1,456 @@ +#ifndef CURLINC_MULTI_H +#define CURLINC_MULTI_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +/* + This is an "external" header file. Don't give away any internals here! + + GOALS + + o Enable a "pull" interface. The application that uses libcurl decides where + and when to ask libcurl to get/send data. + + o Enable multiple simultaneous transfers in the same thread without making it + complicated for the application. + + o Enable the application to select() on its own file descriptors and curl's + file descriptors simultaneous easily. + +*/ + +/* + * This header file should not really need to include "curl.h" since curl.h + * itself includes this file and we expect user applications to do #include + * without the need for especially including multi.h. + * + * For some reason we added this include here at one point, and rather than to + * break existing (wrongly written) libcurl applications, we leave it as-is + * but with this warning attached. + */ +#include "curl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER) +typedef struct Curl_multi CURLM; +#else +typedef void CURLM; +#endif + +typedef enum { + CURLM_CALL_MULTI_PERFORM = -1, /* please call curl_multi_perform() or + curl_multi_socket*() soon */ + CURLM_OK, + CURLM_BAD_HANDLE, /* the passed-in handle is not a valid CURLM handle */ + CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */ + CURLM_OUT_OF_MEMORY, /* if you ever get this, you're in deep sh*t */ + CURLM_INTERNAL_ERROR, /* this is a libcurl bug */ + CURLM_BAD_SOCKET, /* the passed in socket argument did not match */ + CURLM_UNKNOWN_OPTION, /* curl_multi_setopt() with unsupported option */ + CURLM_ADDED_ALREADY, /* an easy handle already added to a multi handle was + attempted to get added - again */ + CURLM_RECURSIVE_API_CALL, /* an api function was called from inside a + callback */ + CURLM_WAKEUP_FAILURE, /* wakeup is unavailable or failed */ + CURLM_BAD_FUNCTION_ARGUMENT, /* function called with a bad parameter */ + CURLM_LAST +} CURLMcode; + +/* just to make code nicer when using curl_multi_socket() you can now check + for CURLM_CALL_MULTI_SOCKET too in the same style it works for + curl_multi_perform() and CURLM_CALL_MULTI_PERFORM */ +#define CURLM_CALL_MULTI_SOCKET CURLM_CALL_MULTI_PERFORM + +/* bitmask bits for CURLMOPT_PIPELINING */ +#define CURLPIPE_NOTHING 0L +#define CURLPIPE_HTTP1 1L +#define CURLPIPE_MULTIPLEX 2L + +typedef enum { + CURLMSG_NONE, /* first, not used */ + CURLMSG_DONE, /* This easy handle has completed. 'result' contains + the CURLcode of the transfer */ + CURLMSG_LAST /* last, not used */ +} CURLMSG; + +struct CURLMsg { + CURLMSG msg; /* what this message means */ + CURL *easy_handle; /* the handle it concerns */ + union { + void *whatever; /* message-specific data */ + CURLcode result; /* return code for transfer */ + } data; +}; +typedef struct CURLMsg CURLMsg; + +/* Based on poll(2) structure and values. + * We don't use pollfd and POLL* constants explicitly + * to cover platforms without poll(). */ +#define CURL_WAIT_POLLIN 0x0001 +#define CURL_WAIT_POLLPRI 0x0002 +#define CURL_WAIT_POLLOUT 0x0004 + +struct curl_waitfd { + curl_socket_t fd; + short events; + short revents; /* not supported yet */ +}; + +/* + * Name: curl_multi_init() + * + * Desc: inititalize multi-style curl usage + * + * Returns: a new CURLM handle to use in all 'curl_multi' functions. + */ +CURL_EXTERN CURLM *curl_multi_init(void); + +/* + * Name: curl_multi_add_handle() + * + * Desc: add a standard curl handle to the multi stack + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle, + CURL *curl_handle); + + /* + * Name: curl_multi_remove_handle() + * + * Desc: removes a curl handle from the multi stack again + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle, + CURL *curl_handle); + + /* + * Name: curl_multi_fdset() + * + * Desc: Ask curl for its fd_set sets. The app can use these to select() or + * poll() on. We want curl_multi_perform() called as soon as one of + * them are ready. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle, + fd_set *read_fd_set, + fd_set *write_fd_set, + fd_set *exc_fd_set, + int *max_fd); + +/* + * Name: curl_multi_wait() + * + * Desc: Poll on all fds within a CURLM set as well as any + * additional fds passed to the function. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle, + struct curl_waitfd extra_fds[], + unsigned int extra_nfds, + int timeout_ms, + int *ret); + +/* + * Name: curl_multi_poll() + * + * Desc: Poll on all fds within a CURLM set as well as any + * additional fds passed to the function. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_poll(CURLM *multi_handle, + struct curl_waitfd extra_fds[], + unsigned int extra_nfds, + int timeout_ms, + int *ret); + +/* + * Name: curl_multi_wakeup() + * + * Desc: wakes up a sleeping curl_multi_poll call. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_wakeup(CURLM *multi_handle); + + /* + * Name: curl_multi_perform() + * + * Desc: When the app thinks there's data available for curl it calls this + * function to read/write whatever there is right now. This returns + * as soon as the reads and writes are done. This function does not + * require that there actually is data available for reading or that + * data can be written, it can be called just in case. It returns + * the number of handles that still transfer data in the second + * argument's integer-pointer. + * + * Returns: CURLMcode type, general multi error code. *NOTE* that this only + * returns errors etc regarding the whole multi stack. There might + * still have occurred problems on individual transfers even when + * this returns OK. + */ +CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle, + int *running_handles); + + /* + * Name: curl_multi_cleanup() + * + * Desc: Cleans up and removes a whole multi stack. It does not free or + * touch any individual easy handles in any way. We need to define + * in what state those handles will be if this function is called + * in the middle of a transfer. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle); + +/* + * Name: curl_multi_info_read() + * + * Desc: Ask the multi handle if there's any messages/informationals from + * the individual transfers. Messages include informationals such as + * error code from the transfer or just the fact that a transfer is + * completed. More details on these should be written down as well. + * + * Repeated calls to this function will return a new struct each + * time, until a special "end of msgs" struct is returned as a signal + * that there is no more to get at this point. + * + * The data the returned pointer points to will not survive calling + * curl_multi_cleanup(). + * + * The 'CURLMsg' struct is meant to be very simple and only contain + * very basic information. If more involved information is wanted, + * we will provide the particular "transfer handle" in that struct + * and that should/could/would be used in subsequent + * curl_easy_getinfo() calls (or similar). The point being that we + * must never expose complex structs to applications, as then we'll + * undoubtably get backwards compatibility problems in the future. + * + * Returns: A pointer to a filled-in struct, or NULL if it failed or ran out + * of structs. It also writes the number of messages left in the + * queue (after this read) in the integer the second argument points + * to. + */ +CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle, + int *msgs_in_queue); + +/* + * Name: curl_multi_strerror() + * + * Desc: The curl_multi_strerror function may be used to turn a CURLMcode + * value into the equivalent human readable error string. This is + * useful for printing meaningful error messages. + * + * Returns: A pointer to a null-terminated error message. + */ +CURL_EXTERN const char *curl_multi_strerror(CURLMcode); + +/* + * Name: curl_multi_socket() and + * curl_multi_socket_all() + * + * Desc: An alternative version of curl_multi_perform() that allows the + * application to pass in one of the file descriptors that have been + * detected to have "action" on them and let libcurl perform. + * See man page for details. + */ +#define CURL_POLL_NONE 0 +#define CURL_POLL_IN 1 +#define CURL_POLL_OUT 2 +#define CURL_POLL_INOUT 3 +#define CURL_POLL_REMOVE 4 + +#define CURL_SOCKET_TIMEOUT CURL_SOCKET_BAD + +#define CURL_CSELECT_IN 0x01 +#define CURL_CSELECT_OUT 0x02 +#define CURL_CSELECT_ERR 0x04 + +typedef int (*curl_socket_callback)(CURL *easy, /* easy handle */ + curl_socket_t s, /* socket */ + int what, /* see above */ + void *userp, /* private callback + pointer */ + void *socketp); /* private socket + pointer */ +/* + * Name: curl_multi_timer_callback + * + * Desc: Called by libcurl whenever the library detects a change in the + * maximum number of milliseconds the app is allowed to wait before + * curl_multi_socket() or curl_multi_perform() must be called + * (to allow libcurl's timed events to take place). + * + * Returns: The callback should return zero. + */ +typedef int (*curl_multi_timer_callback)(CURLM *multi, /* multi handle */ + long timeout_ms, /* see above */ + void *userp); /* private callback + pointer */ + +CURL_EXTERN CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t s, + int *running_handles); + +CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle, + curl_socket_t s, + int ev_bitmask, + int *running_handles); + +CURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle, + int *running_handles); + +#ifndef CURL_ALLOW_OLD_MULTI_SOCKET +/* This macro below was added in 7.16.3 to push users who recompile to use + the new curl_multi_socket_action() instead of the old curl_multi_socket() +*/ +#define curl_multi_socket(x,y,z) curl_multi_socket_action(x,y,0,z) +#endif + +/* + * Name: curl_multi_timeout() + * + * Desc: Returns the maximum number of milliseconds the app is allowed to + * wait before curl_multi_socket() or curl_multi_perform() must be + * called (to allow libcurl's timed events to take place). + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle, + long *milliseconds); + +typedef enum { + /* This is the socket callback function pointer */ + CURLOPT(CURLMOPT_SOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 1), + + /* This is the argument passed to the socket callback */ + CURLOPT(CURLMOPT_SOCKETDATA, CURLOPTTYPE_OBJECTPOINT, 2), + + /* set to 1 to enable pipelining for this multi handle */ + CURLOPT(CURLMOPT_PIPELINING, CURLOPTTYPE_LONG, 3), + + /* This is the timer callback function pointer */ + CURLOPT(CURLMOPT_TIMERFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 4), + + /* This is the argument passed to the timer callback */ + CURLOPT(CURLMOPT_TIMERDATA, CURLOPTTYPE_OBJECTPOINT, 5), + + /* maximum number of entries in the connection cache */ + CURLOPT(CURLMOPT_MAXCONNECTS, CURLOPTTYPE_LONG, 6), + + /* maximum number of (pipelining) connections to one host */ + CURLOPT(CURLMOPT_MAX_HOST_CONNECTIONS, CURLOPTTYPE_LONG, 7), + + /* maximum number of requests in a pipeline */ + CURLOPT(CURLMOPT_MAX_PIPELINE_LENGTH, CURLOPTTYPE_LONG, 8), + + /* a connection with a content-length longer than this + will not be considered for pipelining */ + CURLOPT(CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, CURLOPTTYPE_OFF_T, 9), + + /* a connection with a chunk length longer than this + will not be considered for pipelining */ + CURLOPT(CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, CURLOPTTYPE_OFF_T, 10), + + /* a list of site names(+port) that are blocked from pipelining */ + CURLOPT(CURLMOPT_PIPELINING_SITE_BL, CURLOPTTYPE_OBJECTPOINT, 11), + + /* a list of server types that are blocked from pipelining */ + CURLOPT(CURLMOPT_PIPELINING_SERVER_BL, CURLOPTTYPE_OBJECTPOINT, 12), + + /* maximum number of open connections in total */ + CURLOPT(CURLMOPT_MAX_TOTAL_CONNECTIONS, CURLOPTTYPE_LONG, 13), + + /* This is the server push callback function pointer */ + CURLOPT(CURLMOPT_PUSHFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 14), + + /* This is the argument passed to the server push callback */ + CURLOPT(CURLMOPT_PUSHDATA, CURLOPTTYPE_OBJECTPOINT, 15), + + /* maximum number of concurrent streams to support on a connection */ + CURLOPT(CURLMOPT_MAX_CONCURRENT_STREAMS, CURLOPTTYPE_LONG, 16), + + CURLMOPT_LASTENTRY /* the last unused */ +} CURLMoption; + + +/* + * Name: curl_multi_setopt() + * + * Desc: Sets options for the multi handle. + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_setopt(CURLM *multi_handle, + CURLMoption option, ...); + + +/* + * Name: curl_multi_assign() + * + * Desc: This function sets an association in the multi handle between the + * given socket and a private pointer of the application. This is + * (only) useful for curl_multi_socket uses. + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_assign(CURLM *multi_handle, + curl_socket_t sockfd, void *sockp); + + +/* + * Name: curl_push_callback + * + * Desc: This callback gets called when a new stream is being pushed by the + * server. It approves or denies the new stream. It can also decide + * to completely fail the connection. + * + * Returns: CURL_PUSH_OK, CURL_PUSH_DENY or CURL_PUSH_ERROROUT + */ +#define CURL_PUSH_OK 0 +#define CURL_PUSH_DENY 1 +#define CURL_PUSH_ERROROUT 2 /* added in 7.72.0 */ + +struct curl_pushheaders; /* forward declaration only */ + +CURL_EXTERN char *curl_pushheader_bynum(struct curl_pushheaders *h, + size_t num); +CURL_EXTERN char *curl_pushheader_byname(struct curl_pushheaders *h, + const char *name); + +typedef int (*curl_push_callback)(CURL *parent, + CURL *easy, + size_t num_headers, + struct curl_pushheaders *headers, + void *userp); + +#ifdef __cplusplus +} /* end of extern "C" */ +#endif + +#endif diff --git a/libcurl/curl/options.h b/libcurl/curl/options.h new file mode 100644 index 0000000..14373b5 --- /dev/null +++ b/libcurl/curl/options.h @@ -0,0 +1,68 @@ +#ifndef CURLINC_OPTIONS_H +#define CURLINC_OPTIONS_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 2018 - 2020, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + CURLOT_LONG, /* long (a range of values) */ + CURLOT_VALUES, /* (a defined set or bitmask) */ + CURLOT_OFF_T, /* curl_off_t (a range of values) */ + CURLOT_OBJECT, /* pointer (void *) */ + CURLOT_STRING, /* (char * to zero terminated buffer) */ + CURLOT_SLIST, /* (struct curl_slist *) */ + CURLOT_CBPTR, /* (void * passed as-is to a callback) */ + CURLOT_BLOB, /* blob (struct curl_blob *) */ + CURLOT_FUNCTION /* function pointer */ +} curl_easytype; + +/* Flag bits */ + +/* "alias" means it is provided for old programs to remain functional, + we prefer another name */ +#define CURLOT_FLAG_ALIAS (1<<0) + +/* The CURLOPTTYPE_* id ranges can still be used to figure out what type/size + to use for curl_easy_setopt() for the given id */ +struct curl_easyoption { + const char *name; + CURLoption id; + curl_easytype type; + unsigned int flags; +}; + +CURL_EXTERN const struct curl_easyoption * +curl_easy_option_by_name(const char *name); + +CURL_EXTERN const struct curl_easyoption * +curl_easy_option_by_id (CURLoption id); + +CURL_EXTERN const struct curl_easyoption * +curl_easy_option_next(const struct curl_easyoption *prev); + +#ifdef __cplusplus +} /* end of extern "C" */ +#endif +#endif /* CURLINC_OPTIONS_H */ diff --git a/libcurl/curl/stdcheaders.h b/libcurl/curl/stdcheaders.h new file mode 100644 index 0000000..60596c7 --- /dev/null +++ b/libcurl/curl/stdcheaders.h @@ -0,0 +1,33 @@ +#ifndef CURLINC_STDCHEADERS_H +#define CURLINC_STDCHEADERS_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include + +size_t fread(void *, size_t, size_t, FILE *); +size_t fwrite(const void *, size_t, size_t, FILE *); + +int strcasecmp(const char *, const char *); +int strncasecmp(const char *, const char *, size_t); + +#endif /* CURLINC_STDCHEADERS_H */ diff --git a/libcurl/curl/system.h b/libcurl/curl/system.h new file mode 100644 index 0000000..faf8fcf --- /dev/null +++ b/libcurl/curl/system.h @@ -0,0 +1,504 @@ +#ifndef CURLINC_SYSTEM_H +#define CURLINC_SYSTEM_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* + * Try to keep one section per platform, compiler and architecture, otherwise, + * if an existing section is reused for a different one and later on the + * original is adjusted, probably the piggybacking one can be adversely + * changed. + * + * In order to differentiate between platforms/compilers/architectures use + * only compiler built in predefined preprocessor symbols. + * + * curl_off_t + * ---------- + * + * For any given platform/compiler curl_off_t must be typedef'ed to a 64-bit + * wide signed integral data type. The width of this data type must remain + * constant and independent of any possible large file support settings. + * + * As an exception to the above, curl_off_t shall be typedef'ed to a 32-bit + * wide signed integral data type if there is no 64-bit type. + * + * As a general rule, curl_off_t shall not be mapped to off_t. This rule shall + * only be violated if off_t is the only 64-bit data type available and the + * size of off_t is independent of large file support settings. Keep your + * build on the safe side avoiding an off_t gating. If you have a 64-bit + * off_t then take for sure that another 64-bit data type exists, dig deeper + * and you will find it. + * + */ + +#if defined(__DJGPP__) || defined(__GO32__) +# if defined(__DJGPP__) && (__DJGPP__ > 1) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__SALFORDC__) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__BORLANDC__) +# if (__BORLANDC__ < 0x520) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__TURBOC__) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__WATCOMC__) +# if defined(__386__) +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__POCC__) +# if (__POCC__ < 280) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# elif defined(_MSC_VER) +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__LCC__) +# if defined(__e2k__) /* MCST eLbrus C Compiler */ +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# else /* Local (or Little) C Compiler */ +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# endif + +#elif defined(__SYMBIAN32__) +# if defined(__EABI__) /* Treat all ARM compilers equally */ +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__CW32__) +# pragma longlong on +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__VC32__) +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int + +#elif defined(__MWERKS__) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(_WIN32_WCE) +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__MINGW32__) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_WS2TCPIP_H 1 + +#elif defined(__VMS) +# if defined(__VAX) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int + +#elif defined(__OS400__) +# if defined(__ILEC400__) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(__MVS__) +# if defined(__IBMC__) || defined(__IBMCPP__) +# if defined(_ILP32) +# elif defined(_LP64) +# endif +# if defined(_LONG_LONG) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(__370__) +# if defined(__IBMC__) || defined(__IBMCPP__) +# if defined(_ILP32) +# elif defined(_LP64) +# endif +# if defined(_LONG_LONG) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(TPF) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__TINYC__) /* also known as tcc */ +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) /* Oracle Solaris Studio */ +# if !defined(__LP64) && (defined(__ILP32) || \ + defined(__i386) || \ + defined(__sparcv8) || \ + defined(__sparcv8plus)) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__LP64) || \ + defined(__amd64) || defined(__sparcv9) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +#elif defined(__xlc__) /* IBM xlc compiler */ +# if !defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +/* ===================================== */ +/* KEEP MSVC THE PENULTIMATE ENTRY */ +/* ===================================== */ + +#elif defined(_MSC_VER) +# if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64) +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +/* ===================================== */ +/* KEEP GENERIC GCC THE LAST ENTRY */ +/* ===================================== */ + +#elif defined(__GNUC__) && !defined(_SCO_DS) +# if !defined(__LP64__) && \ + (defined(__ILP32__) || defined(__i386__) || defined(__hppa__) || \ + defined(__ppc__) || defined(__powerpc__) || defined(__arm__) || \ + defined(__sparc__) || defined(__mips__) || defined(__sh__) || \ + defined(__XTENSA__) || \ + (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 4) || \ + (defined(__LONG_MAX__) && __LONG_MAX__ == 2147483647L)) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__LP64__) || \ + defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) || \ + defined(__e2k__) || \ + (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 8) || \ + (defined(__LONG_MAX__) && __LONG_MAX__ == 9223372036854775807L) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +#else +/* generic "safe guess" on old 32 bit style */ +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +#endif + +#ifdef _AIX +/* AIX needs */ +#define CURL_PULL_SYS_POLL_H +#endif + + +/* CURL_PULL_WS2TCPIP_H is defined above when inclusion of header file */ +/* ws2tcpip.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_WS2TCPIP_H +# include +# include +# include +#endif + +/* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file */ +/* sys/types.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_TYPES_H +# include +#endif + +/* CURL_PULL_SYS_SOCKET_H is defined above when inclusion of header file */ +/* sys/socket.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_SOCKET_H +# include +#endif + +/* CURL_PULL_SYS_POLL_H is defined above when inclusion of header file */ +/* sys/poll.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_POLL_H +# include +#endif + +/* Data type definition of curl_socklen_t. */ +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T + typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; +#endif + +/* Data type definition of curl_off_t. */ + +#ifdef CURL_TYPEOF_CURL_OFF_T + typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; +#endif + +/* + * CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow + * these to be visible and exported by the external libcurl interface API, + * while also making them visible to the library internals, simply including + * curl_setup.h, without actually needing to include curl.h internally. + * If some day this section would grow big enough, all this should be moved + * to its own header file. + */ + +/* + * Figure out if we can use the ## preprocessor operator, which is supported + * by ISO/ANSI C and C++. Some compilers support it without setting __STDC__ + * or __cplusplus so we need to carefully check for them too. + */ + +#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \ + defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \ + defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \ + defined(__ILEC400__) + /* This compiler is believed to have an ISO compatible preprocessor */ +#define CURL_ISOCPP +#else + /* This compiler is believed NOT to have an ISO compatible preprocessor */ +#undef CURL_ISOCPP +#endif + +/* + * Macros for minimum-width signed and unsigned curl_off_t integer constants. + */ + +#if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551) +# define CURLINC_OFF_T_C_HLPR2(x) x +# define CURLINC_OFF_T_C_HLPR1(x) CURLINC_OFF_T_C_HLPR2(x) +# define CURL_OFF_T_C(Val) CURLINC_OFF_T_C_HLPR1(Val) ## \ + CURLINC_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T) +# define CURL_OFF_TU_C(Val) CURLINC_OFF_T_C_HLPR1(Val) ## \ + CURLINC_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU) +#else +# ifdef CURL_ISOCPP +# define CURLINC_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix +# else +# define CURLINC_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix +# endif +# define CURLINC_OFF_T_C_HLPR1(Val,Suffix) CURLINC_OFF_T_C_HLPR2(Val,Suffix) +# define CURL_OFF_T_C(Val) CURLINC_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T) +# define CURL_OFF_TU_C(Val) CURLINC_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU) +#endif + +#endif /* CURLINC_SYSTEM_H */ diff --git a/libcurl/curl/typecheck-gcc.h b/libcurl/curl/typecheck-gcc.h new file mode 100644 index 0000000..34d0267 --- /dev/null +++ b/libcurl/curl/typecheck-gcc.h @@ -0,0 +1,705 @@ +#ifndef CURLINC_TYPECHECK_GCC_H +#define CURLINC_TYPECHECK_GCC_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* wraps curl_easy_setopt() with typechecking */ + +/* To add a new kind of warning, add an + * if(curlcheck_sometype_option(_curl_opt)) + * if(!curlcheck_sometype(value)) + * _curl_easy_setopt_err_sometype(); + * block and define curlcheck_sometype_option, curlcheck_sometype and + * _curl_easy_setopt_err_sometype below + * + * NOTE: We use two nested 'if' statements here instead of the && operator, in + * order to work around gcc bug #32061. It affects only gcc 4.3.x/4.4.x + * when compiling with -Wlogical-op. + * + * To add an option that uses the same type as an existing option, you'll just + * need to extend the appropriate _curl_*_option macro + */ +#define curl_easy_setopt(handle, option, value) \ + __extension__({ \ + __typeof__(option) _curl_opt = option; \ + if(__builtin_constant_p(_curl_opt)) { \ + if(curlcheck_long_option(_curl_opt)) \ + if(!curlcheck_long(value)) \ + _curl_easy_setopt_err_long(); \ + if(curlcheck_off_t_option(_curl_opt)) \ + if(!curlcheck_off_t(value)) \ + _curl_easy_setopt_err_curl_off_t(); \ + if(curlcheck_string_option(_curl_opt)) \ + if(!curlcheck_string(value)) \ + _curl_easy_setopt_err_string(); \ + if(curlcheck_write_cb_option(_curl_opt)) \ + if(!curlcheck_write_cb(value)) \ + _curl_easy_setopt_err_write_callback(); \ + if((_curl_opt) == CURLOPT_RESOLVER_START_FUNCTION) \ + if(!curlcheck_resolver_start_callback(value)) \ + _curl_easy_setopt_err_resolver_start_callback(); \ + if((_curl_opt) == CURLOPT_READFUNCTION) \ + if(!curlcheck_read_cb(value)) \ + _curl_easy_setopt_err_read_cb(); \ + if((_curl_opt) == CURLOPT_IOCTLFUNCTION) \ + if(!curlcheck_ioctl_cb(value)) \ + _curl_easy_setopt_err_ioctl_cb(); \ + if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION) \ + if(!curlcheck_sockopt_cb(value)) \ + _curl_easy_setopt_err_sockopt_cb(); \ + if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION) \ + if(!curlcheck_opensocket_cb(value)) \ + _curl_easy_setopt_err_opensocket_cb(); \ + if((_curl_opt) == CURLOPT_PROGRESSFUNCTION) \ + if(!curlcheck_progress_cb(value)) \ + _curl_easy_setopt_err_progress_cb(); \ + if((_curl_opt) == CURLOPT_DEBUGFUNCTION) \ + if(!curlcheck_debug_cb(value)) \ + _curl_easy_setopt_err_debug_cb(); \ + if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION) \ + if(!curlcheck_ssl_ctx_cb(value)) \ + _curl_easy_setopt_err_ssl_ctx_cb(); \ + if(curlcheck_conv_cb_option(_curl_opt)) \ + if(!curlcheck_conv_cb(value)) \ + _curl_easy_setopt_err_conv_cb(); \ + if((_curl_opt) == CURLOPT_SEEKFUNCTION) \ + if(!curlcheck_seek_cb(value)) \ + _curl_easy_setopt_err_seek_cb(); \ + if(curlcheck_cb_data_option(_curl_opt)) \ + if(!curlcheck_cb_data(value)) \ + _curl_easy_setopt_err_cb_data(); \ + if((_curl_opt) == CURLOPT_ERRORBUFFER) \ + if(!curlcheck_error_buffer(value)) \ + _curl_easy_setopt_err_error_buffer(); \ + if((_curl_opt) == CURLOPT_STDERR) \ + if(!curlcheck_FILE(value)) \ + _curl_easy_setopt_err_FILE(); \ + if(curlcheck_postfields_option(_curl_opt)) \ + if(!curlcheck_postfields(value)) \ + _curl_easy_setopt_err_postfields(); \ + if((_curl_opt) == CURLOPT_HTTPPOST) \ + if(!curlcheck_arr((value), struct curl_httppost)) \ + _curl_easy_setopt_err_curl_httpost(); \ + if((_curl_opt) == CURLOPT_MIMEPOST) \ + if(!curlcheck_ptr((value), curl_mime)) \ + _curl_easy_setopt_err_curl_mimepost(); \ + if(curlcheck_slist_option(_curl_opt)) \ + if(!curlcheck_arr((value), struct curl_slist)) \ + _curl_easy_setopt_err_curl_slist(); \ + if((_curl_opt) == CURLOPT_SHARE) \ + if(!curlcheck_ptr((value), CURLSH)) \ + _curl_easy_setopt_err_CURLSH(); \ + } \ + curl_easy_setopt(handle, _curl_opt, value); \ + }) + +/* wraps curl_easy_getinfo() with typechecking */ +#define curl_easy_getinfo(handle, info, arg) \ + __extension__({ \ + __typeof__(info) _curl_info = info; \ + if(__builtin_constant_p(_curl_info)) { \ + if(curlcheck_string_info(_curl_info)) \ + if(!curlcheck_arr((arg), char *)) \ + _curl_easy_getinfo_err_string(); \ + if(curlcheck_long_info(_curl_info)) \ + if(!curlcheck_arr((arg), long)) \ + _curl_easy_getinfo_err_long(); \ + if(curlcheck_double_info(_curl_info)) \ + if(!curlcheck_arr((arg), double)) \ + _curl_easy_getinfo_err_double(); \ + if(curlcheck_slist_info(_curl_info)) \ + if(!curlcheck_arr((arg), struct curl_slist *)) \ + _curl_easy_getinfo_err_curl_slist(); \ + if(curlcheck_tlssessioninfo_info(_curl_info)) \ + if(!curlcheck_arr((arg), struct curl_tlssessioninfo *)) \ + _curl_easy_getinfo_err_curl_tlssesssioninfo(); \ + if(curlcheck_certinfo_info(_curl_info)) \ + if(!curlcheck_arr((arg), struct curl_certinfo *)) \ + _curl_easy_getinfo_err_curl_certinfo(); \ + if(curlcheck_socket_info(_curl_info)) \ + if(!curlcheck_arr((arg), curl_socket_t)) \ + _curl_easy_getinfo_err_curl_socket(); \ + if(curlcheck_off_t_info(_curl_info)) \ + if(!curlcheck_arr((arg), curl_off_t)) \ + _curl_easy_getinfo_err_curl_off_t(); \ + } \ + curl_easy_getinfo(handle, _curl_info, arg); \ + }) + +/* + * For now, just make sure that the functions are called with three arguments + */ +#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) +#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) + + +/* the actual warnings, triggered by calling the _curl_easy_setopt_err* + * functions */ + +/* To define a new warning, use _CURL_WARNING(identifier, "message") */ +#define CURLWARNING(id, message) \ + static void __attribute__((__warning__(message))) \ + __attribute__((__unused__)) __attribute__((__noinline__)) \ + id(void) { __asm__(""); } + +CURLWARNING(_curl_easy_setopt_err_long, + "curl_easy_setopt expects a long argument for this option") +CURLWARNING(_curl_easy_setopt_err_curl_off_t, + "curl_easy_setopt expects a curl_off_t argument for this option") +CURLWARNING(_curl_easy_setopt_err_string, + "curl_easy_setopt expects a " + "string ('char *' or char[]) argument for this option" + ) +CURLWARNING(_curl_easy_setopt_err_write_callback, + "curl_easy_setopt expects a curl_write_callback argument for this option") +CURLWARNING(_curl_easy_setopt_err_resolver_start_callback, + "curl_easy_setopt expects a " + "curl_resolver_start_callback argument for this option" + ) +CURLWARNING(_curl_easy_setopt_err_read_cb, + "curl_easy_setopt expects a curl_read_callback argument for this option") +CURLWARNING(_curl_easy_setopt_err_ioctl_cb, + "curl_easy_setopt expects a curl_ioctl_callback argument for this option") +CURLWARNING(_curl_easy_setopt_err_sockopt_cb, + "curl_easy_setopt expects a curl_sockopt_callback argument for this option") +CURLWARNING(_curl_easy_setopt_err_opensocket_cb, + "curl_easy_setopt expects a " + "curl_opensocket_callback argument for this option" + ) +CURLWARNING(_curl_easy_setopt_err_progress_cb, + "curl_easy_setopt expects a curl_progress_callback argument for this option") +CURLWARNING(_curl_easy_setopt_err_debug_cb, + "curl_easy_setopt expects a curl_debug_callback argument for this option") +CURLWARNING(_curl_easy_setopt_err_ssl_ctx_cb, + "curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option") +CURLWARNING(_curl_easy_setopt_err_conv_cb, + "curl_easy_setopt expects a curl_conv_callback argument for this option") +CURLWARNING(_curl_easy_setopt_err_seek_cb, + "curl_easy_setopt expects a curl_seek_callback argument for this option") +CURLWARNING(_curl_easy_setopt_err_cb_data, + "curl_easy_setopt expects a " + "private data pointer as argument for this option") +CURLWARNING(_curl_easy_setopt_err_error_buffer, + "curl_easy_setopt expects a " + "char buffer of CURL_ERROR_SIZE as argument for this option") +CURLWARNING(_curl_easy_setopt_err_FILE, + "curl_easy_setopt expects a 'FILE *' argument for this option") +CURLWARNING(_curl_easy_setopt_err_postfields, + "curl_easy_setopt expects a 'void *' or 'char *' argument for this option") +CURLWARNING(_curl_easy_setopt_err_curl_httpost, + "curl_easy_setopt expects a 'struct curl_httppost *' " + "argument for this option") +CURLWARNING(_curl_easy_setopt_err_curl_mimepost, + "curl_easy_setopt expects a 'curl_mime *' " + "argument for this option") +CURLWARNING(_curl_easy_setopt_err_curl_slist, + "curl_easy_setopt expects a 'struct curl_slist *' argument for this option") +CURLWARNING(_curl_easy_setopt_err_CURLSH, + "curl_easy_setopt expects a CURLSH* argument for this option") + +CURLWARNING(_curl_easy_getinfo_err_string, + "curl_easy_getinfo expects a pointer to 'char *' for this info") +CURLWARNING(_curl_easy_getinfo_err_long, + "curl_easy_getinfo expects a pointer to long for this info") +CURLWARNING(_curl_easy_getinfo_err_double, + "curl_easy_getinfo expects a pointer to double for this info") +CURLWARNING(_curl_easy_getinfo_err_curl_slist, + "curl_easy_getinfo expects a pointer to 'struct curl_slist *' for this info") +CURLWARNING(_curl_easy_getinfo_err_curl_tlssesssioninfo, + "curl_easy_getinfo expects a pointer to " + "'struct curl_tlssessioninfo *' for this info") +CURLWARNING(_curl_easy_getinfo_err_curl_certinfo, + "curl_easy_getinfo expects a pointer to " + "'struct curl_certinfo *' for this info") +CURLWARNING(_curl_easy_getinfo_err_curl_socket, + "curl_easy_getinfo expects a pointer to curl_socket_t for this info") +CURLWARNING(_curl_easy_getinfo_err_curl_off_t, + "curl_easy_getinfo expects a pointer to curl_off_t for this info") + +/* groups of curl_easy_setops options that take the same type of argument */ + +/* To add a new option to one of the groups, just add + * (option) == CURLOPT_SOMETHING + * to the or-expression. If the option takes a long or curl_off_t, you don't + * have to do anything + */ + +/* evaluates to true if option takes a long argument */ +#define curlcheck_long_option(option) \ + (0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT) + +#define curlcheck_off_t_option(option) \ + (((option) > CURLOPTTYPE_OFF_T) && ((option) < CURLOPTTYPE_BLOB)) + +/* evaluates to true if option takes a char* argument */ +#define curlcheck_string_option(option) \ + ((option) == CURLOPT_ABSTRACT_UNIX_SOCKET || \ + (option) == CURLOPT_ACCEPT_ENCODING || \ + (option) == CURLOPT_ALTSVC || \ + (option) == CURLOPT_CAINFO || \ + (option) == CURLOPT_CAPATH || \ + (option) == CURLOPT_COOKIE || \ + (option) == CURLOPT_COOKIEFILE || \ + (option) == CURLOPT_COOKIEJAR || \ + (option) == CURLOPT_COOKIELIST || \ + (option) == CURLOPT_CRLFILE || \ + (option) == CURLOPT_CUSTOMREQUEST || \ + (option) == CURLOPT_DEFAULT_PROTOCOL || \ + (option) == CURLOPT_DNS_INTERFACE || \ + (option) == CURLOPT_DNS_LOCAL_IP4 || \ + (option) == CURLOPT_DNS_LOCAL_IP6 || \ + (option) == CURLOPT_DNS_SERVERS || \ + (option) == CURLOPT_DOH_URL || \ + (option) == CURLOPT_EGDSOCKET || \ + (option) == CURLOPT_FTPPORT || \ + (option) == CURLOPT_FTP_ACCOUNT || \ + (option) == CURLOPT_FTP_ALTERNATIVE_TO_USER || \ + (option) == CURLOPT_HSTS || \ + (option) == CURLOPT_INTERFACE || \ + (option) == CURLOPT_ISSUERCERT || \ + (option) == CURLOPT_KEYPASSWD || \ + (option) == CURLOPT_KRBLEVEL || \ + (option) == CURLOPT_LOGIN_OPTIONS || \ + (option) == CURLOPT_MAIL_AUTH || \ + (option) == CURLOPT_MAIL_FROM || \ + (option) == CURLOPT_NETRC_FILE || \ + (option) == CURLOPT_NOPROXY || \ + (option) == CURLOPT_PASSWORD || \ + (option) == CURLOPT_PINNEDPUBLICKEY || \ + (option) == CURLOPT_PRE_PROXY || \ + (option) == CURLOPT_PROXY || \ + (option) == CURLOPT_PROXYPASSWORD || \ + (option) == CURLOPT_PROXYUSERNAME || \ + (option) == CURLOPT_PROXYUSERPWD || \ + (option) == CURLOPT_PROXY_CAINFO || \ + (option) == CURLOPT_PROXY_CAPATH || \ + (option) == CURLOPT_PROXY_CRLFILE || \ + (option) == CURLOPT_PROXY_ISSUERCERT || \ + (option) == CURLOPT_PROXY_KEYPASSWD || \ + (option) == CURLOPT_PROXY_PINNEDPUBLICKEY || \ + (option) == CURLOPT_PROXY_SERVICE_NAME || \ + (option) == CURLOPT_PROXY_SSLCERT || \ + (option) == CURLOPT_PROXY_SSLCERTTYPE || \ + (option) == CURLOPT_PROXY_SSLKEY || \ + (option) == CURLOPT_PROXY_SSLKEYTYPE || \ + (option) == CURLOPT_PROXY_SSL_CIPHER_LIST || \ + (option) == CURLOPT_PROXY_TLS13_CIPHERS || \ + (option) == CURLOPT_PROXY_TLSAUTH_PASSWORD || \ + (option) == CURLOPT_PROXY_TLSAUTH_TYPE || \ + (option) == CURLOPT_PROXY_TLSAUTH_USERNAME || \ + (option) == CURLOPT_RANDOM_FILE || \ + (option) == CURLOPT_RANGE || \ + (option) == CURLOPT_REFERER || \ + (option) == CURLOPT_REQUEST_TARGET || \ + (option) == CURLOPT_RTSP_SESSION_ID || \ + (option) == CURLOPT_RTSP_STREAM_URI || \ + (option) == CURLOPT_RTSP_TRANSPORT || \ + (option) == CURLOPT_SASL_AUTHZID || \ + (option) == CURLOPT_SERVICE_NAME || \ + (option) == CURLOPT_SOCKS5_GSSAPI_SERVICE || \ + (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 || \ + (option) == CURLOPT_SSH_KNOWNHOSTS || \ + (option) == CURLOPT_SSH_PRIVATE_KEYFILE || \ + (option) == CURLOPT_SSH_PUBLIC_KEYFILE || \ + (option) == CURLOPT_SSLCERT || \ + (option) == CURLOPT_SSLCERTTYPE || \ + (option) == CURLOPT_SSLENGINE || \ + (option) == CURLOPT_SSLKEY || \ + (option) == CURLOPT_SSLKEYTYPE || \ + (option) == CURLOPT_SSL_CIPHER_LIST || \ + (option) == CURLOPT_TLS13_CIPHERS || \ + (option) == CURLOPT_TLSAUTH_PASSWORD || \ + (option) == CURLOPT_TLSAUTH_TYPE || \ + (option) == CURLOPT_TLSAUTH_USERNAME || \ + (option) == CURLOPT_UNIX_SOCKET_PATH || \ + (option) == CURLOPT_URL || \ + (option) == CURLOPT_USERAGENT || \ + (option) == CURLOPT_USERNAME || \ + (option) == CURLOPT_AWS_SIGV4 || \ + (option) == CURLOPT_USERPWD || \ + (option) == CURLOPT_XOAUTH2_BEARER || \ + (option) == CURLOPT_SSL_EC_CURVES || \ + 0) + +/* evaluates to true if option takes a curl_write_callback argument */ +#define curlcheck_write_cb_option(option) \ + ((option) == CURLOPT_HEADERFUNCTION || \ + (option) == CURLOPT_WRITEFUNCTION) + +/* evaluates to true if option takes a curl_conv_callback argument */ +#define curlcheck_conv_cb_option(option) \ + ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION || \ + (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION || \ + (option) == CURLOPT_CONV_FROM_UTF8_FUNCTION) + +/* evaluates to true if option takes a data argument to pass to a callback */ +#define curlcheck_cb_data_option(option) \ + ((option) == CURLOPT_CHUNK_DATA || \ + (option) == CURLOPT_CLOSESOCKETDATA || \ + (option) == CURLOPT_DEBUGDATA || \ + (option) == CURLOPT_FNMATCH_DATA || \ + (option) == CURLOPT_HEADERDATA || \ + (option) == CURLOPT_HSTSREADDATA || \ + (option) == CURLOPT_HSTSWRITEDATA || \ + (option) == CURLOPT_INTERLEAVEDATA || \ + (option) == CURLOPT_IOCTLDATA || \ + (option) == CURLOPT_OPENSOCKETDATA || \ + (option) == CURLOPT_PROGRESSDATA || \ + (option) == CURLOPT_READDATA || \ + (option) == CURLOPT_SEEKDATA || \ + (option) == CURLOPT_SOCKOPTDATA || \ + (option) == CURLOPT_SSH_KEYDATA || \ + (option) == CURLOPT_SSL_CTX_DATA || \ + (option) == CURLOPT_WRITEDATA || \ + (option) == CURLOPT_RESOLVER_START_DATA || \ + (option) == CURLOPT_TRAILERDATA || \ + 0) + +/* evaluates to true if option takes a POST data argument (void* or char*) */ +#define curlcheck_postfields_option(option) \ + ((option) == CURLOPT_POSTFIELDS || \ + (option) == CURLOPT_COPYPOSTFIELDS || \ + 0) + +/* evaluates to true if option takes a struct curl_slist * argument */ +#define curlcheck_slist_option(option) \ + ((option) == CURLOPT_HTTP200ALIASES || \ + (option) == CURLOPT_HTTPHEADER || \ + (option) == CURLOPT_MAIL_RCPT || \ + (option) == CURLOPT_POSTQUOTE || \ + (option) == CURLOPT_PREQUOTE || \ + (option) == CURLOPT_PROXYHEADER || \ + (option) == CURLOPT_QUOTE || \ + (option) == CURLOPT_RESOLVE || \ + (option) == CURLOPT_TELNETOPTIONS || \ + (option) == CURLOPT_CONNECT_TO || \ + 0) + +/* groups of curl_easy_getinfo infos that take the same type of argument */ + +/* evaluates to true if info expects a pointer to char * argument */ +#define curlcheck_string_info(info) \ + (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG && \ + (info) != CURLINFO_PRIVATE) + +/* evaluates to true if info expects a pointer to long argument */ +#define curlcheck_long_info(info) \ + (CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE) + +/* evaluates to true if info expects a pointer to double argument */ +#define curlcheck_double_info(info) \ + (CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST) + +/* true if info expects a pointer to struct curl_slist * argument */ +#define curlcheck_slist_info(info) \ + (((info) == CURLINFO_SSL_ENGINES) || ((info) == CURLINFO_COOKIELIST)) + +/* true if info expects a pointer to struct curl_tlssessioninfo * argument */ +#define curlcheck_tlssessioninfo_info(info) \ + (((info) == CURLINFO_TLS_SSL_PTR) || ((info) == CURLINFO_TLS_SESSION)) + +/* true if info expects a pointer to struct curl_certinfo * argument */ +#define curlcheck_certinfo_info(info) ((info) == CURLINFO_CERTINFO) + +/* true if info expects a pointer to struct curl_socket_t argument */ +#define curlcheck_socket_info(info) \ + (CURLINFO_SOCKET < (info) && (info) < CURLINFO_OFF_T) + +/* true if info expects a pointer to curl_off_t argument */ +#define curlcheck_off_t_info(info) \ + (CURLINFO_OFF_T < (info)) + + +/* typecheck helpers -- check whether given expression has requested type*/ + +/* For pointers, you can use the curlcheck_ptr/curlcheck_arr macros, + * otherwise define a new macro. Search for __builtin_types_compatible_p + * in the GCC manual. + * NOTE: these macros MUST NOT EVALUATE their arguments! The argument is + * the actual expression passed to the curl_easy_setopt macro. This + * means that you can only apply the sizeof and __typeof__ operators, no + * == or whatsoever. + */ + +/* XXX: should evaluate to true if expr is a pointer */ +#define curlcheck_any_ptr(expr) \ + (sizeof(expr) == sizeof(void *)) + +/* evaluates to true if expr is NULL */ +/* XXX: must not evaluate expr, so this check is not accurate */ +#define curlcheck_NULL(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL))) + +/* evaluates to true if expr is type*, const type* or NULL */ +#define curlcheck_ptr(expr, type) \ + (curlcheck_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), type *) || \ + __builtin_types_compatible_p(__typeof__(expr), const type *)) + +/* evaluates to true if expr is one of type[], type*, NULL or const type* */ +#define curlcheck_arr(expr, type) \ + (curlcheck_ptr((expr), type) || \ + __builtin_types_compatible_p(__typeof__(expr), type [])) + +/* evaluates to true if expr is a string */ +#define curlcheck_string(expr) \ + (curlcheck_arr((expr), char) || \ + curlcheck_arr((expr), signed char) || \ + curlcheck_arr((expr), unsigned char)) + +/* evaluates to true if expr is a long (no matter the signedness) + * XXX: for now, int is also accepted (and therefore short and char, which + * are promoted to int when passed to a variadic function) */ +#define curlcheck_long(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), long) || \ + __builtin_types_compatible_p(__typeof__(expr), signed long) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned long) || \ + __builtin_types_compatible_p(__typeof__(expr), int) || \ + __builtin_types_compatible_p(__typeof__(expr), signed int) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned int) || \ + __builtin_types_compatible_p(__typeof__(expr), short) || \ + __builtin_types_compatible_p(__typeof__(expr), signed short) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned short) || \ + __builtin_types_compatible_p(__typeof__(expr), char) || \ + __builtin_types_compatible_p(__typeof__(expr), signed char) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned char)) + +/* evaluates to true if expr is of type curl_off_t */ +#define curlcheck_off_t(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), curl_off_t)) + +/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */ +/* XXX: also check size of an char[] array? */ +#define curlcheck_error_buffer(expr) \ + (curlcheck_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), char *) || \ + __builtin_types_compatible_p(__typeof__(expr), char[])) + +/* evaluates to true if expr is of type (const) void* or (const) FILE* */ +#if 0 +#define curlcheck_cb_data(expr) \ + (curlcheck_ptr((expr), void) || \ + curlcheck_ptr((expr), FILE)) +#else /* be less strict */ +#define curlcheck_cb_data(expr) \ + curlcheck_any_ptr(expr) +#endif + +/* evaluates to true if expr is of type FILE* */ +#define curlcheck_FILE(expr) \ + (curlcheck_NULL(expr) || \ + (__builtin_types_compatible_p(__typeof__(expr), FILE *))) + +/* evaluates to true if expr can be passed as POST data (void* or char*) */ +#define curlcheck_postfields(expr) \ + (curlcheck_ptr((expr), void) || \ + curlcheck_arr((expr), char) || \ + curlcheck_arr((expr), unsigned char)) + +/* helper: __builtin_types_compatible_p distinguishes between functions and + * function pointers, hide it */ +#define curlcheck_cb_compatible(func, type) \ + (__builtin_types_compatible_p(__typeof__(func), type) || \ + __builtin_types_compatible_p(__typeof__(func) *, type)) + +/* evaluates to true if expr is of type curl_resolver_start_callback */ +#define curlcheck_resolver_start_callback(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_resolver_start_callback)) + +/* evaluates to true if expr is of type curl_read_callback or "similar" */ +#define curlcheck_read_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), __typeof__(fread) *) || \ + curlcheck_cb_compatible((expr), curl_read_callback) || \ + curlcheck_cb_compatible((expr), _curl_read_callback1) || \ + curlcheck_cb_compatible((expr), _curl_read_callback2) || \ + curlcheck_cb_compatible((expr), _curl_read_callback3) || \ + curlcheck_cb_compatible((expr), _curl_read_callback4) || \ + curlcheck_cb_compatible((expr), _curl_read_callback5) || \ + curlcheck_cb_compatible((expr), _curl_read_callback6)) +typedef size_t (*_curl_read_callback1)(char *, size_t, size_t, void *); +typedef size_t (*_curl_read_callback2)(char *, size_t, size_t, const void *); +typedef size_t (*_curl_read_callback3)(char *, size_t, size_t, FILE *); +typedef size_t (*_curl_read_callback4)(void *, size_t, size_t, void *); +typedef size_t (*_curl_read_callback5)(void *, size_t, size_t, const void *); +typedef size_t (*_curl_read_callback6)(void *, size_t, size_t, FILE *); + +/* evaluates to true if expr is of type curl_write_callback or "similar" */ +#define curlcheck_write_cb(expr) \ + (curlcheck_read_cb(expr) || \ + curlcheck_cb_compatible((expr), __typeof__(fwrite) *) || \ + curlcheck_cb_compatible((expr), curl_write_callback) || \ + curlcheck_cb_compatible((expr), _curl_write_callback1) || \ + curlcheck_cb_compatible((expr), _curl_write_callback2) || \ + curlcheck_cb_compatible((expr), _curl_write_callback3) || \ + curlcheck_cb_compatible((expr), _curl_write_callback4) || \ + curlcheck_cb_compatible((expr), _curl_write_callback5) || \ + curlcheck_cb_compatible((expr), _curl_write_callback6)) +typedef size_t (*_curl_write_callback1)(const char *, size_t, size_t, void *); +typedef size_t (*_curl_write_callback2)(const char *, size_t, size_t, + const void *); +typedef size_t (*_curl_write_callback3)(const char *, size_t, size_t, FILE *); +typedef size_t (*_curl_write_callback4)(const void *, size_t, size_t, void *); +typedef size_t (*_curl_write_callback5)(const void *, size_t, size_t, + const void *); +typedef size_t (*_curl_write_callback6)(const void *, size_t, size_t, FILE *); + +/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */ +#define curlcheck_ioctl_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_ioctl_callback) || \ + curlcheck_cb_compatible((expr), _curl_ioctl_callback1) || \ + curlcheck_cb_compatible((expr), _curl_ioctl_callback2) || \ + curlcheck_cb_compatible((expr), _curl_ioctl_callback3) || \ + curlcheck_cb_compatible((expr), _curl_ioctl_callback4)) +typedef curlioerr (*_curl_ioctl_callback1)(CURL *, int, void *); +typedef curlioerr (*_curl_ioctl_callback2)(CURL *, int, const void *); +typedef curlioerr (*_curl_ioctl_callback3)(CURL *, curliocmd, void *); +typedef curlioerr (*_curl_ioctl_callback4)(CURL *, curliocmd, const void *); + +/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */ +#define curlcheck_sockopt_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_sockopt_callback) || \ + curlcheck_cb_compatible((expr), _curl_sockopt_callback1) || \ + curlcheck_cb_compatible((expr), _curl_sockopt_callback2)) +typedef int (*_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype); +typedef int (*_curl_sockopt_callback2)(const void *, curl_socket_t, + curlsocktype); + +/* evaluates to true if expr is of type curl_opensocket_callback or + "similar" */ +#define curlcheck_opensocket_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_opensocket_callback) || \ + curlcheck_cb_compatible((expr), _curl_opensocket_callback1) || \ + curlcheck_cb_compatible((expr), _curl_opensocket_callback2) || \ + curlcheck_cb_compatible((expr), _curl_opensocket_callback3) || \ + curlcheck_cb_compatible((expr), _curl_opensocket_callback4)) +typedef curl_socket_t (*_curl_opensocket_callback1) + (void *, curlsocktype, struct curl_sockaddr *); +typedef curl_socket_t (*_curl_opensocket_callback2) + (void *, curlsocktype, const struct curl_sockaddr *); +typedef curl_socket_t (*_curl_opensocket_callback3) + (const void *, curlsocktype, struct curl_sockaddr *); +typedef curl_socket_t (*_curl_opensocket_callback4) + (const void *, curlsocktype, const struct curl_sockaddr *); + +/* evaluates to true if expr is of type curl_progress_callback or "similar" */ +#define curlcheck_progress_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_progress_callback) || \ + curlcheck_cb_compatible((expr), _curl_progress_callback1) || \ + curlcheck_cb_compatible((expr), _curl_progress_callback2)) +typedef int (*_curl_progress_callback1)(void *, + double, double, double, double); +typedef int (*_curl_progress_callback2)(const void *, + double, double, double, double); + +/* evaluates to true if expr is of type curl_debug_callback or "similar" */ +#define curlcheck_debug_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_debug_callback) || \ + curlcheck_cb_compatible((expr), _curl_debug_callback1) || \ + curlcheck_cb_compatible((expr), _curl_debug_callback2) || \ + curlcheck_cb_compatible((expr), _curl_debug_callback3) || \ + curlcheck_cb_compatible((expr), _curl_debug_callback4) || \ + curlcheck_cb_compatible((expr), _curl_debug_callback5) || \ + curlcheck_cb_compatible((expr), _curl_debug_callback6) || \ + curlcheck_cb_compatible((expr), _curl_debug_callback7) || \ + curlcheck_cb_compatible((expr), _curl_debug_callback8)) +typedef int (*_curl_debug_callback1) (CURL *, + curl_infotype, char *, size_t, void *); +typedef int (*_curl_debug_callback2) (CURL *, + curl_infotype, char *, size_t, const void *); +typedef int (*_curl_debug_callback3) (CURL *, + curl_infotype, const char *, size_t, void *); +typedef int (*_curl_debug_callback4) (CURL *, + curl_infotype, const char *, size_t, const void *); +typedef int (*_curl_debug_callback5) (CURL *, + curl_infotype, unsigned char *, size_t, void *); +typedef int (*_curl_debug_callback6) (CURL *, + curl_infotype, unsigned char *, size_t, const void *); +typedef int (*_curl_debug_callback7) (CURL *, + curl_infotype, const unsigned char *, size_t, void *); +typedef int (*_curl_debug_callback8) (CURL *, + curl_infotype, const unsigned char *, size_t, const void *); + +/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */ +/* this is getting even messier... */ +#define curlcheck_ssl_ctx_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_ssl_ctx_callback) || \ + curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback1) || \ + curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback2) || \ + curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback3) || \ + curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback4) || \ + curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback5) || \ + curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback6) || \ + curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback7) || \ + curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback8)) +typedef CURLcode (*_curl_ssl_ctx_callback1)(CURL *, void *, void *); +typedef CURLcode (*_curl_ssl_ctx_callback2)(CURL *, void *, const void *); +typedef CURLcode (*_curl_ssl_ctx_callback3)(CURL *, const void *, void *); +typedef CURLcode (*_curl_ssl_ctx_callback4)(CURL *, const void *, + const void *); +#ifdef HEADER_SSL_H +/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX + * this will of course break if we're included before OpenSSL headers... + */ +typedef CURLcode (*_curl_ssl_ctx_callback5)(CURL *, SSL_CTX *, void *); +typedef CURLcode (*_curl_ssl_ctx_callback6)(CURL *, SSL_CTX *, const void *); +typedef CURLcode (*_curl_ssl_ctx_callback7)(CURL *, const SSL_CTX *, void *); +typedef CURLcode (*_curl_ssl_ctx_callback8)(CURL *, const SSL_CTX *, + const void *); +#else +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback6; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback7; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8; +#endif + +/* evaluates to true if expr is of type curl_conv_callback or "similar" */ +#define curlcheck_conv_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_conv_callback) || \ + curlcheck_cb_compatible((expr), _curl_conv_callback1) || \ + curlcheck_cb_compatible((expr), _curl_conv_callback2) || \ + curlcheck_cb_compatible((expr), _curl_conv_callback3) || \ + curlcheck_cb_compatible((expr), _curl_conv_callback4)) +typedef CURLcode (*_curl_conv_callback1)(char *, size_t length); +typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length); +typedef CURLcode (*_curl_conv_callback3)(void *, size_t length); +typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length); + +/* evaluates to true if expr is of type curl_seek_callback or "similar" */ +#define curlcheck_seek_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_seek_callback) || \ + curlcheck_cb_compatible((expr), _curl_seek_callback1) || \ + curlcheck_cb_compatible((expr), _curl_seek_callback2)) +typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int); +typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int); + + +#endif /* CURLINC_TYPECHECK_GCC_H */ diff --git a/libcurl/curl/urlapi.h b/libcurl/curl/urlapi.h new file mode 100644 index 0000000..1d70880 --- /dev/null +++ b/libcurl/curl/urlapi.h @@ -0,0 +1,126 @@ +#ifndef CURLINC_URLAPI_H +#define CURLINC_URLAPI_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 2018 - 2021, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include "curl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* the error codes for the URL API */ +typedef enum { + CURLUE_OK, + CURLUE_BAD_HANDLE, /* 1 */ + CURLUE_BAD_PARTPOINTER, /* 2 */ + CURLUE_MALFORMED_INPUT, /* 3 */ + CURLUE_BAD_PORT_NUMBER, /* 4 */ + CURLUE_UNSUPPORTED_SCHEME, /* 5 */ + CURLUE_URLDECODE, /* 6 */ + CURLUE_OUT_OF_MEMORY, /* 7 */ + CURLUE_USER_NOT_ALLOWED, /* 8 */ + CURLUE_UNKNOWN_PART, /* 9 */ + CURLUE_NO_SCHEME, /* 10 */ + CURLUE_NO_USER, /* 11 */ + CURLUE_NO_PASSWORD, /* 12 */ + CURLUE_NO_OPTIONS, /* 13 */ + CURLUE_NO_HOST, /* 14 */ + CURLUE_NO_PORT, /* 15 */ + CURLUE_NO_QUERY, /* 16 */ + CURLUE_NO_FRAGMENT /* 17 */ +} CURLUcode; + +typedef enum { + CURLUPART_URL, + CURLUPART_SCHEME, + CURLUPART_USER, + CURLUPART_PASSWORD, + CURLUPART_OPTIONS, + CURLUPART_HOST, + CURLUPART_PORT, + CURLUPART_PATH, + CURLUPART_QUERY, + CURLUPART_FRAGMENT, + CURLUPART_ZONEID /* added in 7.65.0 */ +} CURLUPart; + +#define CURLU_DEFAULT_PORT (1<<0) /* return default port number */ +#define CURLU_NO_DEFAULT_PORT (1<<1) /* act as if no port number was set, + if the port number matches the + default for the scheme */ +#define CURLU_DEFAULT_SCHEME (1<<2) /* return default scheme if + missing */ +#define CURLU_NON_SUPPORT_SCHEME (1<<3) /* allow non-supported scheme */ +#define CURLU_PATH_AS_IS (1<<4) /* leave dot sequences */ +#define CURLU_DISALLOW_USER (1<<5) /* no user+password allowed */ +#define CURLU_URLDECODE (1<<6) /* URL decode on get */ +#define CURLU_URLENCODE (1<<7) /* URL encode on set */ +#define CURLU_APPENDQUERY (1<<8) /* append a form style part */ +#define CURLU_GUESS_SCHEME (1<<9) /* legacy curl-style guessing */ +#define CURLU_NO_AUTHORITY (1<<10) /* Allow empty authority when the + scheme is unknown. */ +#define CURLU_ALLOW_SPACE (1<<11) /* Allow spaces in the URL */ + +typedef struct Curl_URL CURLU; + +/* + * curl_url() creates a new CURLU handle and returns a pointer to it. + * Must be freed with curl_url_cleanup(). + */ +CURL_EXTERN CURLU *curl_url(void); + +/* + * curl_url_cleanup() frees the CURLU handle and related resources used for + * the URL parsing. It will not free strings previously returned with the URL + * API. + */ +CURL_EXTERN void curl_url_cleanup(CURLU *handle); + +/* + * curl_url_dup() duplicates a CURLU handle and returns a new copy. The new + * handle must also be freed with curl_url_cleanup(). + */ +CURL_EXTERN CURLU *curl_url_dup(CURLU *in); + +/* + * curl_url_get() extracts a specific part of the URL from a CURLU + * handle. Returns error code. The returned pointer MUST be freed with + * curl_free() afterwards. + */ +CURL_EXTERN CURLUcode curl_url_get(CURLU *handle, CURLUPart what, + char **part, unsigned int flags); + +/* + * curl_url_set() sets a specific part of the URL in a CURLU handle. Returns + * error code. The passed in string will be copied. Passing a NULL instead of + * a part string, clears that part. + */ +CURL_EXTERN CURLUcode curl_url_set(CURLU *handle, CURLUPart what, + const char *part, unsigned int flags); + + +#ifdef __cplusplus +} /* end of extern "C" */ +#endif + +#endif /* CURLINC_URLAPI_H */ diff --git a/libcurl/libcurl.def b/libcurl/libcurl.def new file mode 100644 index 0000000..cdc328f --- /dev/null +++ b/libcurl/libcurl.def @@ -0,0 +1,105 @@ +LIBRARY LIBCURL +EXPORTS +curl_dbg_accept +curl_dbg_calloc +curl_dbg_fclose +curl_dbg_fdopen +curl_dbg_fopen +curl_dbg_free +curl_dbg_log +curl_dbg_malloc +curl_dbg_mark_sclose +curl_dbg_memdebug +curl_dbg_memlimit +curl_dbg_realloc +curl_dbg_recv +curl_dbg_sclose +curl_dbg_send +curl_dbg_socket +curl_dbg_strdup +curl_easy_cleanup +curl_easy_duphandle +curl_easy_escape +curl_easy_getinfo +curl_easy_init +curl_easy_option_by_id +curl_easy_option_by_name +curl_easy_option_next +curl_easy_pause +curl_easy_perform +curl_easy_perform_ev +curl_easy_recv +curl_easy_reset +curl_easy_send +curl_easy_setopt +curl_easy_strerror +curl_easy_unescape +curl_easy_upkeep +curl_escape +curl_formadd +curl_formfree +curl_formget +curl_free +curl_getdate +curl_getenv +curl_global_cleanup +curl_global_init +curl_global_init_mem +curl_global_sslset +curl_maprintf +curl_mfprintf +curl_mime_addpart +curl_mime_data +curl_mime_data_cb +curl_mime_encoder +curl_mime_filedata +curl_mime_filename +curl_mime_free +curl_mime_headers +curl_mime_init +curl_mime_name +curl_mime_subparts +curl_mime_type +curl_mprintf +curl_msnprintf +curl_msprintf +curl_multi_add_handle +curl_multi_assign +curl_multi_cleanup +curl_multi_fdset +curl_multi_info_read +curl_multi_init +curl_multi_perform +curl_multi_poll +curl_multi_remove_handle +curl_multi_setopt +curl_multi_socket +curl_multi_socket_action +curl_multi_socket_all +curl_multi_strerror +curl_multi_timeout +curl_multi_wait +curl_multi_wakeup +curl_mvaprintf +curl_mvfprintf +curl_mvprintf +curl_mvsnprintf +curl_mvsprintf +curl_pushheader_byname +curl_pushheader_bynum +curl_share_cleanup +curl_share_init +curl_share_setopt +curl_share_strerror +curl_slist_append +curl_slist_free_all +curl_strequal +curl_strnequal +curl_unescape +curl_url +curl_url_cleanup +curl_url_dup +curl_url_get +curl_url_set +curl_version +curl_version_info diff --git a/libcurl/libcurl.lib b/libcurl/libcurl.lib new file mode 100644 index 0000000000000000000000000000000000000000..889ecbc38f1778bc19ea801c87452a4b2a6af376 GIT binary patch literal 23156 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 0 ) + { + for (uint16_t i=0; i.conf ), disabling them.\n"); + config.tachi_scorehook = false; + config.tachi_rivals = false; + } + } + + if (config.tachi_scorehook) + { + patch_tachi_scorehook(g_game_dll_fn, config.pfree, config.hidden_is_offset, config.tachi_scorehook_skip_omni); + } + + if (config.tachi_rivals) + { + //must be called after scorehook + patch_tachi_rivals(g_game_dll_fn, config.tachi_scorehook); + } + if (config.time_rate) patch_get_time(config.time_rate/100.); diff --git a/popnhax/tachi.cc b/popnhax/tachi.cc new file mode 100644 index 0000000..0966524 --- /dev/null +++ b/popnhax/tachi.cc @@ -0,0 +1,1202 @@ +#include +#include +#include +#include +#include + +#include + +#include "util/jsmn.h" +#include "util/jsmn-find.h" + +#include "util/search.h" + +#include "util/log.h" +#include "util/patch.h" + +#include "popnhax/custom_categs.h" + +#include "libcurl/curl/curl.h" + +#include "minhook/hde32.h" +#include "minhook/include/MinHook.h" + +#define DEBUG_CURL 0 + +#if DEBUG_CURL == 1 +FILE *g_curl_log_fp; +#define CURL_PRINT(...) do { \ +if (g_curl_log_fp != NULL) { \ +fprintf(g_curl_log_fp, __VA_ARGS__); \ +fflush(g_curl_log_fp);\ + }\ +fprintf(stderr, __VA_ARGS__); \ +} while (0) +#else +#define CURL_PRINT(...) do { \ +fprintf(stderr, __VA_ARGS__); \ +} while (0) +#endif + +#define MAX_RIVALS 4 + +#define SCORE_TABLE_HEAP 1 +#define SCORE_TABLE_TYPE struct ScoreHashtable +#define SCORE_TABLE_BUCKET struct ScoreBucket +#define SCORE_TABLE_FREE_KEY(key) free(key) +#define SCORE_TABLE_HASH(key, hash) chash_string_hash(key, hash) +#define SCORE_TABLE_FREE_VALUE(value) free(value) +#define SCORE_TABLE_COMPARE(cmp_a, cmp_b) chash_string_compare(cmp_a, cmp_b) +#define SCORE_TABLE_INIT(bucket, _key, _value) chash_default_init(bucket, _key, _value) + +#pragma pack(1) +typedef struct score_info_s { + uint32_t score; + uint16_t gauge; + uint16_t unk; + uint32_t max_combo; + uint16_t nb_cool; + uint16_t nb_great; + uint16_t nb_good; + uint16_t nb_bad; + uint32_t padding1; + uint16_t nb_fast; + uint16_t nb_slow; + uint32_t unk2; + uint32_t unk3; + uint8_t clear_type; + uint8_t clear_rank; +} score_info_t; + +#pragma pack(1) +typedef struct song_info_s { + uint16_t music_id; + uint8_t sheet_id; + uint8_t sheet_id2; + uint32_t unk; + uint16_t unk2; + uint8_t hispeed; // c'est x10.. va de 0x0A à 0x64 pour 1.0 à 10.0 + uint8_t unk3; + uint8_t popkun; //0: normal, 1:beat, 2:you, 3:rival + uint8_t hidden; // on/off + int16_t hidden_value; + uint8_t sudden; + uint8_t padding; + int16_t sudden_value; + uint8_t random; // 0:non 1:mirror 2:random 3: srandom + uint8_t judge; + uint8_t gauge_type; //0 normal 1: easy 2: hard 3: danger + /* + uint8_t unk; + uint8_t ojama1; + uint8_t ojama2; + + uint8_t unk; + uint8_t unk; + uint8_t ojama1_state; + uint8_t ojama2_state; + + uint8_t guidese; + uint8_t lift_state; + int16_t lift; + */ +} song_info_t; + +#pragma pack(1) +typedef struct rival_info_s { + int16_t no; // rival index [0;3] + char g_pm_id[13]; // friendid + char name[13]; // username, 6 unicode or 12 ascii + int16_t chara_num; + int8_t is_open; // always 1? + int8_t padding; // 00 +} rival_info_t; + +#pragma pack(1) +typedef struct rival_score_s { + uint32_t music_num; + uint32_t sheet_num; + uint32_t score; + uint32_t clear_rank; + uint32_t clear_type; +} rival_score_t; + +struct ScoreBucket { + char *k; + rival_score_t *v; + int state; +}; + +struct ScoreHashtable { + int size; + int capacity; + struct ScoreBucket *fields; +}; + +struct MemoryStruct { + char *memory; + size_t size; +}; + +bool g_skip_omni = false; + +struct ScoreHashtable *g_score_hashtable = NULL; +rival_score_t *g_rival_score_current = NULL; +int g_rival_current_idx = 0; +int g_rival_score_count = 0; + +/* will be loaded from file */ +char g_api_key[64] = {0}; +char g_base_url[128] = {0}; +char g_import_url[128] = {0}; +char g_status_url[128] = {0}; +char g_users_url_prefix[128] = {0}; +char g_rivals_url[128] = {0}; +char g_pbs_url_suffix[128] = {0}; + +char g_rivals[5][32]; //to store usernames + +void (*write_rival_score)(); +uint32_t* (*get_rivals_ptr)(); +uint32_t g_rival_entry_size; +uint32_t g_rival_count_offset; +rival_info_t g_curr_rival_info; +rival_score_t g_curr_rival_score; +uint32_t g_curr_rival_score_count = 1; +uint32_t g_rival_count = 1; + +struct MemoryStruct g_curl_data; +score_info_t *g_score_info; +song_info_t *g_song_info; +uint32_t *g_song_info_zone; +uint32_t g_playerdata_zone_addr; //pointer to the playerdata memory zone (offset 0x08 is popn friend ID as ascii (12 char long), offset 0x44 is rival count, offset 0x1A5 is "is logged in" flag) +uint16_t g_stage_offset = 0x504; // 0x508 in later games, overwritten when setting up the patches +uint32_t g_need_conf_load = 1; +uint32_t g_hidden_is_offset = 0; // mask "hidden" value behavior in score send + +const char *g_clear_medal[] = +{ + "none", //shouldn't happen + "failedCircle", //1 + "failedDiamond", //2 + "failedStar", //3 + "easyClear", //4 + "clearCircle", //5 + "clearDiamond", //6 + "clearStar", //7 + "fullComboCircle", //8 + "fullComboDiamond", //9 + "fullComboStar", //A + "perfect" //B +}; + +const char *g_random_type[] = +{ + "NONRAN", + "MIRROR", + "RANDOM", + "S-RANDOM" +}; + +const char *g_gauge_type[] = +{ + "NORMAL", + "EASY", + "HARD", + "DANGER" +}; + +const char *g_difficulty[] = +{ + "Easy", + "Normal", + "Hyper", + "EX" +}; + +/* curl callback function */ +static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) +{ + size_t realsize = size * nmemb; + struct MemoryStruct *mem = (struct MemoryStruct *)userp; + + char *ptr = (char*)realloc(mem->memory, mem->size + realsize + 1); + if(!ptr) { + /* out of memory! */ + CURL_PRINT("[tachi] (WriteMemoryCallback) not enough memory (realloc returned NULL)\n"); + return 0; + } + + mem->memory = ptr; + memcpy(&(mem->memory[mem->size]), contents, realsize); + mem->size += realsize; + mem->memory[mem->size] = 0; + + return realsize; +} + +rival_info_t g_rival_data = {.no=0,.g_pm_id={'1','2','3','4','1','2','3','4','1','2','3','4','\0'},.name={'Y','T','B','N','\0'},.chara_num=5555,.is_open=1,.padding=0}; +rival_info_t *g_rival_current = NULL; + +// make g_rival_current point to the next entry so that the asm hook can inject it +// return false when the last rival has been retrieved +bool get_next_rival(){ + static uint32_t idx = 0; + if ( g_rival_current == NULL ) // need reinit + { + idx = 0; + } + if ( idx >= g_rival_count ) + { + //end reached + g_rival_current = NULL; + idx = 0; + } + sprintf( g_rival_data.name, "%.*s", 12, g_rivals[idx]); + + g_rival_current = &g_rival_data; + idx++; //for next call + return true; +} + + +// make g_rival_score_current point to the next hashmap entry so that the asm hook can inject it +// return false when the last score has been retrieved +bool get_next_score(){ + static int idx = 0; + if ( g_rival_score_current == NULL ) // need reinit + { + idx = 0; + } + + while ( g_score_hashtable->fields[idx].state != CHASH_FILLED ) + { + idx++; + if ( idx >= g_score_hashtable->capacity ) + { + //end reached + chash_free(g_score_hashtable, SCORE_TABLE); + g_rival_score_current = NULL; + return false; + } + } + + g_rival_score_current = g_score_hashtable->fields[idx].v; + idx++; //for next call + return true; +} + +/* debug function, not used by the hook */ +void iterate_hashtable(){ + g_rival_score_current = NULL; + int count = 0; + while ( get_next_score() ) + { + printf("music_num = %u\nsheet_num = %u\nscore = %u\nclear_type = %u\nclear_rank = %u\n\n----\n", g_rival_score_current->music_num, g_rival_score_current->sheet_num, g_rival_score_current->score, g_rival_score_current->clear_type, g_rival_score_current->clear_rank); + count++; + } + fprintf(stderr,"retrieved %d values in hashmap\n", count); +} + +// parse curl-retrieved json and build the score hashmap +int parse_rival_pbs(){ + int r = 0; + (void)r; + jsmn_parser parser; + jsmntok_t *toks = NULL; + jsmnf_pair *f; + + unsigned num_tokens = 0; + uint32_t score_entries = 0; + uint32_t chart_entries = 0; + + char * const pbs_path[] = { (char*)"body", (char*)"pbs" }; + char * const chartID_path[] = { (char*)"chartID" }; + char * const score_path[] = { (char*)"scoreData", (char*)"score" }; + char * const clearMedal_path[] = { (char*)"scoreData", (char*)"enumIndexes", (char*)"clearMedal" }; + char * const grade_path[] = { (char*)"scoreData", (char*)"enumIndexes", (char*)"grade" }; + + char * const charts_path[] = {(char*) "body", (char*)"charts" }; + char * const inGameID_path[] = { (char*)"data", (char*)"inGameID" }; + char * const difficulty_path[] = { (char*)"difficulty" }; + char *chartID_str = NULL; + + char* js = g_curl_data.memory; + int jslen = g_curl_data.size; + + if ( js == NULL ) + { + CURL_PRINT("[tachi] (parse_rival_pbs) no curl data to parse\n"); + return false; + } + jsmn_init(&parser); + r = jsmn_parse_auto(&parser, js, jslen, &toks, &num_tokens); + + /* populate jsmnf_pairs with the jsmn tokens */ + jsmnf_loader loader; + jsmnf_pair *pairs = NULL; + unsigned num_pairs = 0; + + jsmnf_init(&loader); + r = jsmnf_load_auto(&loader, js, toks, num_tokens, &pairs, &num_pairs); + + /* prepare hashtable */ + if ( g_score_hashtable != NULL ) + { + chash_free(g_score_hashtable, SCORE_TABLE); + } + g_rival_score_current = NULL; + g_rival_score_count = 0; + g_score_hashtable = chash_init(g_score_hashtable, SCORE_TABLE); + + /* first part, pbs */ + if ((f = jsmnf_find_path(pairs, js, pbs_path, sizeof(pbs_path) / sizeof *pbs_path))) + { + score_entries = f->size; + for (int i = 0; i < f->size; ++i) + { + rival_score_t *rival_score = (rival_score_t *)malloc(sizeof(rival_score_t)); + + jsmnf_pair *g = &f->fields[i]; + if ((g = jsmnf_find_path(g, js, clearMedal_path, sizeof(clearMedal_path) / sizeof *clearMedal_path))) { + rival_score->clear_type = strtol(js + g->v.pos, NULL, 10) + 1; + } + g = &f->fields[i]; + if ((g = jsmnf_find_path(g, js, grade_path, sizeof(grade_path) / sizeof *grade_path))) { + rival_score->clear_rank = strtol(js + g->v.pos, NULL, 10) + 1; + + } + g = &f->fields[i]; + if ((g = jsmnf_find_path(g, js, score_path, sizeof(score_path) / sizeof *score_path))) { + rival_score->score = strtol(js + g->v.pos, NULL, 10); + } + g = &f->fields[i]; + if ((g = jsmnf_find_path(g, js, chartID_path, sizeof(chartID_path) / sizeof *chartID_path))) { + chartID_str = (char*)malloc((int)g->v.len+1); + sprintf(chartID_str, "%.*s", (int)g->v.len, js + g->v.pos); + } + chash_assign(g_score_hashtable, chartID_str, rival_score, SCORE_TABLE); + } + } + + /* find chartID in body.charts.n.chartID to retrieve body.charts.n.data.inGameID and body.charts.n.difficulty */ + if ((f = jsmnf_find_path(pairs, js, charts_path, sizeof(charts_path) / sizeof *charts_path))) { + chart_entries = f->size; + if ( score_entries != chart_entries ) + CURL_PRINT("WARNING: found %u score entries and %u chart entries\n", score_entries, chart_entries); + + int entries=0; + for (int i = 0; i < f->size; ++i) + { + jsmnf_pair *g = &f->fields[i]; + if ((g = jsmnf_find_path(g, js, chartID_path, sizeof(chartID_path) / sizeof *chartID_path))) { + chartID_str = (char*)malloc((int)g->v.len+1); + sprintf(chartID_str, "%.*s", (int)g->v.len, js + g->v.pos); + } + + rival_score_t *value; + chash_lookup(g_score_hashtable, chartID_str, value, SCORE_TABLE); + + g = &f->fields[i]; + if ((g = jsmnf_find_path(g, js, inGameID_path, sizeof(inGameID_path) / sizeof *inGameID_path))) { + value->music_num = strtol(js + g->v.pos, NULL, 10); + } + g = &f->fields[i]; + if ((g = jsmnf_find_path(g, js, difficulty_path, sizeof(difficulty_path) / sizeof *difficulty_path))) + { + /* filter on 2nd char since E is common to Easy and EX */ + switch ( (js + g->v.pos)[1] ) + { + case 'o': //Normal + case 'O': + value->sheet_num = 1; + break; + case 'y': //Hyper + case 'Y': + value->sheet_num = 2; + break; + case 'X': //EX + case 'x': + value->sheet_num = 3; + break; + case 'a': //Easy + case 'A': + default: + value->sheet_num = 0; + break; + } + } + entries++; + } + CURL_PRINT("[%s] parsed %d scores\n", g_rivals[g_rival_current_idx], entries); + g_rival_score_count = entries; + } + + return true; +} + +/* curl callback */ +static size_t parse_rivals(void *ptr, size_t size, size_t nmemb, void *data) +{ + char *match = strstr((char*)ptr, "\"username\":\""); + while (match!= NULL && g_rival_count < MAX_RIVALS) + { + char *match_username = match+strlen("\"username\":\""); + strncpy( g_rivals[g_rival_count], match_username, strchr(match_username, '"')-match_username); + g_rivals[g_rival_count][strchr(match_username, '"')-match_username] = '\0'; + ptr = match+1; + match = strstr((char*)ptr, "\"username\":\""); + g_rival_count++; + }; + if (match != NULL) + CURL_PRINT("WARNING: pop'n only supports %d rivals, skipping the rest\n", MAX_RIVALS); + + return size*nmemb; +} + +bool tachi_get_status() +{ + CURL *curl = curl_easy_init(); + if(!curl) + return false; + + curl_easy_setopt(curl, CURLOPT_URL, g_status_url); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); + + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&g_curl_data); + CURLcode res = curl_easy_perform(curl); + curl_easy_cleanup(curl); + return (res == CURLE_OK); +} + +static char *load_whole_file(char *filename, long *p_fsize) +{ + long fsize; + char *str; + FILE *f; + + f = fopen(filename, "rb"); + if ( f == NULL ) + { + CURL_PRINT("[tachi] (load_whole_file) cannot open file\n"); + return NULL; + } + + fseek(f, 0, SEEK_END); + fsize = ftell(f); + fseek(f, 0, SEEK_SET); + + str = (char*) malloc(fsize + 1); + + str[fsize] = '\0'; + fread(str, 1, fsize, f); + + fclose(f); + + if (p_fsize) *p_fsize = fsize; + + return str; +} + +bool load_conf(char *friendid) +{ + char filename[30]; + FILE *conf = NULL; + if ( strlen(friendid) != 0 ) + { + sprintf(filename, "_tachi.%s.conf", friendid); + conf = fopen(filename, "r"); + } + + if ( conf == NULL ) + { + sprintf(filename, "_tachi.default.conf"); + conf = fopen(filename, "r"); + } + + if ( conf == NULL ) + { + CURL_PRINT("[tachi] no config file found\n"); + return false; + } + + CURL_PRINT("[tachi] using file %s\n", filename); + + int r; + jsmn_parser parser; + jsmntok_t *toks = NULL; + unsigned num_tokens = 0; + + char* js = load_whole_file(filename, NULL); + if ( js == NULL ) + { + CURL_PRINT("[tachi] cannot open config file\n"); + return false; + } + jsmn_init(&parser); + r = jsmn_parse_auto(&parser, js, strlen(js), &toks, &num_tokens); + if (r <= 0) + { + CURL_PRINT("[tachi] couldn't parse config file\n"); + return false; + } + + // populate jsmnf_pairs with the jsmn tokens + jsmnf_loader loader; + jsmnf_pair *pairs = NULL; + unsigned num_pairs = 0; + + jsmnf_init(&loader); + r = jsmnf_load_auto(&loader, js, toks, num_tokens, &pairs, &num_pairs); + if (r <= 0) + { + CURL_PRINT("[tachi] couldn't parse config file\n"); + return false; + } + + char base[64]; + bool has_api = false; + bool missing_param = false; + jsmnf_pair *f; + + if ((f = jsmnf_find(pairs, js, "key", strlen("key")))) { + has_api = true; + sprintf(g_api_key, "%.*s", (int)f->v.len, js + f->v.pos); + } else { + missing_param = true; + } + if ((f = jsmnf_find(pairs, js, "base", strlen("base")))) { + sprintf(base, "%.*s", (int)f->v.len, js + f->v.pos); + } else { + CURL_PRINT("[tachi] 'base' param not found\n"); + missing_param = true; + } + + if ( missing_param ) + { + if ( has_api && (f = jsmnf_find(pairs, js, "url", strlen("url")))) { + sprintf(g_import_url, "%.*s", (int)f->v.len, js + f->v.pos); + } else { + CURL_PRINT("[tachi] 'url' param not found\n"); + CURL_PRINT("[tachi] missing field in config file. please download a proper config file for your tachi account.\n"); + return false; + } + + int len = strstr(g_import_url+strlen("https://"), "/") - g_import_url; + sprintf(base, "%.*s", len, g_import_url); + CURL_PRINT("[tachi] using legacy mode (extracted base '%s' from 'url' param), please update your config file.\n", base); + } + + sprintf(g_import_url, "%s%s", base, "/ir/direct-manual/import"); + sprintf(g_status_url, "%s%s", base, "/api/v1/status"); + sprintf(g_users_url_prefix, "%s%s", base, "/api/v1/users"); + sprintf(g_rivals_url, "%s%s", base, "/api/v1/users/me/games/popn/9B/rivals"); + sprintf(g_pbs_url_suffix, "%s", "/games/popn/9B/pbs/all"); + + return true; +} + +bool load_profile_if_needed() +{ + if ( g_need_conf_load ) + { + /* retrieve friend ID and open config file */ + char *friendid = (char*)(*(uint32_t*)g_playerdata_zone_addr+0x08); + if (!load_conf(friendid)) + { + CURL_PRINT("[tachi] failed to parse config\n"); + return false; + } + + if ( g_curl_data.memory == NULL ) + { + g_curl_data.memory = (char*)malloc(1); /* grown as needed by realloc above */ + g_curl_data.size = 0; + } + + //CURL_PRINT("[profile info]\nfriend_id = %s\napi_key = %s\nimport url = %s\nstatus url = %s\nrivals url = %s\npbs url = %s/%s%s\n", friendid, g_api_key, g_import_url, g_status_url, g_rivals_url, g_users_url_prefix, "", g_pbs_url_suffix); + + if (!tachi_get_status() || g_curl_data.memory == NULL ) + { + CURL_PRINT("[tachi] ERROR: status check request failed (server down?)\n"); + return false; + } + + if ( strstr(g_curl_data.memory, "\"success\":true") != NULL ) + { + CURL_PRINT("[tachi] status check: OK\n"); + } + else + { + CURL_PRINT("[tachi] WARNING: status check failed (got success=false)\n"); + CURL_PRINT("%s\n", g_curl_data.memory); + } + g_need_conf_load = 0; + + if ( g_curl_data.memory != NULL ) + { + free(g_curl_data.memory); + g_curl_data.memory = NULL; + g_curl_data.size = 0; + } + } + + return true; +} + +bool tachi_send_score() +{ + char score_json[1024]; + + /* retrieve song id memory zone */ + uint8_t stage_number = *(uint8_t*)((uint8_t*)g_song_info_zone+0x0E); + uint32_t *song_info = (uint32_t*)((uint32_t)g_song_info_zone+g_stage_offset*stage_number); + g_song_info = (song_info_t*)((uint8_t*)song_info+0x20); + uint16_t song_id = g_song_info->music_id; + + uint16_t attract_marker = *(uint16_t*)((uint8_t*)g_song_info_zone+0x1C); + if ( attract_marker == 0x0101 ) + { + CURL_PRINT("[tachi_send_score] skipping attract mode demo score\n"); + return false; + } + + if ( song_id > 3400 || ( g_skip_omni && is_a_custom(song_id) ) ) // only skip customs, not proper omni + { + CURL_PRINT("[tachi_send_score] skipping %s songid %u\n", g_skip_omni ? "omni/custom" : "custom", song_id); + return false; + } + + /* prepare POST data */ + if ( !load_profile_if_needed() ) + return false; + + uint8_t diff_idx = g_song_info->sheet_id; + const char *diff = g_difficulty[diff_idx]; + double gauge = g_score_info->gauge * 100. / 1023.; + double hispeed = (g_song_info->hispeed)/10.; + uint64_t curr_time = (uint64_t)time(NULL)*1000; + + sprintf(score_json, "{ \ + \"meta\": {\ + \"game\": \"popn\",\ + \"playtype\": \"9B\",\ + \"service\": \"popnhax\"\ + },\ + \"scores\":\ + [{\ + \"score\": %u,\ + \"clearMedal\": \"%s\",\ + \"matchType\": \"inGameID\",\ + \"identifier\": \"%u\",\ + \"timeAchieved\": %llu,\ + \"difficulty\": \"%s\",\ + \"optional\": {\ + \"fast\": %u,\ + \"slow\": %u,\ + \"maxCombo\": %u,\ + \"gauge\": %f\ + },\ + \"judgements\": {\ + \"cool\": %u,\ + \"great\": %u,\ + \"good\": %u,\ + \"bad\": %u\ + },\ + \"scoreMeta\": {\ + \"hiSpeed\": %f,\ + \"hidden\": %d,\ + \"sudden\": %d,\ + \"random\": \"%s\",\ + \"gauge\": \"%s\"\ + }\ + }]\ + }", g_score_info->score, g_clear_medal[g_score_info->clear_type], song_id, curr_time, diff, g_score_info->nb_fast, g_score_info->nb_slow, g_score_info->max_combo, gauge, g_score_info->nb_cool, g_score_info->nb_great, g_score_info->nb_good, g_score_info->nb_bad, hispeed, (g_hidden_is_offset) ? 0 : g_song_info->hidden_value, g_song_info->sudden_value, g_random_type[g_song_info->random], g_gauge_type[g_song_info->gauge_type]); + + /* curl request */ + CURL *curl = curl_easy_init(); + + struct curl_slist *list = NULL; + + char auth_header[128]; + sprintf(auth_header, "Authorization: Bearer %s", g_api_key); + + CURL_PRINT("\n\nscorejson data is \n%s\n", score_json); + + if(curl) + { + curl_easy_setopt(curl, CURLOPT_URL, g_import_url); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); + + list = curl_slist_append(list, auth_header); + list = curl_slist_append(list, "Content-Type: application/json"); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, score_json); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list); + + curl_easy_perform(curl); + curl_slist_free_all(list); + curl_easy_cleanup(curl); + } + + return false; +} + +bool tachi_get_rival_scores(int idx) +{ + if ( !load_profile_if_needed() ) + return false; + + CURL *curl = curl_easy_init(); + if(!curl) + return false; + + struct curl_slist *list = NULL; + + char auth_header[128]; + char rival_url[128]; + sprintf(auth_header, "Authorization: Bearer %s", g_api_key); + + sprintf(rival_url, "%s/%s%s", g_users_url_prefix, g_rivals[idx], g_pbs_url_suffix); + + if ( g_curl_data.memory == NULL ) + { + g_curl_data.memory = (char*)malloc(1); /* grown as needed by realloc above */ + g_curl_data.size = 0; + } + + curl_easy_setopt(curl, CURLOPT_URL, rival_url); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); + + list = curl_slist_append(list, auth_header); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&g_curl_data); + + CURLcode res = curl_easy_perform(curl); + curl_easy_cleanup(curl); + + return (res == CURLE_OK); +} + +void tachi_get_rival_scores_and_parse() +{ + + if (tachi_get_rival_scores(g_rival_current_idx)) + { + parse_rival_pbs(); + if ( g_curl_data.memory != NULL ) + { + free(g_curl_data.memory); + g_curl_data.memory = NULL; + g_curl_data.size = 0; + } + } + + g_rival_current_idx++; +} + +bool tachi_get_rivals() +{ + /* reset data for the hook that is to come */ + g_rival_count = 0; + g_rival_current = NULL; + g_rival_current_idx = 0; + + if ( !load_profile_if_needed() ) + return false; + + CURL *curl = curl_easy_init(); + if(!curl) + return false; + + struct curl_slist *list = NULL; + char auth_header[128]; + sprintf(auth_header, "Authorization: Bearer %s", g_api_key); + + curl_easy_setopt(curl, CURLOPT_URL, g_rivals_url); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); + + list = curl_slist_append(list, auth_header); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, parse_rivals); + + CURLcode res = curl_easy_perform(curl); + curl_easy_cleanup(curl); + + if ( res != CURLE_OK ) + CURL_PRINT("[tachi] WARNING: get rivals request failed\n"); + + CURL_PRINT("found %d rivals\n", g_rival_count); + for (uint32_t j=0; j < g_rival_count; j++) + { + CURL_PRINT("%s\n", g_rivals[j]); + } + + return g_rival_count; +} + +extern bool (*popn22_is_normal_mode)(); + +void (*real_medal_commit)(); +void hook_medal_commit() +{ + __asm("push eax\n"); + __asm("push ecx\n"); + __asm("push edx\n"); + + __asm("push eax\n"); + __asm("call %0"::"a"(popn22_is_normal_mode)); + __asm("test al,al"); + __asm("pop eax\n"); + __asm("je skip_score_send"); + + __asm("mov [_g_score_info], edi\n"); + __asm("mov [_g_song_info_zone], eax\n"); + __asm("call %P0" : : "i"(tachi_send_score)); + + __asm("skip_score_send:"); + __asm("pop edx\n"); + __asm("pop ecx\n"); + __asm("pop eax\n"); + + real_medal_commit(); +} + +void (*real_end_of_credit)(); +void hook_end_of_credit() +{ + __asm("mov %0, 0x01\n":"=m"(g_need_conf_load): :); + real_end_of_credit(); +} + +void (*real_mode_select)(); +void hook_mode_select_rival_inject() +{ + // if g_need_conf_load is 0 then it means we already injected rivals this credit, leave + __asm("cmp dword ptr [_g_need_conf_load], 0\n"); + __asm("je leave_rival_inject\n"); + + __asm("push eax\n"); + __asm("push ecx\n"); + __asm("push edx\n"); + __asm("call %P0" : : "i"(tachi_get_rivals)); + __asm("cmp eax, 0\n"); + __asm("pop edx\n"); + __asm("pop ecx\n"); + __asm("pop eax\n"); + __asm("je leave_rival_inject\n"); + + /* fake login to prevent rival handling bypass */ + __asm("mov ecx, dword ptr [_g_playerdata_zone_addr]\n"); + __asm("mov edx, [ecx]\n"); + __asm("add edx, 0x1A5\n"); //offset where result screen is checking to decide if the favorite option should be displayed/handled + __asm("mov ecx, [edx]\n"); + __asm("cmp ecx, 0\n"); + __asm("jne skip_fake_login_tachi\n"); + __asm("mov dword ptr [edx], 0xFF000001\n"); + __asm("sub edx, 0x19D\n"); //back to popn friendid offset + __asm("mov dword ptr [edx], 0x61666564\n"); // "defa" + __asm("add edx, 0x04\n"); + __asm("mov dword ptr [edx], 0x00746C75\n"); // "ult" + __asm("skip_fake_login_tachi:\n"); + + /* reset rival count in player data */ + __asm("mov eax, [_g_playerdata_zone_addr]\n"); + __asm("mov eax, [eax]\n"); + __asm("add eax, 0x44\n"); + __asm("mov byte ptr [eax], 0\n"); + + /* INJECT RIVALS */ + __asm("push edi\n"); //edi is current rival + __asm("xor edi, edi\n"); + + __asm("inject_rival:\n"); + __asm("push eax\n"); + __asm("push ecx\n"); + __asm("push edx\n"); + __asm("call %P0" : : "i"(get_next_rival)); + __asm("pop edx\n"); + __asm("pop ecx\n"); + __asm("pop eax\n"); + + /* write rival_info_t data */ + __asm("call [_get_rivals_ptr]\n"); //retrieve &rivals[i] + __asm("push ebx\n"); + __asm("push edx\n"); + __asm("mov edx, [_g_rival_entry_size]\n"); + __asm("mov ebx, edi\n"); + __asm("imul ebx, edx\n"); + __asm("lea eax, [ebx+eax+4]\n"); + __asm("pop edx\n"); + __asm("pop ebx\n"); + + __asm("push ebx\n"); + __asm("xor ebx, ebx\n"); + __asm("write_rival_data:\n"); + __asm("lea edx, [_g_rival_data+ebx*4]\n"); + __asm("mov edx, [edx]\n"); + __asm("mov [eax], edx\n"); + __asm("add eax, 4\n"); + __asm("inc ebx\n"); + __asm("cmp ebx, 8\n"); + __asm("jb write_rival_data\n"); + __asm("pop ebx\n"); + + /* increment rival count */ + __asm("mov eax, [_g_playerdata_zone_addr]\n"); + __asm("mov eax, [eax]\n"); + __asm("add eax, 0x44\n"); + __asm("inc byte ptr [eax]\n"); // increment rival count in playerdata + __asm("call [_get_rivals_ptr]\n"); + __asm("add eax, [_g_rival_count_offset]\n"); + __asm("inc byte ptr [eax]\n"); // increment rival count in rival score zone + + __asm("push eax\n"); + __asm("push ecx\n"); + __asm("push edx\n"); + __asm("call %P0" : : "i"(tachi_get_rival_scores_and_parse)); + __asm("pop edx\n"); + __asm("pop ecx\n"); + __asm("pop eax\n"); + + /* write score data */ + __asm("push esi\n"); + __asm("xor esi, esi\n"); + __asm("write_score_data:\n"); + __asm("push eax\n"); + __asm("push ecx\n"); + __asm("push edx\n"); + __asm("call %P0" : : "i"(get_next_score)); + __asm("pop edx\n"); + __asm("pop ecx\n"); + __asm("pop eax\n"); + __asm("cmp dword ptr [_g_rival_score_current], 0\n"); // should not happen but we don't want the game to crash if it does + __asm("je score_inject_next_rival\n"); + + /* retrieve &rivals[i] */ + __asm("call [_get_rivals_ptr]\n"); //retrieve &rivals[i] + __asm("push ebx\n"); + __asm("push edx\n"); + __asm("mov edx, [_g_rival_entry_size]\n"); + __asm("mov ebx, edi\n"); + __asm("imul ebx, edx\n"); + __asm("lea eax, [ebx+eax+4]\n"); + __asm("pop edx\n"); + __asm("pop ebx\n"); + + __asm("mov edx, [_g_rival_score_current]\n"); + __asm("call [_write_rival_score]\n"); //will clobber eax + __asm("inc esi\n"); + __asm("cmp esi, [_g_rival_score_count]\n"); + __asm("jb write_score_data\n"); + __asm("mov dword ptr [_g_rival_score_current], 0\n"); + __asm("score_inject_next_rival:\n"); + __asm("pop esi\n"); + + __asm("inc edi\n"); + __asm("cmp edi, [_g_rival_count]\n"); + __asm("jb inject_rival\n"); + __asm("pop edi\n"); + + /* fake not logged in return value to bypass real rivals retrieval */ + __asm("xor eax, eax\n"); + + __asm("leave_rival_inject:\n"); + real_mode_select(); +} + +bool patch_tachi_rivals(const char *dllFilename, bool scorehook) +{ + DWORD dllSize = 0; + char *data = getDllData(dllFilename, &dllSize); + +#if DEBUG_CURL == 1 + if ( g_curl_log_fp == NULL ) + g_curl_log_fp = fopen("popnhax_curl.log", "w"); +#endif + + /* retrieve get_rivals_ptr() */ + { + int64_t pattern_offset = search(data, dllSize, "\x0F\xB6\x8E\x38\x02\x00\x00", 7, 0); + if (pattern_offset == -1) + { + pattern_offset = search(data, dllSize, "\x0F\xB6\x89\x38\x02\x00\x00", 7, 0); // usaneko/peace + if (pattern_offset == -1) { + LOG("popnhax: tachi rivals: cannot find get_rivals_ptr function\n"); + return false; + } + } + + int64_t fun_rel = *(int32_t *)(data + pattern_offset - 0x04 ); // function call is just before our pattern + get_rivals_ptr = (uint32_t*(*)())((int64_t)data + pattern_offset + fun_rel); + } + + /* retrieve rival_entry_size */ + { + int64_t pattern_offset = search(data, dllSize, "\x8B\xE5\x5D\xC2\x08\x00\x69\xDB", 8, 0); + if (pattern_offset == -1) + { + LOG("popnhax: tachi rivals: cannot find rival entry size\n"); + return false; + } + + g_rival_entry_size = *(int32_t *)(data + pattern_offset + 0x08 ); + } + + /* retrieve offset where g_rival_count should be written */ + { + int64_t pattern_offset = search(data, dllSize, "\x66\x83\xF8\xFF\x75\x07\x66\xFF\x87", 9, 0); + if (pattern_offset == -1) + { + LOG("popnhax: tachi rivals: cannot find rival entry size\n"); + return false; + } + + g_rival_count_offset = *(int32_t *)(data + pattern_offset + 0x09 ); + } + + /* retrieve write_rival_score */ + { + int64_t pattern_offset = search(data, dllSize, "\x66\x8B\x0A\x50\x8A\x42\x04\xE8", 8, 0); + if (pattern_offset == -1) + { + LOG("popnhax: tachi rivals: cannot find rival entry size\n"); + return false; + } + + write_rival_score = (void(*)())(data + pattern_offset); + } + + /* hook credit end to reset "need to load conf" marker, if scorehook didn't already install it */ + if ( !scorehook ) { + { // same as in local favorites patch / score challenge / score hook + int64_t pattern_offset = search(data, dllSize, "\x8B\x01\x8B\x50\x14\xFF\xE2\xC3\xCC\xCC\xCC\xCC", 12, 0); + if (pattern_offset == -1) { + LOG("popnhax: tachi rivals: cannot find check if logged function\n"); + return false; + } + g_playerdata_zone_addr = (*(uint32_t *)(data + pattern_offset + 0x25)); + } + + { + int64_t pattern_offset = search(data, dllSize, "\x33\xC0\x89\x87\x18\x02\x00\x00\x89", 9, 0); + if (pattern_offset == -1) { + pattern_offset = search(data, dllSize, "\x33\xC0\x89\x86\x18\x02\x00\x00\x89", 9, 0); // usaneko/peace + if (pattern_offset == -1) { + LOG("popnhax: tachi rivals: cannot find end of credit check if logged function\n"); + return false; + } + } + uint64_t patch_addr = (int64_t)data + pattern_offset; + MH_CreateHook((LPVOID)patch_addr, (LPVOID)hook_end_of_credit, + (void **)&real_end_of_credit); + } + + } + + /* hook after mode select logged in check */ + { + int64_t pattern_offset = search(data, dllSize, "\x8B\xE5\x5D\xC3\x8B\xC6\xE8", 7, 0); + + if (pattern_offset == -1) + { + LOG("popnhax: tachi rivals: cannot retrieve mode select logged in check\n"); + return false; + } + + uint64_t patch_addr = (int64_t)data + pattern_offset + 11; + MH_CreateHook((LPVOID)patch_addr, (LPVOID)hook_mode_select_rival_inject, + (void **)&real_mode_select); + } + + LOG("popnhax: tachi rival injection enabled\n"); + return true; +} + +bool patch_tachi_scorehook(const char *dllFilename, bool pfree, bool hidden_is_offset, bool skip_omni) +{ + DWORD dllSize = 0; + char *data = getDllData(dllFilename, &dllSize); + +#if DEBUG_CURL == 1 + if ( g_curl_log_fp == NULL ) + g_curl_log_fp = fopen("popnhax_curl.log", "w"); +#endif + + /* do not send a "hidden" value if it really is an offset */ + if (hidden_is_offset) + g_hidden_is_offset = 1; + + if (skip_omni) + g_skip_omni = true; + + /* retrieve song struct size */ + { + int64_t pattern_offset = search(data, dllSize, "\x8B\x74\x24\x14\x0F\xB6\xC0", 7, 0); + if (pattern_offset == -1) { + LOG("popnhax: tachi scorehook: cannot retrieve score zone offset computation function\n"); + return false; + } + + g_stage_offset = *(uint16_t *) ((int64_t)data + pattern_offset + 12); + //LOG("popnhax: tachi scorehook: stage offset size 0x%0x\n", g_stage_offset); + } + + /* player data address (for friendid retrieval), same as local favorite patch */ + { + //this is the same function used in score challenge patch, checking if we're logged in... but now we just directly retrieve the address + int64_t pattern_offset = search(data, dllSize, "\x8B\x01\x8B\x50\x14\xFF\xE2\xC3\xCC\xCC\xCC\xCC", 12, 0); + if (pattern_offset == -1) { + LOG("popnhax: tachi scorehook: cannot find check if logged function\n"); + return false; + } + + g_playerdata_zone_addr = (*(uint32_t *)(data + pattern_offset + 0x25)); + } + /* hook credit end to reset "need to load conf" marker */ + { + int64_t pattern_offset = search(data, dllSize, "\x33\xC0\x89\x87\x18\x02\x00\x00\x89", 9, 0); + if (pattern_offset == -1) { + pattern_offset = search(data, dllSize, "\x33\xC0\x89\x86\x18\x02\x00\x00\x89", 9, 0); // usaneko/peace + if (pattern_offset == -1) { + LOG("popnhax: tachi scorehook: cannot find end of credit check if logged function\n"); + return false; + } + } + + uint64_t patch_addr = (int64_t)data + pattern_offset; + + MH_CreateHook((LPVOID)patch_addr, (LPVOID)hook_end_of_credit, + (void **)&real_end_of_credit); + } + + /* hook medal calculation */ + { + int64_t pattern_offset = search(data, dllSize, "\x89\x84\x24\x68\x02\x00\x00\x8D\x44\x24\x20", 11, 0); + + if (pattern_offset == -1) { + LOG("popnhax: tachi hook: cannot retrieve medal handling function\n"); + return false; + } + + uint64_t patch_addr = (int64_t)data + pattern_offset + 0x13; + MH_CreateHook((LPVOID)patch_addr, (LPVOID)hook_medal_commit, + (void **)&real_medal_commit); + } + + if (!pfree) //pfree already retrieves this info + { + int64_t pattern_offset = search(data, dllSize, "\x83\xC4\x0C\x33\xC0\xC3\xCC\xCC\xCC\xCC\xE8", 11, 0); + if (pattern_offset == -1) { + LOG("popnhax: tachi score hook: cannot find is_normal_mode function, fallback to best effort (active in all modes)\n"); + } + else + { + popn22_is_normal_mode = (bool(*)()) (data + pattern_offset + 0x0A); + } + } + + LOG("popnhax: tachi score hook enabled%s\n", g_skip_omni ? " (omnimix charts excluded)" : ""); + return true; +} \ No newline at end of file diff --git a/popnhax/tachi.h b/popnhax/tachi.h new file mode 100644 index 0000000..39c8c8a --- /dev/null +++ b/popnhax/tachi.h @@ -0,0 +1,9 @@ +#ifndef __TACHI_H__ +#define __TACHI_H__ + +#include + +bool patch_tachi_scorehook(const char *dllFilename, bool pfree, bool hidden_is_offset, bool skip_omni); +bool patch_tachi_rivals(const char *dllFilename, bool scorehook); + +#endif diff --git a/util/chash.h b/util/chash.h new file mode 100644 index 0000000..78662f0 --- /dev/null +++ b/util/chash.h @@ -0,0 +1,469 @@ +/* + * C-Ware License + * + * Copyright (c) 2022, C-Ware + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Redistributions of modified source code must append a copyright notice in + * the form of 'Copyright ' to each modified source file's + * copyright notice, and the standalone license file if one exists. + * + * A "redistribution" can be constituted as any version of the source code + * that is intended to comprise some other derivative work of this code. A + * fork created for the purpose of contributing to any version of the source + * does not constitute a truly "derivative work" and does not require listing. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef CWARE_LIBCHASH_H +#define CWARE_LIBCHASH_H + +#define CWARE_LIBCHASH_VERSION "2.0.0" + +/* How big heap-allocated hashtables are by default */ +#ifndef CHASH_INITIAL_SIZE +#define CHASH_INITIAL_SIZE 10 +#elif CHASH_INITIAL_SIZE <= 0 + "chash_init: default length must be greater than 0" +#endif + +/* Calculates the next size of the hashtable. */ +#ifndef CHASH_RESIZE +#define CHASH_RESIZE(size) \ + ((size) * 1.3) +#endif + +/* The threshold that, when passed, will cause a resize */ +#ifndef CHASH_LOAD_THRESHOLD +#define CHASH_LOAD_THRESHOLD 0.8 +#endif + +/* The type that is used for counters; useful for aligning hashtable + * length and capacity fields so type casting warnings do not appear */ +#ifndef CHASH_COUNTER_TYPE +#define CHASH_COUNTER_TYPE int +#endif + +/* The name of the key field */ +#ifndef CHASH_KEY_FIELD +#define CHASH_KEY_FIELD key +#endif + +/* The name of the value field */ +#ifndef CHASH_VALUE_FIELD +#define CHASH_VALUE_FIELD value +#endif + +/* The name of the state field */ +#ifndef CHASH_STATE_FIELD +#define CHASH_STATE_FIELD state +#endif + +/* The name of the buckets field */ +#ifndef CHASH_BUCKETS_FIELD +#define CHASH_BUCKETS_FIELD buckets +#endif + +/* The name of the length field */ +#ifndef CHASH_LENGTH_FIELD +#define CHASH_LENGTH_FIELD length +#endif + +/* The name of the capacity field */ +#ifndef CHASH_CAPACITY_FIELD +#define CHASH_CAPACITY_FIELD capacity +#endif + +/* State enums */ +#define CHASH_UNFILLED 0 +#define CHASH_FILLED 1 +#define CHASH_TOMBSTONE 2 + +/* Built-ins */ + +#define chash_string_hash(key, hash) \ + 5031; \ + do { \ + int __CHASH_HINDEX = 0; \ + \ + for(__CHASH_HINDEX = 0; (key)[__CHASH_HINDEX] != '\0'; \ + __CHASH_HINDEX++) { \ + (hash) = (((hash) << 1) + (hash)) + (key)[__CHASH_HINDEX]; \ + } \ + } while(0) + +#define chash_string_compare(cmp_a, cmp_b) \ + (strcmp((cmp_a), (cmp_b)) == 0) + +#define chash_default_init(bucket, _key, _value) \ + (bucket).CHASH_KEY_FIELD = (_key); \ + (bucket).CHASH_VALUE_FIELD = _value + + + + + + + + + + + + + + + + + + + + +/* utility macros */ + +#define __chash_abs(x) \ + ((x) < 0 ? (x) * - 1 : (x)) + +#define __chash_hash(mod, _key, namespace) \ + __CHASH_HASH = namespace ## _HASH((_key), __CHASH_HASH); \ + __CHASH_HASH = __CHASH_HASH % (mod); \ + __CHASH_HASH = __chash_abs(__CHASH_HASH); + +#define __chash_probe(hashtable, _key, namespace) \ + while(__CHASH_INDEX < (hashtable)->CHASH_CAPACITY_FIELD) { \ + if((hashtable)->CHASH_BUCKETS_FIELD[__CHASH_HASH].CHASH_STATE_FIELD == \ + CHASH_UNFILLED) \ + break; \ + \ + if((namespace ## _COMPARE((_key), \ + (hashtable)->CHASH_BUCKETS_FIELD[__CHASH_HASH].CHASH_KEY_FIELD)) == 1) { \ + \ + __CHASH_INDEX = -1; \ + break; \ + } \ + \ + __CHASH_HASH = (__CHASH_HASH + 1) % (hashtable)->CHASH_CAPACITY_FIELD; \ + __CHASH_INDEX++; \ + } \ + +#define __chash_probe_to_unfilled(mod, _key, buffer, namespace) \ + while(1) { \ + if(buffer[__CHASH_HASH].CHASH_STATE_FIELD != CHASH_FILLED) \ + break; \ + \ + if((namespace ## _COMPARE((_key), buffer[__CHASH_HASH].CHASH_KEY_FIELD)) \ + == 1) \ + break; \ + \ + __CHASH_HASH = (__CHASH_HASH + 1) % mod; \ + } \ + +#define __chash_resize(hashtable, namespace) \ +do { \ + CHASH_COUNTER_TYPE __CHASH_INDEX = 0; \ + namespace ## _BUCKET *__CHASH_BUCKETS = NULL; \ + CHASH_COUNTER_TYPE __CHASH_NEXT_SIZE = (CHASH_COUNTER_TYPE) \ + CHASH_RESIZE((hashtable)->CHASH_CAPACITY_FIELD); \ + \ + if((namespace ## _HEAP) == 0) { \ + if((hashtable)->CHASH_LENGTH_FIELD != \ + (hashtable)->CHASH_CAPACITY_FIELD) { \ + break; \ + } \ + \ + fprintf(stderr, "__chash_resize: hashtable is full. could not resize" \ + " (%s:%i)\n", __FILE__, __LINE__); \ + abort(); \ + } \ + \ + if((float) (hashtable)->CHASH_LENGTH_FIELD / \ + (float) (hashtable)->CHASH_CAPACITY_FIELD < CHASH_LOAD_THRESHOLD) \ + break; \ + \ + __CHASH_BUCKETS = (namespace ## _BUCKET *)malloc((size_t) (__CHASH_NEXT_SIZE \ + * ((CHASH_COUNTER_TYPE) \ + sizeof(namespace ## _BUCKET)))); \ + memset(__CHASH_BUCKETS, 0, ((size_t) (__CHASH_NEXT_SIZE \ + * ((CHASH_COUNTER_TYPE) \ + sizeof(namespace ## _BUCKET))))); \ + \ + for(__CHASH_INDEX = 0; __CHASH_INDEX < (hashtable)->CHASH_CAPACITY_FIELD; \ + __CHASH_INDEX++) { \ + namespace ## _BUCKET __CHASH_NEW_KEY_BUCKET; \ + memset(&__CHASH_NEW_KEY_BUCKET, 0, sizeof(namespace ## _BUCKET)); \ + namespace ## _INIT(__CHASH_NEW_KEY_BUCKET, \ + (hashtable)->CHASH_BUCKETS_FIELD[__CHASH_INDEX].CHASH_KEY_FIELD, \ + (hashtable)->CHASH_BUCKETS_FIELD[__CHASH_INDEX].CHASH_VALUE_FIELD); \ + \ + if((hashtable)->CHASH_BUCKETS_FIELD[__CHASH_INDEX].CHASH_STATE_FIELD \ + != CHASH_FILLED) \ + continue; \ + \ + __chash_hash(__CHASH_NEXT_SIZE, __CHASH_NEW_KEY_BUCKET.CHASH_KEY_FIELD, \ + namespace); \ + __chash_probe_to_unfilled(__CHASH_NEXT_SIZE, \ + (hashtable)->CHASH_BUCKETS_FIELD[__CHASH_INDEX].CHASH_KEY_FIELD, \ + __CHASH_BUCKETS, namespace) \ + \ + __CHASH_BUCKETS[__CHASH_HASH] = __CHASH_NEW_KEY_BUCKET; \ + __CHASH_BUCKETS[__CHASH_HASH].CHASH_STATE_FIELD = CHASH_FILLED; \ + __CHASH_HASH = 0; \ + } \ + \ + free((hashtable)->CHASH_BUCKETS_FIELD); \ + (hashtable)->CHASH_BUCKETS_FIELD = __CHASH_BUCKETS; \ + (hashtable)->CHASH_CAPACITY_FIELD = __CHASH_NEXT_SIZE; \ + __CHASH_HASH = 0; \ +} while(0) + +#define __chash_assert_nonnull(func, ptr) \ +do { \ + if((ptr) == NULL) { \ + fprintf(stderr, #func ": " #ptr " cannot be null (%s:%i)\n", \ + __FILE__, __LINE__); \ + abort(); \ + } \ +} while(0) + + + + + + + + + + + + + + + + + +/* operations */ +#define chash_init(hashtable, namespace) \ + NULL; \ + \ + (hashtable) = (namespace ## _TYPE *) malloc(sizeof((*(hashtable)))); \ + (hashtable)->CHASH_LENGTH_FIELD = 0; \ + (hashtable)->CHASH_CAPACITY_FIELD = CHASH_INITIAL_SIZE; \ + (hashtable)->CHASH_BUCKETS_FIELD = (namespace ## _BUCKET *) malloc(CHASH_INITIAL_SIZE \ + * sizeof(*((hashtable)->CHASH_BUCKETS_FIELD))); \ + memset((hashtable)->CHASH_BUCKETS_FIELD, 0, \ + sizeof(*((hashtable)->CHASH_BUCKETS_FIELD)) * CHASH_INITIAL_SIZE) + +#define chash_init_stack(hashtable, buffer, _length, namespace) \ + (*(hashtable)); \ + \ + if((_length) <= 0) { \ + fprintf(stderr, "chash_init_stack: hashtable cannot have a maximum " \ + "length of 0 or less (%s:%i)\n", __FILE__, __LINE__); \ + abort(); \ + } \ + \ + __chash_assert_nonnull(chash_init_stack, buffer); \ + \ + (hashtable)->CHASH_LENGTH_FIELD = 0; \ + (hashtable)->CHASH_CAPACITY_FIELD = _length; \ + (hashtable)->CHASH_BUCKETS_FIELD = buffer + +#define chash_assign(hashtable, _key, _value, namespace) \ +do { \ + long __CHASH_HASH = 0; \ + namespace ## _BUCKET __CHASH_KEY_BUCKET; \ + memset(&__CHASH_KEY_BUCKET, 0, sizeof(namespace ## _BUCKET)); \ + namespace ## _INIT(__CHASH_KEY_BUCKET, _key, _value); \ + \ + __chash_assert_nonnull(chash_assign, hashtable); \ + __chash_assert_nonnull(chash_assign, (hashtable)->CHASH_BUCKETS_FIELD); \ + __chash_resize(hashtable, namespace); \ + __chash_hash((hashtable)->CHASH_CAPACITY_FIELD, _key, namespace); \ + __chash_probe_to_unfilled((hashtable)->CHASH_CAPACITY_FIELD, \ + (_key), (hashtable)->CHASH_BUCKETS_FIELD, namespace) \ + \ + if((hashtable)->CHASH_BUCKETS_FIELD[__CHASH_HASH].CHASH_STATE_FIELD == \ + CHASH_FILLED) { \ + namespace ## _FREE_VALUE( \ + (hashtable)->CHASH_BUCKETS_FIELD[__CHASH_HASH].CHASH_VALUE_FIELD); \ + } else { \ + (hashtable)->CHASH_LENGTH_FIELD++; \ + } \ + \ + (hashtable)->CHASH_BUCKETS_FIELD[__CHASH_HASH] = __CHASH_KEY_BUCKET; \ + (hashtable)->CHASH_BUCKETS_FIELD[__CHASH_HASH].CHASH_STATE_FIELD = \ + CHASH_FILLED; \ +} while(0) + +#define chash_lookup(hashtable, _key, storage, namespace) \ +(void)storage; \ + \ +do { \ + int __CHASH_INDEX = 0; \ + long __CHASH_HASH = 0; \ + namespace ## _BUCKET __CHASH_KEY_BUCKET; \ + memset(&__CHASH_KEY_BUCKET, 0, sizeof(namespace ## _BUCKET)); \ + namespace ## _INIT(__CHASH_KEY_BUCKET, _key, \ + __CHASH_KEY_BUCKET.CHASH_VALUE_FIELD); \ + \ + (void) __CHASH_KEY_BUCKET; \ + \ + __chash_assert_nonnull(chash_lookup, hashtable); \ + __chash_assert_nonnull(chash_lookup, (hashtable)->CHASH_BUCKETS_FIELD); \ + __chash_hash((hashtable)->CHASH_CAPACITY_FIELD, _key, namespace); \ + __chash_probe(hashtable, _key, namespace) \ + \ + if(((hashtable)->CHASH_BUCKETS_FIELD[__CHASH_HASH].CHASH_STATE_FIELD != \ + CHASH_FILLED) || __CHASH_INDEX != -1) { \ + fprintf(stderr, "chash_lookup: failed to find key in hashtable (%s:%i)" \ + "\n", __FILE__, __LINE__); \ + abort(); \ + } \ + \ + storage = (hashtable)->CHASH_BUCKETS_FIELD[__CHASH_HASH].CHASH_VALUE_FIELD; \ +} while(0) + +#define chash_delete(hashtable, _key, namespace) \ +do { \ + int __CHASH_INDEX = 0; \ + long __CHASH_HASH = 0; \ + \ + __chash_assert_nonnull(chash_delete, hashtable); \ + __chash_assert_nonnull(chash_delete, (hashtable)->CHASH_BUCKETS_FIELD); \ + __chash_hash((hashtable)->CHASH_CAPACITY_FIELD, _key, namespace); \ + __chash_probe(hashtable, _key, namespace) \ + \ + if(((hashtable)->CHASH_BUCKETS_FIELD[__CHASH_HASH].CHASH_STATE_FIELD != \ + CHASH_FILLED) || __CHASH_INDEX != -1) { \ + fprintf(stderr, "chash_delete: failed to find key in hashtable (%s:%i)" \ + "\n", __FILE__, __LINE__); \ + abort(); \ + } \ + \ + namespace ## _FREE_KEY((hashtable)->CHASH_BUCKETS_FIELD[__CHASH_HASH] \ + .CHASH_KEY_FIELD); \ + namespace ## _FREE_VALUE( \ + (hashtable)->CHASH_BUCKETS_FIELD[__CHASH_HASH].CHASH_VALUE_FIELD); \ + (hashtable)->CHASH_BUCKETS_FIELD[__CHASH_HASH].CHASH_STATE_FIELD = \ + CHASH_TOMBSTONE; \ + (hashtable)->CHASH_LENGTH_FIELD--; \ +} while(0) + +#define chash_contains(hashtable, _key, storage, namespace) \ +1; \ + \ +do { \ + int __CHASH_INDEX = 0; \ + long __CHASH_HASH = 0; \ + \ + __chash_assert_nonnull(chash_contents, hashtable); \ + __chash_assert_nonnull(chash_contents, (hashtable)->CHASH_BUCKETS_FIELD); \ + __chash_hash((hashtable)->CHASH_CAPACITY_FIELD, _key, namespace); \ + __chash_probe(hashtable, _key, namespace) \ + \ + if(((hashtable)->CHASH_BUCKETS_FIELD[__CHASH_HASH].CHASH_STATE_FIELD != \ + CHASH_FILLED) || __CHASH_INDEX != -1) { \ + storage = 0; \ + } \ +} while(0) + +#define chash_lookup_bucket(hashtable, _key, storage, namespace) \ +storage; \ + \ +do { \ + CHASH_COUNTER_TYPE __CHASH_INDEX = 0; \ + long __CHASH_HASH = 0; \ + namespace ## _BUCKET __CHASH_KEY_BUCKET; \ + memset(&__CHASH_KEY_BUCKET, 0, sizeof(namespace ## _BUCKET)); \ + namespace ## _INIT(__CHASH_KEY_BUCKET, _key, \ + __CHASH_KEY_BUCKET.CHASH_VALUE_FIELD); \ + \ + (void) __CHASH_KEY_BUCKET; \ + \ + __chash_assert_nonnull(chash_lookup_bucket, hashtable); \ + __chash_assert_nonnull(chash_lookup_bucket, \ + (hashtable)->CHASH_BUCKETS_FIELD); \ + __chash_hash((hashtable)->CHASH_CAPACITY_FIELD, _key, namespace); \ + __chash_probe(hashtable, _key, namespace) \ + \ + if(((hashtable)->CHASH_BUCKETS_FIELD[__CHASH_HASH].CHASH_STATE_FIELD != \ + CHASH_FILLED) || __CHASH_INDEX != -1) { \ + fprintf(stderr, "chash_lookup_bucket: failed to find key in hashtable" \ + "(%s:%i) \n", __FILE__, __LINE__); \ + abort(); \ + } \ + \ + storage = ((hashtable)->CHASH_BUCKETS_FIELD + __CHASH_HASH); \ +} while(0) + +#define chash_free(hashtable, namespace) \ +do { \ + __chash_assert_nonnull(chash_free, hashtable); \ + __chash_assert_nonnull(chash_free, (hashtable)->CHASH_BUCKETS_FIELD); \ + (hashtable)->CHASH_CAPACITY_FIELD--; \ + \ + while((hashtable)->CHASH_CAPACITY_FIELD != -1) { \ + if((hashtable)->CHASH_BUCKETS_FIELD[(hashtable)->CHASH_CAPACITY_FIELD] \ + .CHASH_STATE_FIELD != CHASH_FILLED) { \ + (hashtable)->CHASH_CAPACITY_FIELD--; \ + continue; \ + } \ + \ + namespace ##_FREE_KEY( \ + (hashtable)->CHASH_BUCKETS_FIELD[(hashtable)->CHASH_CAPACITY_FIELD] \ + .CHASH_KEY_FIELD); \ + namespace ##_FREE_VALUE( \ + (hashtable)->CHASH_BUCKETS_FIELD[(hashtable)->CHASH_CAPACITY_FIELD] \ + .CHASH_VALUE_FIELD); \ + (hashtable)->CHASH_CAPACITY_FIELD--; \ + (hashtable)->CHASH_LENGTH_FIELD--; \ + } \ + \ + if((namespace ## _HEAP) == 1) { \ + free((hashtable)->CHASH_BUCKETS_FIELD); \ + free((hashtable)); \ + } \ +} while(0); + +#define chash_is_full(hashtable, namespace) \ + (((hashtable)->CHASH_LENGTH_FIELD) == ((hashtable)->CHASH_CAPACITY_FIELD)) + + + + + + + + + +/* Iterator logic */ +#define chash_iter(hashtable, i) \ + for((i) = 0; (i) < (hashtable)->CHASH_CAPACITY_FIELD; (i)++) + +#define chash_get(hashtable, key, value, i) \ + if((hashtable)->CHASH_BUCKETS_FIELD[(i)].CHASH_STATE_FIELD != CHASH_FILLED) \ + continue; \ + \ + (key) = (hashtable)->CHASH_BUCKETS_FIELD[(i)].CHASH_KEY_FIELD; \ + (value) = (hashtable)->CHASH_BUCKETS_FIELD[(i)].CHASH_VALUE_FIELD + +#endif diff --git a/util/jsmn-find.h b/util/jsmn-find.h new file mode 100644 index 0000000..5b46268 --- /dev/null +++ b/util/jsmn-find.h @@ -0,0 +1,725 @@ +#ifndef JSMN_FIND_H +#define JSMN_FIND_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef JSMN_H +#error "jsmn-find.h should be included after jsmn.h" +#else +/** @brief JSON token description */ +struct jsmnftok { + /** start position in JSON data string */ + int pos; + /** length of token in JSON data string */ + size_t len; +}; + +/** @brief JSON object */ +typedef struct jsmnf_pair { + /** JSON type @see `jsmntype_t` at jsmn.h */ + jsmntype_t type; + /** amount of children currently filled in */ + int size; + /** children threshold capacity */ + int capacity; + /** this pair's fields */ + struct jsmnf_pair *fields; + /** the key of the pair */ + struct jsmnftok k; + /** the value of the pair */ + struct jsmnftok v; + /** current state of this pair */ + int state; +} jsmnf_pair; + +/** @brief Bucket (@ref jsmnf_pair) loader, keeps track of pair array + * position */ +typedef struct jsmnf_loader { + /** next pair to allocate */ + unsigned pairnext; +} jsmnf_loader; + +/** + * @brief Initialize a @ref jsmnf_loader + * + * @param[out] loader jsmnf_loader to be initialized + */ +JSMN_API void jsmnf_init(jsmnf_loader *loader); + +/** + * @brief Populate the @ref jsmnf_pair pairs from jsmn tokens + * + * @param[in,out] loader the @ref jsmnf_loader initialized with jsmnf_init() + * @param[in] js the JSON data string + * @param[in] tokens jsmn tokens initialized with jsmn_parse() / + * jsmn_parse_auto() + * @param[in] num_tokens amount of tokens initialized with jsmn_parse() / + * jsmn_parse_auto() + * @param[out] pairs jsmnf_pair pairs array + * @param[in] num_pairs maximum amount of pairs provided + * @return a `enum jsmnerr` value for error or the amount of `pairs` used + */ +JSMN_API int jsmnf_load(jsmnf_loader *loader, + const char *js, + const jsmntok_t tokens[], + unsigned num_tokens, + jsmnf_pair pairs[], + unsigned num_pairs); + +/** + * @brief Find a @ref jsmnf_pair token by its associated key + * + * @param[in] head a @ref jsmnf_pair object or array loaded at jsmnf_start() + * @param[in] js the JSON data string + * @param[in] key the key too be matched + * @param[in] length length of the key too be matched + * @return the @ref jsmnf_pair `head`'s field matched to `key`, or NULL if + * not encountered + */ +JSMN_API jsmnf_pair *jsmnf_find(const jsmnf_pair *head, + const char *js, + const char key[], + int length); + +/** + * @brief Find a @ref jsmnf_pair token by its full key path + * + * @param[in] head a @ref jsmnf_pair object or array loaded at jsmnf_start() + * @param[in] js the JSON data string + * @param[in] path an array of key path strings, from least to highest depth + * @param[in] depth the depth level of the last `path` key + * @return the @ref jsmnf_pair `head`'s field matched to `path`, or NULL if + * not encountered + */ +JSMN_API jsmnf_pair *jsmnf_find_path(const jsmnf_pair *head, + const char *js, + char *const path[], + unsigned depth); + +/** + * @brief Populate and automatically allocate the @ref jsmnf_pair pairs from + * jsmn tokens + * @brief jsmnf_load() counterpart that automatically allocates the necessary + * amount of pairs necessary for sorting the JSON tokens + * + * @param[in,out] loader the @ref jsmnf_loader initialized with jsmnf_init() + * @param[in] js the JSON data string + * @param[in] tokens jsmn tokens initialized with jsmn_parse() / + * jsmn_parse_auto() + * @param[in] num_tokens amount of tokens initialized with jsmn_parse() / + * jsmn_parse_auto() + * @param[out] p_pairs pointer to @ref jsmnf_pair to be dynamically increased + * @note must be `free()`'d once done being used + * @param[in,out] num_pairs initial amount of pairs provided + * @return a `enum jsmnerr` value for error or the amount of `pairs` used + */ +JSMN_API int jsmnf_load_auto(jsmnf_loader *loader, + const char *js, + const jsmntok_t tokens[], + unsigned num_tokens, + jsmnf_pair **p_pairs, + unsigned *num_pairs); + +/** + * @brief `jsmn_parse()` counterpart that automatically allocates the necessary + * amount of tokens necessary for parsing the JSON string + * + * @param[in,out] parser the `jsmn_parser` initialized with `jsmn_init()` + * @param[in] js the JSON data string + * @param[in] length the raw JSON string length + * @param[out] p_tokens pointer to `jsmntok_t` to be dynamically increased + * @note must be `free()`'d once done being used + * @param[in,out] num_tokens amount of tokens + * @return a `enum jsmnerr` value for error or the amount of `tokens` used + */ +JSMN_API int jsmn_parse_auto(jsmn_parser *parser, + const char *js, + size_t length, + jsmntok_t **p_tokens, + unsigned *num_tokens); + +/** + * @brief Utility function for unescaping a Unicode string + * + * @param[out] buf destination buffer + * @param[in] bufsize destination buffer size + * @param[in] src source string to be unescaped + * @param[in] length source string length + * @return length of unescaped string if successful or a negative jsmn error + * code on failure + */ +JSMN_API long jsmnf_unescape(char buf[], + size_t bufsize, + const char src[], + size_t length); + +#ifndef JSMN_HEADER + +#include +#include +#include + +/* key */ +#define CHASH_KEY_FIELD k +/* value */ +#define CHASH_VALUE_FIELD v +/* fields */ +#define CHASH_BUCKETS_FIELD fields +/* members count */ +#define CHASH_LENGTH_FIELD size + +#include "chash.h" + +#define _jsmnf_key_hash(key, hash) \ + 5031; \ + do { \ + unsigned __CHASH_HINDEX; \ + for (__CHASH_HINDEX = 0; __CHASH_HINDEX < (key).len; \ + ++__CHASH_HINDEX) { \ + (hash) = (((hash) << 1) + (hash)) \ + + _JSMNF_STRING_B[(key).pos + __CHASH_HINDEX]; \ + } \ + } while (0) + +/* compare jsmnf keys */ +#define _jsmnf_key_compare(cmp_a, cmp_b) \ + ((cmp_a).len == (cmp_b).len \ + && !strncmp(_JSMNF_STRING_B + (cmp_a).pos, \ + _JSMNF_STRING_A + (cmp_b).pos, (cmp_a).len)) + +#define _JSMNF_TABLE_HEAP 0 +#define _JSMNF_TABLE_BUCKET struct jsmnf_pair +#define _JSMNF_TABLE_FREE_KEY(_key) +#define _JSMNF_TABLE_HASH(_key, _hash) _jsmnf_key_hash(_key, _hash) +#define _JSMNF_TABLE_FREE_VALUE(_value) +#define _JSMNF_TABLE_COMPARE(_cmp_a, _cmp_b) _jsmnf_key_compare(_cmp_a, _cmp_b) +#define _JSMNF_TABLE_INIT(_bucket, _key, _value) \ + chash_default_init(_bucket, _key, _value) + +JSMN_API void +jsmnf_init(jsmnf_loader *loader) +{ + loader->pairnext = 0; +} + +#define _JSMNF_STRING_A js +#define _JSMNF_STRING_B js + +static int +_jsmnf_load_pairs(struct jsmnf_loader *loader, + const char *js, + struct jsmnf_pair *curr, + const struct jsmntok *tok, + unsigned num_tokens, + struct jsmnf_pair *pairs, + unsigned num_pairs) +{ + int offset = 0; + + if (!num_tokens) return 0; + + switch (tok->type) { + case JSMN_STRING: + case JSMN_PRIMITIVE: + break; + case JSMN_OBJECT: + case JSMN_ARRAY: { + const unsigned top_idx = loader->pairnext + (1 + tok->size), + bottom_idx = loader->pairnext; + int ret; + + if (tok->size > (int)(num_pairs - bottom_idx) + || top_idx > (num_pairs - bottom_idx)) + { + return JSMN_ERROR_NOMEM; + } + + loader->pairnext = top_idx; + + (void)chash_init_stack(curr, &pairs[bottom_idx], top_idx - bottom_idx, + _JSMNF_TABLE); + + if (JSMN_OBJECT == tok->type) { + while (curr->size < tok->size) { + const struct jsmntok *_key = tok + 1 + offset; + struct jsmnftok key, value = { 0 }; + + key.pos = _key->start; + key.len = _key->end - _key->start; + + /* skip Key token */ + offset += 1; + + /* _key->size > 0 means either an Object or Array */ + if (_key->size > 0) { + const struct jsmntok *_value = tok + 1 + offset; + struct jsmnf_pair *found = NULL; + + value.pos = _value->start; + value.len = _value->end - _value->start; + + chash_assign(curr, key, value, _JSMNF_TABLE); + (void)chash_lookup_bucket(curr, key, found, _JSMNF_TABLE); + + ret = _jsmnf_load_pairs(loader, js, found, _value, + num_tokens - offset, pairs, + num_pairs); + if (ret < 0) return ret; + + offset += ret; + } + else { + chash_assign(curr, key, value, _JSMNF_TABLE); + } + } + } + else if (JSMN_ARRAY == tok->type) { + for (; curr->size < tok->size; ++curr->size) { + const struct jsmntok *_value = tok + 1 + offset; + struct jsmnf_pair *element = curr->fields + curr->size; + struct jsmnftok value; + + value.pos = _value->start; + value.len = _value->end - _value->start; + + /* assign array element */ + element->v = value; + element->state = CHASH_FILLED; + /* unused for array elements */ + element->k.pos = 0; + element->k.len = 0; + + ret = _jsmnf_load_pairs(loader, js, element, _value, + num_tokens - offset, pairs, num_pairs); + if (ret < 0) return ret; + + offset += ret; + } + } + break; + } + default: + case JSMN_UNDEFINED: + fputs("Error: JSMN_UNDEFINED token detected, jsmn_parse() failure\n", + stderr); + return JSMN_ERROR_INVAL; + } + + curr->type = tok->type; + + return offset + 1; +} + +#undef _JSMNF_STRING_A +#undef _JSMNF_STRING_B + +JSMN_API int +jsmnf_load(struct jsmnf_loader *loader, + const char *js, + const struct jsmntok tokens[], + unsigned num_tokens, + struct jsmnf_pair pairs[], + unsigned num_pairs) +{ + int ret; + + if (!loader->pairnext) { /* first run, initialize pairs */ + static const struct jsmnf_pair blank_pair = { (jsmntype_t)0 }; + unsigned i = 0; + + for (; i < num_pairs; ++i) + pairs[i] = blank_pair; + /* root */ + pairs[0].v.pos = tokens->start; + pairs[0].v.len = tokens->end - tokens->start; + + ++loader->pairnext; + } + + ret = _jsmnf_load_pairs(loader, js, pairs, tokens, num_tokens, pairs, + num_pairs); + + /* TODO: rather than reseting pairnext keep the last 'bucket' ptr stored, + * so it can continue from the in the next try */ + if (ret < 0) loader->pairnext = 0; + return ret; +} + +#define _JSMNF_STRING_A js +#define _JSMNF_STRING_B key + +JSMN_API struct jsmnf_pair * +jsmnf_find(const struct jsmnf_pair *head, + const char *js, + const char key[], + int length) +{ + struct jsmnf_pair *found = NULL; + + if (!key || !head) return NULL; + + if (JSMN_OBJECT == head->type) { + struct jsmnftok _key; + int contains; + + _key.pos = 0; + _key.len = length; + + contains = chash_contains(head, _key, contains, _JSMNF_TABLE); + if (contains) { + (void)chash_lookup_bucket(head, _key, found, _JSMNF_TABLE); + } + } + else if (JSMN_ARRAY == head->type) { + char *endptr; + int idx = (int)strtol(key, &endptr, 10); + if (endptr != key && idx < head->size) found = head->fields + idx; + } + return found; +} + +#undef _JSMNF_STRING_A +#undef _JSMNF_STRING_B + +JSMN_API struct jsmnf_pair * +jsmnf_find_path(const struct jsmnf_pair *head, + const char *js, + char *const path[], + unsigned depth) +{ + const struct jsmnf_pair *iter = head; + struct jsmnf_pair *found = NULL; + unsigned i; + + for (i = 0; i < depth; ++i) { + if (!iter) continue; + found = jsmnf_find(iter, js, path[i], strlen(path[i])); + if (!found) break; + iter = found; + } + return found; +} + +#define RECALLOC_OR_ERROR(type, ptr, prev_size) \ + do { \ + const unsigned new_size = *(prev_size)*2; \ + void *tmp = realloc((ptr), new_size * sizeof *(ptr)); \ + if (!tmp) return JSMN_ERROR_NOMEM; \ + (ptr) = (type) tmp; \ + memset((ptr) + *(prev_size), 0, \ + (new_size - *(prev_size)) * sizeof *(ptr)); \ + *(prev_size) = new_size; \ + } while (0) + +JSMN_API int +jsmn_parse_auto(struct jsmn_parser *parser, + const char *js, + size_t length, + struct jsmntok **p_tokens, + unsigned *num_tokens) +{ + int ret; + + if (NULL == *p_tokens || 0 == *num_tokens) { + *p_tokens = (jsmntok *)calloc(1, sizeof **p_tokens); + *num_tokens = 1; + } + while (JSMN_ERROR_NOMEM + == (ret = jsmn_parse(parser, js, length, *p_tokens, *num_tokens))) + { + RECALLOC_OR_ERROR(jsmntok*, *p_tokens, num_tokens); + } + return ret; +} + +JSMN_API int +jsmnf_load_auto(struct jsmnf_loader *loader, + const char *js, + const struct jsmntok tokens[], + unsigned num_tokens, + struct jsmnf_pair **p_pairs, + unsigned *num_pairs) +{ + int ret; + + if (NULL == *p_pairs || 0 == *num_pairs) { + *p_pairs = (jsmnf_pair *)calloc(1, sizeof **p_pairs); + *num_pairs = 1; + } + while (JSMN_ERROR_NOMEM + == (ret = jsmnf_load(loader, js, tokens, num_tokens, *p_pairs, + *num_pairs))) + { + RECALLOC_OR_ERROR(jsmnf_pair *, *p_pairs, num_pairs); + } + return ret; +} + +#undef RECALLOC_OR_ERROR + +static int +_jsmnf_read_4_digits(char *s, const char *end, unsigned *p_hex) +{ + char buf[5] = { 0 }; + int i; + + if (end - s < 4) return JSMN_ERROR_PART; + + for (i = 0; i < 4; i++) { + buf[i] = s[i]; + if (('0' <= s[i] && s[i] <= '9') || ('A' <= s[i] && s[i] <= 'F') + || ('a' <= s[i] && s[i] <= 'f')) + { + continue; + } + return JSMN_ERROR_INVAL; + } + + *p_hex = (unsigned)strtoul(buf, NULL, 16); + + return 4; +} + +#define _JSMNF_UTF16_IS_FIRST_SURROGATE(c) \ + (0xD800 <= (unsigned)c && (unsigned)c <= 0xDBFF) +#define _JSMNF_UTF16_IS_SECOND_SURROGATE(c) \ + (0xDC00 <= (unsigned)c && (unsigned)c <= 0xDFFF) +#define _JSMNF_UTF16_JOIN_SURROGATE(c1, c2) \ + (((((unsigned long)c1 & 0x3FF) << 10) | ((unsigned)c2 & 0x3FF)) + 0x10000) +#define _JSMNF_UTF8_IS_VALID(c) \ + (((unsigned long)c <= 0x10FFFF) \ + && ((unsigned long)c < 0xD800 || (unsigned long)c > 0xDFFF)) +#define _JSMNF_UTF8_IS_TRAIL(c) (((unsigned char)c & 0xC0) == 0x80) +#define _JSMNF_UTF_ILLEGAL 0xFFFFFFFFu + +static int +_jsmnf_utf8_trail_length(unsigned char c) +{ + if (c < 128) return 0; + if (c < 194) return -1; + if (c < 224) return 1; + if (c < 240) return 2; + if (c <= 244) return 3; + return -1; +} + +static int +_jsmnf_utf8_width(unsigned long value) +{ + if (value <= 0x7F) return 1; + if (value <= 0x7FF) return 2; + if (value <= 0xFFFF) return 3; + return 4; +} + +/* See RFC 3629 + Based on: http://www.w3.org/International/questions/qa-forms-utf-8 */ +static unsigned long +_jsmnf_utf8_next(char **p, const char *end) +{ + unsigned char lead, tmp; + int trail_size; + unsigned long c; + + if (*p == end) return _JSMNF_UTF_ILLEGAL; + + lead = **p; + (*p)++; + + /* First byte is fully validated here */ + trail_size = _jsmnf_utf8_trail_length(lead); + + if (trail_size < 0) return _JSMNF_UTF_ILLEGAL; + + /* Ok as only ASCII may be of size = 0 also optimize for ASCII text */ + if (trail_size == 0) return lead; + + c = lead & ((1 << (6 - trail_size)) - 1); + + /* Read the rest */ + switch (trail_size) { + case 3: + if (*p == end) return _JSMNF_UTF_ILLEGAL; + tmp = **p; + (*p)++; + if (!_JSMNF_UTF8_IS_TRAIL(tmp)) return _JSMNF_UTF_ILLEGAL; + c = (c << 6) | (tmp & 0x3F); + /* fall-through */ + case 2: + if (*p == end) return _JSMNF_UTF_ILLEGAL; + tmp = **p; + (*p)++; + if (!_JSMNF_UTF8_IS_TRAIL(tmp)) return _JSMNF_UTF_ILLEGAL; + c = (c << 6) | (tmp & 0x3F); + /* fall-through */ + case 1: + if (*p == end) return _JSMNF_UTF_ILLEGAL; + tmp = **p; + (*p)++; + if (!_JSMNF_UTF8_IS_TRAIL(tmp)) return _JSMNF_UTF_ILLEGAL; + c = (c << 6) | (tmp & 0x3F); + } + + /* Check code point validity: no surrogates and valid range */ + if (!_JSMNF_UTF8_IS_VALID(c)) return _JSMNF_UTF_ILLEGAL; + + /* make sure it is the most compact representation */ + if (_jsmnf_utf8_width(c) != trail_size + 1) return _JSMNF_UTF_ILLEGAL; + + return c; +} + +static long +_jsmnf_utf8_validate(char *p, const char *end) +{ + const char *start = p; + while (p != end) { + if (_jsmnf_utf8_next(&p, end) == _JSMNF_UTF_ILLEGAL) + return JSMN_ERROR_INVAL; + } + return (long)(end - start); +} + +static unsigned +_jsmnf_utf8_encode(unsigned long value, char utf8_seq[4]) +{ + if (value <= 0x7F) { + utf8_seq[0] = value; + return 1; + } + if (value <= 0x7FF) { + utf8_seq[0] = (value >> 6) | 0xC0; + utf8_seq[1] = (value & 0x3F) | 0x80; + return 2; + } + if (value <= 0xFFFF) { + utf8_seq[0] = (value >> 12) | 0xE0; + utf8_seq[1] = ((value >> 6) & 0x3F) | 0x80; + utf8_seq[2] = (value & 0x3F) | 0x80; + return 3; + } + utf8_seq[0] = (value >> 18) | 0xF0; + utf8_seq[1] = ((value >> 12) & 0x3F) | 0x80; + utf8_seq[2] = ((value >> 6) & 0x3F) | 0x80; + utf8_seq[3] = (value & 0x3F) | 0x80; + return 4; +} + +static int +_jsmnf_utf8_append(unsigned long hex, char *buf_tok, const char *buf_end) +{ + char utf8_seq[4]; + unsigned utf8_seqlen = _jsmnf_utf8_encode(hex, utf8_seq); + unsigned i; + + if ((buf_tok + utf8_seqlen) >= buf_end) return JSMN_ERROR_NOMEM; + + for (i = 0; i < utf8_seqlen; ++i) + buf_tok[i] = utf8_seq[i]; + return utf8_seqlen; +} + +#define BUF_PUSH(buf_tok, c, buf_end) \ + do { \ + if (buf_tok >= buf_end) return JSMN_ERROR_NOMEM; \ + *buf_tok++ = c; \ + } while (0) + +JSMN_API long +jsmnf_unescape(char buf[], size_t bufsize, const char src[], size_t len) +{ + char *src_tok = (char *)src, *const src_end = src_tok + len; + char *buf_tok = buf, *const buf_end = buf + bufsize; + int second_surrogate_expected = 0; + unsigned first_surrogate = 0; + + while (*src_tok && src_tok < src_end) { + char c = *src_tok++; + + if (0 <= c && c <= 0x1F) return JSMN_ERROR_INVAL; + + if (c != '\\') { + if (second_surrogate_expected) return JSMN_ERROR_INVAL; + BUF_PUSH(buf_tok, c, buf_end); + continue; + } + + /* expects escaping but src is a well-formed string */ + if (!*src_tok || src_tok >= src_end) return JSMN_ERROR_PART; + + c = *src_tok++; + + if (second_surrogate_expected && c != 'u') return JSMN_ERROR_INVAL; + + switch (c) { + case '"': + case '\\': + case '/': + BUF_PUSH(buf_tok, c, buf_end); + break; + case 'b': + BUF_PUSH(buf_tok, '\b', buf_end); + break; + case 'f': + BUF_PUSH(buf_tok, '\f', buf_end); + break; + case 'n': + BUF_PUSH(buf_tok, '\n', buf_end); + break; + case 'r': + BUF_PUSH(buf_tok, '\r', buf_end); + break; + case 't': + BUF_PUSH(buf_tok, '\t', buf_end); + break; + case 'u': { + unsigned hex; + int ret = _jsmnf_read_4_digits(src_tok, src_end, &hex); + + if (ret != 4) return ret; + + src_tok += ret; + + if (second_surrogate_expected) { + if (!_JSMNF_UTF16_IS_SECOND_SURROGATE(hex)) + return JSMN_ERROR_INVAL; + + ret = _jsmnf_utf8_append( + _JSMNF_UTF16_JOIN_SURROGATE(first_surrogate, hex), buf_tok, + buf_end); + if (ret < 0) return ret; + + buf_tok += ret; + + second_surrogate_expected = 0; + } + else if (_JSMNF_UTF16_IS_FIRST_SURROGATE(hex)) { + second_surrogate_expected = 1; + first_surrogate = hex; + } + else { + ret = _jsmnf_utf8_append(hex, buf_tok, buf_end); + if (ret < 0) return ret; + + buf_tok += ret; + } + } break; + default: + return JSMN_ERROR_INVAL; + } + } + return _jsmnf_utf8_validate(buf, buf_tok); +} + +#undef BUF_PUSH + +#endif /* JSMN_HEADER */ +#endif /* JSMN_H */ + +#ifdef __cplusplus +} +#endif + +#endif /* JSMN_FIND_H */ diff --git a/util/jsmn.h b/util/jsmn.h new file mode 100644 index 0000000..8ac14c1 --- /dev/null +++ b/util/jsmn.h @@ -0,0 +1,471 @@ +/* + * MIT License + * + * Copyright (c) 2010 Serge Zaitsev + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef JSMN_H +#define JSMN_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef JSMN_STATIC +#define JSMN_API static +#else +#define JSMN_API extern +#endif + +/** + * JSON type identifier. Basic types are: + * o Object + * o Array + * o String + * o Other primitive: number, boolean (true/false) or null + */ +typedef enum { + JSMN_UNDEFINED = 0, + JSMN_OBJECT = 1 << 0, + JSMN_ARRAY = 1 << 1, + JSMN_STRING = 1 << 2, + JSMN_PRIMITIVE = 1 << 3 +} jsmntype_t; + +enum jsmnerr { + /* Not enough tokens were provided */ + JSMN_ERROR_NOMEM = -1, + /* Invalid character inside JSON string */ + JSMN_ERROR_INVAL = -2, + /* The string is not a full JSON packet, more bytes expected */ + JSMN_ERROR_PART = -3 +}; + +/** + * JSON token description. + * type type (object, array, string etc.) + * start start position in JSON data string + * end end position in JSON data string + */ +typedef struct jsmntok { + jsmntype_t type; + int start; + int end; + int size; +#ifdef JSMN_PARENT_LINKS + int parent; +#endif +} jsmntok_t; + +/** + * JSON parser. Contains an array of token blocks available. Also stores + * the string being parsed now and current position in that string. + */ +typedef struct jsmn_parser { + unsigned int pos; /* offset in the JSON string */ + unsigned int toknext; /* next token to allocate */ + int toksuper; /* superior token node, e.g. parent object or array */ +} jsmn_parser; + +/** + * Create JSON parser over an array of tokens + */ +JSMN_API void jsmn_init(jsmn_parser *parser); + +/** + * Run JSON parser. It parses a JSON data string into and array of tokens, each + * describing + * a single JSON object. + */ +JSMN_API int jsmn_parse(jsmn_parser *parser, const char *js, const size_t len, + jsmntok_t *tokens, const unsigned int num_tokens); + +#ifndef JSMN_HEADER +/** + * Allocates a fresh unused token from the token pool. + */ +static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser, jsmntok_t *tokens, + const size_t num_tokens) { + jsmntok_t *tok; + if (parser->toknext >= num_tokens) { + return NULL; + } + tok = &tokens[parser->toknext++]; + tok->start = tok->end = -1; + tok->size = 0; +#ifdef JSMN_PARENT_LINKS + tok->parent = -1; +#endif + return tok; +} + +/** + * Fills token type and boundaries. + */ +static void jsmn_fill_token(jsmntok_t *token, const jsmntype_t type, + const int start, const int end) { + token->type = type; + token->start = start; + token->end = end; + token->size = 0; +} + +/** + * Fills next available token with JSON primitive. + */ +static int jsmn_parse_primitive(jsmn_parser *parser, const char *js, + const size_t len, jsmntok_t *tokens, + const size_t num_tokens) { + jsmntok_t *token; + int start; + + start = parser->pos; + + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + switch (js[parser->pos]) { +#ifndef JSMN_STRICT + /* In strict mode primitive must be followed by "," or "}" or "]" */ + case ':': +#endif + case '\t': + case '\r': + case '\n': + case ' ': + case ',': + case ']': + case '}': + goto found; + default: + /* to quiet a warning from gcc*/ + break; + } + if (js[parser->pos] < 32 || js[parser->pos] >= 127) { + parser->pos = start; + return JSMN_ERROR_INVAL; + } + } +#ifdef JSMN_STRICT + /* In strict mode primitive must be followed by a comma/object/array */ + parser->pos = start; + return JSMN_ERROR_PART; +#endif + +found: + if (tokens == NULL) { + parser->pos--; + return 0; + } + token = jsmn_alloc_token(parser, tokens, num_tokens); + if (token == NULL) { + parser->pos = start; + return JSMN_ERROR_NOMEM; + } + jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos); +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + parser->pos--; + return 0; +} + +/** + * Fills next token with JSON string. + */ +static int jsmn_parse_string(jsmn_parser *parser, const char *js, + const size_t len, jsmntok_t *tokens, + const size_t num_tokens) { + jsmntok_t *token; + + int start = parser->pos; + + /* Skip starting quote */ + parser->pos++; + + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + char c = js[parser->pos]; + + /* Quote: end of string */ + if (c == '\"') { + if (tokens == NULL) { + return 0; + } + token = jsmn_alloc_token(parser, tokens, num_tokens); + if (token == NULL) { + parser->pos = start; + return JSMN_ERROR_NOMEM; + } + jsmn_fill_token(token, JSMN_STRING, start + 1, parser->pos); +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + return 0; + } + + /* Backslash: Quoted symbol expected */ + if (c == '\\' && parser->pos + 1 < len) { + int i; + parser->pos++; + switch (js[parser->pos]) { + /* Allowed escaped symbols */ + case '\"': + case '/': + case '\\': + case 'b': + case 'f': + case 'r': + case 'n': + case 't': + break; + /* Allows escaped symbol \uXXXX */ + case 'u': + parser->pos++; + for (i = 0; i < 4 && parser->pos < len && js[parser->pos] != '\0'; + i++) { + /* If it isn't a hex character we have an error */ + if (!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */ + (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */ + (js[parser->pos] >= 97 && js[parser->pos] <= 102))) { /* a-f */ + parser->pos = start; + return JSMN_ERROR_INVAL; + } + parser->pos++; + } + parser->pos--; + break; + /* Unexpected symbol */ + default: + parser->pos = start; + return JSMN_ERROR_INVAL; + } + } + } + parser->pos = start; + return JSMN_ERROR_PART; +} + +/** + * Parse JSON string and fill tokens. + */ +JSMN_API int jsmn_parse(jsmn_parser *parser, const char *js, const size_t len, + jsmntok_t *tokens, const unsigned int num_tokens) { + int r; + int i; + jsmntok_t *token; + int count = parser->toknext; + + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + char c; + jsmntype_t type; + + c = js[parser->pos]; + switch (c) { + case '{': + case '[': + count++; + if (tokens == NULL) { + break; + } + token = jsmn_alloc_token(parser, tokens, num_tokens); + if (token == NULL) { + return JSMN_ERROR_NOMEM; + } + if (parser->toksuper != -1) { + jsmntok_t *t = &tokens[parser->toksuper]; +#ifdef JSMN_STRICT + /* In strict mode an object or array can't become a key */ + if (t->type == JSMN_OBJECT) { + return JSMN_ERROR_INVAL; + } +#endif + t->size++; +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + } + token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY); + token->start = parser->pos; + parser->toksuper = parser->toknext - 1; + break; + case '}': + case ']': + if (tokens == NULL) { + break; + } + type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY); +#ifdef JSMN_PARENT_LINKS + if (parser->toknext < 1) { + return JSMN_ERROR_INVAL; + } + token = &tokens[parser->toknext - 1]; + for (;;) { + if (token->start != -1 && token->end == -1) { + if (token->type != type) { + return JSMN_ERROR_INVAL; + } + token->end = parser->pos + 1; + parser->toksuper = token->parent; + break; + } + if (token->parent == -1) { + if (token->type != type || parser->toksuper == -1) { + return JSMN_ERROR_INVAL; + } + break; + } + token = &tokens[token->parent]; + } +#else + for (i = parser->toknext - 1; i >= 0; i--) { + token = &tokens[i]; + if (token->start != -1 && token->end == -1) { + if (token->type != type) { + return JSMN_ERROR_INVAL; + } + parser->toksuper = -1; + token->end = parser->pos + 1; + break; + } + } + /* Error if unmatched closing bracket */ + if (i == -1) { + return JSMN_ERROR_INVAL; + } + for (; i >= 0; i--) { + token = &tokens[i]; + if (token->start != -1 && token->end == -1) { + parser->toksuper = i; + break; + } + } +#endif + break; + case '\"': + r = jsmn_parse_string(parser, js, len, tokens, num_tokens); + if (r < 0) { + return r; + } + count++; + if (parser->toksuper != -1 && tokens != NULL) { + tokens[parser->toksuper].size++; + } + break; + case '\t': + case '\r': + case '\n': + case ' ': + break; + case ':': + parser->toksuper = parser->toknext - 1; + break; + case ',': + if (tokens != NULL && parser->toksuper != -1 && + tokens[parser->toksuper].type != JSMN_ARRAY && + tokens[parser->toksuper].type != JSMN_OBJECT) { +#ifdef JSMN_PARENT_LINKS + parser->toksuper = tokens[parser->toksuper].parent; +#else + for (i = parser->toknext - 1; i >= 0; i--) { + if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) { + if (tokens[i].start != -1 && tokens[i].end == -1) { + parser->toksuper = i; + break; + } + } + } +#endif + } + break; +#ifdef JSMN_STRICT + /* In strict mode primitives are: numbers and booleans */ + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 't': + case 'f': + case 'n': + /* And they must not be keys of the object */ + if (tokens != NULL && parser->toksuper != -1) { + const jsmntok_t *t = &tokens[parser->toksuper]; + if (t->type == JSMN_OBJECT || + (t->type == JSMN_STRING && t->size != 0)) { + return JSMN_ERROR_INVAL; + } + } +#else + /* In non-strict mode every unquoted value is a primitive */ + default: +#endif + r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens); + if (r < 0) { + return r; + } + count++; + if (parser->toksuper != -1 && tokens != NULL) { + tokens[parser->toksuper].size++; + } + break; + +#ifdef JSMN_STRICT + /* Unexpected char in strict mode */ + default: + return JSMN_ERROR_INVAL; +#endif + } + } + + if (tokens != NULL) { + for (i = parser->toknext - 1; i >= 0; i--) { + /* Unmatched opened object or array */ + if (tokens[i].start != -1 && tokens[i].end == -1) { + return JSMN_ERROR_PART; + } + } + } + + return count; +} + +/** + * Creates a new parser based over a given buffer with an array of tokens + * available. + */ +JSMN_API void jsmn_init(jsmn_parser *parser) { + parser->pos = 0; + parser->toknext = 0; + parser->toksuper = -1; +} + +#endif /* JSMN_HEADER */ + +#ifdef __cplusplus +} +#endif + +#endif /* JSMN_H */

F|4cIUg1J|ldyw$fWnIl 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 literal 0 HcmV?d00001 diff --git a/dist/popnhax/normaliz.dll b/dist/popnhax/normaliz.dll new file mode 100644 index 0000000000000000000000000000000000000000..bd889e9065a86935ba49577a8b4b7dbfa95038fd GIT binary patch literal 20480 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