Sunday, January 21, 2018

Re: popen from cgi program

On 2018-01-20, Jordon <openbsd@sirjorj.com> wrote:
> I am still learning cgi/web stuff and stumbled upon an issue.  I am
> trying to popen() a program to catch what it dumps to stdout.  To start
> simply, I am just trying to run uname.  I get nothing.  No errors on
> popen() or pclose(), but nothing printed.  I run the same code from a
> regular cpp program (changing the khtml_puts() to printf() and it works
> perfectly.  That makes me wonder if there is something environmental
> that I am missing, or maybe this is just not allowed.
>
> My code is this:
>
>   char dump[1024];
>   memset(dump, 0, sizeof(dump));
>   FILE *f = popen("uname -a", "r");
>   if(f == NULL) {
>     khtml_puts(&r, "popen()FAILED!");
>   } else {
>     khtml_puts(&r, "output: ");
>     while (fgets(dump, sizeof(dump), f) != NULL) {
>       khtml_puts(&r, "GOTSOMETHING!");
>       khtml_puts(&r, dump);
>     }
>     int status = pclose(f);
>     if(status==-1) {
>       khtml_puts(&r, "pclose()FAILED");
>     }
>   }
>   khtml_puts(&r, "done");
>
>
> All I get from it is "output: done"
>
>
>
> Also, my httpd.conf is this:
>
> ext_addr="egress"
> prefork 2
> server "localhost" {
>         listen on $ext_addr port 80
>         root "/htdocs"
>         location "/cgi-bin/*" {
>                 fastcgi
>                 root "/"
>         }
> }
>
> Any ideas?
>
>

popen() requires a shell. You are most likely running it in a chroot and
don't have /bin/sh.

No comments:

Post a Comment