Search code examples
cshellsegmentation-faultprompt

Getting an unexpected seg fault when creating a custom shell prompt


So the following snippet should either make the prompt in a simple shell program 'my257sh'>, or ''> if -p is used as a command line arg when launching, followed by a string to be used as the custom prompt.

The custom prompt works fine, but I get a seg fault when launching with no additional args.

Can someone tell me what incredibly simple and stupid thing I'm doing wrong?

int main(int argc, char *argv[]) {
    char cmdline[MAXLINE]; /* Command line */
    char def_prompt[20] = "my257sh";
    const char prompt_check[2] = "-p";
    char new_prompt[20];

    if (argc > 0){
        if (strstr(argv[1], prompt_check)) {
            strcpy(new_prompt, argv[2]);
        }
    }
    else {
        strcpy(new_prompt, def_prompt);
    }

    signal(SIGINT, sigIntHandler); // ignores ctrl + C interrupt

    while (1) {
    /* Read */
        printf("%s> ",new_prompt);
        ...

Solution

  • argc contains the number of arguments passed on the shell, including the command itself, so argc will always be > 0 as it is at least 1 if no parameters were given.

    If you don't pass any arguments, then argv[1] will contain a NULLpointer. If you pass only one parameter then argv[2] is a NULL pointer.

    if (argc > 2)
    {
        if (strstr(argv[1], prompt_check))
            strcpy(new_prompt, argv[2]);
    }
    else
    {
        strcpy(new_prompt, def_prompt);
    }