| 1 | /* | 
|---|
| 2 | <vms_fab> | 
|---|
| 3 |  | 
|---|
| 4 | This macro sets up the file access block and name block for VMS. | 
|---|
| 5 | It also does the initial parsing of the input string (resolving | 
|---|
| 6 | wildcards, | 
|---|
| 7 | if any) and finds all files matching the input pattern. | 
|---|
| 8 | The address of the first matching pattern is returned. | 
|---|
| 9 |  | 
|---|
| 10 | Written by Phillip C. Brisco 8/98. | 
|---|
| 11 | */ | 
|---|
| 12 | #include "vms_fab.h" | 
|---|
| 13 |  | 
|---|
| 14 | void | 
|---|
| 15 | vms_fab (int * argp, char **argvp[]) | 
|---|
| 16 | { | 
|---|
| 17 | extern int optind; | 
|---|
| 18 | int optout; | 
|---|
| 19 |  | 
|---|
| 20 | fab = cc$rms_fab; | 
|---|
| 21 | nam = cc$rms_nam; | 
|---|
| 22 |  | 
|---|
| 23 | optout = 0; | 
|---|
| 24 | strcpy (fna_buffer, *argvp[optind]); | 
|---|
| 25 | length_of_fna_buffer = NAM$C_MAXRSS; | 
|---|
| 26 |  | 
|---|
| 27 | fab.fab$b_bid = FAB$C_BID; | 
|---|
| 28 | fab.fab$b_bln = FAB$C_BLN; | 
|---|
| 29 | fab.fab$l_fop = FAB$M_NAM; | 
|---|
| 30 | fab.fab$l_nam = &nam; | 
|---|
| 31 | fab.fab$l_fna = (char *)&fna_buffer; | 
|---|
| 32 | fab.fab$b_fns = length_of_fna_buffer; | 
|---|
| 33 |  | 
|---|
| 34 | nam.nam$b_bid = NAM$C_BID; | 
|---|
| 35 | nam.nam$b_bln = NAM$C_BLN; | 
|---|
| 36 | nam.nam$l_esa = (char *)&expanded_name; | 
|---|
| 37 | nam.nam$b_ess = NAM$C_MAXRSS; | 
|---|
| 38 | nam.nam$l_rsa = (char *)&result_name; | 
|---|
| 39 | nam.nam$b_rss = NAM$C_MAXRSS; | 
|---|
| 40 |  | 
|---|
| 41 | fab_stat = sys$parse (&fab); | 
|---|
| 42 | fab_stat = sys$search (&fab); | 
|---|
| 43 |  | 
|---|
| 44 | if (fab_stat != 65537) | 
|---|
| 45 | { | 
|---|
| 46 | fprintf (stderr, "No Matches found.\n"); | 
|---|
| 47 | exit (0); | 
|---|
| 48 | } | 
|---|
| 49 |  | 
|---|
| 50 | /* | 
|---|
| 51 | While we find matching patterns, continue searching for more. | 
|---|
| 52 | */ | 
|---|
| 53 | while (fab_stat == 65537) | 
|---|
| 54 | { | 
|---|
| 55 | /* | 
|---|
| 56 | Allocate memory for the filename | 
|---|
| 57 | */ | 
|---|
| 58 | arr_ptr[optout] = alloca (max_file_path_size + 1); | 
|---|
| 59 |  | 
|---|
| 60 | strcpy (arr_ptr[optout], result_name); | 
|---|
| 61 |  | 
|---|
| 62 | /* | 
|---|
| 63 | If we don't tack on a null character at the end of the | 
|---|
| 64 | filename, | 
|---|
| 65 | we can get partial data which is still there from the last | 
|---|
| 66 | sys$search command. | 
|---|
| 67 | */ | 
|---|
| 68 | arr_ptr[optout][nam.nam$b_dev + | 
|---|
| 69 | nam.nam$b_dir + | 
|---|
| 70 | nam.nam$b_name + | 
|---|
| 71 | nam.nam$b_type + | 
|---|
| 72 | nam.nam$b_ver] = '\0'; | 
|---|
| 73 |  | 
|---|
| 74 | fab_stat = sys$search (&fab); | 
|---|
| 75 | optout++; | 
|---|
| 76 | } | 
|---|
| 77 |  | 
|---|
| 78 | optout--; | 
|---|
| 79 |  | 
|---|
| 80 | /* Return a pointer to the beginning of memory that has the expanded | 
|---|
| 81 | filenames. | 
|---|
| 82 | */ | 
|---|
| 83 | *argp = optout; | 
|---|
| 84 | *argvp = arr_ptr; | 
|---|
| 85 |  | 
|---|
| 86 | } | 
|---|