Chapter Contents

Previous

Next
osdfind

osdfind



Find the First OS/390 File or Member Matching a Pattern

Portability: SAS/C extension


SYNOPSIS
DESCRIPTION
RETURN VALUE
CAUTION
EXAMPLE
RELATED FUNCTIONS
SEE ALSO


SYNOPSIS

#include <os.h>

int osdfind(struct DSNINFO *info, const char *pattern);


DESCRIPTION

osdfind searches for an OS/390 data set or PDS member whose name matches the pattern pointed to by pattern . Information about the first matching file is returned in the structure pointed to by info . Additional matching files can be retrieved using the osdnext function.

The pattern has the form of a OS/390 data set name, with several extensions:

The header file <os.h> defines the structure DSNINFO . This structure is used for osdfind , osdnext , and osdquit . The structure is defined as

struct DSNINFO {    /* argument structure for osdfind/osdnext  */
  void * _ [4] ;                /* reserved for library use     */
  char cattype;                 /* catalog entry type           */
  char dsname [45] ;            /* null-terminated full dsname  */
  char mem [9] ;                /* null-terminated member name  */
  char __;                      /* padding                      */
  unsigned TTR: 24;             /* TTR of start of member       */
  unsigned alias: 1;            /* alias member bit             */
  unsigned user_TTR_count: 2;   /* number of user TTRs          */
  unsigned user_data_halfwords: 5;   /* halfwords of user data  */
  char user_data [62] ;         /* user data from PDS directory */
};

The following paragraphs describe some of the members of this structure.

The cattype member is a one-character code indicating the type of file. The values are
A non VSAM data set
B GDG base
C VSAM cluster
D VSAM data component
G VSAM alternate index
I VSAM index component
M master catalog
P page space
R VSAM path
U user catalog
X alias name

The mem element is the member name when you specify a pattern ending in an asterisk in parentheses (*). The mem element is a null string for other patterns.

The TTR, alias, user_TTR_count, user_data_halfwords , and user_data members contain information from the PDS directory entry for the member when an (*) pattern is specified. See the MVS Data Administration Guide for more information on PDS directory structures. These fields are not meaningful when the pattern does not request the return of PDS members.


RETURN VALUE

osdfind returns 0 if a matching data set or PDS member is found or -1 if no match is found. Other negative values may be returned to indicate fatal errors, after which no more names can be returned. If a minor error occurs, a positive value may be returned, indicating that the names of some files or members could not be returned, but that another call to osdfind may successfully return additional names. For example, if osdfind is unable to return PDS members because a PDS directory is corrupt, osdfind returns a positive return code to indicate that it may be possible to return members of other PDSs matching the pattern.


CAUTION

osdfind assumes the PDS directory for an (*) pattern is not modified during processing. If a write to the data set or member occurs during the execution of osdfind , the results are unpredictable. The results are also unpredictable if files or members matching the pattern are added or deleted between the call to osdfind and the corresponding osdquit .

The first 16 bytes of the DSNINFO structure are reserved for use in subsequent calls to osdnext . Do not alter this area because the effects are unpredictable.

The catalog searches by osdfind use a 65-K buffer to hold data set names. For this reason, all matching filenames may not be returned if the highest level qualifier identifies more than about 1,400 filenames. For example, if there are more than 1,400 files under the index ORDERS, then osdfind with the pattern ORDERS.*.LOG returns only matching names from the first 1,400. This is a limitation of the operating system, not of SAS/C.


EXAMPLE

This example uses osdfind and osdnext to search all the user's .C files for members that are defined in the SPF statistics as belonging to a specific userid:

#include <os.h>
#include <string.h>
#include <stdio.h>

void findmine(char *id) {

   struct spfstat {  /* This structure maps SPF statistics. */
      char version;
      char mod;
      char pad1[2];
      int created;       /* Julian date, packed decimal     */
      int changed;       /* Julian date, packed decimal     */
      char changet[2];   /* time changed, hours and minutes */
      short size;
      short init;
      short modified;
      char userid[8];    /* who edited it last              */
   } *s;
   struct DSNINFO d;     /* Return information from         */
                         /*  osdfind/osdnext.               */
   int rc;
   rc = osdfind(&d, ".*.c(*)");    /* Find all my .C files. */
   while(rc >= 0) {
      char resp;
      if (rc > 0) {
         puts("Error searching .C files.  Continue?");
         scanf(" %c", &resp);
         if (resp != 'y' && resp != 'Y') {
            osdquit(&d); /* If not continuing, free memory. */
            break;
         }
      }
      else if (d.user_data_halfwords >=

            /* if user data looks like SPF data             */
         sizeof(struct spfstat)/2) {
         s = (struct spfstats *) d.user_data;

            /* if it's owned by this id                     */
         if (memcmp(s->userid, id, 8) == 0)

               /* Print filename and member.                */   
            printf("%s(%s)\n", d.dsname, d.mem);
      }
      rc = osdnext(&d);             /* Proceed to next one. */
   }
}


RELATED FUNCTIONS

cmsdfind , cmsffind , opendir , osdnext , osdquit


SEE ALSO


Chapter Contents

Previous

Next

Top of Page

Copyright © 2001 by SAS Institute Inc., Cary, NC, USA. All rights reserved.