boa在imx6ul上的移植问题system() cgi不能执行

boa在imx6ul下移植 ,并执行一个cgi   cgi里边调用system函数控制io 口,经过不断得调试发现system()函数无法执行。

于是不断搜索发现 需要给boa一定的执行权限 。重新配置/etc/boa/boa.conf 

其中改这里 

User  root                                                                    
Group 0
改完这里后,还要重新编译 boa ,在boa.c 中将

   /*if (setuid(0) != -1) {
            DIE("icky Linux kernel bug!");
        } */
屏蔽掉,然后重新编译。

最后每次配置boa.conf后一定要重启或使其生效。

共享一段用c程序写的cgi 程序 


#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/ioctl.h"
#include "stdlib.h"
#include "termios.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "sys/time.h"
#define LED_BRIGHTNESS    "/sys/class/leds/led1/brightness"
#define LED1_ON       "echo 1 > /sys/class/leds/led1/brightness"
#define LED1_OFF      "echo 0 > /sys/class/leds/led1/brightness"

char* getcgidata(FILE* fp, char* requestmethod);
int main()
{
       char *input;
       char *req_method;
       char name[64];
       char pass[64];
       int i = 0;
       int j = 0;
      int fd;

//     printf("Content-type: text/plain; charset=iso-8859-1\n\n");
       printf("Content-type: text/html\n\n");
       printf("The following is query reuslt:<br><br>");

       req_method = getenv("REQUEST_METHOD");
       input = getcgidata(stdin, req_method);
 
       // 我们获取的input字符串可能像如下的形式
       // Username="admin"&Password="aaaaa"
       // 其中"Username="和"&Password="都是固定的
       // 而"admin"和"aaaaa"都是变化的,也是我们要获取的
      printf( "%s<br> \n",input);
       // 前面9个字符是UserName=
       // 在"UserName="和"&"之间的是我们要取出来的用户名
       for ( i = 9; i < (int)strlen(input); i++ )
       {
              if ( input[i] == '&' )
              {
                     name[j] = '\0';
                     break;
              }                  
              name[j++] = input[i];
       }

       // 前面9个字符 + "&Password="10个字符 + Username的字符数
       // 是我们不要的,故省略掉,不拷贝
       for ( i = 19 + strlen(name), j = 0; i < (int)strlen(input); i++ )
       {
              pass[j++] = input[i];
       }
       pass[j] = '\0';
   printf( "%s<br> \n",name);

       if(!strcmp(name,"pen"))
  {
   printf( "open ok<br> \n");
 
  system(LED1_ON);
usleep(500000);


  }else  if(!strcmp(name,"close"))
  {
   printf( "close ok<br> \n");
  system(LED1_OFF);
  usleep(500000);
  } 
       printf("Your Username is %s<br>Your Password is %s<br> \n", name, pass);
      close(fd);
       return 0;
}

char* getcgidata(FILE* fp, char* requestmethod)
{
       char* input;
       int len;
       int size = 1024;
       int i = 0;
      
       if (!strcmp(requestmethod, "GET"))
       {
              input = getenv("QUERY_STRING");
              return input;
       }
       else if (!strcmp(requestmethod, "POST"))
       {
              len = atoi(getenv("CONTENT_LENGTH"));
              input = (char*)malloc(sizeof(char)*(size + 1));
             
              if (len == 0)
              {
                     input[0] = '\0';
                     return input;
              }
             
              while(1)
              {
                     input[i] = (char)fgetc(fp);
                     if (i == size)
                     {
                            input[i+1] = '\0';
                            return input;
                     }
                    
                     --len;
                     if (feof(fp) || (!(len)))
                     {
                            i++;
                            input[i] = '\0';
                            return input;
                     }
                     i++;
                    
              }
       }
       return NULL;
}


sitemap