From 9be9d8374c9a766fba93b1aab743fd739467b5af Mon Sep 17 00:00:00 2001
From: Ansh <anshbhajjan@gmail.com>
Date: Wed, 5 Mar 2025 02:59:46 -0500
Subject: [PATCH] Assignment 5 Extra Credit 1 and 2 Done

---
 .../starter/bats/student_tests.sh             |  54 ++++++++++++++++
 assignments/assignment-5/starter/dsh          | Bin 23240 -> 23688 bytes
 assignments/assignment-5/starter/dshlib.c     |  59 ++++++++++++++++--
 assignments/assignment-5/starter/dshlib.h     |   3 +
 assignments/assignment-5/starter/output.txt   |   2 -
 5 files changed, 112 insertions(+), 6 deletions(-)
 delete mode 100644 assignments/assignment-5/starter/output.txt

diff --git a/assignments/assignment-5/starter/bats/student_tests.sh b/assignments/assignment-5/starter/bats/student_tests.sh
index fdc56b3..3df4907 100644
--- a/assignments/assignment-5/starter/bats/student_tests.sh
+++ b/assignments/assignment-5/starter/bats/student_tests.sh
@@ -86,3 +86,57 @@ EOF
         # Assertions
         [ "$status" -eq 0 ]
 }
+
+@test "Check if > works" {
+        run ./dsh <<EOF
+echo "hello, class" > out.txt
+cat out.txt
+rm out.txt
+exit
+EOF
+
+        # Strip all whitespace (spaces, tabs, newlines) from the output
+        stripped_output=$(echo "$output" | tr -d '[:space:]')
+
+        # Expected output with all whitespace removed for easier matching
+        expected_output="\"hello,class\"dsh3>dsh3>dsh3>dsh3>"
+
+        echo "Captured stdout:"
+        echo "Output: $stripped_output"
+        echo "Expected: $expected_output"
+        echo "Exit Status: $status"
+
+        # Check exact match
+        [ "$stripped_output" = "$expected_output" ]
+
+        # Assertions
+        [ "$status" -eq 0 ]
+}
+
+@test "Check if >> works" {
+        run ./dsh <<EOF
+echo "hello, class" > out.txt
+cat out.txt
+echo "this is the second line" >> out.txt
+cat out.txt
+rm out.txt
+exit
+EOF
+
+        # Strip all whitespace (spaces, tabs, newlines) from the output
+        stripped_output=$(echo "$output" | tr -d '[:space:]')
+
+        # Expected output with all whitespace removed for easier matching
+        expected_output="\"hello,class\"\"hello,class\"\"thisisthesecondline\"dsh3>dsh3>dsh3>dsh3>dsh3>dsh3>"
+
+        echo "Captured stdout:"
+        echo "Output: $stripped_output"
+        echo "Expected: $expected_output"
+        echo "Exit Status: $status"
+                                                                                                                                        
+        # Check exact match                                                                                                             
+        [ "$stripped_output" = "$expected_output" ]                                                                                     
+                                                                                                                                        
+        # Assertions                                                                                                                    
+        [ "$status" -eq 0 ]                                                                                                             
+}
diff --git a/assignments/assignment-5/starter/dsh b/assignments/assignment-5/starter/dsh
index d7d0c175eba2254a6950a18d144f42c2d0dc6a52..ebb6c2dff3b3b37f3e43b695b1d32c79f3482609 100755
GIT binary patch
delta 8287
zcmX@Hm9b+d;{*vI1z`p-Z~&7G3?9J~wU%)n;D&GyOcrDmp7=(F>n$%t;4SZDAx1sN
zIZO~PjAjsk@EI8x7}yvX7&vqxd=6VQni<0PnB2%HE+_$2B>`0>F?l89dBGD35H)am
zawk)~A}$kuKwa`<GADDs$coz>b4%W_?Y4>Bdavh7a%%Loj<Cr+%o>t13=9k~$1yN2
zWN2VuU;>HBPCm=*%(!r}Ad5aD*JMW)ea6zsg)I7vdnXIBh)+JiD#3Ve@<kT?$ptJD
zlO<Ra7}X{_vWQQfz$(GG4y0lds|4dL5QDL1@<djB#%*A>DM%4xCx|^cfX#rhd2%D0
zIAh=BnQTog`30$Ylcm@nP5#ZUKUsrAr2Z-c11$6ygflaF85md@?nA{yz<d^lmr(we
ziPP8^7?>G8L;0mrnVbv^Obq`ZA;tg?ZYZBY1i}!21~3PN%Wwc1=^PFWlXr7uN=ib-
zLDUa>5DAG!naQ@C;*)bYc~l*s>4TMlfk6(U08A=CRkMS_cXBSL_~bd9JiG=-qO6nW
za*9tr!^y+zfF#O3`7EdS<UgD|ya7m}oRj}@ici+z;^9p|66Kz(%OyTJhKq-{07;a0
zax9nl<Q^^_-UcL5{>i;u;*<Aq@$gPS5*3=fmrH!|8!jH+1xTVIlizZQPnO~4;oX2F
zDmGb`TYRz)HxKUtBvFaUzTD!IYq)uMFCd9ZZ*JuFW|<_Q#PLdxf#K7C)z_P~1hN=K
zGsGAe7(Tsh{P+L=gwOnPzdrp}_0`*aQqY>w<kNrEvpNh6{PHdg3{a_~X#Bls{H>FJ
z2x)pv)?r}ylBUNm-vSPJk6zoIIt&aRy{wx+l;w{SQIBrcG7!7<Kndsn2mJC4Accpa
zv`4RPCrGl_v}tm-uneQ?<PKpu%~~A>28L4YP>*I?B@ol2^Jxi>N4Kq-4g<rBoqzxT
zf06S4|NmpGp_9)G>&VKoGca_z{^@r8(|OFJm-QMq1A|BB@f{#*UOb&FArj5#Ik`ln
z*iRHJam}Oi_=~K+|NplhC}jsLdhPDf?fS!`SM(<rNGDi<Crkk-cfMAGD!7kOpfTB0
z)X{trLg4lvu#sjUrQHn8KbT5YKunKr2LX_cI)DEEZ~pPWl;5M5HGcA1(P)2Ou-<bZ
zNzFh1|9f=0J~-}r2IT6O=1dF>9^I}FKyvT@{{P=xdxpJ^YsbI;|Np-<VPatDc0J>f
ze8Hphg2%xJ%pRH`ie+-Fm|A_e>j#hH4iO+jJRs}@F#EXc4KUpsdIM~3FK+=S$gg1A
zyMBXhfAKPa5p3-XkhS4||Nr;sc75T|E9wqb3J#X~-(XK#d-S^A@aR0`(aWj<mOQo}
zWc-VI2dGgV&9yHW_*)(_fDQcM(H;82qcb4l<pqcU$kZ<!AP0a=)q<Gnj4<^wSQ2XL
z>t7J}K@IJJm;p010p!u+4jG_`3V2-%b@ME+0btY5{sOz%1Yvp^SQ2V_AF}Bs#vs$6
z&P{l&I(eIzzP2o~a#IxL{2=9^*yiBxoAvMi|H(Y!DspGoK|X^T|LiB&@ee$jYacN1
zx9<Bp*-u<SA@t|}|0fTFGFqrd=Tnd7Hvt}<wI@1Dk9c&3?&$PAFu6}$ygu$HB*{p6
z^s<J5%{>0%)X)F__k+Cp;=#}V|6lz6`Tu{X>x1Un2meb!%1ofj7Q>b81Q`OhdNv~i
zLv!sBhB~fp*AJb?U%dYTj^Q2M49zbXEnSb)LdCB`#81?FbUQ?Nv>qr4_vm&#0pjcf
zMKU~V8G!A6(OmliV)s5akhhP&(16=*_w)b%Zr2xJZJozo#Qy+uJCDC8{qg_*Yk9C^
zB)eS?z!cbl6&&b1{vzbZ|Nr$+YZE|js5|a@#}N|oC%PRnKxIjz?;Qpf28P${AO<AE
zfLxi-?R#g}5=I7wPEg_oXYdzoKS06srn&YF#Hk`sr`G*|h2|8n)o=EJg0}Pci>=@P
z|F7?MebagT#p&<=|Gzf$=ypW}lrkg+Hhu^B=L<|v6NKA&{Kbs#;E+Ax(Hp=4^#q4U
zCpa<6f&#afbtWq$tp0t6IY0#LfG?fLUqnH4@5qBkj65j9T%UBiKG+3{0a$P?0$cdx
zwKBRyCs+a$$Nb;_|KIWdKgc<uKT<rjMN~By7#K=eUmW{}k^mdue3+~tDN(Njvb(cY
z15_S0?*&l|rMe#7tVdKp?mf5*R3n4^>(R@4iUlNg{6z%Fj^Ci7NtKC#;dracpa1_s
z&h+SIJqT6;DwOwuS<pf`>>J2IqW&O5yTO+21GR!YI_r<W=myEP9w=4W&&9yN@Z!wZ
z|Nkd=Koo(Br8Qsw{|CqE%bnoD3as0sS2PK1J~)UqK_+xh1v%b>@xn1s2?SBqdHltH
zkpCd2@o!^jIZ!GBD#E~ekH0ARTL1t5%UBe1*D`}V2{xDM8@L>iL~@P%*Z=<^C7&zE
z(%z{Cpn!vz4~=jmP%Z(7N%LNC$du?n8T|cs{{8<C;r!!oInBVpP!Hk#=Wkidz`*eG
zG6N_)W&VI7@c;kgtqRbPeO>3#+Y7R)8!UuT6?ib7@Mu230SYgRAD}XXxzv@gj@}B6
z`tDwkZ5|MhKuqsE_QL%4|Not>Aem;cg^b;;Alog$9R8ky|NsBL*7oRSeFVydoyT8j
zefj_YwbVXPv(BTJ^$kQ69BVJ)zx@9{;pJ0s<${_bRlofIFLd%S1El@o(fo$PqxlHO
z;mwWQ!c3DCY(;Gt?Ccoq7z#2AQW?_ni?SKOO;$GrzsWNcOoAfb|NlROfq~)1hyVW%
zfD+D!|NlW%Uc{&W|3M87$It)&e_&u>sQUc>zW^fxgT|Nt{|y)!7#4l`{~uKC$$kC*
zzkrc};pzAP|0ggqFqHh7ET^a?d*S2%|7xJb?7|N2N~ka}FqkkfFzk5u|9`{eR7GV&
zfe-)xgQY;K7#P4!+Y(S$;{(J%s4xSlRS&AUJSXo|lxIwud{a@L@x$bwit>zJlO>hp
z!<T*j|Nl6s)8NV{(8lD<%f`HqiHDs7tWSrLfx-9N|Ns3c@@;T=A4Ud-JwN{cUx*?<
z10=tBqEZo;1hl;kYhQy3Igq=qPS(_w7knTKVlyy+@-~RYF*#CKo>5?OrLI2XiODN<
z<r)1apVZYC<bbv?L6(5jX-wwSlNX%931TxafLhuh){4oNdj5<NlRNd~nIt$SuhL6n
zl$b22f1Gi`<cs=MOq?Q<eGT-uoS-h6%{h4^li1|h22voI?FJo;p_3g9#X+1%Lj@-x
zPEfalkz)=61A{Cdh=>N+!N9<PFaRQu%)r3FuENN`z;sdEih+TFm4kg5s829?x1kcF
zz~p;|QuUzT2=fd{50J_a%nS_7Go``o8W4MyB&c@b1`(SW7#O%fW-v0yb1;JvB<~hb
z#|A{OGO`^6u|cBjb<7M5EQx~CAl5BpU|<k4WM*Kv!D`5n$;80Gcz}_Cfz_BDWF`Zn
za6K~v1FIP)$P^C7Ngye6Fh_v#7f8ke%#mO`%fi6GY6<2jFgh_YFtA#IIU0=CAQ@{g
z$AHljWPlBrW5HMeGQbwhabU~<>2UyaJQ#aGdK|%=`T#}_5YGwBi(qsHX>t*3Vq#!O
zU=#xx=O)t5#K4fjxDLee0K2<@aU#e#PcWy1@dHT4i@T12fuVx&B8cNF6wAQC(7@ON
zGR=>_fPsObiBTIQ<ImB<#K6$ZSPwEFkbe${?qK`^l8WT*VqjpH!1w^fi56eR#K16v
zaWBYmF_IgY7#J2Xt^sjk!R}eXs0T73juR9w8yHPMGVxq`piIa(6C{%WcH99*PmoL!
z$5ti=h9eB@rpycsZ0wSc7#J87)Ig47(dHABo&3XCsb26dBLf37D6<IeVqsulUd_b7
zzzvGgqfF447iJLGU}9kCKhMO#zzm8@UJy$>h=qY+B8bJD!oa}5e2RgAf%gRy1A{~+
z0|Nu6KBGS~0|RF%3#iY@c?&e8z{HsX%4;l~bs&m^^8!e)UV!r-C=V%cz62?C;A8_y
zHgGV4(hSFOW(Ec(4iP2>1{RJ;76t|m24+x_;RTs3=EKauP{1K9u$7sCfpIxVR+I~p
zyiR~PV%#7J4#pH_1_lmsZjinJ#-&UQ3>*?*P6XpiCI*Ij4oNUCfw2yxNs1F>LIwj^
z>?kud1UMMj=YV9TnIoAQ7!*ZW7#I#PbEpe|l8{nfX)XhY23Q{hqZP<9O|S%qvI2;s
z#VNtUz|g_Wzzs4E#0F<4b_Q_v(yM2I+Q9}EW@KQW&&a^Qq0MxW85)!vUVNz_%UeOg
z#IXe&E?i8Ya5)Z&IgTZujK{!k4bm3CY{kOBAeqa^z`(7|)Xc)bzywMt3@ibl$W&$I
z2c?wxAYo8UF}+{{jcTyWXJTMr4`AX01<`@Y|4kL@Z@`pDF|hE143lBv0~z!lBn~oz
zK`4TWfq^Gq0F>YPSs56ZKnx}@3lxG3%pj8GB_jg^Z#WYVh+_a!1-2H%VqgX}+*sN{
z3bY{#0znEuDw*m*B!kdTCI$w+tzgZ$AUUvRkdzbyiz!HB8Y5V;1tbX)XHfYA66RtC
zJ4<ykGXn#60Tb^MxI9Z3NPa6s+is9B$i)mSIiOg`V+4o59ae^V2Bw`13=B+fLBSjX
zN~V&hKw+f9{0^iC<PHXwdCUw9ysQwXv$8QTfI^djK}eR7fq`od*j)-RQHT_aH7F9M
zLn6T(CdZ(*6O>W>m7PJOMvs{o7}PJ+gE9>hBP+;HHqwwX9h5^sEXFx^*%%mvL5ZJ*
zkpmQE%oAr+NEanDa51uhG%!z`QX$;K$iTqED5wX@(GwR`@Vy7sxC{&ophgtP6yb|Z
z3=H~=;8e>zv8RIXCsYBba$x}3FP+I?z{m?Ra6$zG0|S2<69dBru$$IOfXrZE09U~v
zx6V1s&cGm&oSVY1K?=lVp17l)XB#5}!v<xD30vxUKu+3VcZr>WfqCMJdLEDiHh4m0
zH`KH7Ff%Z0WLpFZ^@$1fq6L{L4BI)*gSi1RY0%m@6k;ty6*~h1TQnmB!*LFf0ZbDk
z7-U{T)zm=MtO2Px$jHEO6{^OE4b&{Y2j#^u@I8@&D3ym$3~cPo3=H2u^7RZ%6GIpn
zm_a#~85D;6q09^nsbIf96NM-TH&4KRuj61~;Mo9DAO(qz6%fy+nm|0epq}jx3j;$I
zII@@~I<O@$F)(C9c>!#@7#SFHp)t3op3hy30UZ7epkWV?RidC^t>6a*E7QaTw#Up2
z3=QB~i)o?<+aV?fhDInaf`NfwiG_h7m>*PLWI^2t3lGLQ>o}ls6s!v|EQ5jnHWLGb
z3t0UJXd|Qw)Sdv@%Q)vA$YV2@85mqNK}nuzVg`do5hDWwqXiqR#jy^g5*!L5#U(`y
z780NkV44^qy7``^JEMR(gQqY910Oe|AfpgF0|WnLcWc>t0X49wpfCe7pN%8~gODDh
zy(BZA6}L6FCAYeyr?8DAqc8)5un7Y*pOqq`HLE4Jr!bQQ1A_=F12YFmgc~LzYJx5z
zCd|mp$IT5f3}lQr#29vKZc9ZzPhoq>dXSwGER1%F?A(ehp27&Fl5mHxS}O9YOG4Zs
z1xoDFFpJ=hk%4#$WQD9Cqbi>;H?zF7JjkB{;tULODh%A*cHGPy3=H!84BXrd3<_c(
z?{Hgl`&x1{FerkZ$%?RBi5KJ(a1eM3TW~WlDDy(qgZyg2%D|wa#{dl`R#-4GFsM$>
zvk^B`gG<3fkbyxR$v51d!XTG9NYsFXR%7xun<QmUXpA#+GP3gQW@SFf%E)n&iHU&`
z(i&pmV5pyLZEMEJKe@=(joSs(JYkh(;AC=|ywCPvy|OT?$b44u-K-M3SvmKy3OBQI
zaGYXgiDYHp$I8YL!OHK=%Fc0}Rcb9O4~Hl#H$p^uEvw{iR-V%+Vx_D?w^*gpSUEnk
z@}*5?m1IulxW+2az{J8>!YT=((pUwU6(+Dsq_J{*W99W`<rH9c=eWko%WO0GjGe7F
z=R#K2CRXW4R^cXAHV$uA*7T>WEDN5pa_wPdNq@=;k>-eG<tk-mD`DmKp28|q&ME>@
zI}xIG;Zs(bJ*-M;tXz}D?UxAZvvM%$3b6`DvZ^pJu`n^YZa!nL$7mBDpP!Z%U&0XY
z8Ju2}SdhVxo0yZ6pUe=SoROHB$532Sl$=|@P@Gwn3Q|;@kzZ7jRGP++oReRiI$6*~
zxIU>gEj}r+I2F=!%gie%Es0M{0hyPWQ;?C!kXDqM%1~02nHyhRkeHlW43bI7OwTM~
zNGUBaVo1)(EC$)`A77N3m=d3wm%@;opPQSQml6+>0a==snUk8A&ybv(5}%oul3KwK
zpO%xDUd-U+8Sm#`9}@56$q=7hS`?q0pHrHf#}M!7AD^6`lA2sr!jM{#np{@E5TBou
z0`g~ZY6+xo8SfdKl#`g34Kl;o*CpQB1>~%P(!6AdTXGYNvQvu~ic3;5^BCemUMNZ}
zjt6<XxTGj26=F$wQD#YMeSAR)NMTWOaX}tKd17V>sGtYAwIn|q?3UuhvQ$V2fm{<0
zD*NJd@{{3qyGD41K)qzd5TBc$lFE>lo?24O013;Y)RfGk)Z`MFQ(b}_-TnO-5{uH~
zK{nJEq!tzB7lA`R4HQ5Oxrrso8S&6SWXLZq0mTU16i}}k<X3QHFyy6Hl*EI&+~634
z#sSDfATdx>`GcJbiUm*qcsEZUS6J*6GsJ@fslKQf95YF!X=w~erI|S?ARmI`jseU9
zNu(BmLjsgkKoJ}tUyzvsGPA5CF)1e%7Bi_8nI#ZUGbCrEWEO#Z>>A<f92(;40=6S3
zGcT1PK0djmvLH1+3FI<{cze&_<h+ui9FU(XAn7XJGdL%|JhccGM)9B+U;rm{GZT=t
zo=}g1lI>(gN2z*nI*A9lz9c>~59Dly`1pdv6jQLX!SM`EnenB0rNyZ!Mxca|S_JY`
zaAFRqwG0jAv=mT=Dap@{2g{Wf6r>ixVj!`g0PJ^9|M;ZD<m}P{NSXkplt54z#g~BG
zn~X?ppyUs+KQkpYJ|(dv5u~6DA_Pi$2m?SiLOkgiTu_vmSF(A9iz_30T5?`Vj$X#(
zjZBi0Iotvy1EBM7&>D^bG~)?sFE>msbQ5PhFuBuB-w-xu2U7#8Y(Z+k10OI!1_p)>
zP!-7_%D^%CrCU7XjLDwv`jW5-RhY7iV1_WmiOCb)#Thv!uXOJhL~m@QPrm3bJ~_cd
zf$_uSMh|_a2eOkldBibhZ5H%2XXJ!86(<LJsdFJ3X_K40)EE^euk_Lf4JF+2vSZYr
z%;+u7=ma7qK}{PW1_AgW0<20;1j#ZMfk??#W(Ed9CP@YX=nNy+sSFGZ6DLpf7H3_}
z%)p>Dc_WiB<FUyHy~P>Nfb=ll1(RPlbNZMvgJ)DX8~RUU+I%7~fsygWWX)iG!4sfa
zXa)ub80|kfGgx0xf&*eYjJBJ+GFYE80xB9Y`C+g*=L#rq#bm`0bNHwWZ1hEAa%M<9
zM+2xM$-uxcd18q8WcE<O$q}IflQlvOBsK^_EP&CVkuH!3SYdmpAbh$VHtoKbYx1g4
zJ+24Pp`iz|lOKh;F&>+&8K%#Pm;g@<Gv_o=1R2D@U@&=Mm^mkWrg!qgF!RYb!VD&R
zgbPfT2p5=~5pDn<LE_Md==rgEWw<>f<Cn=VBh0z_K|?MK3=D$IleHqvI2YJL)U2AE
z8EMYx1#0wyCNC$ij5O!8af8VDOnw<@&e`D(;dxBfj56oC;0xh#uuRU1GUK`t2;pWi
JPJR_A2LOIW%z^*_

delta 7316
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
V@6406V$8V210dWi#>uOK<p5{tn34bh

diff --git a/assignments/assignment-5/starter/dshlib.c b/assignments/assignment-5/starter/dshlib.c
index f24530c..6942f5f 100644
--- a/assignments/assignment-5/starter/dshlib.c
+++ b/assignments/assignment-5/starter/dshlib.c
@@ -120,6 +120,8 @@ int build_cmd_list(char *cmd_line, command_list_t *clist) {
 		cmd_buff_t *cmd = &clist->commands[index];
 		cmd->argc = 0;
 		cmd->_cmd_buffer = cmd_tok;
+		cmd->input_redirect = NULL;
+		cmd->output_redirect = NULL;
 		
 		//printf("Command %d (before args parsing): '%s'\n", index, cmd_tok);
 
@@ -131,8 +133,29 @@ int build_cmd_list(char *cmd_line, command_list_t *clist) {
 
 			//printf("Command %d: argv[%d]: '%s'\n", index, cmd->argc, arg_tok);
 
-			cmd->argv[cmd->argc] = arg_tok;
-			cmd->argc++;
+			if(strcmp(arg_tok, "<") == 0) {
+				arg_tok = strtok_r(NULL, " ", &arg_tok_save);
+				if(arg_tok != NULL) {
+					cmd->input_redirect = arg_tok;
+				}
+			}
+			else if(strcmp(arg_tok, ">>") == 0) {
+				arg_tok = strtok_r(NULL, " ", &arg_tok_save);
+				if(arg_tok != NULL) {
+					cmd->output_redirect = arg_tok;
+					cmd->output_append = 1;
+				}
+			}
+			else if(strcmp(arg_tok, ">") == 0) {
+				arg_tok = strtok_r(NULL, " ", &arg_tok_save);
+				if(arg_tok != NULL) {
+					cmd->output_redirect = arg_tok;
+				}
+			}
+			else {
+				cmd->argv[cmd->argc] = arg_tok;
+				cmd->argc++;
+			}
 
 			arg_tok = strtok_r(NULL, " ", &arg_tok_save);
 		}
@@ -172,12 +195,40 @@ int exec_cmd(cmd_buff_t *cmd, int cmd_index, command_list_t *clist, int pipefd_i
 			close(pipefd[0]);
 		}
 
-		if(cmd_index > 0) {
+		if(cmd->input_redirect != NULL) {
+			int input_fd = open(cmd->input_redirect, O_RDONLY);
+			if(input_fd == -1) {
+				perror("open");
+				exit(EXIT_FAILURE);
+			}
+			dup2(input_fd, STDIN_FILENO);
+			close(input_fd);
+		}
+		else if(cmd_index > 0) {
 			dup2(pipefd_in, STDIN_FILENO);
 			close(pipefd_in);
 		}
 
-		if(cmd_index < clist->num - 1) {
+		if(cmd->output_redirect != NULL) {
+			int flags = O_WRONLY | O_CREAT;
+			if(cmd->output_append) {
+				flags |= O_APPEND;
+				//printf("OPENING FILE IN APPEND MODE: output_redirect = %s\n", cmd->output_redirect);
+			}
+			else {
+				flags |= O_TRUNC;
+				//printf("OPENING FILE IN OVERWRITE MODE: output_redirect = %s\n", cmd->output_redirect);
+			}
+			int output_fd = open(cmd->output_redirect, flags, 0644);
+			if(output_fd == -1) {
+				perror("open");
+				exit(EXIT_FAILURE);
+			}
+			//printf("FILE OPENED: output_fd = %d\n", output_fd);
+			dup2(output_fd, STDOUT_FILENO);
+			close(output_fd);
+		}
+		else if(cmd_index < clist->num - 1) {
 			close(STDOUT_FILENO);
 			dup2(pipefd[1], STDOUT_FILENO);
 			close(pipefd[1]);
diff --git a/assignments/assignment-5/starter/dshlib.h b/assignments/assignment-5/starter/dshlib.h
index 47d87e7..be62155 100644
--- a/assignments/assignment-5/starter/dshlib.h
+++ b/assignments/assignment-5/starter/dshlib.h
@@ -21,6 +21,9 @@ typedef struct cmd_buff
     int  argc;
     char *argv[CMD_ARGV_MAX];
     char *_cmd_buffer;
+    char *input_redirect;
+    char *output_redirect;
+    int output_append;
 } cmd_buff_t;
 
 /* WIP - Move to next assignment 
diff --git a/assignments/assignment-5/starter/output.txt b/assignments/assignment-5/starter/output.txt
deleted file mode 100644
index d46f5ff..0000000
--- a/assignments/assignment-5/starter/output.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Output of first command:
-whoami 
-- 
GitLab