From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Message-ID: <4358A2A9.4090406@uaservice.com.ua> Date: Fri, 21 Oct 2005 11:11:21 +0300 From: Valentin Lavrinenko User-Agent: Mozilla/5.0 (X11; U; Linux i686; uk-UA; rv:1.7.2) Gecko/20040808 X-Accept-Language: uk, en MIME-Version: 1.0 To: ALT Linux Community Subject: Re: [Comm] Re: /sbin/ifup ppp0 - =?KOI8-R?Q?=CE=C5=CB=CF=D2=D2=C5?= =?KOI8-R?Q?=CB=D4=CE=C1=D1_=D2=C1=C2=CF=D4=C1_=D0=CF_Ctrl-C?= References: <434CEFAD.1010407@uaservice.com.ua> <4354DB5D.5050001@uaservice.com.ua> <20051018183433.GH16082@osdn.org.ua> <4355EBA5.7010702@uaservice.com.ua> <20051019122041.GK16082@osdn.org.ua> <43564EF5.5090903@uaservice.com.ua> <20051019135418.GY16082@osdn.org.ua> <43573A4F.1050307@uaservice.com.ua> <20051020115520.GF16082@osdn.org.ua> In-Reply-To: <20051020115520.GF16082@osdn.org.ua> X-Enigmail-Version: 0.85.0.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: multipart/mixed; boundary="------------000101050400080309020208" X-Authenticated-Sender: lvu@uaservice.com.ua X-Spam-Processed: mail.uaservice.com.ua, Fri, 21 Oct 2005 11:19:53 +0300 (not processed: message from valid local sender) X-MDRemoteIP: 195.230.133.210 X-Return-Path: lvu@uaservice.com.ua X-MDaemon-Deliver-To: community@lists.altlinux.org X-BeenThere: community@lists.altlinux.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: ALT Linux Community List-Id: ALT Linux Community List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 21 Oct 2005 08:12:41 -0000 Archived-At: List-Archive: List-Post: This is a multi-part message in MIME format. --------------000101050400080309020208 Content-Type: text/plain; charset=KOI8-R; format=flowed Content-Transfer-Encoding: 8bit Hi! Michael Shigorin wrote: >Вы ещё не списались с Денисом? > Еще нет. В общем, я, похоже, нашел, в чем проблема, и даже сумел ее поправить. При этом наткнулся на баг (точнее, даже пару связанных) в pppd, повесил на http://ppp.samba.org/cgi-bin/ppp-bugs/incoming?id=1285. К сожалению, я не могу зарегистрироваться в багзилле - видимо, наш сервак рубит письмо с подтверждением. Так что патч приаттачен к письму. Основная идея: когда юзер нажал Ctrl-C, pppp-watch смотрит .pid-файл, создаваемый pppd, и, если нашел - по полученному pid'у убивает pppd. Однако, pppd создает этот файл не сразу, а только когда установится соединение (отработает chat-скрипт, например). Поэтому, если .pid-файл не найден, то мы ищем pppd, запущенный с нужным на параметром, в /proc. Если нашли - ждем 10 секунд (должно хватить), периодически проверяя, не появился ли .pid-файл, как только появился - убиваем pppd. Можно юыло бы, найдя pppd в /proc, сразу убивать pppd, но этому мешает упомянутая выше бага. Если этот патч появится в Сизифе - буду очень рад, если в backports - еще больше :) --------------000101050400080309020208 Content-Type: text/x-patch; name="net-scripts-pppd_sigterm.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="net-scripts-pppd_sigterm.patch" diff -ur net-scripts-0.4.9.1/src/ppp-watch.c net-scripts-0.4.9.1-lvu/src/ppp-watch.c --- net-scripts-0.4.9.1/src/ppp-watch.c 2001-03-05 02:22:06 +0200 +++ net-scripts-0.4.9.1-lvu/src/ppp-watch.c 2005-10-21 10:31:23 +0300 @@ -75,6 +75,7 @@ #include #include #include +#include #include "shvar.h" #include "alloc.h" @@ -116,6 +117,43 @@ } +static int +get_pppd_pid(char *device) { + int i; + glob_t globbuf; + int ge = glob("/proc/*/cmdline", 0, NULL, &globbuf); + if (!ge) { + for (i = 0; i < globbuf.gl_pathc; ++i) { + FILE *fcmdline; + char cmdline[1024]; // hope this will be enough + if (fcmdline = fopen(globbuf.gl_pathv[i], "r")) { + int num_read; + num_read = fread(cmdline, 1, 1024, fcmdline); + if (num_read > 0 && !strcmp(cmdline, "/usr/sbin/pppd")) { + int prev_linkname = 0; + char *p = cmdline; + while (*p && p - cmdline < 1024) { + if (prev_linkname && !strcmp(p, device)) { + int retval; + globbuf.gl_pathv[i][strlen(globbuf.gl_pathv[i])-8] = 0; + retval = atoi(globbuf.gl_pathv[i]+6); + globfree(&globbuf); + fclose(fcmdline); + return retval; + } + prev_linkname = !strcmp(p, "linkname"); + p += strlen(p) + 1; + } + } + fclose(fcmdline); + } + } + globfree(&globbuf); + return 0; + } + else + return -1; +} static void detach(int now, int parentExitCode, char *device) { @@ -550,6 +588,20 @@ if (physicalDevice) { free(physicalDevice); physicalDevice = NULL; } physicalDevice = pppLogicalToPhysical(&pppdPid, real_device); if (physicalDevice) { free(physicalDevice); physicalDevice = NULL; } + if (!pppdPid && get_pppd_pid(device)) + { + // We suspect that pppd is running, but haven't created + // .pid file yet. So we'll wait for 10 seconds, checking + // for .pid file every 10 milliseconds. + int i; + for (i = 0; i < 1000 && !pppdPid && get_pppd_pid(device) !=0 ; ++i) + { + usleep(10000); + physicalDevice = pppLogicalToPhysical(&pppdPid, real_device); + if (physicalDevice) { free(physicalDevice); physicalDevice = NULL; } + } + sleep(2); // Else pppd may hangup, seems there's a bug in it + } if (!pppdPid) cleanExit(35); kill(pppdPid, sendsig); if (sendsig == SIGKILL) { --------------000101050400080309020208--