From 2421ea92eba33682a20571fc7817b96341294546 Mon Sep 17 00:00:00 2001 From: Ruthenic Date: Sun, 1 May 2022 18:24:06 -0400 Subject: [PATCH] init --- .gitignore | 1 + Makefile | 28 ++++++++++++++ bin/httpsrv | Bin 0 -> 17592 bytes bin/main | Bin 0 -> 17568 bytes compile_flags.txt | 1 + lib/file.h | 31 ++++++++++++++++ lib/reqHeader.h | 22 +++++++++++ lib/resHeader.h | 12 ++++++ src/main.c | 69 ++++++++++++++++++++++++++++++++++ src/srv.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 256 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100755 bin/httpsrv create mode 100755 bin/main create mode 100644 compile_flags.txt create mode 100644 lib/file.h create mode 100644 lib/reqHeader.h create mode 100644 lib/resHeader.h create mode 100644 src/main.c create mode 100644 src/srv.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9daeafb --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +test diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..cd46336 --- /dev/null +++ b/Makefile @@ -0,0 +1,28 @@ +CC ?= gcc +target ?= $(shell ${CC} -dumpmachine) +CC_FLAGS ?= +CC_FLAGS := ${CC_FLAGS} -Ilib +DESTDIR ?= / + +.PHONY: all debug clean build-release install +all: + @$(shell mkdir -p bin) +all: main + +main: + @${CC} -o bin/httpsrv src/main.c ${CC_FLAGS} + +debug: CC_FLAGS:=-g -O0 -v ${CC_FLAGS} +debug: all + +clean: + @rm -rf bin + +release: CC_FLAGS:=-O3 ${CC_FLAGS} +release: all +release: + @strip bin/* + tar -czf release.tar.gz bin/* + +install: + @install -m 777 bin/httpsrv ${DESTDIR}/usr/local/bin diff --git a/bin/httpsrv b/bin/httpsrv new file mode 100755 index 0000000000000000000000000000000000000000..bd959293e3129ad96d65bce73259441b024e39da GIT binary patch literal 17592 zcmeHPdz4hgovt1j9f>d_f=*DwjXGIyGtGd!f}+i%@uCQbV9aXLG~GRP!_0K2`wq;o zQHevlb~@t{H@K|p*(DkcNzO*Hi7(<~6lKuO8qh3DV$MoD>UJ+A8Q&v8d%v$9J-0h^ zbN1w)-Lq$kGxt}&ufE@}9=C4Q?W$Yc5?r>V#^)0zj1rd#Y7OHR63_{A=j#YWK+F|m zas8AyPn-gMw8T_;KnbL(aHOVE)@ghcB<&g*8AhI~U}2;wAtmiR!&seSWP{RaSIel@ ztK~$^H`1h+^RsA-V99G)F4KiE(rw4KDKsm7LARfgExO*emd1|FMY}<5H>mB5Jjwzg z7-`y*#o*su?XOw}kj4;@S0SqHy0l%jT&(#o;6Ek9gn_5B%>u@W1lFdp+<&9{2+u_!bZRK@WVu1E1xACq3{5 z9{1}k5B@)T;OBYZ-}JzX9=Pp+;|Un{{{GklU*v&*-2?xr2fosyeNF{m4^fB>g-a0~ zt{>hA{0#9)VJ%QxGro#QJeo+0P$<$B4z(sa!flByG0`4wYfDB%YbF-kh%}5fkx<47 zr=3uHIME?8PCC+_5}9OVW6Tj@Cz%kf$y7`wq`H~zBsYp=3MT8t`j~@Qs4dyCUbH%~ zwlHwQG|FT|q9f*n!qI3NuGd94 zUd|R*EL*y8QD}yLW;r&)KdT(Sc%}#~U43;Z8cWC4vpDJ1S1&?kVynaJ+G5CPeS5M) zw@ye=hb0P8gVEH7Kl5*NIc5+g-5hs{!FdN6KLKgxkqLp%X+T^N3A#3bkpW}YwigEJLApyzXg@6ny9p{m~){mA9Yj$^xaErFvhoO6f?1s6Wi zfRF<&{L?Oc(1pAEyXnWA-#EXR&=^oLJ|BAOlz`>J-Sg8F7cSqwBpY+53zzej#^<_l z=3zo0pkl;K+Yzw?yb3`aH>4a^22_;zm@+EF^)CDqE_|&EKi!4LT{t>GIiy_pxH2k4 zmkY0V;agp}=~GO;-G!e)K!@!C6=C_uYm8!NKqED0Da0F9R9^c6N+JG96_wWm0i_V1q@wbAFrXCT=cuT>9tkLgxOulHax}oJ zx{sV|Oeh3YjQmd-5ON@(6ylRrR9*)IN+E8ksJiOsi#XqTM#4x7jI@9d@6>O$W-%FiSKyj_q z@21Y7zqnHBcTyiiJs|b3QRh%!Y?1n{)H%c#Evavz&Y`{7AoVnL4(UZ9^$pbPsSkV% zplKa-4&lY4QvVC;9J-4KrM`+fhwNgX)UTw@p}M$7>If%jNuS2dDQA>M8E*H7LC6Lgr~ z`G?@Z?yY@+;&X$}M0BOwKw?)qt#q`0@>cTpX$k(fB!AZ36jML8a|8C%zrEakdT^BO z+ixHG*qHzaYqW#9($UuX$%}{VS-!3F+hHp@FJ5E!%%1_Kuyb!XW9|I>%Yc_AT7U`> z+^hYyivjq)xNoSu`&x(M?9cR9To3LV_`rkEVCQZcv~!&Uc0P!|t_CGjctC;!d3m+- zD;uE=F3o+o6ov1d)ra0>=lUOIJqvj>;`ZnFNq1j89ze&ob59&NQ7YvgdKTBHogdva zMHV?YIK9vA?H%}isg%z$Z7+Y>+qoBW{e{ktN+r8D%QU-p;!QGx!^op>k_owIkaiFj zc20tuPm)%9ouuu5N|xj0N@7nRY9`57D)Lk}`GHDuZ3CWXO+N?p`iHZ>MsC~sIwzZq z>F=>=_$3hQ^2hC5U4Nj?X>SvDKFhiemGCjX5Zn0{J2xZuqU}3u_ugE`$bP$LKU#Cs zfSucnHr!HY_x$IeJ@te=^`P%i&#wocE{@8*kbB9_?YDD>-m&jzgGcQ@S8eCi7Jkl_ zQJLw+?m3Q3ZaQN31dsT@KEl?zgRGuG-{vW3p3h+rAovApguwdnc2BNNNtf4wT42JAXBcFz_UYS|;C%oJ|tCs_)=_ z;Ow-y;2`8+xesn{qQMhgzhobDaINZtds$NH_9+&%P-L;PTS08?&-Ovoh$d+|zmKWG}}`)vN2_IosFm&+nkSvh{v6-A^%s z!;gA~=D^vba!UCaB~osl&w>3IGSHdHCQ)Vn zd*qkPZew}z%t7RLP*Km)S?n7Mw&fF+y`99o6i;%HV%yvf=XNf;eaMF*_ZJq)=PtX` zm7<@$?4!W?v%7FTKsUX$ehKFNPcqFKq`QNcej#IIHS2Kawuh<_|T8(^+_lK#4*rZeaJwui?NqK~5SN_+EjB z@`z_)#4DiCcVTK)&;1$>5}3d^bg75wzhE#lAst17%u_uV6RtVKwr&nOPf_ zcw(eL3GaJ%NbQ|?w!GnTe%gSd<54~rT;5M<++TPFT}QnLjA574etIV!#GAG5!_$@F znRdSREICDFdCQCJjzj$Whxk6lp9KD!7t#ynSJ`arBgI=Q%rZk}FQDKkUkqjsYO_-T z9a|0HA0#02Jr;z1hbGJ}`#t6dyjjCPdk1#sRaW$E48f|RpN7%);;DT9%I{#AKxB>7 z6Z^YC%m=bpR6S5%gVX2tm4647fBBF*5=L6!|91=c^eS#s#%hXMO_{M{79~5dCEzr# z?oP$#No0($#560C?AR1bJF%$cBrWsi&v$d22ej*w1veBVi>wDw)^D(#YMKl1eAnf!aM)6B8Zl$&EWsYTmSI()k#% z;ws_9x}0fomdUTK5o}IKkP&|(k`#&d@cP)aO&w8xdm@rfW|FNA@ebkNps5?eo5Gn$ zI)Tj)X_{)|?#%L}V=YN`ViRO3S}Kh#9ZQ!^Rz}En93z@CO&Ni!)og{WOrkx7`fZM_ z%gBoO$DG#O9FMi7=2?FvIPpZrBFk!zWilu&t+=^j-N5S?KWjCIb=2i26LTyl9y(ZT<607{oT_>Zxt=q7 z&K&6#`(M@#xWpn(GTlwjQMW$NG6gPkSYFvqRXK#XX?Tqgf!~x$TOnJ1S1R%CVd_Asv>UPu@&M!;ZHBS|^cfNtpUU4o za_?j&fcO$)>eoXqPxQ_(d--EyRP?xhS(#Mz6A4mFe)bW*3Zu`TdjQy_we+QH3 z49K$ocA35Oe-iLxNS|C`KS|otWF(BVz(@;>w7^IUjI_W=3yieDNDKTQY61PRi22@# zuZRpMln~erQbE483Vh$KLLGMo5xBv~V7_ZI-*n*BR0eK1GMMk1&Q)spTb=hlE+q-| z@!b&t`(iSz#X=SX){A5)=ydY~af2=>_iGp$l@RW4n+Rz$yyPoFjS}LZj+pm$on85x zmlmCo!LP^aIfJQ}Tvvpy;d1`i$&mFiRIEBly-^df?j&{7&Uh`C`U~1I){muLE;lp% zUkK*A^6IQ->wd6A%j>jk)pC=Tw`qBomJew8u$KF^JgnuLTE4I4Df*+Qv$Xt-mb0~7 zqUCj3wraUa%iFZPOUnned|1o- zyy$`d-UI(G`u%YAIvwpc96s3tzt{uMc;p)dpY2wCUsiee;TKE8mFF*k5BFX79UlB$ zz%6q#T=GHssc95ud@)InOaB-Qwb5vu@Gly`z^vyxXy{^ zr1w4i)Zu>7Pj!ErAn)TiahiUQSfR7wTF`im4@LcgAlHVFcA>_v*L=BV1$>6YwXsVq z^1!e2!1+blu=mRYzeD2V#3Q<#Gj!g6h}Bv zaLZMH6MaYe87H38FD!B`4~Zv%pKnMmc{V!C_!`VIdOkHt=MguGTZY#qnmdwC%pbw0 z^-w}ics-Wz6Apk#+Q~Sb_(CcohQ7uRIqe~wCFqD{U=U4)*0*5=zAY5RVs0iB?(7ng zB-ggFF@Q;OSO(8MBtqeII@}$?&O*8y=M2K_u~4+Ly}cVIE-l28R8V;!LY8&Oss&dE zL&4>XLpTMn_zTMyT)lJ=j4?%rf_6xy+KX3-&=t#8EL^ZGv|`DUYlEvps~0R>7KBCh zA&Y=HmB8}{RVN+FX*{R!#||g(phl{@g3hxS6@WZbQGtYF(XbO1vRU*2jf!-6WTXPA zK5bD>oasLOQASy8dA_3p;Tez$Kpo|%fKVYG1gXH}L6QmtcNrB>XEKIPd{j`_GVQ4f zNF7(HfaGzN3Z(kDM<|*}hT`FlD35|HU4cBKiH=ZbCKlC)XezAL=1~QN9v4*yZ7Si= zx=cpbpgp`XX5-*XEDfL7;Nc;dRk1H?h#MyrraT^#sk+BJol`+V{c%L60#e6nDj>C2 zf%82TXePbMoYkqodH$vX2!(J|#yk={Lo@8b7*=Nqw&Bpt-G`7WJ@L8I2aYNdgg?{W z?u6GtqDE52O$>*LV(FCd%i&~wN2ec~b17^QcDtZ;oe7+wOhh%bVBykc4mf_&k-duC_NafHZe7zh@0L8xgmCm$o;u`gPpAml*q{Rrcohjggii zYFTandEnSyOPcbVbpazy{$^dEy8L0-b4|e5n{@*tO+8pgwzIJ}>jw#7tg^8;>kvko zbq7#npbvNWG8F#CH}>Xty^&XHvMIme8F@3(xn^K=vu*e1q*`Taw`hnV#tP-LjS|MviO+gsYs zNV!+4Z7Iy_jgjA}vTx8YJ4Ozg1tjgm*lAV#Q9c83h|1$jQ^8ZNNoAwu$W@`Cr zIYHs3{WMGb1QFKX(9G{vBbOPXmeu(`UuECI0Rh3tbLrd_s`GytY4}xNUNH~;U!QC)uae+FY`?&G__NHO;2 zoaB*dWD7AxiSpIh8~Gtp-1Z`%sVz!!|KA;qosl(2ciWranRU~Zl_{t3VeHB}jER}@ zoAZ{99`=?o)N-uOUl+HWYV51u{aIE9w={iErKoF*&c9DT*qn#>6V8<1jGtWQG-X$o f>N+q-$(E`PYw|VRGY}ch-nvvV&Z;t~QpJA*Ooah- literal 0 HcmV?d00001 diff --git a/bin/main b/bin/main new file mode 100755 index 0000000000000000000000000000000000000000..5840d7c67becbfc41542caa5350e50b01e827b05 GIT binary patch literal 17568 zcmeHP4{%$>nO{3`Fe$N3h{1$Ed4-rsxLR>c{?(8oCvkWQkc5y>TG}eI^lXX9k}5qX zb|{e65m%imF69d4I?P;3TaLN8yQZ|z@ZbE46WZ%Jw8xm1Ib05?G=XA{l$sRK{l4A( zq$i=*xw)IUnVa!?^uGOm-=E$6-oAbN-oEv%-B+!zt*H^5W{A%S;+p0v#H$6yYMlY` zidA9`j^~T>#4PYLC8p$FMIcpaytbUyYkUSM*|kun3O!fBf+^RKDA~EDIa&?< zLSoACq-xM_mG)Ojy^vAz%A*jKc7xiklCIPGOsNb?*S>BC|0m^b(RLFTC_j~y%VEmp zT?0Fc%YQfVY2K>Kb2|?$x_>g&;T20F;hq)CmPCSWk#KZiux)VFinbNYJjs}+Lso(6 z)s7$asVg>Z7qxrE2w`krBWlX{TFpa6CeodUABCOl>-HwM-L!G4))yY_zUHM_$1e2D z{u1d>JIE*LP$G@gp4>A1RzEG1B?*y?@kKGI1YI7XqrL@Td#kih_)fyAhjQ z^aotS%-@4#`>4Iln@MA9ceJ=PO7yO4V_@oQI+y#%h;9V}~ z>r5B@zjMLQbHTsmg6Cau(*>vAUG4n-#06jLf`7vW|G5jk#U(zcKwl40$d%G%$X2W8 z7l5BG&K5?O(&h101VX`ZLil`vLBFpz9Q8-Sdo0oKk3?bt(VMiaoseOy3HXw>KVkd& z{o$xc+KE7aTqI+Got7>9b}TG?AG4wF97XW7X4BC%+n=(Vj#M8pT| zqzFV}NsCk?WN1Z$A{kGFqjs<834;mQv1n36!bw~CO$0&-(VMXRLE#SsthkMOS&2k6 z2FC%v9ganXH5j%Ff1}Bho0D6yd04`~1OR0GA|s)jAEvkiT*;^!2Iy3Giaq42X$v^s^~Y&k6*6rXl&Q6B{1Q@=^nx<=fIm81f6u?pLF0; z4&2$_xgXR0jqWd;TD&Sp*N47!O2Ba7&im6M2QKGdQXBV92QKeh8eiqWsSHkDugVd| zu_MIv(oqP)aYBk|i&td{pItGj%U5 z!El-yv1e}s6tHRSh8{sH3YmXO~o`F|juF57%u^7j%?w}AW($$y7< z8v65FB!36-vx)ag{;!Cqp+4U(`L7XALww$l{2t3Jdf8;Nfue)1y# ztv$rk5T2iq{O5_Mp*ue&`K`p$kewfq{6^wwsLmgh{2JnEh|V97d?)dAtIqG2d3h|b3)e*y6{H0O6nem?OuB?1Kq9 zOm_7#I54wy&lCCdl--Q3bQ_eYE1g=HXk4(D^q$ca`rnoM%fCZp@keHQ(tPUomzz&b z%`j^Yo5wz~=fS~t?V!Fe(c8FSUCEy6w|8|vY{kGO+s)zC9nchJ`gMDbnOXfA;Du%b zP%eOTb+~RFfSNBpQ>yPXy`?<$XY!ZtgYI_tz=hCcrf;4y(*u)crW?P(CPm}8K)NS0 z@@QtZw1Au1kbZvyDxY0Gg5G4NM-Ndua~TA2|IufpyRW|KMaMSNj~_W%D5M{J7RR8O znc2EXR=Im>>4=%lPX4J-$fQX22tC=G>0hKra|0h13T8G%GBewJvn=36l#%;@1nH+C z8-sF6t=lC7lp2R{G<5{W4>5$G5E^OCbgKQ=gs;L;R(CYzMV2Bmnlh2|Qya2%UZuQ6 zDqmkx-ceKzAs1K5ElN2ql?O}8dyC3nM=q$8-$6u~15X0y*yNV0df12Ho)GMN;GX+!!5x+(h2S5Pj_&HDFoW>Y_hWcYD978>{c z6oF7oym8--5_9YQ3Jo>xOBB)2t#>Fi*tqY?A{uP`>p}QZ5@F9(8GqwGdVin41_z8I zC=K1`sfjwXCTF&dwW5U?IwKP#$S8suZksBx+2#@4KlyrppL+JdxzMFEFOAU`F+iws zWoE%_hc-L($3o%wHUOJTDK>D*cV2dA*}41D&B3k*ABG@uwq*?e*~6n@(LIdx?w! zU9S%SO{W$Tn3YCm`l(EcoIFCa2{rD&1*O!;kSB8|xkJ?`hBOFf>n^S*C4Id%L+=ny zxX6Em8YwqV(4+?irQLlrIDH&@kA2V(Ri(swr}p=tP3KY3NQaRNyB2Un5oMO`p=jbq#B_B$8H22AqQZnU`=(|&@1x1af1dd0@ zO|~wDSt7jD12KmmCuhRO{ad-cR2GcxnXTKQ^qQcTe~wJGO1626l*nQK3{**W=WJcO zL;ub){fkQa|M3T@-vs~7CH>=}lJiqa$`6&4-@{ZFm8QxZzqF)0C1F{UbV>OQhjIf- za`3sH6NtPRo+=E?S5f&E`UiCWMcGhPj$fF&OlqY@ZfQ|UCzR3yC8gZiP#Hxt=~Pp6 zG2qczHHV*Wk{$6LsjEBUH=qm!rI(ug4LEh;|B+5v$|-8#mCAT*q~`ifgG@;Z(Jw4PmOG4BqJn9(0;*bO>;|T|1BHWKNyJS~1=;;p!60u~g*CsqF zJU4398~wZd$v`5E#VBbSkI?GarkHK4j}2fEY6E&|0!wO!uAOX*ko|bJXic^z@$i4n zj7#zQK&}sX-zpRak#B#yP}l*wc(PD906GXd0{Z$pg~9~r2mgtg1MZ6++(-;iO8ic} zX3thpGuTvf&S|IA?}v`0OZU?LWx%u0=AYrVT$Il^JWFYi(R7-Qz;pzrBQPC- z=?F|mU^)WR5%_->0sXNEe{V!nMM@_X5m*gUNzPsczVBA)Wtw0jovldmyC(jo15;F) z=4;B|H)*rtw>p3Ls1PHS5iBB7q6J?{^e&DPO+6{)w45JMZqyaU%YT_#G+J@$2!XnG&~aT(QM(i@1EO&B*q!Dqa&yzD3*PJ-y^P z&X}G{{(0^Aea#o^t;_kpCj4D_Ww|SKKUlBnb(;2Sx=YjBG`&mH`!sz>)5Ds+sOcM; zzNhId{n68znqH*o3QgB*dYz`dn(or{Hcju+^gc}=()6&VFKYURrtfJwi&p9#iNCwM zV(r>aV-dc(UTiE~>gn*bJ9MgL={(OA@5nVSr<|^<8c6QZC)&_LTHvpyPYdzY@I}CD zMT78G)c0bI$1CvF8t3aBtW4M9Sc9v1QJ3PmfBGaoPw@4tq(a<=43%5NktZe*3S|>~z8V3E0c4QXijBco|W23Zx=r zQqYWmRKq)f8_Klocm>8617FJ3ca_0n6ZEV3@w?!(_E$}RAMhslZ|N%cpCSF)M#1AV zOTX#j=ld@BLoWC+7d-ER|H%da0s4KlcAbW}Rl^s!;Fq}INtbfFp-*wEJTF^a{LmLm z)#`H-@M_<6-|nJ+0Jy;?!$E&Yerj6;k1s5GO!~)QsEuZ7!OvX$|GNwR4)7*i*X>>G zSBwHg=G;F8FmWIDJu8^?bSDw@bW1ysRe<9lGqlanb+23x3E2KMI`AZ)M#64Y=WG zCuiT5ej3DcdSW8q-9b17`~p^T&@<36=GNkFqVJn5I-782oYdbFZi~ij%M-vS^k96p zzYnkK!#03G!cN))_!250N?+ak?0z5i3`DIY41zIVUj%P@BfcPBUMGG2fk6?7(Yt&s z0N`d=RfG07gnj-*!awB03PNHC`w9I0mM=Ka-#-Ks2j`=jl&R9j2U*wkTf46A_H}Ps z=fl_j>pr)s>*@__VT@a`uiNw~skv^e@Lh4$<~3bc`8Ka#e{J_R-?pwbS9Qapax;aO zcOTF`gNhvuMH%f!_;Z^OXhTMPs7#&qSd;;B??f5mvx0uxFJxHsMvOAK+!|7bRPL%M z3YR%|c@$Bqw%o^2hR|M*GC*zFD1*=-+VD|^$qgfA2+lGZp!Qyrc6OAhP-Ob!WsusI zQU=LwDP>6Iwhmt~8S{nw(I9R4*svL82E$R`K++28%`#=yYLTK0LXQio4K?MkuP2$* zE$H{}v`lPpu@dl!g#_B{veo*shG>DL%#^mlBrDD_?ZPQjLi@25rwmftXUZV8HiLaU zWvJedQ-;wVn=-)X!*&?H9B7|R)y*%|l=WEZK^J#!G%EK**PPx|R3;FfP=itu2V>&NKj983Qfd3sK+!4J1vnOZQuQ)0@`$qH4v zoF{rAe)Me0_N%l#Q!ixB#Lumatw6?UKd9}QR!+Nl{=xPeD(v|=hN;1dnpWC>7C62H ziE;h;`JXA5&(Hsr_4mV`p8eUL-w!b5c2FBB&TP-m>0w~hWVYw`4NUp{0#sxoAI|h; zF!U_X_WbTOg-*1I+XL0j6GUUs-<*i!3q}Q?}>#6HLdoB9~v;{%>ph zHCm6~cQEDmBVnOE9>7Z}Ba{TJsSdLF{>fuJH&<@vt{sMFric1-2ksJ11-(;KFL zUt!;*Cp%1!@{1zvgY7gc{;9&ApO={OdoI?mtpAU-J;z@dT2s?kiUNgm{Ir&M6d7ti ztMT(G({-$&|G&Wm1qX@xKP9%~^LPRnsjxloha6u*+K7W9#UtA@ zeIF91z3^()c17!T`5G;j&-S&DJMH;-vVN(u;Cfct7kL2)U8U0JH*_)0}TRncL&T-H4u SnQHbkFH;(4Rv1*U;=cf8zW00p literal 0 HcmV?d00001 diff --git a/compile_flags.txt b/compile_flags.txt new file mode 100644 index 0000000..b0910f9 --- /dev/null +++ b/compile_flags.txt @@ -0,0 +1 @@ +-Ilib diff --git a/lib/file.h b/lib/file.h new file mode 100644 index 0000000..30c0599 --- /dev/null +++ b/lib/file.h @@ -0,0 +1,31 @@ +#include +#include +#include +#include +#include + +char* readFile(char* path) { + path++; + if (strlen(path) <= 1) { + printf("/ converted to /index.html\n"); + path = (char*)malloc(11); + path = "index.html"; + } + + FILE* fp = fopen(path, "rb"); + if (!(access(path, F_OK) == 0)) { + errno = -1; + return ""; + } + char* buf = NULL; + fseek(fp, 0, SEEK_END); + int length = ftell(fp); + rewind(fp); + + buf = (char*)malloc(sizeof(char) * (length + 1)); + fread(buf, sizeof(char), length, fp); + buf[length] = '\0'; + + char* tmp = buf; + return tmp; +} diff --git a/lib/reqHeader.h b/lib/reqHeader.h new file mode 100644 index 0000000..cef15f7 --- /dev/null +++ b/lib/reqHeader.h @@ -0,0 +1,22 @@ +#include +#include +#include + +typedef struct { + char method[16]; + char path[256]; + char protocol[10]; +} ReqHeader; + +ReqHeader readReqHeader(int client) { + char buf[1024]; + read(client, buf, 1024); + ReqHeader header; + strcpy(header.method, strtok(buf, " ")); + strcpy(header.path, strtok(NULL, " ")); + strcpy(header.protocol, strtok(NULL, " ")); + if (header.path[1] == '\0') { + strcpy(header.path, "/index.html"); + } + return header; +} diff --git a/lib/resHeader.h b/lib/resHeader.h new file mode 100644 index 0000000..2051296 --- /dev/null +++ b/lib/resHeader.h @@ -0,0 +1,12 @@ +#include + +typedef struct { + int status; + char* notice; + char* mime; + char* protocol; +} ResHeader; + +void makeHeader(char* out, ResHeader* header) { + sprintf(out, "%s %d %s\r\nContent-Type: %s\r\n\n", header->protocol, header->status, header->notice, header->mime); +} diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..9c2deea --- /dev/null +++ b/src/main.c @@ -0,0 +1,69 @@ +#define _GNU_SOURCE +#include +#include + +#include "srv.c" + +#define DEFAULT_ADDR "127.0.0.1" +#define DEFAULT_PORT 7677 + +void help(char* exe) { + char* help = "%s - a simple webserver.\n" + " --help: this help message\n" + " --addr [addr], -a [addr]: set the ip address to bind to (default: 127.0.0.1)\n" + " --port [port], -p [port]: set the port to bind to (default: 7677)\n" + " --dir [directory], -d [directory]: set the directory to serve out of (default: the CWD)\n"; + printf(help, exe); +} + +int main(int argc, char** argv) { + char* ADDR = DEFAULT_ADDR; + int PORT = DEFAULT_PORT; + + int c; + int opt_idx; + char* longopt; + struct option long_options[] = { + {"addr", required_argument, 0, 'a'}, + {"port", required_argument, 0, 'p'}, + {"dir", required_argument, 0, 'd'}, + {"help", no_argument, 0, 'h'}, + {0, 0, 0, 0 } + }; + while (1) { + c = getopt_long(argc, argv, "a:p:d:h", long_options, &opt_idx); + + if (c==-1) break; + + switch (c) { + case 0: + longopt = (char*)long_options[opt_idx].name; + printf("%s\n", longopt); + if (!strcmp(longopt, "help")) { + help(argv[0]); + exit(0); + } else if (!strcmp(longopt, "addr")) { + ADDR = optarg; + } else if (!strcmp(longopt, "port")) { + PORT = atoi(optarg); + } else if (!strcmp(longopt, "dir")) { + chdir(optarg); + } + break; + case 'a': + ADDR = optarg; + break; + case 'p': + PORT = atoi(optarg); + break; + case 'd': + chdir(optarg); + break; + case 'h': + help(argv[0]); + exit(0); + } + } + + srv(ADDR, PORT); +} diff --git a/src/srv.c b/src/srv.c new file mode 100644 index 0000000..7d001f3 --- /dev/null +++ b/src/srv.c @@ -0,0 +1,92 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "resHeader.h" +#include "reqHeader.h" +#include "file.h" + +int srv(char* ADDR, int PORT) { + char buffer[BUFSIZ]; + int srvSocket; + struct sockaddr_in srvAddr; + + srvSocket = socket(AF_INET, SOCK_STREAM, 0); + + srvAddr.sin_family = AF_INET; + srvAddr.sin_port = htons(PORT); + srvAddr.sin_addr.s_addr = inet_addr(ADDR); + + if (bind( + srvSocket, + (struct sockaddr*) &srvAddr, + sizeof(srvAddr) + ) < 0) { + printf("Error: Failed to bind to %s:%d.\n", ADDR, PORT); + return 1; + } + + if (listen(srvSocket, 10) < 0) { + printf("Error: Unable to listen on %s:%d.\n", ADDR, PORT); + return 1; + } + + printf("Server (probably) listening on http://%s:%d\n", ADDR, PORT); + + while(1) { + int client = accept(srvSocket, NULL, NULL); + ReqHeader request = readReqHeader(client); + char* tPath = request.path; + char* dot = strrchr(tPath, '.'); + + char *file = readFile(request.path); + ResHeader rawHeader; + rawHeader.protocol = request.protocol; + rawHeader.status = 200; + rawHeader.notice = "OK"; + if (!dot || dot == tPath) { rawHeader.mime = "text/html"; } else { + /*switch (dot) { + "html": + rawHeader.mime = "text/html"; + "css": + rawHeader.mime = "text/css"; + "js": + rawHeader.mime = "text/javascript"; + default: + rawHeader.mime = "text/plain"; + }*/ + if (!strcmp(dot, ".html")) { + rawHeader.mime = "text/html"; + } else if (!strcmp(dot, ".css")) { + rawHeader.mime = "text/css"; + } else if (!strcmp(dot, ".ico")) { + rawHeader.mime = "image/vnd.microsoft.icon"; + } else if (!strcmp(dot, ".js")) { + rawHeader.mime = "text/javascript"; + } else { + rawHeader.mime = "text/plain"; + } + } + if (errno == -1) { + rawHeader.status = 404; + rawHeader.notice = "Not Found"; + } else if (errno > 0) { + rawHeader.status = 500; + rawHeader.notice = "Internal Server Error"; + } + errno = 0; + printf("%d %s\n", rawHeader.status, request.path); + char tmpHeader[1024]; + makeHeader(tmpHeader, &rawHeader); + char resHeader[1024]; //= "HTTP/1.1 200 OK\r\n\nHello, world!"; + sprintf(resHeader, "%s%s", (char*)tmpHeader, file); + send(client, resHeader, strlen(resHeader), 0); + close(client); + } +}