From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Wed, 22 Aug 2007 15:41:48 +0600 From: Denis Klimov To: ALT Devel discussion list Message-Id: <20070822154148.daaa17cd.kliden@km.ru> In-Reply-To: <75e139a00708220213r5e7d709bg50614cb09a556a2@mail.gmail.com> References: <20070822041318.EDBBD8E80D5@ssh.git.local.altlinux.org> <75e139a00708220213r5e7d709bg50614cb09a556a2@mail.gmail.com> Organization: IDO X-Mailer: Sylpheed version 2.2.9 (GTK+ 2.10.6; i586-alt-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=KOI8-R Content-Transfer-Encoding: 8bit X-Virus-Scanned: Scanned by clamav Subject: Re: [devel] [git update] packages/katrin: heads/master X-BeenThere: devel@lists.altlinux.org X-Mailman-Version: 2.1.9rc1 Precedence: list Reply-To: ALT Devel discussion list List-Id: ALT Devel discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 Aug 2007 09:41:48 -0000 Archived-At: List-Archive: List-Post: Этот кусок кода планируется вообще убрать и заменить все это с помощью функции system(3) On Wed, 22 Aug 2007 16:13:02 +0700 Slava Semushin wrote: > 2007/8/22, Denis Klimov : > > Update of /people/zver/packages/katrin.git > [...] > > --- a/src/tc/katrin-tc.c > > +++ b/src/tc/katrin-tc.c > > @@ -59,7 +59,8 @@ if (argc == 2 && (strcmp(argv[1], "remove") == 0 || strcmp(argv[1], "reload") == > > //open tmp script file > > char prog[25] = ""; > > strlcpy(prog, "/tmp/katrin-tc.XXXXXX", sizeof prog); > > - mktemp(prog); > > + mkstemp(prog); > > + > > Предлагаю избавиться от strlcpy() и сразу инициализировать массив значением: > > - char prog[25] = ""; > - strlcpy(prog, "/tmp/katrin-tc.XXXXXX", sizeof prog); > + char prog[] = "/tmp/katrin-tc.XXXXXX"; > > Также: > - надо проверять возвращаемое от mkstemp() значение > - mkstemp() возвращает файловый дескриптор для временного файла, > поэтому надо не надо открывать файл с помощью fopen(). Вместо этого > можно преобразовать дескриптор для open() в дескриптор для fopen() с > помощью fdopen() и потом записывать данные файл с помощью простого > fprintf(). Ну или не преобразовывать и писать с помощью write(). > > > FILE *fh = fopen(prog,"w"); > > > > fwrite("#!/bin/sh\n",strlen("#!/bin/sh\n"),1,fh); > > @@ -111,15 +112,18 @@ if (argc == 2 && (strcmp(argv[1], "remove") == 0 || strcmp(argv[1], "reload") == > > ret = chmod(prog, S_IRUSR | S_IWUSR | S_IXUSR); > > if (ret == -1) { > > err("Can't do chmod(2) for temporary file!"); > > + unlink(prog); > > return EXIT_FAILURE; > > } > > > > if (fork() == 0) > > execl (prog, prog, NULL); > > + unlink(prog); > [...] > > А вот тут получается нехорошая ситуация: > - Процесс форкается и его ребёнок запускает скрипт на выполнение > - Родитель тут же удаляет скрипт, который его ребёнок исполняет > > Надо: > - либо в родителе ждать когда ребёнок закончит выполнение скрипта > - либо добавить в конец скрипта строчку "rm -f $0", то скрипт после > выполнения сам себя удалит (но кажется это не самая лучшая идея, > потому что значение переменной $0 не всегда будет являеться полным > путём к скрипту) > - либо вообще не делать форк (действительно, зачем?) и выполнить > скрипт как-нибудь иначе чем exec() а потом его удалить. > > Кстати, можно также попробовать избавиться от chmod(2), если выставить > верный umask(2) перед созданием временного файла, с помощью > mkstemp(3). > -- Denis Klimov zver