Re: [squid-users] External C program

From: Amos Jeffries <squid3_at_treenet.co.nz>
Date: Thu, 30 Apr 2009 18:15:10 +1200 (NZST)

> Very interesting Bharath !!!
>

Yes thank you. You have identified the issue and we can now tell Julien
exactly what he has to do.

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

Use fgets(). The scan() family apparently do not handle EOF in the way
needed.

Thus to work your code must be:

  char line[8196];
  char ip[45];
  char url[8196];

  ip[0] = '\0';
  url[0] = '\0';

  while( fgets(line, 8196, stdin) != NULL ) {
      snscanf(sbuf, 8196, "%s %s" ip, url);
      // happy joy ....
  }

Amos

> 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 - 05:15:08 MDT

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