2 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
3 2007 Free Software Foundation, Inc.
4 This file is part of GNU Make.
6 GNU Make is free software; you can redistribute it and/or modify it under the
7 terms of the GNU General Public License as published by the Free Software
8 Foundation; either version 3 of the License, or (at your option) any later
11 GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13 A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License along with
16 this program. If not, see <http://www.gnu.org/licenses/>. */
37 struct DIR *dir
= (struct DIR *)xmalloc (sizeof (struct DIR));
38 struct NAM
*dnam
= (struct NAM
*)xmalloc (sizeof (struct NAM
));
39 struct FAB
*dfab
= &dir
->fab
;
40 char *searchspec
= xmalloc (MAXNAMLEN
+ 1);
42 memset (dir
, 0, sizeof *dir
);
46 sprintf (searchspec
, "%s*.*;", dspec
);
48 dfab
->fab$l_fna
= searchspec
;
49 dfab
->fab$b_fns
= strlen (searchspec
);
50 dfab
->fab$l_nam
= dnam
;
53 dnam
->nam$l_esa
= searchspec
;
54 dnam
->nam$b_ess
= MAXNAMLEN
;
56 if (! (sys$
parse (dfab
) & 1))
67 #define uppercasify(str) \
71 for (tmp = (str); *tmp != '\0'; tmp++) \
72 if (islower ((unsigned char)*tmp)) \
73 *tmp = toupper ((unsigned char)*tmp); \
80 struct FAB
*dfab
= &dir
->fab
;
81 struct NAM
*dnam
= (struct NAM
*)(dfab
->fab$l_nam
);
82 struct direct
*dentry
= &dir
->dir
;
85 memset (dentry
, 0, sizeof *dentry
);
87 dnam
->nam$l_rsa
= dir
->d_result
;
88 dnam
->nam$b_rss
= MAXNAMLEN
;
90 DB (DB_VERBOSE
, ("."));
92 if (!((i
= sys$
search (dfab
)) & 1))
94 DB (DB_VERBOSE
, (_("sys$search failed with %d\n"), i
));
99 if (dnam
->nam$w_fid
== 0)
100 dentry
->d_fileno
= 1;
102 dentry
->d_fileno
= dnam
->nam$w_fid
[0] + (dnam
->nam$w_fid
[1] << 16);
104 dentry
->d_reclen
= sizeof (struct direct
);
105 dentry
->d_namlen
= dnam
->nam$b_name
+ dnam
->nam$b_type
;
106 strncpy (dentry
->d_name
, dnam
->nam$l_name
, dentry
->d_namlen
);
107 dentry
->d_name
[dentry
->d_namlen
] = '\0';
109 #ifdef HAVE_CASE_INSENSITIVE_FS
110 uppercasify (dentry
->d_name
);
121 struct FAB
*dfab
= &dir
->fab
;
122 struct NAM
*dnam
= (struct NAM
*)(dfab
->fab$l_nam
);
124 free (dnam
->nam$l_esa
);
131 #endif /* compiled for OpenVMS prior to V7.x */
136 static char buf
[512];
139 return (getcwd (cwd
, 512));
141 return (getcwd (buf
, 512));
145 vms_stat (char *name
, struct stat
*buf
)
150 static struct FAB Fab
;
151 static struct NAM Nam
;
152 static struct fibdef Fib
; /* short fib */
153 static struct dsc$descriptor FibDesc
=
154 { sizeof (Fib
), DSC$K_DTYPE_Z
, DSC$K_CLASS_S
, (char *) &Fib
};
155 static struct dsc$descriptor_s DevDesc
=
156 { 0, DSC$K_DTYPE_T
, DSC$K_CLASS_S
, &Nam
.nam$t_dvi
[1] };
157 static char EName
[NAM$C_MAXRSS
];
158 static char RName
[NAM$C_MAXRSS
];
159 static struct dsc$descriptor_s FileName
=
160 { 0, DSC$K_DTYPE_T
, DSC$K_CLASS_S
, 0 };
161 static struct dsc$descriptor_s string
=
162 { 0, DSC$K_DTYPE_T
, DSC$K_CLASS_S
, 0 };
163 static unsigned long Rdate
[2];
164 static unsigned long Cdate
[2];
165 static struct atrdef Atr
[] =
169 { sizeof (Rdate
), ATR$C_REVDATE
, (unsigned int) &Rdate
[0] },
171 { sizeof (Cdate
), ATR$C_CREDATE
, (unsigned int) &Cdate
[0] },
174 { sizeof (Rdate
), ATR$C_REVDATE
, &Rdate
[0] },
176 { sizeof (Cdate
), ATR$C_CREDATE
, &Cdate
[0]},
180 static short int DevChan
;
181 static short int iosb
[4];
183 name
= vmsify (name
, 0);
185 /* initialize RMS structures, we need a NAM to retrieve the FID */
187 Fab
.fab$l_fna
= name
; /* name of file */
188 Fab
.fab$b_fns
= strlen (name
);
189 Fab
.fab$l_nam
= &Nam
; /* FAB has an associated NAM */
192 Nam
.nam$l_esa
= EName
; /* expanded filename */
193 Nam
.nam$b_ess
= sizeof (EName
);
194 Nam
.nam$l_rsa
= RName
; /* resultant filename */
195 Nam
.nam$b_rss
= sizeof (RName
);
197 /* do $PARSE and $SEARCH here */
198 status
= sys$
parse (&Fab
);
202 DevDesc
.dsc$w_length
= Nam
.nam$t_dvi
[0];
203 status
= sys$
assign (&DevDesc
, &DevChan
, 0, 0);
207 FileName
.dsc$a_pointer
= Nam
.nam$l_name
;
208 FileName
.dsc$w_length
= Nam
.nam$b_name
+ Nam
.nam$b_type
+ Nam
.nam$b_ver
;
210 /* Initialize the FIB */
211 for (i
= 0; i
< 3; i
++)
214 Fib
.fib$w_fid
[i
] = Nam
.nam$w_fid
[i
];
215 Fib
.fib$w_did
[i
] = Nam
.nam$w_did
[i
];
217 Fib
.fib$r_fid_overlay
.fib$w_fid
[i
] = Nam
.nam$w_fid
[i
];
218 Fib
.fib$r_did_overlay
.fib$w_did
[i
] = Nam
.nam$w_did
[i
];
222 status
= sys$
qiow (0, DevChan
, IO$_ACCESS
, &iosb
, 0, 0,
223 &FibDesc
, &FileName
, 0, 0, &Atr
, 0);
224 sys$
dassgn (DevChan
);
231 status
= stat (name
, buf
);
235 buf
->st_mtime
= ((Rdate
[0] >> 24) & 0xff) + ((Rdate
[1] << 8) & 0xffffff00);
236 buf
->st_ctime
= ((Cdate
[0] >> 24) & 0xff) + ((Cdate
[1] << 8) & 0xffffff00);
242 cvt_time (unsigned long tval
)
244 static long int date
[2];
246 static struct dsc$descriptor date_str
=
247 { 26, DSC$K_DTYPE_T
, DSC$K_CLASS_S
, str
};
249 date
[0] = (tval
& 0xff) << 24;
250 date
[1] = ((tval
>> 8) & 0xffffff);
252 if ((date
[0] == 0) && (date
[1] == 0))
255 sys$
asctim (0, &date_str
, date
, 0);