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

📄 soc2udip.c

📁 lwip在ucos上的移植
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************* Copyright 1991 Advanced Micro Devices, Inc.* * This software is the property of Advanced Micro Devices, Inc  (AMD)  which* specifically  grants the user the right to modify, use and distribute this* software provided this notice is not removed or altered.  All other rights* are reserved by AMD.** AMD MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS* SOFTWARE.  IN NO EVENT SHALL AMD BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL* DAMAGES IN CONNECTION WITH OR ARISING FROM THE FURNISHING, PERFORMANCE, OR* USE OF THIS SOFTWARE.** So that all may benefit from your experience, please report  any  problems* or  suggestions about this software to the 29K Technical Support Center at* 800-29-29-AMD (800-292-9263) in the USA, or 0800-89-1131  in  the  UK,  or* 0031-11-1129 in Japan, toll free.  The direct dial number is 512-462-4118.** Advanced Micro Devices, Inc.* 29K Support Products* Mail Stop 573* 5900 E. Ben White Blvd.* Austin, TX 78741* 800-292-9263 (US)******************************************************************************/static	char soc2udip_c[]="@(#)soc2udip.c	2.14  Daniel Mann";static char soc2udip_c_AMD[]="@(#)soc2udip.c	3.2, AMD";/* *       This module converts UDI socket messages*	into UDI Procedural calls.*	It is used by TIP server processes********************************************************************** HISTORY*/#include <stdio.h>#include <stdio.h>#include <errno.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/file.h>#ifdef __hpux#else/* #include <sys/sockio.h> */#endif#include <sys/fcntl.h>#include <netdb.h>#include <netinet/in.h>#include <signal.h>#include <setjmp.h>#include "udiproc.h"#include "udisoc.h"extern	int	errno;/* local type decs. and macro defs. not in a .h  file ************* MACRO/TYPE*/#define	version_c 0x121		/* TIP-IPC version id */#define PORT_NUM 	7000#define	MAX_ERRNO	1#define	SOC_BUF_SIZE 	4* 1024	/* size of socket comms buffer */#define	SBUF_SIZE 	500	/* size of string buffer *//* global dec/defs. which are not in a .h   file ************* EXPORT DEC/DEFS*//* local dec/defs. which are not in a .h   file *************** LOCAL DEC/DEFS*/LOCAL UDIError	tip_errno;LOCAL int	tip_sd;LOCAL int	connect_count = 0;LOCAL int	ns;LOCAL int	getlength;LOCAL struct sockaddr getname;LOCAL UDR	udr;LOCAL UDR*	udrs = &udr;LOCAL char	sbuf[SBUF_SIZE];	/* String handler buffer */LOCAL char*	tip_errmsg[/*MAX_ERRNO*/] ={ "Trying to present non negative error number to TIP "};LOCAL sig_handler(sig, code, scp, addr)int	sig;int	code;struct	sigcontext *scp;char	*addr;{    if(sig == SIGUSR1)    {	UDIStop();	return;    }    if(sig == SIGIO )    {	return;    }    if(sig == SIGURG)    {	UDIStop();	return;    }    if(sig != -1)fprintf(stderr,			"\nTIP-ipc caught a signal %d, socket shutdown\n",sig);#if 0    else fprintf(stderr,"\nTIP-ipc, socket shutdown\n");#endif    sigblock(sigmask(SIGIO));    if(shutdown(tip_sd, 2))    	fprintf(stderr, "TIP-ipc WARNING: socket shutdown failed");    if(udrs->domain == AF_UNIX)	if(unlink(udrs->soc_name))    	   fprintf(stderr,		"TIP-ipc WARNING: failed to unlink %s\n",udrs->soc_name);    exit(0);}/*********************************************************************** MAIN*/main(argc, argv)int 	argc;char*	argv[];{    char	*domain_string = argv[1];    char	*tip_string = argv[2];    struct sockaddr_in	dfe_sockaddr;    struct sockaddr_in	tip_sockaddr_in;    struct sockaddr	tip_sockaddr;    struct hostent 	*tip_info_p;    int		dfe_addrlen;    int		domain;     int		pgrp;#define	NAME_LEN 20    char	tip_host[NAME_LEN];    pgrp = getpid();    setpgrp(0, pgrp);		/* TIP not in same pgrp as DFE */    if(argc < 3)    {	TIPPrintUsage(argv[0]);	fprintf(stderr,"TIP UDI-IPC Version %d.%d.%d\n",		 (version_c&0xf00)>>8, (version_c&0x0f0)>>4, (version_c&0x00f));	exit(1);    }    signal(SIGINT, sig_handler);    signal(SIGKILL, sig_handler);    signal(SIGQUIT, sig_handler);    signal(SIGTERM, sig_handler);    signal(SIGSEGV, sig_handler);    signal(SIGURG, sig_handler);    signal(SIGIO, sig_handler);    signal(SIGUSR1, sig_handler);/*----------------------------------------------------------------- SOCKET */    if(!strcmp(domain_string, "AF_UNIX"))    	domain = AF_UNIX;    else if(!strcmp(domain_string, "AF_INET"))    	domain = AF_INET;    else    {	fprintf(stderr, " TIP-ipc ERROR: address family not known\n");	exit(1);    }    tip_sd = socket(domain, SOCK_STREAM, 0);    if (tip_sd == -1 )    {	perror(" TIP-ipc ERROR, server socket() call failed");    	sig_handler(-1);    }/*------------------------------------------------------------------- BIND */    if(domain==AF_UNIX)    {	        memset( (char*)&tip_sockaddr, 0, sizeof(tip_sockaddr));        tip_sockaddr.sa_family = domain;        bcopy(tip_string, tip_sockaddr.sa_data, strlen(tip_string));	if (bind(tip_sd, &tip_sockaddr, sizeof(tip_sockaddr)) )	{   perror("TIP-ipc WARNING, server bind() failed");	}    }    else if(domain == AF_INET)    {	if(gethostname(tip_host, NAME_LEN))	{   fprintf(stderr,"TIP-ipc ERROR, unable to get TIP host name");	    exit(1);	}	memset( (char*)&tip_sockaddr_in, 0, sizeof(tip_sockaddr_in));	tip_sockaddr_in.sin_family = domain;	tip_sockaddr_in.sin_family = AF_INET;	tip_sockaddr_in.sin_addr.s_addr = inet_addr(tip_host);	if( tip_sockaddr_in.sin_addr.s_addr == -1)	{	    tip_info_p = gethostbyname(tip_host);	/* use host name */	    if( tip_info_p == NULL)	    {  fprintf(stderr," TIP-ipc ERROR, %s not found in /etc/hosts\n",			tip_host);	       exit(1);	    }	    bcopy(tip_info_p->h_addr, (char *) &tip_sockaddr_in.sin_addr,	   	tip_info_p->h_length);	}	tip_sockaddr_in.sin_port = htons(atoi(tip_string));	if (bind(tip_sd, &tip_sockaddr_in, sizeof(tip_sockaddr_in)))	{   perror(" TIP-ipc WARNING, server bind() failed");	}    }/*----------------------------------------------------------------- LISTEN */    if(listen(tip_sd,1))    {	perror(" TIP-ipc ERROR, server listen failed");    	sig_handler(-1);    }/*----------------------------------------------------------------- ACCEPT */    while(1)    {	while(1)	{   dfe_addrlen = sizeof(dfe_sockaddr);	    ns =accept(tip_sd, &dfe_sockaddr, &dfe_addrlen);    	    if(ns  == -1)    	    {   if(errno == EINTR) continue;		perror(" TIP-ipc ERROR, server accept call");    	        sig_handler(-1);	    }	    else break;    	}    	errno = 0;	if(domain == AF_INET)	{#ifdef __hpux#else    	    if(fcntl(ns, F_SETOWN, getpid()) == -1)    	    {   perror(" TIP-ipc, fcntl(..F_SETOWN) call: ");    	        sig_handler(-1);    	    }    	    if(fcntl(ns, F_SETFL, FASYNC) == -1)    	    {   perror(" TIP-ipc, fcntl(..FASYNC) call: ");    	        sig_handler(-1);    	    }#endif	}    	udr_create(udrs, ns, SOC_BUF_SIZE);    	udrs->domain = domain;    	udrs->soc_name = tip_string;    	service();	udr_free(udrs);   }}/******************************************************************** SERVICE* Service each DFE request as they arrive.*/service(){ UDIInt32	service_id;	/* requested DFE service */ for(;;) {  tip_errno = 0;  udrs->udr_op = UDR_DECODE;  if(udr_UDIInt32(udrs, &service_id))  { connect_count--;    return -1;  }  switch(service_id)  {    default:    {	break;    }/*----------------------------------------------------------------- UDIConnect*/    case UDIConnect_c:    {        char*		Config;		/* in  -- identification string */        UDISessionId	Session;	/* out -- session ID */	int		tip_pid;	/* pid of TIP process */	UDIUInt32	TIPIPCId;	UDIUInt32	DFEIPCId;    	udr_UDIUInt32(udrs, &DFEIPCId); /* recv all "in" params */	if ((DFEIPCId & 0xfff) < version_c) {	    fprintf(stderr, "TIP-ipc: Connect from obsolete DFE\n");	    sig_handler(-1);	}        udr_string(udrs, sbuf);        udrs->udr_op = UDR_ENCODE;	/* send all "out" parameters */	tip_errno = UDIConnect(sbuf, &Session);	if( tip_errno <= UDINoError) connect_count++;	TIPIPCId = (company_c << 16) + (product_c << 12) + version_c;    	udr_UDIUInt32(udrs, &TIPIPCId);	tip_pid = getpid();        udr_UDIInt32(udrs, &tip_pid);        udr_UDISessionId(udrs, &Session);        udr_UDIError(udrs, &tip_errno);	/* send any TIP error */        udr_sendnow(udrs);	break;    }/*-------------------------------------------------------------- UDIDisconnect*/    case UDIDisconnect_c:    {        UDISessionId	Session;	/* In */        UDIBool		Terminate;	/* In */        udr_UDISessionId(udrs, &Session);    	udr_UDIBool(udrs, &Terminate);        udrs->udr_op = UDR_ENCODE;	/* send all "out" parameters */	tip_errno = UDIDisconnect(Session, Terminate);	if( tip_errno == UDINoError) connect_count--;        udr_UDIError(udrs, &tip_errno);	/* send any TIP error */        udr_sendnow(udrs);        if(Terminate != UDIContinueSession && connect_count == 0)	{#if 0	    fprintf(stderr, "\nTIP-ipc: DFE has disconnected all sessions\n");#endif	    sig_handler(-1);	} 	if(connect_count == 0) return;	break;    }/*-------------------------------------------------------------------- UDIKill*/    case UDIKill_c:    {        UDISessionId	Session;	/* In */        UDIInt32	signal;	/* In */        udr_UDISessionId(udrs, &Session);    	udr_UDIInt32(udrs, signal);        udrs->udr_op = UDR_ENCODE;	/* send all "out" parameters */	tip_errno = 0;        udr_UDIError(udrs, &tip_errno);	/* send any TIP error */        udr_sendnow(udrs);        if(connect_count == 0)	{#if 0	    fprintf(stderr, "\nTIP-ipc: DFE has disconnected all sessions\n");#endif	    sig_handler(-1);	}	break;    }/*---------------------------------------------------- UDISetCurrentConnection*/    case UDISetCurrentConnection_c:    {	UDISessionId	Session;	/* In */        udr_UDISessionId(udrs, &Session);        udrs->udr_op = UDR_ENCODE;	/* send all "out" parameters */        tip_errno = UDISetCurrentConnection(Session);        udr_UDIError(udrs, &tip_errno);	/* send any TIP error */        udr_sendnow(udrs);	break;    }/*------------------------------------------------------------ UDICapabilities*/    case UDICapabilities_c:    {	UDIUInt32	TIPId;		/* out */	UDIUInt32	TargetId;	/* out */	UDIUInt32	DFEId;		/* in */	UDIUInt32	DFE;		/* in */	UDIUInt32	TIP;		/* out */	UDIUInt32	DFEIPCId;	/* out */	UDIUInt32	TIPIPCId;	/* out */	char	*TIPString = sbuf;	/* out */	strcpy(TIPString, "No TIP Capability string");	udr_UDIUInt32(udrs, &DFEId);	udr_UDIUInt32(udrs, &DFE);    	udrs->udr_op = UDR_ENCODE;		/* send all "out" paramters */        tip_errno = UDICapabilities( &TIPId, &TargetId, DFEId, DFE,		&TIP, &DFEIPCId, &TIPIPCId, TIPString);	udr_UDIUInt32(udrs, &TIPId);    	udr_UDIUInt32(udrs, &TargetId);    	udr_UDIUInt32(udrs, &TIP);    	udr_UDIUInt32(udrs, &DFEIPCId);	TIPIPCId = (company_c << 16) + (product_c << 12) + version_c;    	udr_UDIUInt32(udrs, &TIPIPCId);    	udr_string(udrs, TIPString);        udr_UDIError(udrs, &tip_errno);		/* send any TIP error */        udr_sendnow(udrs);	break;    }/*------------------------------------------------------------- UDIGetErrorMsg*/    case UDIGetErrorMsg_c:    {	UDIError	error_code;	/* In */	UDISizeT	msg_len;	/* In  -- allowed message space */	char*		msg = sbuf;	/* Out -- length of message */	UDISizeT	CountDone;	/* Out -- number of chars */	strcpy(msg, "No TIP message");        udr_UDIError(udrs, &error_code); /* recv all "in" parameters */        udr_UDISizeT(udrs, &msg_len);        udrs->udr_op = UDR_ENCODE;	/* send all "out" parameters */	if(error_code < 0)	{	    if(SBUF_SIZE < msg_len) msg_len = SBUF_SIZE;	    tip_errno = UDIGetErrorMsg(error_code, msg_len, msg, &CountDone);            udr_string(udrs, msg);	}	else	{            udr_string(udrs, tip_errmsg[0]);	    tip_errno = UDIErrorCantHappen;	    CountDone = strlen(tip_errmsg[0]);	}	udr_UDISizeT(udrs, &CountDone);        udr_UDIError(udrs, &tip_errno);	/* send any TIP error */        udr_sendnow(udrs);	break;    }/*--------------------------------------------------------- UDIGetTargetConfig*/    case UDIGetTargetConfig_c:    {	char*		KnownMemory_p;		/* Out */	UDIInt		NumberOfRanges;		/* In and Out */	char*		ChipVersions_p;		/* Out */	UDIInt		NumberOfChips;		/* In and Out */	int		cnt;	int		MaxOfRanges;	char*		NumberOfRanges_p;	udr_UDIInt(udrs, &NumberOfRanges);	/* recieve all "in" params */	MaxOfRanges = NumberOfRanges;	udr_UDIInt(udrs, &NumberOfChips);	udrs->udr_op = UDR_ENCODE;		/* send all "out" parameters */	udr_work(udrs, &NumberOfRanges, 0);	/* nothing yet */	KnownMemory_p = udr_getpos(udrs);	udr_inline(udrs, MaxOfRanges * sizeof(UDIMemoryRange) );	NumberOfRanges_p = udr_getpos(udrs);	udr_inline(udrs, sizeof(UDIInt) );	/* space for NumberOfRanges */	udr_inline(udrs, sizeof(UDIInt) );	/* space for NumberOfChips */	ChipVersions_p = udr_getpos(udrs);	tip_errno = UDIGetTargetConfig(KnownMemory_p, &NumberOfRanges,		ChipVersions_p, &NumberOfChips);	udr_setpos(udrs, NumberOfRanges_p);

⌨️ 快捷键说明

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