cgi_functions.c

来自「这是我自己写的用于嵌入式设备的CGI程序」· C语言 代码 · 共 1,932 行 · 第 1/4 页

C
1,932
字号
            continue;        if (strcmp( name1, username ))            continue;        if (!strcmp( password1, password ))            return 0;     }     fclose(conf_fp);     return -1; /* username and password don't match */}/*--------------------------------------------------------------------------*    获取用户权限,Error返回0,OK返回权限值 *--------------------------------------------------------------------------*/int cgi_get_user_priv(char * username, char * conf_path){    char get_value[24];    int p;    if ((NULL == username) || ( NULL == conf_path) )    {        //printf("Err1\n");        return 0;    }    if ( NULL == get_var_from_file(conf_path, username, get_value))    {        //*priv = 3;        //printf("Err2\n");        return 0;    }    p = atoi (get_value);    return p;}/*--------------------------------------------------------------------------*    设置默认帐号 *--------------------------------------------------------------------------*/int cgi_set_default_sysop(){    FILE *conf_fp;    char buf[]="sysop";    char enc_buf[512];    char w_buf[512];    if (!(conf_fp=fopen(USER_CONF_PATH,"w"))) // open file pointer    {        //printf("%s open failed...\n",USER_CONF_PATH);        return 0;    }    DES_encode(buf, enc_buf);    sprintf(w_buf,"sysop:%s\n",enc_buf);    fprintf(conf_fp,w_buf);    fclose(conf_fp);    //printf("Restoring admin_conf...\n");    if (!(conf_fp=fopen("/mnt/mtd/permiss_conf","w")))    {        //printf("permiss_conf open failed...\n");        return 0;    }    fprintf(conf_fp,"sysop 3\n");    fclose(conf_fp);    return 1;}/*--------------------------------------------------------------------------*    添加用户帐号 *--------------------------------------------------------------------------*/int cgi_add_user_pwd(char *add_user, char *add_passwd){    int i;    char record[512];    FILE *conf_fp,*temp_fp;    char renamecmd[128];    char add_string[512], en_add_string[512];    if (!(conf_fp=fopen(USER_CONF_PATH,"r"))) // open file pointer    {        //printf("%s opened failed...\n",USER_CONF_PATH);        //fclose(conf_fp);        cgi_set_default_sysop();        conf_fp=fopen(USER_CONF_PATH,"r");    }    if (!(temp_fp=fopen("temp","w")))// open file pointer    {        //printf("temp_conf open failed...\n");        return 0;    }    i=cgi_match_user_only(add_user);    if(!i) //add new config item    {        DES_encode(add_passwd, en_add_string);        fseek( conf_fp, 0, SEEK_SET );        while(feof(conf_fp) == 0){            fscanf(conf_fp,"%s\n",record);    // Read next record            fprintf(temp_fp,"%s\n",record);         }        fclose(conf_fp);        fprintf(temp_fp,"%s:%s\n",add_user,en_add_string);        fflush(temp_fp);        fclose(temp_fp);        sprintf(renamecmd,"mv temp %s",USER_CONF_PATH);        system(renamecmd);        sprintf(renamecmd,"chmod 777 %s",USER_CONF_PATH);        system(renamecmd);        return 1;    }    else{        //printf("%s already existed.<br>\n",add_user);        fclose(conf_fp);        fclose(temp_fp);        return 0;    }}/*--------------------------------------------------------------------------*    验证帐号是否存在 *--------------------------------------------------------------------------*/int cgi_match_user_only (char *match_user){    char pattern[512];    char decode[512];    char seps[]=":";    char *token,*name;    FILE *conf_fp;    if (!(conf_fp=fopen(USER_CONF_PATH,"r"))) // open file pointer    {        //printf("%s open failed...\n",USER_CONF_PATH);        cgi_set_default_sysop();        conf_fp=fopen(USER_CONF_PATH,"r");    }    fseek( conf_fp, 0, SEEK_SET );    while (feof(conf_fp) == 0){        fscanf(conf_fp,"%s\n",pattern);    //Read next record        name=strtok(pattern,seps);        if(!strcasecmp(name,match_user))             return 1;     }     fclose(conf_fp);     return 0;}/*--------------------------------------------------------------------------*    删除用户帐号 *--------------------------------------------------------------------------*/int cgi_del_user_pwd(char *del_user){    userpwd user_record[USER_NUM]={0};    int i,index=0;    char *ret;    char seps[]=":";    char *token,*name;    char pattern[512]={0},dec_pattern[512];    FILE *conf_fp,*temp_fp;    char renamecmd[128];    int match=0;    if (!(conf_fp=fopen(USER_CONF_PATH,"r"))) // open file pointer    {        //printf("%s opened...\n",USER_CONF_PATH);        cgi_set_default_sysop();        conf_fp=fopen(USER_CONF_PATH,"r");    }    if (!(temp_fp=fopen("temp","w")))// open file pointer    {        //printf("temp_conf open failed...\n");        fclose(conf_fp);        return 0;    }    fseek( conf_fp, 0, SEEK_SET );    while(feof(conf_fp) == 0)    {        fscanf(conf_fp,"%s\n",pattern);    // Read next record        strcpy(user_record[index].pattern,pattern);        name=strtok(pattern,seps);        if(!strcmp(name,del_user))        {            index--;            match=1;        }        index++;    }    fclose(conf_fp);    if (!match)    {        //printf("%s doesn't exist.\n",del_user);        fclose(temp_fp);        return 0;    }    else{        fseek( temp_fp, 0, SEEK_SET );        for(i=0;i<index;i++){            fprintf(temp_fp,"%s\n",user_record[i].pattern);        }        fflush(temp_fp);        fclose(temp_fp);        sprintf(renamecmd,"mv temp %s",USER_CONF_PATH);        system(renamecmd);        return 1;    }}/*--------------------------------------------------------------------------*    修改用户密码 *--------------------------------------------------------------------------*/int cgi_change_pwd(char *change_user, char *change_pwd){    userpwd user_record[USER_NUM]={0};    int i,index=0;    char *ret;    char seps[]=":";    char *token,*name;    char pattern[512]={0},dec_pattern[512];    char change[512],enc_change[512];    FILE *conf_fp,*temp_fp;    char renamecmd[128];    int match=0;    if (!(conf_fp=fopen(USER_CONF_PATH,"r"))) // open file pointer    {        //printf("%s opened...\n",USER_CONF_PATH);        cgi_set_default_sysop();        conf_fp=fopen(USER_CONF_PATH,"r");    }    if (!(temp_fp=fopen("temp","w")))// open file pointer    {        //printf("temp_conf open failed...\n");        fclose(conf_fp);        return 0;    }    DES_encode(change_pwd, change);//    printf("%s\n",change_pwd);    fseek( conf_fp, 0, SEEK_SET );    while(feof(conf_fp) == 0)    {        fscanf(conf_fp,"%s\n",pattern);    // Read next record        strcpy(user_record[index].pattern,pattern);        name=strtok(pattern,seps);        if(!strcmp(name,change_user))        {            sprintf(user_record[index].pattern,"%s:%s",name,change);            match=1;        }        index++;    }    fclose(conf_fp);    if (!match)    {        //printf("%s doesn't exist.\n",change_user);        fclose(temp_fp);        return 0;    }    else{        fseek( temp_fp, 0, SEEK_SET );        for(i=0;i<index;i++){            fprintf(temp_fp,"%s\n",user_record[i].pattern);        }        fflush(temp_fp);        fclose(temp_fp);        sprintf(renamecmd,"mv temp %s",USER_CONF_PATH);        system(renamecmd);        return 1;    }}/*--------------------------------------------------------------------------*    取用户帐号列表 *--------------------------------------------------------------------------*/account cgi_list_all_account(){    userpwd user_record[USER_NUM]={0};    account name_record;    int i,index=0;    char *ret;    char seps[]=":";    char *token,*name;    char pattern[512]={0},dec_pattern[512];    FILE *conf_fp,*temp_fp;    char account[32];    char renamecmd[128];    int match=0;    if (!(conf_fp=fopen(USER_CONF_PATH,"r"))) // open file pointer    {        //printf("%s open failed...\n",USER_CONF_PATH);        cgi_set_default_sysop();        conf_fp=fopen(USER_CONF_PATH,"r");    }    fseek( conf_fp, 0, SEEK_SET );    index=0;    while(feof(conf_fp) == 0)    {        fscanf(conf_fp,"%s\n",pattern);    // Read next record        strcpy(user_record[index].pattern,pattern);        name=strtok(pattern,seps);        sprintf(account,"%s",name);        strcpy(name_record.user_name[index].name,account);        index++;    }    fclose(conf_fp);    name_record.count=index;    //printf("count=%d\n",name_record.count);    return name_record;}/*--------------------------------------------------------------------------*    设置用户权限 *--------------------------------------------------------------------------*/int cgi_set_permission(const char *user,int permission){    FILE *fp,*tmp_fp;    char user_buf[30];    char permission_buf[4];    int tag = 0;    char cmdbuf[128];	  if (!(tmp_fp=fopen("/tmp/permiss_tmp","w+")))// open file pointer		    return 0;	  if (!(fp=fopen(PRIV_CONF_PATH,"r+")))	  	  fp = NULL;	  else	  {		    while(!feof(fp))		    {		    	  fscanf(fp,"%s %s\n",user_buf,permission_buf);		        if(0==strcmp(user,user_buf))		        {		        	  fprintf(tmp_fp,"%s %d\n",user,permission);		        	  tag = 1;		        }		        else		        		fprintf(tmp_fp,"%s %s\n",user_buf,permission_buf);		    }    }    if(!tag)    	  fprintf(tmp_fp,"%s %d\n",user,permission);    if(fp)        fclose(fp);    fclose(tmp_fp);    memset(cmdbuf,0,128);    strcpy(cmdbuf,"mv /tmp/permiss_tmp ");    strcat(cmdbuf,PRIV_CONF_PATH);    system(cmdbuf);    return 1;}/*--------------------------------------------------------------------------*    删除用户权限 *--------------------------------------------------------------------------*/int cgi_remove_permission(const char *user){    FILE *fp,*tmp_fp;    char user_buf[30];    char permission_buf[30];    char cmdbuf[128];    if (NULL==(fp=fopen(PRIV_CONF_PATH,"r"))) // open file pointer		    return 0;	  if (NULL==(tmp_fp=fopen("/tmp/rm_permiss_tmp","w+")))// open file pointer	  {	  	  fclose(fp);		    return 0;		}    while(0==feof(fp))    {    	  fscanf(fp,"%s %s\n",user_buf,permission_buf);        if(0!=strcmp(user,user_buf))        		fprintf(tmp_fp,"%s %s\n",user_buf,permission_buf);    }    fclose(fp);    fclose(tmp_fp);    memset(cmdbuf,0,128);    strcpy(cmdbuf,"mv /tmp/rm_permiss_tmp ");    strcat(cmdbuf,PRIV_CONF_PATH);    system(cmdbuf);    return 1;}/*--------------------------------------------------------------------------*    发送信号 *--------------------------------------------------------------------------*/int send_command(char *msg){    int msgid;    typedef struct msg_st    {        long int msg_type;        char buf[64];    }MESSAGE;    MESSAGE data;    memset(data.buf, 0, 64);    msgid = msgget((key_t)WAITER_KEY, 0666);    data.msg_type = 1;    strcpy(data.buf, msg);    return msgsnd(msgid, (void *)&data, 64, IPC_NOWAIT);}/*--------------------------------------------------------------------------*    向logd发送写日志的消息 05.25,Kevin *--------------------------------------------------------------------------*/int send_log_msg (int msg_id, int log_type, char* username ){	struct sockaddr_in s_addr;	int sock;	int addr_len;	int len;	char buff[128];	time_t lt;	lt = time(NULL);	sprintf(buff, "%s\t%d\t%d\t%lu", username, msg_id, log_type, (dword) lt);	if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)	{		perror("socket");		exit(errno);	}	s_addr.sin_family = AF_INET;	s_addr.sin_port = htons(7838);	s_addr.sin_addr.s_addr = inet_addr("127.0.0.1");	addr_len = sizeof(s_addr);	len = sendto(sock, buff, strlen(buff), 0, (struct sockaddr *) &s_addr, addr_len);	if (len < 0)	{		return 3;//发送错误	}	close(sock);	return 1;}/*-------------------------------------------------------------------*///弹出提示并跳转页面/*-------------------------------------------------------------------*/void alert_redirect ( char * alert, char * redirect_url ){    fprintf(cgiOut,"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n\                    <HTML><HEAD>\n\                    <META http-equiv=Content-Type content=\"text/html; charset=utf-8\">\n\                    <meta http-equiv=\"pragma\" content=\"no-cache\">\n\                    <script language=\"javascript\">window.alert(\"%s\");\n\                    window.location.href=\"%s\";</script>\n\                    </HEAD></HTML>",                    alert, redirect_url);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?