fopen()
Open a PSL channel to a file.
Syntax
Parameters
Parameter | Definition |
---|---|
filename | name of the file to which the PSL channel should be opened. |
mode | file access mode*Valid Values* |
Description
The fopen() function opens a channel to filename that provides the access to filename from within a PSL process. Theread(), readln(), write(), get_chan_info(), share(), fseek(), ftell(), and close() functions apply to channels that have been opened to files.
When supported by the underlying operating system, the fopen() function performs security checks to determine whether the user name of the calling process has permission for the request. The valid range of mode is the same as for the ANSI Cfopen() function.
If the fopen() function is successful, it returns the PSL channel number to filename. A failure to open filename, such as an operating system problem or invalid mode, sets the PSL errno value and causes the fopen() function to return the NULL string without attempting to open the file. The fopen() function behaves much like the ANSI C fopen() function.
File Permission Changes Using Mode a or w
When the target system is running a variant of Unix, opening filename using mode a or w (append or write) will changefilename permissions and ownership to be those of the user name of the calling process. The change uses the Unix chmodand chown commands. The new filename permission value is 0644 octal, which is read/write for the process user name and read permission for all other users.
When the target system is non-Unix, the file permission changes depend on whether the underlying file system supports the concept of a file owner. If it does, then file ownership is set to the user name of the calling process and write access is restricted to the owner. If it does not, the file will be accessible by any user.
Support for Binary File Access
The fopen() function permits binary modes with a b character, though there is currently no way within a PSL process to write any form of binary data other than character strings. The fopen() function b mode may be useful on some non-Unix platforms to prevent the conversion of CR/LF pairs back and forth to new-line characters, as performed by some standard C libraries for text files.
Using the fopen Function with the fseek Function
The fseek() function may not be meaningful for text files on some non-Unix platforms, so specifying {} in mode may imply bregardless of whether b is specified. BMC Software recommends that you use the {} in mode for the fopen() function whenever you require file positioning using the PSL fseek() function.
Flush a File after Each PSL File Operation
The PSL functions ensure that a file is flushed after every operation so that the well-known bug of doing a write-then-read or read-then-write without an intervening fseek rewind or fflush does not occur in PSL file operations.
fopen() Function and Named Pipes
Do not use the fopen() function to open named pipes (FIFOs). Doing so will cause the PATROL Agent to block indefinitely. Instead, use the following popen() function to open a channel for reading to the read_fifo shell script:
Where fifo is the name of the named pipe you wish to open, and read_fifo is the following shell script:
#
# read_fifo <fifo>
#
while [ 1 ]; do
if [ ! -p $1 ]; then
cat <<- EOF
cannot open '$1' -- no such file
EOF
exit 1
cat $1
done
You can use the channel number returned by the popen() function as an argument in the read() or readln() functions to retrieve the information the read_fifo shell script has read from the named pipe.
Example
The following fopen() function call shows different modes for opening a file:
readchan = fopen("/etc/passwd","r");
# open a file for writing
writechan = fopen("/tmp/abc123","w");
# open a file for appending
appendchan = fopen("tmp/newtmp123","a");