writing a shell in c

Discussion in 'C Programming' started by L337Hax0r, Feb 4, 2004.

  1. L337Hax0r

    L337Hax0r Guest

    for my operating systems design class i am supposed to write a shell in c. i have no idea where to start and our teacher hasn't given us much info. anyone know of any good tutorials?
     
    L337Hax0r, Feb 4, 2004
    #1
    1. Advertising

  2. L337Hax0r wrote:

    > for my operating systems design class i am supposed to write a shell in c.
    > i have no idea where to start and our teacher hasn't given us much info.
    > anyone know of any good tutorials?


    Here is an example shell (well, it's more of a skeleton, really), which does
    not actually execute any internal commands - it just pretends to. On the
    other hand, it /will/ execute external commands if they don't happen to
    have the same name as the internal commands it understands, so use with
    care!

    Note that it is case-sensitive. If you're in Windows, MKDIR foo, for
    example, will be treated as an external command and will actually create a
    foo directory, whereas mkdir foo will be treated as internal, and will
    merely /pretend/ to make a directory.

    /* shelldemo.c
    * Richard Heathfield, 2003
    * Contact:
    * Permission is granted to copy this file and to modify it,
    * provided that credit to the author is given where appropriate
    * and modifications are clearly marked as such. In other words,
    * don't pretend you wrote my bits, and don't pretend I wrote
    * your bits.
    * This code is intended merely to be an expression of an idea for
    * matching up requests to function calls, and was written very
    * quickly. It was not intended to be considered a model of
    * exemplary programming practice. Witness the large main(), and
    * the use of "magic numbers".
    * Retain this comment. Thank you.
    * - rjh 8 Jan 2003.
    */

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int cmpstr(const void *vs1, const void *vs2)
    {
    char * const *s1 = vs1;
    char * const *s2 = vs2;
    return strcmp(*s1, *s2);
    }

    int rjhchdir(char *args)
    {
    if(args != NULL)
    {
    printf("You changed directory to %s.\n", args);
    }
    else
    {
    printf("You changed to your home directory.\n");
    }
    return 0;
    }

    int rjhclear(void)
    {
    printf("You cleared the display.\n");
    return 0;
    }

    int rjhdf(void)
    {
    printf("You asked for disk usage info.\n");
    return 0;
    }

    int rjhdu(char *args)
    {
    printf("You asked for directory usage info.\n");
    if(args != NULL)
    {
    printf("Specifically, you wanted the option %s\n", args);
    }
    return 0;
    }

    int rjhls(char *args)
    {
    printf("You asked for a directory listing.\n");
    if(args != NULL)
    {
    printf("Options: %s\n", args);
    }
    return 0;
    }

    int rjhmkdir(char *args)
    {
    if(args != NULL)
    {
    printf("You created a directory, %s\n", args);
    }
    else
    {
    printf("You have to say what "
    "directory you want to create.\n");
    }
    return 0;
    }

    int rjhsu(char *args)
    {
    if(args != NULL)
    {
    printf("You switched user to %s\n", args);
    }
    else
    {
    printf("You are now root.\n");
    }
    return 0;
    }

    int main(void)
    {
    /* ensure this list is sorted! */
    char *command[] =
    {
    "cd",
    "clear",
    "df",
    "du",
    "exit",
    "ls",
    "mkdir",
    "su"
    };
    size_t numcommands = sizeof command / sizeof command[0];
    char line[4096] = {0};
    char safeline[4096] = {0};
    int done = 0;
    int i = 0;
    char *s = line;
    char **t = NULL;
    char *prompt = ">";
    char *args = NULL;
    char *nl = NULL;

    while(!done)
    {
    printf("%s", prompt);
    fflush(stdout);
    if(NULL == fgets(line, sizeof line, stdin))
    {
    t = NULL;
    done = 1;
    }
    else
    {
    nl = strchr(line, '\n');
    if(nl != NULL)
    {
    *nl = '\0';
    strcpy(safeline, line);
    }
    else
    {
    int ch;
    printf("Line too long! Ignored.\n");
    while((ch = getchar()) != '\n' && ch != EOF)
    {
    continue;
    }
    if(ch == EOF)
    {
    done = 1;
    }
    }
    args = strchr(line, ' ');
    if(args != NULL)
    {
    *args++ = '\0';
    }
    t = bsearch(&s,
    command,
    numcommands,
    sizeof command[0],
    cmpstr);
    }

    if(!done && t != NULL)
    {
    i = (int)(t - command);
    switch(i)
    {
    case 0: rjhchdir(args); break;
    case 1: rjhclear(); break;
    case 2: rjhdf(); break;
    case 3: rjhdu(args); break;
    case 4: done = 1; break;
    case 5: rjhls(args); break;
    case 6: rjhmkdir(args); break;
    case 7: rjhsu(args); break;
    default: break;
    }
    }
    else
    {
    printf("%s is not an internal command. "
    "Trying to execute it instead.\n", line);
    system(safeline);
    }
    }

    return 0;
    }




    --
    Richard Heathfield :
    "Usenet is a strange place." - Dennis M Ritchie, 29 July 1999.
    C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
    K&R answers, C books, etc: http://users.powernet.co.uk/eton
     
    Richard Heathfield, Feb 4, 2004
    #2
    1. Advertising

  3. L337Hax0r <> spoke thus:

    > for my operating systems design class i am supposed to write a shell in c. i
    > have no idea where to start and our teacher hasn't given us much info.
    > anyone know of any good tutorials?


    0) Get clarification from the instructor if you don't understand the
    requirements. No one else can help you until you at least are
    clear on what you are to do.
    1) Check Google if you haven't.
    2) You may need to look elsewhere for help. The system() library call
    is germane here, but all system calls are topics for other
    newsgroups.
    3) In any case, come up with some code first (standard C only, please)
    and post here for help. Starting from scratch is *your* job.
    4) I'm sure that at least one of the links below will prove useful to
    you, if Google wasn't as illuminating as you'd like:

    http://www.csclub.uwaterloo.ca/u/dj3vande/clc/clc-welcome.txt
    http://www.eskimo.com/~scs/C-faq/top.html
    http://benpfaff.org/writings/clc/off-topic.html

    Have fun with your systems class. Make an effort to give it a go
    yourself - newsgroups are no substitute for your own initiative.

    --
    Christopher Benson-Manica | I *should* know what I'm talking about - if I
    ataru(at)cyberspace.org | don't, I need to know. Flames welcome.
     
    Christopher Benson-Manica, Feb 4, 2004
    #3
  4. L337Hax0r

    Ben Pfaff Guest

    Richard Heathfield <> writes:

    > /* ensure this list is sorted! */
    > char *command[] =
    > {
    > "cd",
    > "clear",
    > "df",
    > "du",
    > "exit",
    > "ls",
    > "mkdir",
    > "su"
    > };


    You're going to have a hard time keeping it sorted when sort
    order varies from one platform to the next. You're already
    calling bsearch(); why not call qsort() at the beginning too?
    --
    "C has its problems, but a language designed from scratch would have some too,
    and we know C's problems."
    --Bjarne Stroustrup
     
    Ben Pfaff, Feb 4, 2004
    #4
  5. Ben Pfaff wrote:

    > Richard Heathfield <> writes:
    >
    >> /* ensure this list is sorted! */
    >> char *command[] =
    >> {
    >> "cd",
    >> "clear",
    >> "df",
    >> "du",
    >> "exit",
    >> "ls",
    >> "mkdir",
    >> "su"
    >> };

    >
    > You're going to have a hard time keeping it sorted when sort
    > order varies from one platform to the next. You're already
    > calling bsearch(); why not call qsort() at the beginning too?


    For the same reason that I didn't do All Kinds Of Other Stuff.

    If the OP wishes to add a qsort call, however, he or she (I don't recall
    which, I'm afraid) is entirely welcome. It'll be excellent practice.

    --
    Richard Heathfield :
    "Usenet is a strange place." - Dennis M Ritchie, 29 July 1999.
    C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
    K&R answers, C books, etc: http://users.powernet.co.uk/eton
     
    Richard Heathfield, Feb 4, 2004
    #5
  6. L337Hax0r wrote:
    > for my operating systems design class i am supposed to write a shell
    > in c. i have no idea where to start and our teacher hasn't given us
    > much info. anyone know of any good tutorials?


    Advanced Unix Programming
    by Marc J. Rochkind

    Jeremy.
     
    Jeremy Yallop, Feb 4, 2004
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    2
    Views:
    5,850
    Jonathan Bromley
    Feb 18, 2005
  2. Christian Heimes
    Replies:
    0
    Views:
    623
    Christian Heimes
    Feb 27, 2008
  3. Gerardo Herzig
    Replies:
    1
    Views:
    1,130
    Philipp Pagel
    Feb 27, 2008
  4. D'Arcy J.M. Cain
    Replies:
    0
    Views:
    887
    D'Arcy J.M. Cain
    Feb 27, 2008
  5. Samuel A. Falvo II
    Replies:
    0
    Views:
    504
    Samuel A. Falvo II
    Oct 8, 2008
Loading...

Share This Page