⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cgi.c

📁 这是一个在在Dynamic C环境下实现的设备web服务器的建立
💻 C
📖 第 1 页 / 共 2 页
字号:
/*** BeginHeader */
#ifndef _CGI_FUNC_
#define _CGI_FUNC_
/*** EndHeader */

/*** BeginHeader DefparaCgi */
nodebug xmem int DefparaCgi(HttpState* state);
/*** EndHeader */
nodebug xmem int DefparaCgi(HttpState* state)
{
	if(state->length)
	{
		/* buffer to write out */
		if(state->offset < state->length)
		{
		state->offset += sock_fastwrite(&state->s,
			state->buffer + (int)state->offset,
			(int)state->length - (int)state->offset);
		}
		else
		{
		state->offset = 0;
		state->length = 0;
		}
	}
	else
	{
		switch(state->substate)
		{
			case 0:
			CgiStep0(state);
			break;

		    case 1:
			 CgiStep1(state);
			break;
			case 2:
			  CgiReturn(state,9);
			  DefParaInit(UserIndx,1) ;
			  StoreData( );
			 //RestartSystem();
			break;

			default:
			state->substate = 0;
			return 1;
		}
	}

	return 0;
}

/*** BeginHeader AdRetCgi */
nodebug xmem int AdRetCgi(HttpState* state);
/*** EndHeader */
nodebug xmem int AdRetCgi(HttpState* state)
{
	   	int i;
   	unsigned char ucTmp;
   	unsigned int  uiTmp1;
      unsigned int  uiTmp2;

	if(state->length)
    {
		/* buffer to write out */
		if(state->offset < state->length) {
			state->offset += sock_fastwrite(&state->s,
					state->buffer + (int)state->offset,
					(int)state->length - (int)state->offset);
		} else {
			state->offset = 0;
			state->length = 0;
		}
	}
   else
   {
		switch(state->substate)
		{
		case 0:
			CgiStep0(state);
			break;

		case 1:
			CgiStep1(state);
			break;

		case 2:
			/* init the data */
			for(i=0;i<10;++i)
			{
				FormData[i].value[0] = '\0';
			}

            i=0;

			FormData[i++].name="SelOem";//i=0
			FormData[i++].name="MaAddr";
			FormData[i++].name="FrmId";

			FormData[i++].name="Flag";
			FormData[i++].name="CfgTtl";
			FormData[i++].name="IP_pro";
			FormData[i++].name="SrcPort";
			FormData[i++].name="DstPort";
			FormData[i++].name="Filter";
            FormData[i++].name="LogoS";

			state->p = state->buffer;
			state->substate++;
			break;

		case 3:

		 	if(ParseForm(state,10))
         	{

				//sprintf(state->buffer, "MAC:<p>%s\r\n",FormData[1].value);
				//state->length = strlen(state->buffer);

				 if(!(strcmp(FormData[0].value,"web1")))
				{
					UserIndx=0;
				}
				else if(!(strcmp(FormData[0].value,"web2")))
				{
					UserIndx=1;
				}
				else if(!(strcmp(FormData[0].value,"web3")))
				{
					UserIndx=2;
				}
				else if(!(strcmp(FormData[0].value,"Others")))
				{
					UserIndx=3;
					memcpy(LogoPic,FormData[9].value,100);
				}
				

				StrtoMac();

				g_AddrInfo[UserIndx].uiFrmType = StrtoHex(2);

				
				ucTmp=atoi(FormData[4].value);
				
				for(i=0;i<MAX_CHANNEL;++i)
				{
				  g_AddrInfo[UserIndx].SecdE1Para[i].Ttl=ucTmp;
				}
				
				g_AddrInfo[UserIndx].uiUDPPort = StrtoHex(6);
				
				ucTmp=StrtoTos(5);
				uiTmp1=StrtoHex(3);
				uiTmp2=StrtoHex(7);
				
				for(i=0;i<MAX_CHANNEL;++i)
				{
				  g_AddrInfo[UserIndx].SecdE1Para[i].SegFlag=uiTmp1;
				  g_AddrInfo[UserIndx].FirE1Para[i].Proto=ucTmp;
				}

				g_AddrInfo[UserIndx].TirdE1Para.Filter = atoi(FormData[8].value);
								
                //inet_ethtoa(g_DispAddrInfo.macaddress,g_AddrInfo[UserIndx].ucMacAddr);
				//ConvertDisp();
				//CfgFpga();
                StoreData( );

                //Restore( );
				//ucTmp=StrtoTos(9);
				//Status.Los=ucTmp&0x0F;
				//Status.Ais=(ucTmp>>4);

				//sprintf(state->buffer, "UserIndx:<p>%d\r\n",UserIndx);
				//state->length = strlen(state->buffer);

			}
			else
			{
				//CgiErr(state);
				CgiReturn(state,8);
			}

			state->substate++;

			break;

		case 4:
			 CgiReturn(state,7);

			break;
		/*case 5:
		    RestartSystem();
		break;*/

		default:
			state->substate = 0;
			return 1;
		}
	}

	 return 0;
}

/*** BeginHeader ParseForm */
nodebug xmem int ParseForm(HttpState* state,int Length);
/*** EndHeader */
nodebug xmem int ParseForm(HttpState* state,int Length)
{
	int retval;
	int i;

	retval = sock_aread(&state->s, state->p,
	                    (state->content_length < HTTP_MAXBUFFER-1)?
	                     (int)state->content_length:HTTP_MAXBUFFER-1);
	if (retval < 0) {
		// Error--just bail out
		return 1;
	}

	// Using the subsubstate to keep track of how much data we have received
	state->subsubstate += retval;

	if (state->subsubstate >= state->content_length) {
		// NULL-terminate the content buffer
		state->buffer[(int)state->content_length] = '\0';

		// Scan the received POST information into the FORMSpec structure
		for(i=0; i<Length; i++)
		{
			http_scanpost(FormData[i].name, state->buffer, FormData[i].value, MAX_FORMSIZE);
		}

		// Finished processing--returning 1 indicates that we are done
		return 1;
	}
	// Processing not finished--return 0 so that we can be called again
	return 0;
}

/*** BeginHeader CgiStep0 */
nodebug xmem void CgiStep0(HttpState* state);
/*** EndHeader */
nodebug xmem void CgiStep0(HttpState* state)
{
	//strcpy(state->buffer, "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n");
	Getstring(CgiOfStr, 0, state->buffer, 100);
	state->length = strlen(state->buffer);
	state->offset = 0;
	state->substate++;
}

/*** BeginHeader CgiStep1 */
nodebug xmem void CgiStep1(HttpState* state);
/*** EndHeader */
nodebug xmem void CgiStep1(HttpState* state)
{
	//strcpy(state->buffer, "<html><head><title>Results</title></head><body>\r\n");
	Getstring(CgiOfStr, 1, state->buffer, 100);
	state->length = strlen(state->buffer);
	state->substate++;
}

/*** BeginHeader CgiSuccess */
nodebug xmem void CgiSuccess(HttpState* state);
/*** EndHeader */
nodebug xmem void CgiSuccess(HttpState* state)
{
	//sprintf(state->buffer, "<p>All settings will be applied after you reboot system!\r\n");
	Getstring(CgiOfStr, 2, state->buffer, 100);
	state->length += strlen(state->buffer);
	state->substate++;
}

/*** BeginHeader CgiReturn */
nodebug xmem void CgiReturn(HttpState* state,unsigned char index);
/*** EndHeader */
nodebug xmem void CgiReturn(HttpState* state,unsigned char index)
{
	if(index==0)
	{
		//strcpy(state->buffer, "<p><a href=""/SetE1Lb.htm"">Return</a></body></html>\r\n");
		Getstring(CgiOfStr, 3, state->buffer, 100);
	}
    else if(index==1)
    {
    	Getstring(CgiOfStr, 4, state->buffer, 100);
    	//strcpy(state->buffer, "<p><a href=""/SetEthinfo.htm"">Return</a></body></html>\r\n");
    }
    else if(index==2)
    {
    	Getstring(CgiOfStr, 5, state->buffer, 100);
    	//strcpy(state->buffer, "<p><a href=""/SetE1info.htm"">Return</a></body></html>\r\n");
    }
    else if(index==3)
    {
    	Getstring(CgiOfStr, 6, state->buffer, 100);
    	//strcpy(state->buffer, "<p><a href=""/EqInfo.shtml"">Return</a></body></html>\r\n");
    }
    else if(index==4)
    {
    	Getstring(CgiOfStr, 7, state->buffer, 100);
    	//sprintf(state->buffer, "<p>Reboot success! \r\n");
    }
    else if(index==5)
    {
    	Getstring(CgiOfStr, 8, state->buffer, 100);
    	//sprintf(state->buffer, "<p>Loopback set Success!\r\n");
    }
    else if(index==6)
    {
    	sprintf(state->buffer, "<p>Please remember the network configuration!\r\n\
				<p> All settings will be applied after you reboot system.\r\n\
				<p>IP Address: %s<p>\r\n<p>Submask: %s<p>\r\n<p>Gateway IP Address: %s<p>\r\n",g_DispAddrInfo.ip,g_DispAddrInfo.netmask,g_DispAddrInfo.gateway);

	}
    else if(index==7)
    {
    	//sprintf(state->buffer, "<p>Advance set Success!\r\n");
    	Getstring(CgiOfStr, 9, state->buffer, 200);
    }
    else if(index==8)
    {
    	//strcpy(state->buffer, "Parse form errro!\r\n" );
	     Getstring(CgiOfStr, 10, state->buffer, 100);
    }
    else if(index==9)
    {
    	//sprintf(state->buffer, "<p>Deffault Parameter Recovery Success! Please Reboot!\r\n<p><a href=""/Reboot.htm"">Return</a></body></html>\r\n");
    	Getstring(CgiOfStr, 11, state->buffer, 200);
    }
       

	state->length = strlen(state->buffer);
	state->substate++;
}


/*** BeginHeader SetEthCgi */
nodebug xmem int SetEthCgi(HttpState* state);
/*** EndHeader */
nodebug xmem int SetEthCgi(HttpState* state)
{
	int i;

	unsigned long IpAddr;
	unsigned long Mask;
	unsigned long Gateway;


	if(state->length)
   {
		/* buffer to write out */
		if(state->offset < state->length) {
			state->offset += sock_fastwrite(&state->s,
					state->buffer + (int)state->offset,
					(int)state->length - (int)state->offset);
		} else {
			state->offset = 0;
			state->length = 0;
		}
	}
   else
   {
		switch(state->substate)
		{
		case 0:
			CgiStep0(state);
			break;

		case 1:
			CgiStep1(state);
			break;

		case 2:
			/* init the data */
			for(i=0;i<12;++i)
			{
				FormData[i].value[0] = '\0';
			}


			FormData[0].name="IP1";
			FormData[1].name="IP2";
			FormData[2].name="IP3";
			FormData[3].name="IP4";

			FormData[4].name="Mask1";
			FormData[5].name="Mask2";
			FormData[6].name="Mask3";
			FormData[7].name="Mask4";

			FormData[8].name="Gate1";
			FormData[9].name="Gate2";
			FormData[10].name="Gate3";
			FormData[11].name="Gate4";

			state->p = state->buffer;
			state->substate++;
			break;

		case 3:
			/* parse the POST information */
		 if(ParseForm(state,12))
         {
				IpAddr=0;
				Mask=0;
				Gateway=0;

         	   for(i=0;i<4;++i)
         	   {
	         	   	IpAddr+=atoi(FormData[i].value);

	         	   	Mask+=atoi(FormData[i+4].value);

	         	   	Gateway+=atoi(FormData[i+8].value);

	         	   if(i<3)
	         	   {
						IpAddr<<=8;
						Mask<<=8;
						Gateway<<=8;
				   }

         	    }

				g_AddrInfo[UserIndx].ulIpAddr		= IpAddr;
				g_AddrInfo[UserIndx].ulIpMask		= Mask;
				g_AddrInfo[UserIndx].ulGateway		= Gateway;

				FormDispIP();
				SetSrcIP( );

				CgiReturn(state,6);

			}
			else
			{
				//CgiErr(state);
				CgiReturn(state,8);
			}
			break;

		case 4:
		    CgiReturn(state,1);

			break;

		default:
			state->substate = 0;
			return 1;
		}
	}
	return 0;
}


/*** BeginHeader SetLbCgi */
nodebug xmem int SetLbCgi(HttpState* state);
/*** EndHeader */
nodebug xmem int SetLbCgi(HttpState* state)
{
   	int i;
   	unsigned char ucTmp;

	if(state->length)
    {
		/* buffer to write out */
		if(state->offset < state->length) {
			state->offset += sock_fastwrite(&state->s,
					state->buffer + (int)state->offset,
					(int)state->length - (int)state->offset);
		} else {
			state->offset = 0;
			state->length = 0;
		}
	}
   else
   {
		switch(state->substate)
		{
		case 0:
			CgiStep0(state);
			break;

		case 1:
			CgiStep1(state);
			break;

		case 2:
			/* init the data */
			for(i=0;i<8;++i)
			{
				FormData[i].value[0] = '\0';
			}

            i=0;

			FormData[i++].name="LB0";//i=0
			FormData[i++].name="LB1";
			FormData[i++].name="LB2";
			FormData[i++].name="LB3";
			FormData[i++].name="RB0";
			FormData[i++].name="RB1";
			FormData[i++].name="RB2";
			FormData[i++].name="RB3";

			state->p = state->buffer;
			state->substate++;
			break;

		case 3:

		 	if(ParseForm(state,8))
         	{
         		ucTmp=0;

				for(i=0;i<4;i++)
				{
					if(!(strcmp(FormData[i].value,"on")))//Llb
					{
						ucTmp|=0x02;
						 memcpy(E1State[i].CtrlL,"checked\0",8);
						 memcpy(E1State[i].CtrlR,"\0",8);

					}
				    else if(!(strcmp(FormData[i+4].value,"on")))//Rlb
					{
						ucTmp|=0x01;
						 memcpy(E1State[i].CtrlR,"checked\0",8);
						 memcpy(E1State[i].CtrlL,"\0",8);
					}
					else
					{
						memcpy(E1State[i].CtrlL,"\0",8);
						memcpy(E1State[i].CtrlR,"\0",8);
					}

					if(i<3)
					{
						ucTmp<<=2;
					}

				}

				 WrPortE(LB_REG,NULL,ucTmp);

				 CgiReturn(state,5);
			}
			else
			{
				//CgiErr(state);
				CgiReturn(state,8);
			}
			break;

⌨️ 快捷键说明

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