|
Here is a RPG and C example accessing the IFS systems
* PATH LENGTH PARAMETER
IPATHLN DS
I B 1 40PATHL
* OPEN INFORMATION PARAMETER
IOPNINF DS
I 1 1 EXISTS
I 2 2 NOTTHR
I 3 3 SYNASY
I 4 4 RSV1
I 5 5 SHAREM
I 6 6 ACCESS
I 7 7 OTYPE
I 8 10 RSV3
* ATTRIBUTE LENGTH PARAMETER
IATTRLN DS
I B 1 40ATTRL
* RETURN CODE PARAMETER
IRETCD DS
I B 1 40RCLEN
I B 5 80RTCD
I 9 15 CONDTN
I 16 16 RSV
I 17 272 MSG
* BYTES TO READ/WRITE PARAMETER
IBYTRDW DS B 1 40BYT2RW
* BYTES ACTUALLY READ/WRITTEN PARAMETER
IBYTACT DS B 1 40BYTARW
G.1.3 Opening an NSF File
* PARAMETER LIST FOR QHFOPNSF CALL
C POPNSF PLIST
C PARM FHDLE 16
C PARM PATH 36
C PARM PATHL
C PARM OPNINF
C PARM ATRTBL 1
C PARM ATTRLN
C PARM ACTION 1
C PARM RETCD
C* OPEN FILE SUBROUTINE
C OPNSF BEGSR
C* FILL IN THE PATH AND ATTRIBUTE LENGTHS
C Z-ADD36 PATHL SET PATH LEN=36
C Z-ADD*ZEROS ATTRL ZERO ATTRIBUTE
LNGTH
C* FILL IN THE OPNINF PARAMETER
C MOVE '0' EXISTS 1 FAIL IF EXISTS
C MOVE '1' NOTTHR 1 CREATE IF NOT
THERE
C MOVE '0' SYNASY 1 ASYNCHRONOUS
C MOVE *BLANKS RSV1 1
C MOVE '1' SHAREM 1 DENY NONE
C MOVE '2' ACCESS 1 READ/WRITE
C MOVE '0' OTYPE 1 NORMAL
C MOVE *BLANKS RSV3 3
C* CALL THE API TO OPEN THE STREAM FILE
C CALL 'QHFOPNSF'POPNSF 50
C OPNEND ENDSR
G.1.4 Writing a File to an NSF Disk
* PARAMETER LIST FOR QHFRDSF OR QHFWRTSF CALL
C PRWSF PLIST
C PARM FHDLE 16
C PARM DATAIN
C PARM BYT2RW
C PARM BYTARW
C PARM RETCD
C* CALL API TO WRITE TO THE FILE
C WRTSF BEGSR
C Z-ADD256 BYT2RW SET WRITE
LENGTH=256
C CALL 'QHFWRTSF'PRWSF 50
C WRTEND ENDSR
G.1.5 Closing an NSF File
* PARAMETER LIST FOR QHFCLOSF CALL
C PCLOSF PLIST
C PARM FHDLE 16
C PARM RETCD
C* CALL API TO CLOSE THE FILE
C CLOSF BEGSR
C CALL 'QHFCLOSF'PCLOSF 50
C CLSEND ENDSR
C* END OF SAMPLE RPG CALL TO THE HFS API
G.2.1 Integrated File System Function Examples
/*********************************************************************/
/* IFS File
systems */
/* This program demonstrates the use of various integrated file
*/
/* system functions applied to the QOPT physical file system
*/
/* including:
*/
/* chdir() - change current directory
*/
/* close() - close file
*/
/* closedir() - close directory
*/
/* creat() - create file
*/
/* lseek() - seek file (change file offset)
*/
/* open() - open file
*/
/* opendir() - open directory
*/
/* read() - read file
*/
/* readdir() - read directory entry
*/
/* rewinddir() - rewind directory entries
*/
/* stat() - directory statistics
*/
/* write() - write file
*/
/*
*/
/*********************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <fcntl.h>
void main (void)
{
/*****************************************************************/
/* local variables, contents and defines
*/
/*****************************************************************/
char path[294]; /* optical path
*/
DIR *dirP; /* pointer to the directory
*/
int filedes; /* open file descriptor
*/
struct dirent *direntP; /* directory entry structure
*/
struct stat info; /* dir/file information
*/
int volume_number; /* what it says...
*/
int rc = 0; /* function return codes
*/
int kk = 0; /* local counter
*/
char data[] = "The quick red fox jumped over the fence";
/*****************************************************************/
/* Retrieve the list of volumes from the QOPT physical file
*/
/* system by opening the QOPT pfs root directory and reading the
*/
/* directory entries.
*/
/*****************************************************************/
memset(path, /* clear path name
*/
0x00,
sizeof(path));
strcpy(path, /* set physical file system
*/
"/QOPT");
rc = stat("/QOPT", &info);; /* determine number of files
*/
if (rc != 0)
perror("stat() failed:");
dirP = opendir(path); /* open the directory
*/
if (dirP == NULL)
perror("opendir() failed:");
for (kk = 1; kk <= info.st_nlink; kk++)
{
direntP = readdir(dirP);
if (direntP == NULL)
perror("readdir() failed:");
printf("%d) %s\n", kk, direntP->d_name);
}
/*****************************************************************/
/* Prompt user for the volume they want to work with and make it
*/
/* the current directory.
*/
/*****************************************************************/
printf("\nEnter the number the volume you want to work with:\n");
scanf("%d", &volume_number);;
rewinddir(dirP); /* beginning of directory
*/
for (kk = 1; kk <= volume_number; kk++)
direntP = readdir(dirP); /* get requested dir. entry */
strcat(path, "/");
strcat(path, direntP->d_name);
rc = chdir(path); /* set current working dir.
*/
if (rc != 0)
perror("chdir() failed:");
if (getcwd(path, sizeof(path)) == NULL)
perror("getcwd() failed:");
printf("\nThe current working directory is: %s\n", path);
rc = closedir(dirP); /* close the directory
*/
if (rc != 0)
perror("closedir() failed:");
/*****************************************************************/
/* Create and open a file write only. If the file exists it
*/
/* will be truncated. The owner will have read, write, and
*/
/* execute authority to the file.
*/
/*****************************************************************/
strcat(path, "/");
printf("\nEnter a file name:\n");
scanf("%s", &path[strlen(path)]);
filedes = creat(path, S_IRWXU);
if (filedes == -1)
{
perror("creat() failed");
return;
}
rc = write(filedes, data, sizeof(data));
if (rc == -1)
perror("write() failed:");
close(filedes);
/*****************************************************************/
/* Read back the file and print it.
*/
/*****************************************************************/
memset(data, 0x00, sizeof(data));
filedes = open(path, O_RDWR);
if (filedes == -1)
{
perror("open() failed");
return;
}
read(filedes, data, sizeof(data));
if (filedes == -1)
{
perror("read() failed");
return;
}
printf("\nThe data written to file is: %s\n", data);
/*****************************************************************/
/* Change the offset into the file and change part of it. Read
*/
/* the entire file, print it out and close the file.
*/
/*****************************************************************/
lseek(filedes, 4, SEEK_SET);
rc = write(filedes, "slow old ", 9);
if (rc == -1)
{
perror("write() failed");
return;
}
lseek(filedes, 18, SEEK_SET);
rc = write(filedes, "went under ", 11);
if (rc == -1)
{
perror("write() failed");
return;
}
lseek(filedes, 0, SEEK_SET);
read(filedes, data, sizeof(data));
if (filedes == -1)
{
perror("read() failed");
return;
}
printf("\nThe data now is: %s\n", data);
close(filedes);
printf("Done...\n");
return;
}
Harry Williams wrote:
> Does anyone have an example reading an IFS or NSF object. I have
> API's from
> > RPG, but I do not have the DD specifications or know how to access
> these
> > objects in MI.
>
> Happy Holidays.
> Harry
>
> _______________________________________________
> This is the MI Programming on the AS400 / iSeries (MI400) mailing list
> To post a message email: MI400@midrange.com
> To subscribe, unsubscribe, or change list options,
> visit: http://lists.midrange.com/cgi-bin/listinfo/mi400
> or email: MI400-request@midrange.com
> Before posting, please take a moment to review the archives
> at http://archive.midrange.com/mi400.
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.