Хрестоматия по программированию на Си в Unix


Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 6


void setcwd(){ /* Установить имя текущего каталога */ char cwd[512]; getwd(cwd); setenv( "CWD", cwd ); } void main(ac, av, ev) char *av[], *ev[]; { int argc; /* количество аргументов */ char *prompt; /* приглашение */

setuser(); setcwd(); signal(SIGINT, SIG_IGN); setbuf(stdout, NULL); /* отменить буферизацию */ for(;;){ prompt = getenv( "prompt" ); /* setenv prompt -->\ */ printf( prompt ? prompt : "@ ");/* приглашение */ if( gets(cmd) == NULL /* at EOF */ ) exit(0); argc = parse(cmd); if( !argc) continue; if( !strcmp(arg[0], "exit" )) exit(0);

if( !strcmp(arg[0], "cd" )){ char *d = (argc==1) ? getenv("HOME"):arg[1]; if(chdir(d) < 0) printf( "Не могу войти в %s\n", d ); else setcwd(); continue; }

if( !strcmp(arg[0], "echo" )){ register i; FILE *fp; if( fout ){ if((fp = fopen(fout, rout & APPEND ? "a":"w")) == NULL) continue; } else fp = stdout; for(i=1; i < argc; i++ ) fprintf( fp, "%s%s", arg[i], i == argc-1 ? "\n":" "); if( fp != stdout ) fclose(fp); continue; }

if( !strcmp(arg[0], "setenv" )){ if( argc == 1 ) printenv(); else if( argc == 2 ) setenv( arg[1], "" ); else setenv( arg[1], arg[2]); continue; } cmdExec(arg[0], (char **) arg, environ, fin, fout, rout); } }

/* -----------------------------------------------------------*/ /* Отсортировать и напечатать окружение */ void printenv(){ char *e[40]; register i = 0; char *p, **q = e;

do{ p = e[i] = environ[i]; i++; } while( p );

#ifdef SORT qsort( e, --i /* сколько */, sizeof(char *), cmps); #endif while( *q ) printf( "%s\n", *q++ ); }

/* Сравнение имени переменной окружения с name */ static char *envcmp(name, evstr) char *name, *evstr; { char *p; int code; if((p = strchr(evstr, '=')) == NULL ) return NULL; /* error ! */ *p = '\0'; /* временно */ code = strcmp(name, evstr); *p = '='; /* восстановили */ return code==0 ? p+1 : NULL; }




- Начало -  - Назад -  - Вперед -