From ec07761d0fb654ac7a43089ad865a88340e67f3e Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 27 Oct 2018 01:24:22 +0200 Subject: [PATCH] Implement waitpid() support for getting the waitee's exit code. --- Kernel/Syscall.cpp | 2 +- Kernel/Task.cpp | 16 +++++++++++++--- Kernel/Task.h | 3 ++- Kernel/_fs_contents | Bin 1024000 -> 1024000 bytes LibC/unistd.cpp | 4 ++-- LibC/unistd.h | 6 +++++- Userland/sh.cpp | 12 ++++++++++-- 7 files changed, 33 insertions(+), 10 deletions(-) diff --git a/Kernel/Syscall.cpp b/Kernel/Syscall.cpp index ca0ed9b66c..4bf39c045c 100644 --- a/Kernel/Syscall.cpp +++ b/Kernel/Syscall.cpp @@ -95,7 +95,7 @@ DWORD handle(DWORD function, DWORD arg1, DWORD arg2, DWORD arg3) case Syscall::PosixGetpid: return current->sys$getpid(); case Syscall::PosixWaitpid: - return current->sys$waitpid((pid_t)arg1); + return current->sys$waitpid((pid_t)arg1, (int*)arg2, (int)arg3); case Syscall::PosixMmap: return (dword)current->sys$mmap((void*)arg1, (size_t)arg2); case Syscall::PosixMunmap: diff --git a/Kernel/Task.cpp b/Kernel/Task.cpp index 21492915de..aa96881258 100644 --- a/Kernel/Task.cpp +++ b/Kernel/Task.cpp @@ -450,8 +450,13 @@ void Task::sys$exit(int status) s_tasks->remove(this); + for (auto* task = s_tasks->head(); task; task = task->next()) { + if (task->waitee() == m_pid) + task->m_waiteeStatus = status << 8; + } + if (!scheduleNewTask()) { - kprintf("Task::taskDidCrash: Failed to schedule a new task :(\n"); + kprintf("Task::sys$exit: Failed to schedule a new task :(\n"); HANG; } @@ -752,7 +757,6 @@ int Task::sys$chdir(const char* path) if (!handle->isDirectory()) return -ENOTDIR; m_cwd = handle->vnode(); - kprintf("m_cwd <- %p (%u)\n", m_cwd.ptr(), handle->vnode()->inode.index()); return 0; } @@ -844,14 +848,20 @@ pid_t Task::sys$getpid() return m_pid; } -pid_t Task::sys$waitpid(pid_t waitee) +pid_t Task::sys$waitpid(pid_t waitee, int* wstatus, int options) { + if (wstatus) + VALIDATE_USER_BUFFER(wstatus, sizeof(int)); + InterruptDisabler disabler; if (!Task::fromPID(waitee)) return -1; m_waitee = waitee; + m_waiteeStatus = 0; block(BlockedWait); yield(); + if (wstatus) + *wstatus = m_waiteeStatus; return m_waitee; } diff --git a/Kernel/Task.h b/Kernel/Task.h index afa6694f04..495dbde41c 100644 --- a/Kernel/Task.h +++ b/Kernel/Task.h @@ -95,7 +95,7 @@ public: int sys$geterror() { return m_error; } void sys$exit(int status); int sys$spawn(const char* path, const char** args); - pid_t sys$waitpid(pid_t); + pid_t sys$waitpid(pid_t, int* wstatus, int options); void* sys$mmap(void*, size_t size); int sys$munmap(void*, size_t size); int sys$get_dir_entries(int fd, void*, size_t); @@ -160,6 +160,7 @@ private: void* m_kernelStack { nullptr }; dword m_timesScheduled { 0 }; pid_t m_waitee { -1 }; + int m_waiteeStatus { 0 }; int m_fdBlockedOnRead { -1 }; size_t m_maxFileHandles { 16 }; diff --git a/Kernel/_fs_contents b/Kernel/_fs_contents index a074bdec66a6b358698a3fb07b82964575608a24..9e4402d6903a1cb727a396a3d1f0603ea9e57e03 100644 GIT binary patch delta 34632 zcmZoTVApWKZi5aBC+DKe(I7l!vnh)+BU6gTM#eU#O&lTuynp^9fc!*8;YkuKlMN(T zL>L$t82&dqFfcGQ{0Ffa82-smWYpPQBheuln4`nM&}DrNY$V87hyq3i2?&FMk%57s zh>3xrn2CX*go%Nnl!<|%jERAvoQZ*p9NEe3{LN*6GkAco|GZ43+y+b64< zn@@gXrogvCk%6Hr9;RdRB=exjDdq~29~2lEPOrI$VUW;dSqpX6iwq15mnJewPkv&q zAqWaU5QbR6$iO#wuBG}!7KO&N5WY2$(R%U|0*Y>f6s1@y@SRa) zV0d)w64XVLg{*=mKe1GhOi*HAxOfRBd^s9oJ|lzB_|Cw<@PmPY;U@zF!!HH~ zhTjYf41X9H82&OaF#H3hJCJ%t1_nk(28P9(Z(6(0V7xF{@ygBV7Y;MAF;1EO(2`ek zdIvj?%654cMh@o9{x?K9Hzz-gWMyO>dmbC_MenY+eCIgUOul)frVL8@^X(beJ6ZUY*fz za^rh-#(>Ey->WkgPQLhFoiSnZ&-dz#b0#Z(P-k2=+3>yieCfkYfW2{3X@4*aCfTFu44paeE=@`O(U zj24p@eo|+gJN+XkllbHZp9C0lCV%{-&KNOS@-xV6$It4F0+Ta8gS<8IvpTB|9|MEH z^uooA!jmt27GSiQ{P43nm=vF^@CC#-{G!fiGhOf`BS^UMi#n@}5Cg-N=?fKklo?NK zzW7C*dD#a>p6Q88S;JW@EsRsA2ehz;F*uVM3IwoEgcURcc}GCjY8!-XZ$&^USe z_6`nxmPAAI-EbaCv#4x2`V$(lFu(Gmq85kHCCK^pw=;e@@{-KMNmnjJ<9jnR4 zHND^>3mu*vnzdY@BE?{a`PL9kX#7RHMRlR+i~9 zeH;Qz#%a?T`#5B$d-rjOF`7(g6yTDWzM+TJ0h!HYVme*1mqUEIPCthqvq@6o^xA%o z!0E>)b4X5?oWLQ8U@@7dO?RBdv2gkaeKytU`hBd8)8*E22(u)b8JocaV(Ikw39QC! z=H`hC;R@6LPvTISet!}NKeKsa^7N0BII@^5%%&R}v&l@C%V)HjK4BuOD5J%6MP4rP z=?^Azq%m8hB|-uxehP;zvt_c$^!ZabQkhedjo`xU)Avl_Fyw#)LrNMbWMrmSPUSFT zN==F1}j`Y`ku>JdV-;kyn7%NUNe5(7K9jL2Bp@Oda(FWv zry4=b`nQlHht(v-Od))FVjrvJ^c9OZRG3Z8jX<$4K7CCXtKxLIMXYShW`@YoueF#% zkjV^cU}glXB-Du(mZ^|{>{-mA#%yT>)w5v=8|(B7i#gPp6AhsX1eS1^GbJWXPdvvG zFkOBrYx=aM91>UrlBXZ=V??N6PE0YHuDF8Dm^lfOD*Qp3XM^%*|4KGb<|Ip_=@3Rz z;`Dqar)h5tolr;M$`G0vuZG>8W>GKu!>Cy ziD6_iooh9lDsyU@!Sr)0Ih>f%Qm0?sz#%n#!fG}#=Cm}6>4LjhC8z&OW)x*kHZYie z(SS>GdjBd8bLM0NLy$_z>HAl(nzJMu7#mG*T*H-5V8T;kK~Ro_b}k_}VLrVDIfvtcxvUNDzcemYpK!EQGG>8pboji)PY;%J<1 zu$zr{`ss~qBFsi6iPI-KGAd24UB_y`Yy^t>HEeRz&#hyXV@k3BIbLr1hYcLg%*i0H zL^GLB7ud|!%4D1jN?Qio9X7D;V`M~d_A)Y=7){?el|yH`z;2Ff(?4usWn(fipZ;+_ z+uH30yV*h+(RnG;4NtMjfn51ydYmUK+w_JttZdV{_pwP&->{c0n#tT~x&SD!=kH?G zW=w+wHSZpd98fvj2zJkYHY;Y!6a#2@?q-!`LgL6UB^p8uxVM{ChAGh)?C$9f8(3?n z3!G+^WKK>pm_9L<(EuX!U@vPZQ<51Z4g>bFx-h30L1SwDK2~AIL`X)Pu$k3<`np4G zZ?U@qIrx*G#DkEqM zC_i!fZXZSq=EM|(=@(A3D8d;`i7C@@j5dStr*HIS6rP@NmPLdy3BhJcvIG@>FJUxulBMNz0beF@#+2z7+gW|47x*yE zV@fsK9(aL;nUN{kaQcEEMoqS4V*`Z{h3Om5vjk7K4`F0uO17N7QItz(dP60bH&PjL zA(*k0IXO9X`oRDukLe3t7}cj61TrNtCV>hYuxj7w3l6Y}Gn=JZOurb)sKf-J6&cN^ zfBeX-F#SR>C_BvJPzABVr+)}z%)%qZY;ItIY1=2pGL|yJ8O$c8W{@g) z!aueKu+1#yrlv;I^<$Vkn37@Da}8JG^nWo-Y|Lh+si3SVHa-3itKxLKSSEHxi|LKg zOg@lG+T1J!6qW|l7u0h3PM3>g;stq6KbcW#dP5wO9HZfMIGf4bWcq?QCL=~mh}hdW zCPhe0fOY#rV#3_Q93*WEO04?HjLOrw5|}iZlZ-4t?M;#CI;%KDnaq=>7qW1PPXC+C zD9)T@Vmy690+TmWlIe8AD#p&~{RND&C>-V_)5PhD8H`=i?b8@TQF)+(aAO`*=k)%1 zCf4coDNGWWBFsrrcP%pW0Yq~g3!##21e8O7BT5CC!1JIe^bO{%#@foU9p(S6ja737BeYK z|6j%^!IWY;J)xY@6+v4-`T@Jk88w+xk_@INlrR}EB^!Zg+3D*`n3R}PO~9hE(<>?% z6`4}aAkObEU}T-HS;;8JlxjZRF_o!v`i5L4`{`@SndBKQw;NV5DljsqCPK5rgK{RN z>FIx1M5oWIW)z>E_J>6b%wkGSn{H6Sq|KCOI9;%Y@d$HTipBKC-z*Ny76#@Jhw0Zc zN;6v+q(FGLDw!mv7qoClPv@;-(qghSo1R$CC_LT%Kda^R4|R;}jHc5KYMI2Q$Afwj zYpa;pnG!9g8`d&OOg~q}B*B;j^1R6O-&IU{j49JM)-k#=o0=v=6m(TH2{S@NV?re( z>vX$%MsX%nONhlhe_1)FzpZ9+XErl2fLQ8P!=wc>QJ{g*l-b} zz@zGz_!v{BAE;rHna800nEy50ct*iI*ISw*+L=3k)@G=5yWo-4UDYQZCf~u z8BIVLH;vgW30%LcPXFJ+!3!>Y16o+Mr(3mhC^4HS89+Ki33-fp+XR>tSQuNjD~d2B zu;Umwn0`%;NpAb&O^jz*ryo#Z%3##muBpl-&pcgW2BX0C2o0t+tgH#b3=9_2FV1CD zp01{j467KjV+-vieNNnIuG}uba=PHl4?SNn^Ur zLPnnHGDjF?rpJJ|Js@t*5k?ut#_1C!8O5hBIKn8v7%+X~5k_^!)gU2t#)RpNM;X-_ zuTEchlS!SiV0s{k_hY)D6OZ`x2}cj0)8B?b#N;9f6HcX!g;!T@g2;wc6{t(2QIsG7r_hP!?aYl85My=(x!jVW|LqxvoMQ_ZDcZ@e&I2*1E^3oe9pX(+1%7(`qk&m#mp84Mxa^( z+l(=&6!ipl0n^8bEeef>4isGRj0jY zmYFW_g-w6Dfd@MqQ<^EL8z{GZ!A>RxMs!{hq#LN|IA}GQ%?uK!FN|f9o37x(=n3x9v6vZ}Lj$_t3!C8d`A1pUn2n9WMowWi zF@nnZeP)(oHZ=nqBRqY=Mkb!=x$cbYpm@1(ltoR_EXh5o<6aUO=kLmcN`Vd`}|lrnUYeb z8-C{ii&Rb5_h+pJwRaZ2;+O(zDmgPHrA=4#Wu3xpQfmh)Zj6kR4M8Tn1GS19``K=WIt9p9ECpLM|pjzYfhTp8xph3mJ2v&*dtHW4r znM}>5GfrUx4_|6d-#e8}YI^BZ4wLB>;jGe3W=0^xBB#F#XH8->n_lpZ!-vV-0HXdw z7c1NJJrS(ZjONp(ut|UhOcfZ-w;O!tU}OY!pBtyMeFJq;7rx?Sqe`b_Uz#>GCpIf>PN`T{0S&gqOtSrx&W z*i6mLK&Av9XVU=-Fq@hsPT#ng&2ajJ7qhlVUV;-Yp9;0I( zps|n9F^|zP4;DI%c})NMoH+#434={p2r#Bi4=7?1nGWf28H0NY!qcH0E;9>I$3b{H zxWk3aVYHn7(T!1LI;6jqG+nTdRc<<>zh#kT1nMz@`&*7oNE`=dOG6WAcgqqq(*W%! z;plD|g1fdT-7TXeNOvnK3EJH<0`()H#-Mk%3{t_}E#_3iR8YUIf+^K_`uaL18E}7# zDb;kk;VM?m>FbTz_(2m3xtm>C%uSQr@?SQ)4D zZDDen9+1MiWU`5Y!A5~QOrW-v&vwNYMn^1dtM%QCip-#9)mhf*0%t+vO4BRPGTq<) zWGbT$6MS%~gLV3fxr{1|7N7=}`t${s94ym+%w_apOn@}Ca^^8=Os~;n;+cL!k4a|w zo_UNKj0YgCEuQ&|3m6}OT3hPVugquEVEi%t?|epoMvm!;pwXlx&}b5LfJp)}z|;d0 zQfJhF3@~kj3@}+h2AFOl4KR5?2AEhN15A970j3DZ0Fwn|fXNLqz?29XU@C_UFl9gn zn5rNHOdG%hOsxC37#Jj`HySf3Gv0snGMPXInJU18OpFtzE1m!kCm}|dRzOCW zN+2UlCDXwpOeNF7BTOZb6)Gi=5vCL&28N4}5herJ2vf_nFWidT756apV2K>?lA-BL z$C;eAC$ob_{va{5z49!RGD_>$1T@GeV8zJ7=l~i2Yq-V~F#W(`M)3Hb52MU<#p_J| zj6Tx~uQMHI%7G63CEQ@rn7%=rk!8Bb5k{5i8*VUZFirtS%e0$JEYqh*GKxS({+2)@ z<~k%|wm>3=ar#3^Ms>y`kcd&4ZU`FYy8?+5e@L7}LgM5JBu<(kaWWASCu<;aatIP9 zUm$UE6dWf^He%D|7Bi|ba!$W^n@OF~2NVV3(*tA}1sHv%C(1CYGp+y$sWY-n-zdYV z&cwnqoo@-F8Y9niMp;I6CK;aTaUkvsNR+&QM9B+Cl)QjM$qPu7+(1Oh9#E8gX9VRI zgYAkAEIT-{4#gf}+WyLiMT!X&Bi5|bXO(aiY+o0`BE`t4wf$r$OFhfN)Yv9`pHC=5a)O>Ws|O52mn)PyYZKfK8Zw5hSELUD1+Je7XZ@khNgCVhW2oW5D!@N4Ujd z5OSC>Z~Tb3=A8mf4s*dGJRqii}duEG!_}w zr@RadQedUiC#10mO#hI^!ZUphNajB;0|P%q<^f2?A)SR~`j<2o6;?hz1_l?1j6ph! z0HeTk$8;8T)*wCx2Iz{n29U7A^obzh8ieo#kg&n@hall)d<+b!(*>6>3Qt$aU=d*C znQoZDqR!|rJrYD^Om75HKc=q)QAeg<%wSPxJ;M)MUp8GJlSP2>&UD307ErP(%w!Rt zo&XYBF})BX+*K79j3=paPsC5Y;nE||rl&bmRCfuUjhMpLHU;Iu>kUaUVO&vd~f zjQ)%=puDS%ly7w)`F0T`-`YU(?HNdc>I2EQ?~w}B7)a)of@EG5NaoFfWL`f==8b`5 z-f~Fh?S*9C8c61y0M5LON5BOt22p(sf$;;@B($XjqV^m>1Bh0{%0BL9(5MvBr z)R`_Q&gjn=Gd&SR^-SL=&Ul<@4YZZ9K!Q<&@d&7dQlI_-#J&P5rqri9NHQX~F`hum zsy~pj>I%o+bv{NWAp?!GMGd}r}u%lC6I!u4pLC5OuqbAk7RF zXfs0x(#)`dHZwS;2g)+4GlD7c=@Vob1sFM|FGLb@c*`v~{Ub==2c*3Ev)xgSaXaHS z1;z=A+b3*gzR1mO5epiPH#D?JGM%o-$|keD;~?{W*6ByM*d&=vQY@xF;9^q)4>h0b zXEFjUjF`{GCLyY$keOGa1tuXALq=xCM$>J%*<_f_l8mM+PGC}EHa9k#-pI{n%xs=$ zHoay7lM<7K@$>}~n2eY$%o0Is*)*6fEK{eQWVU2Y0x!qCc#>IcdOr^vKeI)u$@GOh zYzoucPBIHKnWav@z{94>oM>zSTBIvE{mw~dGtd+f-y|j@rlh3l{5)(j)8i&FDKRIT zm`&fu%cjAUoHYHyBql`|&77QSFkPRIO$)TLPhm2XK2u8a^uWnX`phY5M$`B4v56rV zsmUhOKk%{1v!)p)D}+ohc*SNoUEmBeJBy`}Ldf)kpz-elQ8qRvLxb&(Q<&HpnT-uC zrh89iGGI0`vzX2=$QA;cgX9-v3uXo_gf%$FY{isfGJT;Sn>4eTg~9awf^4baMcr?v zF&RrInxrU%C?x0PCuhfJB<7{$q=MtaILX*_y2E*9Y0wm8?0IHmrbLtJA1*R0Ofi-tIp$>J zB#7<_B5Z=p$tETsX*s53)9DW{Fq<$Zn^{cHzsMX1S_ganBC{NGiYZuq5NHC#ZWfa) zbBdYKbOa~-@C-Dz?^E3GM(`RRs==i#p}!-Ovwh*6BjV4PItJ$tjd&P0pd6_ zo2QvfUweaDjxh}~v48&tvmCRffyuO+%nqRbuQZ$Rbiaj6dZ6W~hPRl7r*C-ArU+RJ zVv=ZXG5z38W@FGwraR2S)9n^9aZl%6#3aL%WH`MMDxv^dj{6W~jQ?v^&gnHE>15;S zV6*&Rvr0^pV`F1YwoFwhnSSv#tK9T=iPBAf=zEF-$3p7i` zD8nW^{ec{tC>qBYV&VVW%tFkmril>Uko61Z5X&Iz7oaxxf!8l2CPLRQBpE^1FC-;G z)-S;5WGFw?Ywp0PZN=t+;RWN|F z3=IvSOBD=LU`rK@QeaCJER&}|syj@fj>=gbAuFQ|c5H<+XHl0oB2 zDNN>2+5$Yz1X-B?%D(W05X@$Y2B0Ays0E4O`TrEgB+vpRFUV4as`oElfxRZ}b4ICun3&O9LvSboMhzA-19Nb40j)%^ z055O=>4dLDFoljlBCSL)1RFVp*~9=U2U&?=3N{9LC4!m7bjV5sOG|7k5iAp-D-n{- z6hahSGK)bCw9zpLHPGZjCB5qyLeMSa`2aF614;dL49x+buGhuVGb!1>*aAII!aAsg&aA9Cz zaAja%aARO#aA#m(@L*tI@MK_M@M2(K@Md6O@L^zJ@MU0N@MBvCpWO_jdhcio}p^*V>%eWbI`M(2X%Q!k0u~Qnnq1*(vW!xeWwq-og2)bq5Ff9?h zWt=(D$Y?rvi!^A*ICSH)ktt~7vp9Im_;dwcE(4ZCqh#=IUM(hLV~FzUy&URH#?bB6 z*LyiMrhn*Rg)ZoX><@?SD+lcu_w3`40BsDPz=7B#4r4Q!7(=XsY!bIj1#c2(GzD!b zH-u75rr_<@(~z;MOi;34k-H#I}s0S?-p&&bCmKV5Gz2QQPEF(k;4_kLSIH_?OkeluAbKoSYk z)^7u-JZS4Tb7CTRqZN4jHhAwhrU+wI@J>N_z#?$#%a#%2@B&I^Pd?%ZMwtQz-ezXd&B>6>-e_D)3(%^0_-1dD>9Fm{ z?V!c~s?cS@kj>ua$;g|%nUf8Zrt@!LvjuI#0PpdH?e509*&DQZ^5I6dU`C_q^=sG^ zAe+2Fqa&al-=Iz2Ov%R68BejQ!B-SVFc~L;63^Q06Si!R0i*zUO$s9WP05$RyJmHL+Cbc@NVxE$Tn=yZf|Bwb0bLF zhAej8&&JDSnFQK;Ejj((ZdO@F1Y3qV(Ew@+WXrc9$Op%n5>r9@1d#T5Gbfosw{{1B zH+maDV+pj;o5=#2mB7}4c6u|XT3Ae9xS!ROImN(idct8g3+5Dqr0KH{v&n!qdYgcT z#39?er%yY;DmcCR0IM`(+H|=iY>rHz74S#cz{O?P5jI^WW6S9~kFe=68K+Kv3F4a= zPY*oGW)3O{A++gq#bazD(;W`6iZCLvK_k=g$Jivn`?(oYK#HuHOie(0ymc8(r~4N% zi6XXfGnraU-*Jr1lG!xT0NBQHZ#=;!GCk)6n=q4E8i=FE zWNtQn;|b7UY6>*63eL0gpe__w2JHo5oxZ`Bi*fYBUO2zr3GhA^ijCQWBN$0iRd8o+dt0VuNN zraPQtD+FzFFg(RpI{m?3RsoRdn#{>2iPP_%W|abM%4|5#riY-Dr$0E)roohw0;0vH zD_md`Wll*mn7;80s~S_P;q-(HY&I~OIn@&Czl23>-jKo>G!X$_L?&>F%@gh)9?+n$FR|%O7r4NB8?@~OP3#t^I(Tz|)r2WAdHS0RtTNN>F0v{z zC7Vr8yvSO&zW*|-Dk!JsUT2eKGE14>bDd2ZG~Rjo zI-3H5HlF_WIvY3v$lhSnV>P!lPzafxxP;AQT0A2wbE-wsbjI7P?V#FQce=w(wp&b? zB9?~J*W6~)2Jh7e*J9wrQ*f6}VS3FXHu>ojZbHsSxWjgaIWZZ!PaCF27Zhgm@3JYv z=;;R2ITS!vrB9pBD$Sgl46X#_z#`MZKAv!sRgF10)nfYD+pG@L7v5o&oL+E;)oA+O zhioF#7bGyUK)B40*hHoa++}r}zHmO9#B}{_%#zb}@3Lx6zYLN%aF^9_y6HVu(di%- zlcCA586H?_=L?D zv`Ho537au!ESc{itI>4NN37h_y&tk_O#k(S&6qKDy53VZ3(&sbhYwlxKqKygk66ta z)23f|%4WorW;VU{5vws{+H{L&Y=(?!)3ctjSx*1|f{ksu(qmRT79&vICij?CW_rV8 zRyAfL1B2-X&)G6S;)&D2;&V9J_@>)GVU=M?1?}r-;ANAX{{K0f@^sBtY~t_$ zlvRn*47BsaWBRAxtP-GLg@{gj$>t2IllDDjbz(G{-tm$xp2;W`q*8eL1ztAx={3(- zHJBi~R)nWJykgU4G@hRGiY3N~Y{rbn(?7mqd(LVMcECYFw%F_}s(-&@7aZff-m3&b64X|CTKs)N&Dg#Tqny z%_~-}>0jQm*@L!St$W34%$#VLJbnEuRwKs5>GR&PDTAi$Y+kdvF(yyvde7zw%AV(5 zv%0f@H{CQYWHOxY^@dfNF=hJO_iXN<8N~H(SY<%_InTafm1j(ye(wXD%=8H#*nA=E zY(}H$j8oavrWbrL-UmBsz2G}natCsyMbs6!|CZ@+Gu*mPc}u?L<<9jqG^{| zbf&)#U=o@B?kAfxs8%-wWt$22Sb3-CRd8uckNw8VH9a$gRTh4R1gIw1F8G^Gl#wYp z8MGrzb^3%Vt}@VWe~xM{c~B*w=*tS;<#m)1s=%OztD4Ek01_t?{;|zsHZn*BMT*Y! z3vrBM)ARqc-Dd(FXY`a+9CZAH?et0aSw*IA_`~YRm>A9*2FcSuGO<@q zf6&UsKE2hGRbcx0f2`5dCp-Wh=M~4qI{kJnqv7-m4>+W!^R;tvP5)fPq&j^?8<))V zsCF*V>2}pj+F)5wu4?pT71`>~Cd|l~2;M$8)t`-HySxi4594%&ryOk4r#|2io}Ryg zRe$;cW{?|_!Ky&J=9Q-3c+4Tq3eH5+_ZKm#fHs0jGntxAw|v6k%V;{?;t7Ys^aG0- zRTycxry4Z7LF;b(=<*Z9iWFSSPnIb#ihzfu8BM42yR&*BMyEjse}Ix1e8(%Zu~{;B zt1GDP0&RH()m0#RdRaT07<`kYG?PW@^ukUyNyN5SCQB1Y`g`BbRtUgU(n2ZF~hCcCzpl$6U}xSjf&-3vi)^yz|u(W9KWlfQ0RQO+wrG znglKu-+@lOddwj@eL^Lp!}NO?;c36e49GW0DXkRUS4=kf8 zsIG_tZ-JfeGL21gdS(Qx36ohe+Adg7G0q6uNBbdyRe{Oec)8(s4n|Oe9U=y7FZ$6tZW8(C>Bvu#5me~JCSiu{rrKZnk;^dkhdYnxIRQgFxf5pUU zg4(mO0|jaU6Q{xSV~f}Xr~hBbX2oP-1lr{gHo=1Gu<1yfV8Od-S2HCVO&4J0 z4608wO;kuxNG>fZO3f>YPb?`Z0#~}GiKfX4E(*n^x$$X5sgU~8G||jJAw?lCwW0*7 z#>_+^NufACySOs97$#()-~?KOQ<9ns6)^`XDoam{&qWA<6_w`3Co1OT3T(;;i%j4YvR;Eau+Yv7Dip=;nQ(jaT#QcWOh;L;2&p=;n$j6rMQL|IG> z49#GR;7pC6i{LDbaV&yM0-r7=j93I`Vqghf1ZS8ET?A)p4qXIi22ng6vmZH$D71v*`3cbD6}!Lu%kfaOQ@Ipha*R%m{`NOvJmrj;*8-U3ZTO*z{Vgg zh=U%hgIExkl!&?@&Ir8J4zeJQF=d(zo5=M4x0$)7@0DZY1C8$}%EQ;i8BT|D7*nS| zkcKD~8a>u$^jIJ0p)t^1rYI-*pm0Wy^#Khwg2yo$hT5?{9~j*|w!2?p-I&5BfbPgG^ zTBHE90Aa+>AnB}NVA4^Vu9U#h z%*4z*eR%>$7~|^c{}MQ?8S|%GC2}}3Nia>XPvppCRGI!VkwaDjG`7&)JK^vD|DL71 z&2M-zsu&m;UKTP=mrLS^tQQ9zsLJpHboF6SKybz+kR0g1ukO}8fB*kiW%$6rV9VgZ zz)->)7#N%Zx?=FF@vl+b1eA2D42!U}ju|>s+RyT#gfr)9v#)6pUOeGD}iZ6!P+mauaiMDiz8z zOEMISOA<>;ixpH;xEP@FiAgXOT-)RGIlh99mJKcA&}U?f+TL2uv74#hor!^gQJ#Sz zn2CXb$%TO-2E?~wU`Pbe%?qoxo}OmrVBrQFo^of~YIgXM(8z(+`3u_UQ{bnS`fLn9ImA&45#YksraIu3^9_z$(tg zz+eioA^@b|%k)G8PIXovE(Qi8i0}dfP5~w!ndzGhIMo>IActLj0Ex-SOlLCWRAXES zI?hUbx`QF70F#c)^dOMfX^7YakeH3k^hF@CuMoWtKw>^J(?1z@hIn z6kv*xneJr7smAKe&A`9~5pOW!6kzn7KGBF%ohe6V`Yt0*HOBJk4~;n0SzEao7^ESp z6pT3q7#B=8H0D%i-Nwzpz&u?M9HPdY0!%eB)0>Pr)mV4(!jG{!08)Nr`bCiP$B2Wn z1WY&u7_UrMG~rZd{R=)ND>0l?WP0TrZhpo)(+feuJcuK*Hh@$=nSKx?9KZ)Mn{g$N zI4>sy1E>f9Wlx4L(*;dA)mf{+vfwKt157yum{{bdCz*1pu`c0bU|^dLJ}PU0DW?G2 zDv&zH>Dx>>l^Cx~H_TuWpZ)=)UPNv>lNqNPlYzkWyv2-S(;dt>L3b$xnsKT#^$37Y zTN9f;0VFnM`a+P{5&_VWYhu$Mm~jd)6$nqSo69IRox>c7V_?oHz*->8z`!z{@eGg1 z^hk3~ekdPw&Exb2sN!`?7{#Z@3N!J8jM-(*sm9na{h>LhI%|tO1H%f?Ia~fr8wC`= zXKjt1YRIV0IC`q#=&6Q`qo*1&jGk&pqf-r+DKIKb^I%q-u9(2l!uVCg5q(egro;aW-i$AsVbWnzS1bD$ts=^U#{K^3WzNe_$X|llFBn za(mX+6Wof`z|o5R25!aHmk5B`t)LbxxNVEsZaqwDyHyaQUAjGyo$)R6cCTU%E@nop z?U2T)C!HFn+n{aD-B9{Cs154Fz;FdbJ2MzDJOoKtF)%y>30N>Nd;#(085np$jZjkt z203V>R2jrK2et69HcCq%jZ#mfM(Gqu28I=oM(J|2M(Gwvqtpi4C|v_-l;%JhrDq_G z(m9Yu={rcH^xO20i7eva_UOOqf}rLm8(J%L52O`pjoJ!jyfS^G0jD}+E~Fs|YJ@UA zna*g)sm?e7(%uBMK^ebH4+IJAf(U_|pe)cP=o5%ea1&Gn+5}}sYl5mko1jK$O;8(1 z6VwFS1Wki9K}*n@p#6|0=u)&Ms0*|Sx&o~U+5>5VUP5bv&Ve*R-=H-?mq41Jzj@)O zw1S(UYamTfdr;$XIz|(852Oj236_O7K^f0XPXx70C!@7MXYw&Ha6wz3OAswk#yis) zK@Cd=EH%v3~~cB1=0X5L2iILAU8l^9B>2F0j&WF;UgNL4#LwB4NwQ+>EH%v z0HguxgWLd(VBEezgz*R?c^8k29@&aGvK2I7!UGvFVf+TET;@S4mn2B#!c9!&l7gpl z`HH`CxrV4Za8xc^5Gv3r7tmEV$m1pAu*wBxyySKHbk1ZB>u|&%$x{XfhSxecsu%bm zi7<4Kb zU!=-r4WhDHjaJ$0fK)ai(vT654Uo#F1yb2ufK)bHAeGH0NM-X2QQ0t|4}Nf=RXbN8 z)s8({wetp2?G!>P4{){f2U6`!fz&aeY6mn#0v`I<2N46;J2KFE=LJM7xZcr$);rv2 z^^Og+-Z4X~cN`$~jt{in$%5276=?O&WJtZU60P2efz~@~(CVEfkb37DTD`LcQtx~~ zt9SN5>K)Lz;n35;!S&7&NWJ3>u30eZohy)fCl@S>sCS+~>YeFm_0C*A1_l{Oy)#|I zj8g(U?!ov4QtL<{*E(w;wN43gty2T3b$XC%oe1Pw2gU){IuU5K4up@Wbs~^!od{^H vlL4u9QjlvM2gdD!n>a2qwqG>mYQJd8-G0%Or~RTSZ~H}4zU>!H`Sr5^x7dD{ delta 28536 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 8) +#define WTERMSIG(status) ((status) & 0x7f) +#define WIFEXITED(status) (WTERMSIG(status) == 0) + #define HOST_NAME_MAX 64 #define S_IFMT 0170000 diff --git a/Userland/sh.cpp b/Userland/sh.cpp index 68bd4dd286..7fb929dfdc 100644 --- a/Userland/sh.cpp +++ b/Userland/sh.cpp @@ -17,7 +17,8 @@ static void prompt() static int sh_pwd(int, const char**) { - printf("cwd: %s\n", g_cwd); + printf("%s\n", g_cwd); + return 0; } static int sh_cd(int argc, const char** argv) @@ -100,7 +101,14 @@ static int runcmd(char* cmd) return 1; } // FIXME: waitpid should give us the spawned process's exit status - waitpid(ret); + int wstatus = 0; + waitpid(ret, &wstatus, 0); + + if (WIFEXITED(wstatus)) { + //printf("Exited normally with status %d\n", WEXITSTATUS(wstatus)); + } else { + printf("Exited abnormally\n"); + } return retval; }