List File System Names (Version 1)
Purpose
Returns the names of the file systems contained in a specified aggregate on this system; the aggregate must be attached.
IBM recommends that you should use the List Detailed File System Information API instead of List Aggregate Status or List File System Status.
Format
syscall_parmlist
opcode int 138 AGOP_LISTFSNAMES_PARMDATA
parms[0] int offset to AGGR_ID
parms[1] int buffer length or 0
parms[2] int offset to buffer or 0
parms[3] int offset to size
parms[4] int 0
parms[5] int 0
parms[6] 0
AGGR_ID
aid_eye char[4] "AGID"
aid_len char sizeof(AGGR_ID)
aid_ver char 1
aid_name char[45] "OMVS.PRV.AGGR001.LDS0001"
aid_reserved char[33] 0
FS_ID[n] Array of FS_IDs (n can be zero)
fsid_eye char[4] "FSID"
fsid_len char sizeof(FS_ID)
fsid_ver char 1
fsid_res1 char 0
fsid_res2 char 0
fsid_id
high unsigned int
low unsigned int
fsid_aggrname char[45]
fsid_name char[45]
fsid_reserved char[32]
fsid_reserved2 char[2]
size int
Return_value 0 if request is successful, -1 if it is not successful
Return_code
EINTR ZFS is shutting down
EINVAL Invalid parameter list
EMVSERR Internal error using an osi service
ENOENT Aggregate is not attached
E2BIG List is too big for buffer supplied
Reason_code
0xEFnnxxxx See z/OS Distributed File Service Messages and Codes
Usage notes
- Reserved fields and undefined flags must be set to binary zeros.
Privilege required
None.
Related services
- List Attached Aggregate Names
- List Detailed File System Information
- List File System Status
Restrictions
None.
Examples
#pragma linkage(BPX1PCT, OS)
extern void BPX1PCT(char *, int, int, char *, int *, int *, int *);
#include <stdio.h>
#define ZFSCALL_AGGR 0x40000005
#define AGOP_LISTFSNAMES_PARMDATA 138
#define E2BIG 145
typedef struct syscall_parmlist_t {
int opcode; /* Operation code to perform */
int parms[7]; /* Specific to type of operation, */
/* provides access to the parms */
/* parms[4]-parms[6] are currently unused*/
} syscall_parmlist;
#define ZFS_MAX_AGGRNAME 44
#define ZFS_MAX_FSYSNAME 44
typedef struct aggr_id_t {
char aid_eye[4]; /* Eye Catcher */
#define AID_EYE "AGID"
char aid_len; /* Length of this structure */
char aid_ver; /* Version */
#define AID_VER_INITIAL 1 /* Initial version */
char aid_name[ZFS_MAX_AGGRNAME+1]; /* aggr name, null terminated */
char aid_reserved[33]; /* Reserved for the future */
} AGGR_ID;
typedef struct hyper { /* This is a 64 bit integer to zFS */
unsigned int high;
unsigned int low;
} hyper;
typedef struct fs_id_t {
char fsid_eye[4]; /* Eye catcher */
#define FSID_EYE "FSID"
char fsid_len; /* Length of this structure */
char fsid_ver; /* Version */
char fsid_res1; /* Reserved. */
char fsid_res2; /* Reserved. */
hyper fsid_id; /* Internal identifier */
#define FSID_VER_INITIAL 1 /* Initial version */
char fsid_aggrname[ZFS_MAX_AGGRNAME+1]; /*Aggregate name,can be NULL string*/
char fsid_name[ZFS_MAX_FSYSNAME+1]; /* Name, null terminated */
char fsid_reserved[32]; /* Reserved for the future */
char fsid_reserved2[2]; /* Reserved for the future */
} FS_ID;
struct parmstruct {
syscall_parmlist myparms;
AGGR_ID aggr_id;
/* Real malloc'd structure will have an array of FS_IDs here */
int size;
};
int main(int argc, char **argv)
{
int bpxrv;
int bpxrc;
int bpxrs;
struct parmstruct myparmstruct;
AGGR_ID *aggPtr;
FS_ID *fsPtr;
int fsSize = sizeof(FS_ID);
int buflen = sizeof(FS_ID);
struct parmstruct *myp = &myparmstruct;
int mypsize;
int count_fs;
int total_fs;
char aggrname[45] = "PLEX.DCEIMGQX.FS";
/* Ensure reserved fields are 0 */
memset(&myparmstruct.aggr_id, 0, sizeof(AGGR_ID));
memcpy(&myparmstruct.aggr_id.aid_eye, AID_EYE, 4);
myparmstruct.aggr_id.aid_len = sizeof(AGGR_ID);
myparmstruct.aggr_id.aid_ver = AID_VER_INITIAL;
strcpy(myparmstruct.aggr_id.aid_name, aggrname);
myparmstruct.myparms.opcode = AGOP_LISTFSNAMES_PARMDATA;
myparmstruct.myparms.parms[0] = sizeof(syscall_parmlist);
myparmstruct.myparms.parms[1] = 0;
myparmstruct.myparms.parms[2] = 0;
myparmstruct.myparms.parms[3] = sizeof(syscall_parmlist) + sizeof(AGGR_ID);
myparmstruct.myparms.parms[4] = 0;
myparmstruct.myparms.parms[5] = 0;
myparmstruct.myparms.parms[6] = 0;
BPX1PCT("ZFS ",
ZFSCALL_AGGR, /* Aggregate operation */
sizeof(myparmstruct), /* Length of Argument */
(char *)&myparmstruct, /* Pointer to Argument */
&bpxrv, /* Pointer to Return_value */
&bpxrc, /* Pointer to Return_code */
&bpxrs); /* Pointer to Reason_code */
if (bpxrv < 0)
{
if (bpxrc == E2BIG)
{
buflen = myp->size; /* Get buffer size needed */
mypsize = buflen +
sizeof(syscall_parmlist) +
sizeof(AGGR_ID) +
sizeof(int);
myp = (struct parmstruct *)malloc((int)mypsize);
memset(myp, 0, mypsize);
memcpy(myp->aggr_id.aid_eye, AID_EYE, 4);
myp->aggr_id.aid_len = sizeof(AGGR_ID);
myp->aggr_id.aid_ver = AID_VER_INITIAL;
strcpy(myp->aggr_id.aid_name, aggrname);
myp->myparms.opcode = AGOP_LISTFSNAMES_PARMDATA;
myp->myparms.parms[0] = sizeof(syscall_parmlist);
myp->myparms.parms[1] = buflen;
myp->myparms.parms[2] = sizeof(syscall_parmlist) + sizeof(AGGR_ID);
myp->myparms.parms[3] = sizeof(syscall_parmlist) +
sizeof(AGGR_ID) +
buflen;
myp->myparms.parms[4] = 0;
myp->myparms.parms[5] = 0;
myp->myparms.parms[6] = 0;
BPX1PCT("ZFS ",
ZFSCALL_AGGR, /* Aggregate operation */
mypsize, /* Length of Argument */
(char *)myp, /* Pointer to Argument */
&bpxrv, /* Pointer to Return_value */
&bpxrc, /* Pointer to Return_code */
&bpxrs); /* Pointer to Reason_code */
if (bpxrv == 0)
{
total_fs = buflen / fsSize;
printf("total file systems = %d\n", total_fs);
count_fs = 1;
for (fsPtr = (FS_ID * ) & (myp->size);
count_fs <= total_fs;
fsPtr++, count_fs++)
printf("%-64.64s\n", fsPtr->fsid_name);
free(myp);
}
else
{ /* lsaggr names failed with large enough buffer */
printf("Error on ls fs with large enough buffer\n");
printf("BPXRV = %d BPXRC = %d BPXRS = %x\n", bpxrv, bpxrc, bpxrs);
free(myp);
return bpxrc;
}
}
else
{ /* error was not E2BIG */
printf("Error on ls fs trying to get required size\n");
printf("BPXRV = %d BPXRC = %d BPXRS = %x\n", bpxrv, bpxrc, bpxrs);
free(myp);
return bpxrc;
}
}
else
{ /* asking for buffer size gave rv = 0; maybe there are no file systems */
if (myparmstruct.size == 0)
printf("No file systems\n");
else /* No, there was some other problem with getting the size needed */
printf("Error getting size required\n");
}
return 0;
}