Re: [squid-users] External C program

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

On Wed, Apr 29, 2009 at 11:15 PM, Amos Jeffries <squid3_at_treenet.co.nz> wrote:
>> 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
>

Hey that's smart! :)

I'm going to go for that and if things go wrong, I'll let you know ...

Thank you everyone!

btw: Amos, any idea why I get a randomly 127.0.0.1 instead of my real
Ip in the logs ?

>
>> 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:27:00 MDT

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