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


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


/* Установить переменную окружения */ void setenv( name, value ) char *name, *value; { static malloced = 0; /* 1, если environ перемещен */ char *s, **p, **newenv; int len, change_at = (-1), i;

/* Есть ли переменная name в environ-е ? */ for(p = environ; *p; p++ ) if(s = envcmp(name, *p)){ /* уже есть */ if((len = strlen(s)) >= strlen(value)){ /* достаточно места */ strcpy(s, value); return; } /* Если это новый environ ... */ if( malloced ){ free( *p ); *p = str3spl(name, "=", value); return; } /* иначе создаем копию environ-а */ change_at = p - environ; /* индекс */ break; } /* Создаем копию environ-а. Если change_at == (-1), то * резервируем новую ячейку для еще не определенной переменной */ for(p=environ, len=0; *p; p++, len++ ); /* вычислили количество переменных */ if( change_at < 0 ) len++; if((newenv = (char **) malloc( sizeof(char *) * (len+1))) == (char **) NULL) return; for(i=0; i < len+1; i++ ) newenv[i] = NULL; /* зачистка */ /* Копируем старый environ в новый */ if( !malloced ) /* исходный environ в стеке (дан системой) */ for(i=0; environ[i]; i++ ) newenv[i] = strdup(environ[i]); else for(i=0; environ[i]; i++ ) newenv[i] = environ[i]; /* Во втором случае строки уже были спасены, копируем ссылки */

/* Изменяем, если надо: */ if( change_at >= 0 ){ free( newenv[change_at] ); newenv[change_at] = str3spl(name, "=", value); } else { /* добавить в конец новую переменную */ newenv[len-1] = str3spl(name, "=", value); } /* подменить environ */ if( malloced ) free( environ ); environ = newenv; malloced++; qsort( environ, len, sizeof(char *), cmps); }

/* Допишите команды: unsetenv имя_переменной - удаляет переменную среды; exit N - завершает интерпретатор с кодом возврата N (это целое число); */

© Copyright А. Богатырев, 1992-95
Си в UNIX

| |




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



Книжный магазин