John Doe wrote:
Hi,

I have a little problem with my external_acl C program.
Everything works fine with a php version, but my original C version, for some 
tricky reason, does not...
Tested both from the console and they seem to behave exactly in the same way...
I am calling either program with the same syntax:

  external_acl_type filter children=8 concurrency=0 ttl=0 negative_ttl=0 %PATH 
filter

The following in PHP works fine with squid:

  while (!feof(STDIN)) {
    $url = fgets(STDIN);
    fwrite(STDERR, 'filter: url='.$url."\n");
    fwrite(STDOUT, 'OK user=allowed'."\n");
    fwrite(STDERR, 'filter: end of while...'."\n");
  }

The following in C does not work well with squid:

  while (fgets(url, sizeof(url), stdin)) {
    // let's ignore the '\n' at the end of url, it only appear in the logs 
anyway...
    fprintf(stderr, "filter: url=%s\n", url);
    printf("OK user=allowed\n");
    fprintf(stderr, "filter: end of while...\n");
  }

With the C version, if I load a test page with 3 images going through squid, I 
will have the following in the squid_cache.log:

  filter: url=/path/to/img1.gif
  filter: end of while...
  filter: url=/path/to/img2.gif
  filter: end of while...
  filter: url=/path/to/img3.gif
  filter: end of while...

and then squid will just wait (for the 3 instances of my program?), blocking 
everything...
When I stop squid, I get 3 messages like:

  WARNING: Closing client 192.168.16.23 connection due to lifetime timeout
  2008/08/19 17:05:18|    http://localhost/path/to/img1.gif

Any idea what is wrong with my C code...?

Thx,
JD

Sounds like you are having problems with output buffering.  Try adding...

fflush(stdout);

...after your fprintf statement.

Chris

Reply via email to