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;
}