From 7be2b2596aaac762882b025474007d0eaca53649 Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Mon, 3 Feb 2014 18:05:01 +0100 Subject: [PATCH] Prepare userland shell --- Makefile | 6 +++++- programs/tsh/Makefile | 15 ++++++++++++++ programs/tsh/src/main.cpp | 27 +++++++++++++++++++++++++ programs/tsh/tsh | Bin 0 -> 13623 bytes userlib/include/string.hpp | 40 +++++++++++++++++++++++++++++++++++++ 5 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 programs/tsh/Makefile create mode 100644 programs/tsh/src/main.cpp create mode 100755 programs/tsh/tsh create mode 100644 userlib/include/string.hpp diff --git a/Makefile b/Makefile index 1a402af3..15c97de5 100644 --- a/Makefile +++ b/Makefile @@ -32,11 +32,14 @@ programs/loop/a.out: force_look programs/keyboard/a.out: force_look cd programs/keyboard; ${MAKE} a.out +programs/tsh/tsh: force_look + cd programs/tsh; ${MAKE} tsh + hdd.img: dd if=/dev/zero of=hdd.img bs=516096c count=1000 (echo n; echo p; echo 1; echo ""; echo ""; echo t; echo c; echo a; echo 1; echo w;) | sudo fdisk -u -C1000 -S63 -H16 hdd.img -thor.flp: hdd.img bootloader/stage1.bin bootloader/stage2.bin kernel/kernel.bin programs/one/a.out programs/hello/a.out programs/long/a.out programs/loop/a.out programs/longone/a.out programs/longtwo/a.out programs/keyboard/a.out +thor.flp: hdd.img bootloader/stage1.bin bootloader/stage2.bin kernel/kernel.bin programs/one/a.out programs/hello/a.out programs/long/a.out programs/loop/a.out programs/longone/a.out programs/longtwo/a.out programs/keyboard/a.out programs/tsh/tsh mkdir -p mnt/fake/ dd if=bootloader/stage1.bin of=hdd.img conv=notrunc dd if=bootloader/stage2.bin of=hdd.img seek=1 conv=notrunc @@ -51,6 +54,7 @@ thor.flp: hdd.img bootloader/stage1.bin bootloader/stage2.bin kernel/kernel.bin sudo /bin/cp programs/longtwo/a.out mnt/fake/longtwo sudo /bin/cp programs/loop/a.out mnt/fake/loop sudo /bin/cp programs/keyboard/a.out mnt/fake/keyboard + sudo /bin/cp programs/tsh/tsh mnt/fake/tsh sleep 0.1 sudo /bin/umount mnt/fake/ sudo /sbin/losetup -d /dev/loop0 diff --git a/programs/tsh/Makefile b/programs/tsh/Makefile new file mode 100644 index 00000000..cce843d7 --- /dev/null +++ b/programs/tsh/Makefile @@ -0,0 +1,15 @@ +.PHONY: default clean + +default: tsh + +include ../../cpp.mk + +%.cpp.o: src/%.cpp + $(CC) $(PROGRAM_FLAGS) -mcmodel=large $(CPP_FLAGS_64) $(WARNING_FLAGS) -c $< -o $@ + +tsh: main.cpp.o + $(CC) $(PROGRAM_LINK_FLAGS) -mcmodel=small -fPIC $(CPP_FLAGS_64) -o tsh main.cpp.o + +clean: + rm -f *.cpp.o + rm -rf tsh diff --git a/programs/tsh/src/main.cpp b/programs/tsh/src/main.cpp new file mode 100644 index 00000000..c4474d8c --- /dev/null +++ b/programs/tsh/src/main.cpp @@ -0,0 +1,27 @@ +//======================================================================= +// Copyright Baptiste Wicht 2013-2014. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +//======================================================================= + +#include +#include +#include + +int main(){ + char input_buffer[64]; + + while(true){ + for(int i = 0; i < 10; ++i){ + auto c = read_input(input_buffer, 63); + input_buffer[c] = '\0'; + + if(str_equals(input_buffer, "exit")){ + exit(0); + } else { + print_line("Unknown command"); + } + } + } +} \ No newline at end of file diff --git a/programs/tsh/tsh b/programs/tsh/tsh new file mode 100755 index 0000000000000000000000000000000000000000..4342eacf0cbd313eb023a4250b0cb081600bb7c4 GIT binary patch literal 13623 zcmeHOU2Ggz6}~gGj@Madz4j)y)5Pf}xFJ>8wVk+;2_$iTXf~yFQ`s)YE!gYbvAxai zteKg$ok}QCl7gIo)Bq_UOaXyJ5k>qwRHjv_X;8{brK-w9o@gFQgp|HiLE@nj<~uX@ z%P(@|Z>5t(Smnayro+Jk#h(Hj5AOb-If(Qf= z2qF+fAc#N^fgl1w1cC?z5%@16Fg)1u+FJUZRZ>YWee&+UXRZ&UNss4MO|{Z|Ya`(+ z{CvN5JG~N@&-`oerC0hG2YnagHT2>1(#J5JzW7lL9ci%k?!NTWiSBUv3RM^X5_4Uc z-XLAL+<0l#Zok}q>3#dbfwvbr2HsofNUyz*fN8hdQgH01Q7@#5JVt|KoEf-0zm|V2m}!bA`nC%h`|3{1oXwc zEk=zqMrpxFWJ|?j#>j~u<6q{Tf1DR#nyFafpUDvX3e4SB-`ui+PHY0V_vewgaxXe;{)K$Tyk+A!&~32iK9 z79}g()JX#SNlb{1;oqZ%AL9U#U!hW3CQ$SHiMWGe%MwNr;$5Gw$HVm)~4V;RydR{TluuEe5A>(ymdTg(Q_yY8Piy!m4fm2bI zFG6+mHwhix{2c-#&W9fDF9TPv&SLa5acawtAjdCVHi1G#S^fj49fYbaGR~bTkhDlA z>aT*%?|=G82t`@`Cpa;y4>A-n6SSDMPqtnmk7rD!pRskjLcZ z4I51wzg8myVkd35A3|prRY&MNIfzIIrB!(-8jonvZPC$=RwahTpmvK$`RLLG1s-2Jw)MNmKyA5vK@n=_Rl;Lc3K&GID+w{O)`pg- z=*3e?U)<_6Ihr>?d{lu;OH@0ab4%D{--S?%(vc#YFry-u+-D{?-mZ4nHitx<^W zm6(v_E;MD(R5-As(!_e}g2$va7WuLh?gY8JJ%WiJ>#s`QWLq$lLVwiXx-DwBbZeUudw_o1WGPqZKV|_S(X%4?L|= zM)?e=@8o*Lk$Q?F>%zijd7r7Gcb&}V;iT#~itXVPcW>X3Ew;hOlO%hB2Iz zLd==SFH*B}bM$qhb=I==qSvy)o8eY5lQ&XX$f-iuXXkW_8QA$Cxjt%9rTboQ_Z##V z4{wRT@h1Kr$~<{1q-syU+8xrg#n+MgDDj!+hK3G3qm^HMRNFkZD;|!k3LFlFV2k6Z zMU;@D?Hvo3Lm} z7!%`ty_RiG=wB;m3fAc_W`}zx9HKMqi9+7ci=u2;`58mcC9<;_6Wm7}W>!=beJb;! zP%>r`o*rdr)@;eNYe|k7N7d9bxrw|nSGG@Qi-IC4P7aMGj_=)@=uZu#_9c?VY!Txr z94chY86C}xRXhZ9Gp&y#j4c*LV(af0H*+Yv12a*S%J(Ea2X(f`Doja7>ySEQErl}7*lRcB1 zGfTFfwM(W;)EBe*oSiQjke}u#B`LZt-?Z&KuxV4*p>O1{%Frwo^LBFD%oO$HT#3dm zr8Cx9BRgxBj8fT3mW_qHkxSZ{se*3N3hwdNCFZ)1rVNSsT*lPpWLHs~)j~^GROZ8* zZiowKh9;)U)6=>sdS**Sy=NhxowZ8{i`|pc=X-3-ag~uqv0jdI)%(ejKU6qr(qTIL z#WxPO9lsunCcYGn9VPF!OFNtpaZ>BZfyegwmf;MR>3khManGYGImC!a{5$x20MDX#CT?E%GBq%RVZZ{&6pWu25VL7)VAmV zVh(x|DSE2Zv2LWavmIm<{&%nqsxRD*_r5o0w)cIyOV|lO`umtKCdGNe z6I3CeazUk*`lLhUVf+|(2(sFeaFL&ds;TQ`9|60b{%dmK-1IShO>z7_`j>aR{n|bS zUsDX-NB`fScJ&8c;MIQpuYlvHk?`R?uF9kfyxK2&1{^<)gkP5W|L`tbYXz##x5ooYbH5G5P#rS+cKjqYB)ClT)5s$tWnp;3Sqfm2`*F&-!^1 cYxuL1c{g2UHYF=$lF}+)QY}-TT31N^Kfy6>rvLx| literal 0 HcmV?d00001 diff --git a/userlib/include/string.hpp b/userlib/include/string.hpp new file mode 100644 index 00000000..a899477c --- /dev/null +++ b/userlib/include/string.hpp @@ -0,0 +1,40 @@ +//======================================================================= +// Copyright Baptiste Wicht 2013-2014. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +//======================================================================= + +#ifndef USERLIB_STRING_H +#define USERLIB_STRING_H + +int str_compare(const char *s1, const char *s2){ + while (*s1 != '\0') { + if (*s2 == '\0'){ + return 1; + } + + if (*s2 > *s1){ + return -1; + } + + if (*s1 > *s2){ + return 1; + } + + s1++; + s2++; + } + + if (*s2 != '\0'){ + return -1; + } + + return 0; +} + +bool str_equals(const char* s1, const char* s2){ + return str_compare(s1, s2) == 0; +} + +#endif