📄 nfsdrv.c
字号:
/* nfsDrv.c - Network File System (NFS) I/O driver *//* Copyright 1984 - 2001 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------03l,07may02,kbw man page edits03k,06nov01,vvv made max. path length configurable (SPR #63551)03j,15oct01,rae merge from truestack ver 03s, base 03h (SPR #9357 etc.)03i,07feb01,spm merged from version 03o of tor3_x branch (base 03h): fixed group validation in nfsMountAll (SPR #3524), added permission checks to nfsOpen() routine (SPR #21991)03h,14mar99,jdi doc: removed refs to config.h and/or configAll.h (SPR 25663).03g,15dec98,cjtc added helper routine nfsDrvNumGet() to return the nfs driver number in the io system. This is needed by the WindView host to ensure that the upload is going via the upload mechanism requested03f,20nov97,gnn fix for spr#5436, need to support FIOFSTATFSGET03e,26aug97,spm removed compiler warnings (SPR #7866)03f,19aug97,cth changed nfsCacheSize back to before 03e (SPR 7834) fixed by fixing SPR 8460.03e,15apr97,cth added simsol specific fix for spr#7834 (for sirocco release), +dvs at some pt this probably needs to be better integrated.03d,06aug96,sgv fix for spr#646802s,13feb95,jdi doc tweaks.02r,12jan95,rhp doc: add FIOSYNC to list of NFS ioctl functions. Also, jdi doc tweaks to nfsDevListGet() and nfsDevInfoGet().02q,01dec93,jag added the routines nfsDevListGet(), and nfsDevInfoGet(). These routines provide support for the SNMP demo.02q,08sep94,jmm changed NFS client to use new RPC genned xdr routines02p,28jul93,jmm added permission checking to nfsOpen () (spr 2046)02o,01feb93,jdi documentation cleanup for 5.1; added third param to ioctl() examples.02n,13nov92,dnw added include of semLibP.h02m,21oct92,jdi removed mangen SECTION designation.02l,02oct92,srh added ioctl(FIOGETFL) to return file's open mode02k,16sep92,jcf added include of errnoLib.h.02j,04sep92,jmm changed nfsUnmount to make sure device names match exactly (spr 1564)02i,19jul92,smb added include fcntl.h.02h,26may92,rrr the tree shuffle02g,19Mar92,jmm changed nfsSeek to allow seeks beyond EOF added #include of pathLib.h02f,20jan92,jmm changed nfsOpen to not truncate path names after looking up symlinks02e,16dec91,gae added includes plus fixes for ANSI.02d,04oct91,rrr passed through the ansification filter -changed functions to ansi style -changed includes to have absolute path from h/ -changed READ, WRITE and UPDATE to O_RDONLY O_WRONLY and ... -changed VOID to void -changed copyright notice02c,05apr91,jdi documentation -- removed header parens and x-ref numbers; doc review by dnw.02b,21feb91,jaa documentation cleanup.02a,08oct90,dnw changed nfsMountAll verbose flag to quiet flag.01z,08oct90,hjb de-linted.01y,02oct90,hjb nfsWrite() changed to avoid reading data into cache to keep cache up-to-date when size of data being written is bigger than the nfs cache size.01x,10aug90,dnw added verbose arg to nfsMountAll().01w,26jun90,jcf changed semaphore types. removed super semaphores.01v,29may90,dnw fixed nfsMount to free allocated memory if iosDevAdd returns ERROR01u,10may90,dnw added nfsMountAll change nfsClose() to not call nfsClientClose() (unless nfsAutoClose is set TRUE) made SSEMAPHORE include embedded SEM_BINARY which is inited instead of a SEM_ID which is created (to reduce malloc). changed NFS_MAXPATHLEN to (PATH_MAX + 1)01t,01may90,llk added FIOREADDIR and FIOFSTATGET ioctl calls. deleted FIODIRENTRY ioctl call.01s,01apr90,llk changed nfsRead() to always return the number of bytes requested by caller (up to the bytes left in the file). changed name nfsFlushCache() to nfsCacheFlush(). added "DEFICIENCIES" documentation (and probably some deficiencies). made string arrays shorter than defined in the NFS spec. fixed bug which didn't update file ptr correctly if cache size was 0. coalesced malloc of cache and fd into one malloc.01r,14mar90,jdi documentation cleanup.01q,09aug89,dab made nfsOpen() check for O_TRUNC flag. made nfsCreate() truncate file if file already exists.01p,12jul89,llk lint.01o,24mar89,dab caching disabled when nfsCacheSize is zero; +gae formerly a bug when nfsCacheSize was zero.01n,23mar89,dab added FIOSYNC option to nfsIoctl().01m,21nov88,jcf lint.01l,19oct88,llk documentation.01k,28sep88,llk documentation.01j,24aug88,gae documentation. Made nfsMount() check hostname, and allow default local name.01i,07jul88,jcf lint.01h,30jun88,llk changed to handle links. added nfsDevShow().01g,22jun88,dnw changed taskIdGet() to taskIdSelf().01f,16jun88,llk changed to more v4 names.01e,04jun88,llk added rm, mkdir, rmdir. changed how nfsOpen retrieves directory and file names.01d,30may88,dnw changed to v4 names.01c,04may88,jcf changed ssemaphores to be consistent with new semLib.01b,22apr88,gae fixed drvnum reference in nfsUnmount().01a,19apr88,llk written.*//*This driver provides facilities for accessing files transparently over thenetwork via NFS (Network File System). By creating a network devicewith nfsMount(), files on a remote NFS system (such as a UNIX system) canbe handled as if they were local.USER-CALLABLE ROUTINESThe nfsDrv() routine initializes the driver. The nfsMount() and nfsUnmount()routines mount and unmount file systems. The nfsMountAll() routine mountsall file systems exported by a specified host.INITIALIZATIONBefore using the network driver, it must be initialized by calling nfsDrv().This routine must be called before any reads, writes, or other NFS calls.This is done automatically when INCLUDE_NFS is defined..CREATING NFS DEVICESIn order to access a remote file system, an NFS device must be created bycalling nfsMount(). For example, to create the device `/myd0/' for the filesystem `/d0/' on the host `wrs', call:.CS nfsMount ("wrs", "/d0/", "/myd0/");.CEThe file `/d0/dog' on the host `wrs' can now be accessed as `/myd0/dog'.If the third parameter to nfsMount() is NULL, VxWorks creates a device withthe same name as the file system. For example, the call:.CS nfsMount ("wrs", "/d0/", NULL);.CEor from the shell:.CS nfsMount "wrs", "/d0/".CEcreates the device `/d0/'. The file `/d0/dog' is accessed by the same name,`/d0/dog'.Before mounting a file system, the host must already have been createdwith hostAdd(). The routine nfsDevShow() displays the mounted NFS devices.IOCTL FUNCTIONSThe NFS driver responds to the following ioctl() functions:.iP "FIOGETNAME" 18 3Gets the file name of <fd> and copies it to the buffer referenced by <nameBuf>:.CS status = ioctl (fd, FIOGETNAME, &nameBuf);.CE.iP "FIONREAD"Copies to <nBytesUnread> the number of bytes remaining in the filespecified by <fd>:.CS status = ioctl (fd, FIONREAD, &nBytesUnread);.CE.iP "FIOSEEK"Sets the current byte offset in the file to the position specified by<newOffset>. If the seek goes beyond the end-of-file, the file grows.The end-of-file pointer gets moved to the new position, and the new spaceis filled with zeros:.CS status = ioctl (fd, FIOSEEK, newOffset);.CE.iP "FIOSYNC"Flush data to the remote NFS file. It takes no additional argument:.CS status = ioctl (fd, FIOSYNC, 0);.CE.iP "FIOWHERE"Returns the current byte position in the file. This is the byte offset ofthe next byte to be read or written. It takes no additional argument:.CS position = ioctl (fd, FIOWHERE, 0);.CE.iP "FIOREADDIR"Reads the next directory entry. The argument <dirStruct> is a pointer toa directory descriptor of type DIR. Normally, the readdir() routine is used toread a directory, rather than using the FIOREADDIR function directly. Seethe manual entry for dirLib:.CS DIR dirStruct; fd = open ("directory", O_RDONLY); status = ioctl (fd, FIOREADDIR, &dirStruct);.CE.iP "FIOFSTATGET"Gets file status information (directory entry data). The argument<statStruct> is a pointer to a stat structure that is filled with datadescribing the specified file. Normally, the stat() or fstat() routine isused to obtain file information, rather than using the FIOFSTATGETfunction directly. See the manual entry for dirLib:.CS struct stat statStruct; fd = open ("file", O_RDONLY); status = ioctl (fd, FIOFSTATGET, &statStruct);.CE.iP "FIOFSTATFSGET"Gets the file system parameters for and open file descriptor. The argument<statfsStruct> is a pointer to a statfs structure that is filled with datadescribing the underlying filesystem. Normally, the stat() or fstat() routineis used to obtain file information, rather than using the FIOFSTATGET functiondirectly. See the manual entry for dirLib:.CS statfs statfsStruct; fd = open ("directory", O_RDONLY); status = ioctl (fd, FIOFSTATFSGET, &statfsStruct);.CEDEFICIENCIESThere is only one client handle/cache per task.Performance is poor if a task is accessing two or more NFS files.Changing <nfsCacheSize> after a file is open could cause adverse effects.However, changing it before opening any NFS file descriptors should notpose a problem.INCLUDE FILES: nfsDrv.h, ioLib.h, dirent.hSEE ALSO: dirLib, nfsLib, hostAdd(), ioctl(),*/#include "vxWorks.h"#include "iosLib.h"#include "ioLib.h"#include "memLib.h"#include "stdlib.h"#include "semLib.h"#include "string.h"#include "lstLib.h"#include "rpc/rpc.h"#include "xdr_nfs.h"#include "xdr_nfsserv.h"#include "hostLib.h"#include "sys/stat.h"#include "dirent.h"#include "errnoLib.h"#include "errno.h"#include "stdio.h"#include "nfsLib.h"#include "nfsDrv.h"#include "pathLib.h"#include "fcntl.h"#include "memPartLib.h"#include "private/semLibP.h"IMPORT unsigned int nfsMaxMsgLen; /* max. length of NFs read/write buf */IMPORT int nfsMaxPath; /* max. length of file path *//* XXX FD_MODE is defined in here and in netDrv */#define FD_MODE 3 /* mode mask for opened file */ /* O_RDONLY, O_WRONLY or O_RDWR */#ifdef __GNUC__# ifndef alloca# define alloca __builtin_alloca# endif#endiftypedef struct /* NFS_DEV - nfs device structure */ { DEV_HDR devHdr; /* nfs device header */ char host[MAXHOSTNAMELEN]; /* host for this device */ nfs_fh fileHandle; /* handle for mounted file system */ /* * File system mounted on this dev - though it appears as a single * character, it is really a character array - the memory for the array * is allocated when an NFS_DEV struct is allocated. This change was * required for configurable file path length support. */ char fileSystem[1]; } NFS_DEV;/* nfs file descriptor */typedef struct /* NFS_FD - NFS file descriptor */ { NFS_DEV *nfsDev; /* pointer to this file's NFS device */ nfs_fh fileHandle; /* file's file handle */ nfs_fh dirHandle; /* file's directory file handle */ fattr fileAttr; /* file's attributes */ unsigned int mode; /* (O_RDONLY, O_WRONLY, O_RDWR) */ unsigned int fileCurByte; /* number of current byte in file */ SEM_ID nfsFdSem; /* accessing semaphore */ BOOL cacheValid; /* TRUE: cache valid and remaining */ /* fields in structure are valid. */ /* FALSE: cache is empty or */ /* cacheCurByte not the same as the */ /* current byte in the file. */ char *cacheBuf; /* pointer to file's read cache */ char *cacheCurByte; /* pointer to current byte in cache */ unsigned int cacheBytesLeft; /* number of bytes left in cache */ /* between cacheCurByte and the end */ /* of valid cache material. NOTE: */ /* This number may be smaller than */ /* the amount of room left in for */ /* the cache writing. */ BOOL cacheDirty; /* TRUE: cache is dirty, not flushed */ } NFS_FD;/* globals */int mutexOptionsNfsDrv = SEM_Q_PRIORITY | SEM_DELETE_SAFE | SEM_INVERSION_SAFE;unsigned int nfsCacheSize; /* size of an nfs cache */BOOL nfsAutoClose; /* TRUE: close client after file close*//* locals */LOCAL int nfsDrvNum; /* this particular driver number *//* forward declarations */LOCAL int nfsCacheFlush ();LOCAL STATUS nfsClose ();LOCAL int nfsCreate ();LOCAL int nfsDelete ();LOCAL int nfsIoctl ();LOCAL int nfsOpen ();LOCAL int nfsRead ();LOCAL int nfsSeek ();LOCAL int nfsWrite ();LOCAL int nfsChkFilePerms ();/********************************************************************************* nfsDrv - install the NFS driver** This routine initializes and installs the NFS driver. It must be * called before any reads, writes, or other NFS calls.* This is done automatically when INCLUDE_NFS is defined.** VXWORKS AE PROTECTION DOMAINS* Under VxWorks AE, you can call this function from within the kernel * protection domain only. This restriction does not apply under non-AE * versions of VxWorks. ** RETURNS:* OK, or ERROR if there is no room for the driver.*/STATUS nfsDrv (void) { if (nfsDrvNum == 0) { nfsCacheSize = nfsMaxMsgLen; nfsDrvNum = iosDrvInstall (nfsCreate, nfsDelete, nfsOpen, nfsClose, nfsRead, nfsWrite, nfsIoctl); } return (nfsDrvNum == ERROR ? ERROR : OK); }/********************************************************************************* nfsDrvNumGet - return the IO system driver number for the nfs driver** This routine returns the nfs driver number allocated by iosDrvInstall during* the nfs driver initialization. If the nfs driver has yet to be initialized,* or if initialization failed, nfsDrvNumGet will return ERROR.** RETURNS: the nfs driver number or ERROR*/int nfsDrvNumGet (void) { return (nfsDrvNum == 0 ? ERROR : nfsDrvNum); }/********************************************************************************* nfsMount - mount an NFS file system** This routine mounts a remote file system. It creates a* local device <localName> for a remote file system on a specified host.* The host must have already been added to the local host table with* hostAdd(). If <localName> is NULL, the local name will be the same as* the remote name.** RETURNS: OK, or ERROR if the driver is not installed,* <host> is invalid, or memory is insufficient.** SEE ALSO: nfsUnmount(), hostAdd()*/STATUS nfsMount ( char *host, /* name of remote host */ char *fileSystem, /* name of remote directory to mount */ char *localName /* local device name for remote dir */ /* (NULL = use fileSystem name) */ ) { FAST NFS_DEV *pNfsDev; nfs_fh fileHandle; if (nfsDrvNum < 1) { errnoSet (S_ioLib_NO_DRIVER); return (ERROR); } if (strlen (fileSystem) >= nfsMaxPath) { errnoSet (S_nfsLib_NFSERR_NAMETOOLONG); return (ERROR); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -