Re: [squid-users] External C program

From: Bharath Raghavendran <rbharath25_at_gmail.com>
Date: Thu, 30 Apr 2009 09:49:00 +0530

Hi,

I was playing around with scanf just now. scanf seems to be able to
input 2 strings :
scanf("%s %s", &str1, &str2);

Moreover, I also noticed that "while( scanf( ..blah.. ) )" doesn't
work as intended. i.e., its unable to detect an EOF. Hence, when squid
quits/restarts and it sends an EOF to the program, the program does
not quit. This could be the cause for getting multiple children when
squid restarts.

-Bharath

2009/4/30 Julien Philibin <julien_at_philibin.fr>:
> On Wed, Apr 29, 2009 at 1:22 AM, Amos Jeffries <squid3_at_treenet.co.nz> wrote:
>> Julien Philibin wrote:
>>>
>>> Hi John,
>>> thanks for your reply.
>>>
>>> I'll give a shot with your skeleton and see how things are going on ...
>>>
>>> On Tue, Apr 28, 2009 at 1:59 AM, John Doe <jdmls_at_yahoo.com> wrote:
>>>>
>>>> From: Julien Philibin <julien_at_philibin.fr>
>>>>>
>>>>> Hi, I've been trying to find a typical external ACL C program skeleton
>>>>> for a while, but I wasn't able to find anything very interesting ...
>>>>> What I would like to do, is to read to different strings and process
>>>>> them in order to allow/disallow access to a website.
>>>>> The thing is, after a while I get two processes that use around 10 Mb
>>>>> of memory and 15% of my CPU ....
>>>>> Also, if I restart squid, I'll get two more processes running and so
>>>>> on, everytime I restart squid ...
>>>>
>>>> Personaly, I use fgets/fflush and I did not see any problem (memory leak,
>>>> etc) so far...
>>>> Something like:
>>>>
>>>> #define INPUTSIZE 4096
>>
>> FYI: I've just had to start bumping my own custom helpers to using 8196 or
>> more for their buffers. Current Squid allow up to 8196 for URL length and
>> many more for possible headers length so watch that on inputs.
>>
>>
>>>> char input[INPUTSIZE];
>>>> while (fgets(input, sizeof(input), stdin)) {
>>>> if ((cp=strchr(input, '\n')) == NULL) {
>>>> fprintf(stderr, "filter: input too big: %s\n", input);
>>>> } else {
>>>> *cp = '\0';
>>>> }
>>>> ...
>>>> fflush(stderr);
>>>> fflush(stdout);
>>>> }
>>>>
>>>> Do you use any malloc or functions that malloc... and that would need a
>>>> free?
>>>
>>> Yes I do, but I also free them (the memory usage doesn't change). I
>>> also made a mistake, it is not 10Mb but 1 ...
>>>
>>>
>>> THe only weird thing is that after a restart (of squid), it looks like
>>> squid doesn't have any control anymore on the externals programs and
>>> they (both of external programs) start to use a lot of CPU...
>>>
>>> Maybe it has something to do with stdin that was not flushed correctly
>>> and creates an infinite loop or something ...
>>
>> Probably. Squid simply closes its connection to the pipes and abandons the
>> old helper. Leaving the pipe close with a '\0' I believe.
>> From the docs of scanf() I don't get a clear idea of the return value when
>> empty string is received (is it 1/0/EOF?).
>>
>
> I'll try to figure it out as soon as my helper is working properly :-)
>
>> Also scanf() you were using earlier has no concept of length and opens the
>> possibility of buffer over-runs.
>>
>> Prefer fgets or snscanf() as input methods.
>>
>
> Hi guys, so, I've been trying to implement the source code you gave to
> me. I am running into an issue.
>
> my first string is supposed to be a source (lenght <= 16)
> and the second one the URl of the website that the user is trying to access.
>
> When I use the fgets method: fgets(source, sizeof(source), stdin) it
> doesn't work. if the Ip address is less than 15, the program simply
> takes the beginning of the destination URL and everything goes wrong
> ....
>
> So I was wondering what would you guys use ?
>
> sscanf(stdin, "%s", s);
> or
> scanf("%s", &source); //as I was doing before, and double check the
> buffer's size
> or
> Something else?
>
> I have to admit, all this is confusing me a little bit :-)
> There must be an easy/secure way to catch two strings from stdin ...
>
> Thanks for your time guys.
>
>> Amos
>> --
>> Please be using
>> Current Stable Squid 2.7.STABLE6 or 3.0.STABLE14
>> Current Beta Squid 3.1.0.7
>>
>
> Julien
>
Received on Thu Apr 30 2009 - 04:19:10 MDT

This archive was generated by hypermail 2.2.0 : Thu Apr 30 2009 - 12:00:03 MDT