All pastes #58307 Raw Edit

blAckEnEd

public c v1 · immutable
#58307 ·published 2006-05-23 08:28 UTC
rendered paste body
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>char *HOME;char *HOSTNAME;char *USER;char PROMPT[50];void do_exec (char *argv[]){	switch (fork ())	{	case -1:		perror ("fork()");		break;	case 0:		execvp (argv[0], argv);		perror ("execvp()");		exit (1);		break;	default:		wait (NULL);		break;	}}int is_special_command (char *argv[]){	if (!strcmp (argv[0], "exit"))	{		exit (0);	}	if (!strcmp (argv[0], "cd"))	{		if (!argv[1])		{			chdir (HOME);			return 1;		}				if (strchr (argv[1], '~'))		{			char aux[1024] = {};			strcat (aux, HOME);			strcat (aux, argv[1] + 1);			chdir (aux);		}				chdir (argv[1]);				return 1;	}		return 0;}void parse_command (char *command){	char *argv[255];	unsigned char idx = 1;	argv[0] = strtok (command, " \t\n");	while (argv[idx++] = strtok (NULL, " \t\n"))		;		if (!is_special_command (argv))	{		do_exec (argv);	}}char *get_command (){	char command[1024];	char c;	int idx = 0;		printf ("%s ", PROMPT);		while ((c = getchar ()) != '\n')	{		switch (c)		{		case '\b':			idx--;			break;		default:			command[idx++] = c;			break;		}	}		command[idx] = '\0';		return command;}void setup (){	HOME = getenv ("HOME");	HOSTNAME = getenv ("HOSTNAME");	USER = getenv ("USER");	strcpy (PROMPT, USER);	strcat (PROMPT, "@");	strcat (PROMPT, HOSTNAME);	strcat (PROMPT, "$ ");}int main (int argc, char *argv[]){	char *command;	setup ();	while (1)		parse_command (get_command ());	return 0;}