Re: [squid-users] External C program

From: Julien Philibin <julien_at_philibin.fr>
Date: Wed, 29 Apr 2009 21:25:26 -0700

Very interesting Bharath !!!

What would be your advice to get my program working ?!

Thanks

On Wed, Apr 29, 2009 at 9:19 PM, Bharath Raghavendran
<rbharath25_at_gmail.com> wrote:
> 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:25:51 MDT

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