亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tftpdlib.c

?? vxworks操作系統源代碼_對于在vxworks環境下開發軟件的人員非常有用
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* tftpdLib.c - Trivial File Transfer Protocol server library *//* Copyright 1992 - 2001 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------01l,07may02,kbw  man page edits01k,15oct01,rae  merge from truestack ver 01n, base 01i (SPR #69222 etc.)01j,09jan01,dgr  Adding to comment-header-block of tftpdInit as per SPR #6333701i,09oct97,nbs  modified tftpd to use filename from TFTP_DESC, spr # 941301h,01aug96,sgv  added trunc flag for open call SPR #683901g,21jul95,vin	 applied ntohs for the opcode field. SPR4124.01f,11aug93,jmm  Changed ioctl.h and socket.h to sys/ioctl.h and sys/socket.h01e,21sep92,jdi  documentation cleanup. 01d,18jul92,smb  Changed errno.h to errnoLib.h.01c,04jun92,ajm  shut up warnings on mips compiler01b,26may92,rrr  the tree shuffle		  -changed includes to have absolute path from h/01a,29Jan92,jmm		written.*//*DESCRIPTIONThis library implements the VxWorks Trivial File Transfer Protocol(TFTP) server module.  The server can respond to both read and writerequests.  It is started by a call to tftpdInit().The server has access to a list of directories that can either beprovided in the initial call to tftpdInit() or changed dynamicallyusing the tftpdDirectoryAdd() and tftpDirectoryRemove() calls.Requests for files not in the directory trees specified in the accesslist will be rejected, unless the list is empty, in which case allrequests will be allowed.  By default, the access list contains thedirectory given in the global variable `tftpdDirectory'.  It is possibleto remove the default by calling tftpdDirectoryRemove().For specific information about the TFTP protocol, see RFC 783, "TFTPProtocol."VXWORKS AE PROTECTION DOMAINSUnder VxWorks AE, you can run the tftp server in the kernel protection domain only.  This restriction does not apply under non-AE versions of VxWorks.  INTERNALThe server library uses the TFTP client routines tftpPut() andtftpGet() to do the actual file transfer.  When the server receives arequest, it does one of three things:    Read request (RRQ): spawns tftpFileRead task, which will call                        tftpPut().    Write request (WRQ): spawns tftpFileWrite task, which will call                         tftpGet().    All others: sends back error packetTo use this feature, include the following component:INCLUDE_TFTP_SERVERINCLUDE FILES: tftpdLib.h, tftpLib.hSEE ALSO:tftpLib, RFC 783 "TFTP Protocol"*/#include "vxWorks.h"#include "tftpdLib.h"#include "netinet/in.h"#include "sockLib.h"#include "sys/socket.h"#include "tftpLib.h"#include "errnoLib.h"#include "fcntl.h"#include "ioLib.h"#include "stdio.h"#include "stdlib.h"#include "string.h"#include "sys/types.h"#include "unistd.h"#include "usrLib.h"#include "iosLib.h"#include "msgQLib.h"#include "semLib.h"#include "inetLib.h"#include "memPartLib.h"/* EXTERNALS */extern int sysClkRateGet (void);/* GLOBALS */BOOL tftpdDebug			= FALSE;	/* TRUE: debugging messages */int tftpdTaskPriority		= 55;int tftpdTaskStackSize		= 12000;int tftpdTaskId			= NONE;int tftpdErrorSendTries		= 3;int tftpdMaxConnections		= 10;char *tftpdDirectoryDefault	= "/tftpboot";int tftpdResponsePriority	= 100;/* XXX Hack for Genus */FUNCPTR tftpdNameMunge = NULL;/* LOCALS */LOCAL SEM_ID	tftpdDirectorySem;	/* protection for the semaphore list */LOCAL LIST    	tftpdDirectoryList;	/* access list, elements  TFTPD_DIR  */LOCAL MSG_Q_ID	tftpdDescriptorQueue;	/* msg queue of available connection */LOCAL TFTP_DESC *tftpdDescriptorPool;LOCAL char	tftpdErrStr []	= "TFTP server";/* PROTOTYPES */static STATUS tftpdRequestVerify (TFTP_DESC *pReplyDesc, int opCode,				  char *fileName);static STATUS tftpdRequestDecode (TFTP_MSG *pTftpMsg, int *opCode,				  char *fileName, char *mode);static STATUS tftpdFileRead (char *fileName, TFTP_DESC *pReplyDesc);static STATUS tftpdFileWrite (char *fileName, TFTP_DESC *pReplyDesc);static STATUS tftpdDescriptorQueueInit (int nEntries);static STATUS tftpdDescriptorQueueDelete (void);static TFTP_DESC *tftpdDescriptorCreate (char *mode, BOOL connected,					 int sock, u_short clientPort,					 struct sockaddr_in *pClientAddr);static STATUS tftpdDescriptorDelete (TFTP_DESC *descriptor);static STATUS tftpdDirectoryValidate (char *fileName);static STATUS tftpdErrorSend (TFTP_DESC *pReplyDesc, int errorNum);/******************************************************************************** tftpdInit - initialize the TFTP server task** This routine will spawn a new TFTP server task, if one does not already* exist.  If a TFTP server task is running already, tftpdInit() will simply* return an ERROR value without creating a new task.** To change the default stack size for the TFTP server task, use the* <stackSize> parameter.  The task stack size should be set to a large enough* value for the needs of your application - use checkStack() to evaluate your* stack usage.  The default size is set in the global variable* `tftpdTaskStackSize'.  Setting <stackSize> to zero will result in the stack* size being set to this default.** To set the maximum number of simultaneous TFTP connections (each with its* own transfer identifier or TID), set the <maxConnections> parameter.  More* information on this is found in RFC 1350 ("The TFTP Protocol (Revision 2)").* Setting <maxConnections> to zero will result in the maximum number of* connections being set to the default, which is 10.** If <noControl> is TRUE, the server will be set up to transfer any* file in any location.  Otherwise, it will only transfer files in the* directories in '/tftpboot' or the <nDirectories> directories in the* <directoryNames> list, and will send an* access violation error to clients that attempt to access files outside of* these directories.** By default, <noControl> is FALSE, <directoryNames> is empty, <nDirectories>* is zero, and access is restricted to the '/tftpboot' directory.** Directories can be added to the access list after initialization by using* the tftpdDirectoryAdd() routine.** VXWORKS AE PROTECTION DOMAINS* Under VxWorks AE, you can call this function from within the kernel * protection domain only.  In addition, all arguments to this function can  * reference only that data which is valid in the kernel protection domain. * This restriction does not apply under non-AE versions of VxWorks.  ** RETURNS:* OK, or ERROR if a new TFTP task cannot be created.*/STATUS tftpdInit    (    int	 stackSize,		/* stack size for the tftpdTask		*/    int  nDirectories,		/* number of directories allowed read	*/    char **directoryNames,	/* array of dir names			*/    BOOL noControl,		/* TRUE if no access control required	*/    int	 maxConnections    )    {    /*     * Make sure there isn't a TFTP server task running already     */    if (tftpdTaskId != NONE)	{	return (ERROR);	}    /*     * Initialize the access list, add the default directory,     * and give the semaphore that protects the list     */    lstInit (&tftpdDirectoryList);    tftpdDirectorySem = semMCreate(SEM_Q_FIFO);    /*     * If access control isn't turned off, add the default directory     * to the list     */    if (noControl != TRUE)        tftpdDirectoryAdd (tftpdDirectoryDefault);    /*     * Add the first set of directories to the list     */    while (--nDirectories >= 0)	{	tftpdDirectoryAdd (directoryNames [nDirectories]);	}    /* create a TFTP server task */    tftpdTaskId = taskSpawn ("tTftpdTask", tftpdTaskPriority, 0,			     stackSize == 0 ? tftpdTaskStackSize : stackSize,			     tftpdTask, nDirectories, (int) directoryNames,			     maxConnections, 0, 0, 0, 0, 0, 0, 0);    if (tftpdTaskId == ERROR)	{        printErr ("%s: tftpdTask cannot be created\n", tftpdErrStr);	return (ERROR);	}    return (OK);    }/******************************************************************************** tftpdTask - TFTP server daemon task** This routine processes incoming TFTP client requests by spawning a new* task for each connection that is set up.  This routine is called by * tftpdInit().** VXWORKS AE PROTECTION DOMAINS* Under VxWorks AE, you can call this function from within the kernel * protection domain only.  In addition, all arguments to this function can  * reference only that data which is valid in the kernel protection domain. * This restriction does not apply under non-AE versions of VxWorks.  ** RETURNS:* OK, or ERROR if the task returns unexpectedly.*/STATUS tftpdTask    (    int		nDirectories,		/* number of dirs allowed access    */    char	**directoryNames,	/* array of directory names         */    int		maxConnections		/* max number of simultan. connects */    )    {    int			serverSocket;	/* socket to use to communicate with					 * the remote process */    struct sockaddr_in	clientAddr;	/* process requesting TFTP					 * connection */    struct sockaddr_in	serverAddr;    int			clientAddrLength = sizeof (struct sockaddr_in);    TFTP_MSG 		requestBuffer;    int			value;    int			opCode;    char		*fileName;    char		mode [TFTP_SEGSIZE];    TFTP_DESC		*pReplyDesc;    int			replySocket;    serverSocket = socket (AF_INET, SOCK_DGRAM, 0);    bzero ((char *) &serverAddr, sizeof (struct sockaddr_in));    bzero ((char *) &clientAddr, sizeof (struct sockaddr_in));    serverAddr.sin_family	= AF_INET;    serverAddr.sin_port		= htons((u_short) TFTP_PORT);    serverAddr.sin_addr.s_addr	= INADDR_ANY;    if (bind (serverSocket, (SOCKADDR *) &serverAddr,	      sizeof (struct sockaddr_in)) == ERROR)	{	printErr ("%s: could not bind to TFTP port\n", tftpdErrStr);	return (ERROR);	}    if (tftpdDescriptorQueueInit (maxConnections) == ERROR)	{	printErr ("%s: could not create descriptor queue\n", tftpdErrStr);	return (ERROR);	}    /*     * Clean out any outstanding data on the TFTP port.     */    FOREVER	{	if (ioctl (serverSocket, FIONREAD, (int) &value) == ERROR)	    return (ERROR);	if (value == 0)                /* done - socket cleaned out */	    break;	recvfrom (serverSocket, (caddr_t) &requestBuffer,		  sizeof (TFTP_MSG), 0, (SOCKADDR *) NULL,		  (int *) NULL);	}    /*     * The main loop.  Receive requests on the TFTP port, parse the request,     * and spawn tasks to handle it.     */    FOREVER	{	/*	 * Read a message from the TFTP port	 */	value = recvfrom (serverSocket, (char *) &requestBuffer, TFTP_SEGSIZE,			  0, (struct sockaddr *) &clientAddr,			  &clientAddrLength);	/*	 * If there's an error reading on the port, abort the server.	 */	if (value == ERROR)	    {	    printErr ("%s:  could not read on TFTP port\n", tftpdErrStr);	    close (serverSocket);	    tftpdDescriptorQueueDelete ();	    break;	    }	/*	 * Set up a socket to use for a reply, and get a port number for it.	 */	replySocket = socket (AF_INET, SOCK_DGRAM, 0);	if (replySocket == ERROR)	    {	    /*	     * XXX How should we deal with an error here?	     */	    continue;	    }	serverAddr.sin_port = htons((u_short) 0);	if (bind (replySocket, (SOCKADDR *) &serverAddr,		  sizeof (struct sockaddr_in)) == ERROR)	    {	    /*	     * XXX How should we deal with an error here?	     */	    continue;	    }	if (tftpdRequestDecode (&requestBuffer, &opCode, NULL,				(char *) mode) == ERROR)	    {	    /*	     * We received something that doesn't look like a TFTP request.	     * Ignore it.	     */	    close (replySocket);	    continue;	    }	/*	 * Get a reply descriptor.  This will pend until one is available.	 */	pReplyDesc = tftpdDescriptorCreate (mode, TRUE, replySocket,					    clientAddr.sin_port, &clientAddr);	if (pReplyDesc == NULL)	    {	    /*	     * Couldn't create a reply descriptor.	     */	    close (replySocket);	    continue;	    }	/*	 * Copy the name of the requested file into the TFTP_DESC	 */	fileName = pReplyDesc->fileName;        if (tftpdRequestDecode (&requestBuffer, NULL, (char *) fileName,                                NULL) == ERROR)            {            /*             * We received something that doesn't look like a TFTP request.             * Ignore it.             */            close (replySocket);            continue;            }	if (tftpdRequestVerify (pReplyDesc, opCode, fileName) != OK)	    {	    /*	     * Invalid request, error packet already sent by tftpdRequestVerify	     */	    tftpdDescriptorDelete (pReplyDesc);	    close (replySocket);	    continue;	    }	if (tftpdDebug)	    {	    printf ("%s: Request: Opcode = %d, file = %s, client = %s\n",		    tftpdErrStr, opCode, fileName, pReplyDesc->serverName);	    }	switch (opCode)	    {	    case TFTP_RRQ:		/*		 * We've received a read request.  Spawn a tftpdFileRead		 * task to process it.		 */	        taskSpawn ("tTftpRRQ", tftpdResponsePriority, 0, 10000,			   tftpdFileRead, (int) fileName, (int) pReplyDesc,			   0, 0, 0, 0, 0, 0, 0, 0);		break;	    case TFTP_WRQ:		/*		 * We've received a write request.  Spawn a tftpdFileWrite		 * task to process it.		 */	        taskSpawn ("tTftpWRQ", tftpdResponsePriority, 0, 10000,			   tftpdFileWrite, (int) fileName, (int) pReplyDesc,			   0, 0, 0, 0, 0, 0, 0, 0);		break;	    }	} /* end FOREVER */    printErr ("%s:  aborting TFTP server\n", tftpdErrStr);    tftpdDescriptorQueueDelete ();    close (serverSocket);    return (ERROR);    }/******************************************************************************** tftpdRequestVerify - ensure that an incoming TFTP request is valid** Checks a TFTP request to make sure that the opcode is either* a read or write request, and then checks to see if the file requested* is in the access list.** If there is an error, it sends an error packet to the offending client.** RETURNS: OK, or ERROR if any of the conditions aren't met.*/LOCAL STATUS tftpdRequestVerify    (    TFTP_DESC	*pReplyDesc,    int		opCode,    char	*fileName    )    {    int		dirIsValid;    /*     * Need to check two things:     *     * 1.  The request itself needs to be valid, either a write request (WRQ)     *     or a read request (RRQ).     *     * 2.  It needs to be to a valid directory.     */    if ((opCode != TFTP_RRQ) && (opCode != TFTP_WRQ))	{	/*	 * Bad opCode sent to the server.	 */	tftpdErrorSend (pReplyDesc, EBADOP);	return (ERROR);	}    dirIsValid = tftpdDirectoryValidate (fileName);    if (dirIsValid != OK)	{	/*	 * Access was denied to the file that the client	 * requested.	 */	tftpdErrorSend (pReplyDesc, errnoGet());	return (ERROR);	}    return (OK);    }/******************************************************************************** tftpdRequestDecode - break down a TFTP request** Given a pointer to a TFTP message, this routine decodes the message* and returns the message's opcode, file name, and mode.** RETURNS:* OK or ERROR.*/LOCAL STATUS tftpdRequestDecode    (    TFTP_MSG	*pTftpMsg,    int	*	opCode,		/* pointer to the opCode to return */    char	*fileName,	/* where to return filename */    char	*mode		/* where to return mode */    )    {    char	*strIndex;	/* index into pTftpMsg to get mode string */    if (pTftpMsg == NULL)	return (ERROR);    if (opCode != NULL)	*opCode = ntohs(pTftpMsg->th_opcode);    if (fileName != NULL)	{	strncpy (fileName, pTftpMsg->th.request, 128);	fileName [127] = EOS;	}    if (mode != NULL)	{	/*	 * Need to get the next string in the struct. Use the for loop to	 * find the end of the first string.	 */	for (strIndex = pTftpMsg->th.request;	     *strIndex != EOS;	     strIndex++)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产在线精品一区二区夜色 | 久久超碰97中文字幕| 色天天综合久久久久综合片| 自拍视频在线观看一区二区| 成人午夜在线免费| 日本一区二区三区久久久久久久久不 | 国产精品网站在线| 成人av电影在线播放| 亚洲激情欧美激情| 在线电影院国产精品| 国内精品伊人久久久久av一坑| 久久综合狠狠综合久久综合88| 日本伊人精品一区二区三区观看方式| 亚洲人成网站精品片在线观看 | 在线播放欧美女士性生活| 午夜精品一区二区三区电影天堂| 91超碰这里只有精品国产| 蜜桃免费网站一区二区三区| 久久久亚洲午夜电影| 不卡的av电影| 日日摸夜夜添夜夜添亚洲女人| 日韩三级视频中文字幕| 处破女av一区二区| 亚洲国产精品久久久久婷婷884| 日韩午夜激情视频| 成人一区二区视频| 亚洲国产精品视频| 国产亚洲一二三区| 欧洲精品在线观看| 国产精品一二三在| 午夜精品在线视频一区| 国产欧美日韩综合| 欧美三级电影一区| 国产不卡一区视频| 日韩福利电影在线| 综合激情成人伊人| 精品少妇一区二区三区在线播放| 99久久精品情趣| 老司机一区二区| 夜夜嗨av一区二区三区| 久久精品日韩一区二区三区| 欧美老肥妇做.爰bbww视频| 国产不卡在线播放| 久久精品99国产国产精| 一区二区欧美视频| 国产欧美视频在线观看| 6080午夜不卡| 在线视频你懂得一区| 国产精品一区二区在线观看网站| 亚洲va国产va欧美va观看| 国产精品进线69影院| 久久综合视频网| 欧美日韩免费一区二区三区| 91小宝寻花一区二区三区| 成人蜜臀av电影| 日本不卡一区二区| 亚洲在线中文字幕| 成人免费一区二区三区视频 | 欧美日韩视频不卡| 欧洲精品一区二区三区在线观看| av一区二区三区| 国产suv精品一区二区三区| 久久草av在线| 蜜桃av一区二区| 日韩中文字幕一区二区三区| 亚洲综合av网| 亚洲免费资源在线播放| 国产精品国产自产拍在线| 国产午夜亚洲精品不卡| 久久综合色一综合色88| 久久综合久久久久88| 欧美日本韩国一区二区三区视频| 在线观看日韩高清av| 91九色最新地址| 在线视频欧美区| 欧美色倩网站大全免费| 在线观看www91| 欧美视频一区二区三区在线观看 | 成人黄色免费短视频| 国产91精品在线观看| 国产精品99久久久久久似苏梦涵 | 国产中文一区二区三区| 国产一区二区三区四| 国产一区不卡在线| 国产成人在线视频免费播放| 国产98色在线|日韩| 成人97人人超碰人人99| 91在线视频免费91| 欧美性xxxxxxxx| 欧美另类变人与禽xxxxx| 欧美成人性战久久| 久久一夜天堂av一区二区三区| 国产亚洲一区二区三区| 国产精品短视频| 18涩涩午夜精品.www| 亚洲一区二区四区蜜桃| 天涯成人国产亚洲精品一区av| 日本欧美在线观看| 国产在线精品一区二区夜色 | 欧美伦理视频网站| 日韩视频免费观看高清完整版 | 国产精品国产精品国产专区不片| 中文字幕一区二| 亚洲高清在线视频| 精品一二线国产| 国产成人综合网站| 欧洲一区在线电影| 久久一留热品黄| 综合分类小说区另类春色亚洲小说欧美| 亚洲乱码一区二区三区在线观看| 午夜影院在线观看欧美| 黄色资源网久久资源365| 成人免费观看视频| 91精品国产丝袜白色高跟鞋| 久久久久久久久久久久电影| 亚洲免费三区一区二区| 免费视频一区二区| 97se亚洲国产综合自在线| 这里是久久伊人| 亚洲欧洲av一区二区三区久久| 日韩激情视频在线观看| 成人免费va视频| 日韩欧美另类在线| 亚洲蜜臀av乱码久久精品蜜桃| 免费在线看成人av| 在线观看免费亚洲| 国产色综合久久| 日韩主播视频在线| 一本色道**综合亚洲精品蜜桃冫| 欧美成人猛片aaaaaaa| 亚洲精品久久久久久国产精华液| 国模大尺度一区二区三区| 欧美日韩精品免费观看视频 | 在线观看一区二区视频| 久久午夜免费电影| 三级影片在线观看欧美日韩一区二区| 国产成人精品亚洲午夜麻豆| 欧美久久久久久久久久| 亚洲欧美日韩小说| 风间由美性色一区二区三区| 欧美一区二区在线免费观看| 亚洲色图在线视频| 国产成人精品免费| 91精品国产91久久久久久一区二区 | 欧美一级欧美一级在线播放| 国产精品久久久久影院老司| 老汉av免费一区二区三区| 欧美色中文字幕| 亚洲一级二级三级| 91色porny| 国产精品短视频| 成人av在线资源| 国产日韩欧美激情| 国内精品伊人久久久久影院对白| 欧美亚洲日本国产| 亚洲视频一二区| 波多野结衣亚洲| 国产精品视频一二三区| 国产精品一二一区| 精品国产99国产精品| 欧美a一区二区| 5566中文字幕一区二区电影| 亚洲影院在线观看| 欧美亚洲高清一区| 亚洲国产中文字幕在线视频综合| 91久久香蕉国产日韩欧美9色| 国产精品不卡一区| 91丨九色丨尤物| 国产精品天美传媒| 色综合咪咪久久| **网站欧美大片在线观看| 99久久国产综合色|国产精品| 国产欧美日韩麻豆91| 成人国产精品免费观看| 亚洲精品高清视频在线观看| 日本高清不卡aⅴ免费网站| 亚洲免费观看高清完整版在线观看| 97久久精品人人爽人人爽蜜臀| 中国av一区二区三区| 91片在线免费观看| 亚洲va欧美va国产va天堂影院| 91精品在线一区二区| 久久er99热精品一区二区| 久久久久久久免费视频了| 波多野结衣一区二区三区| 亚洲免费观看高清完整版在线观看熊| 欧美色综合网站| 激情五月播播久久久精品| 欧美激情一区不卡| 91免费视频大全| 三级影片在线观看欧美日韩一区二区| 日韩免费观看2025年上映的电影| 韩国av一区二区| 亚洲天堂av老司机| 欧美日韩mp4| 国产一区二区三区国产| 亚洲人成网站影音先锋播放| 欧美一区二区三区免费大片| 国产超碰在线一区| 亚洲国产一区在线观看|