`clever' C preprocessor trick now causes problems

Till Straumann strauman at SLAC.Stanford.EDU
Tue Sep 25 02:21:49 UTC 2001

norume at young.usask.ca wrote:

> Quoting Till Straumann <strauman at SLAC.Stanford.EDU>:

-- snip --

> >
> > In this case, neither gcc nor EPICS seems to be the problem but the
> > rudimentary
> > implementation of filesystems in RTEMS and the lack of directory support
> > in
> > TFTPfs.
> True, but the TFTP filesystem does support directories the the extent that the startup scripts use them.  Here's the startup script from exampleApp:
> ============================================================
> dbLoadDatabase("../../dbd/example.dbd",0,0)
> registerRecordDeviceDriver(pdbbase)
> dbLoadRecords("../../db/dbExample1.db","user=norume")
> dbLoadRecords("../../db/dbExample2.db","user=norume,no=1,scan=1 second")
> dbLoadRecords("../../db/dbExample2.db","user=norume,no=2,scan=2 second")
> dbLoadRecords("../../db/dbExample2.db","user=norume,no=3,scan=5 second")
> iocInit()
> #seq sncExample,"user=norume"
> ============================================================
> On my TFTP server these appear as:
> /tftpboot/epics/norumx3/bin/example.bt
> /tftpboot/epics/norumx3/dbd/example.dbd
> /tftpboot/epics/norumx3/db/dbExample1.db
> /tftpboot/epics/norumx3/db/dbExample2.db
> /tftpboot/epics/norumx3/st.cmd

Sure - but this doesn't work _without_ your 'pre-fopen' hack on the
pathnames, i.e. the TFTPfs does not support directories (i.e.
rtems_filesystem_node_type() never returns RTEMS_FILESYSTEM_DIRECTORY
and hence a chdir() is impossible. Therefore, it's also impossible to support
relative paths.

Here's an idea how (very rudimentary) relative path support could be added
to TFTPfs:

- TFTPfs'  rtems_filesystem_node_type() returns 'RTEMS_FILESYSTEM_DIRECTORY'
   to any call with a pathname argument ending with a slash ('/').  It also stores (a
   copy of) the pathname in the node_access field. (hence the freenode method
   would have to be implemented also).

- TFTPfs' rtems_filesystem_evaluate_path() assembles the absolute path
   from the prefix (stored in cwd's node_access) and the relative path argument.
   It then eliminates all occurrences of '.' and '..' before proceeding.

   Note: this works only as long as no mount points or links are crossed (which
   are not implemented by TFTPfs anyway).

The iocsh should then do a eg. chdir("/TFTP/BOOTP_HOST/epics/norumx3/blah/blah/")
when initializing. This will record "/BOOTP_HOST/epics/norumx3/blah/blah"
in the cwd structure.

Regards, Till.

More information about the users mailing list