3 * VMS-specific C header file for perl5.
5 * Last revised: 12-Dec-1994 by Charles Bailey bailey@genetics.upenn.edu
8 #ifndef __vmsish_h_included
9 #define __vmsish_h_included
11 #include <descrip.h> /* for dirent struct definitions */
12 #include <libdef.h> /* status codes for various places */
13 #include <rmsdef.h> /* at which errno and vaxc$errno are */
14 #include <ssdef.h> /* explicitly set in the perl source code */
16 /* DEC's C compilers and gcc use incompatible definitions of _to(upp|low)er() */
20 #define _toupper(c) (((c) < 'a' || (c) > 'z') ? (c) : (c) & ~040)
24 #define _tolower(c) (((c) < 'A' || (c) > 'Z') ? (c) : (c) | 040)
26 /* Assorted things to look like Unix */
28 #ifndef _IOLBF /* gcc's stdio.h doesn't define this */
32 #include <processes.h> /* for vfork() */
35 #include <file.h> /* it's not <sys/file.h>, so don't use I_SYS_FILE */
36 #define unlink kill_file
38 /* Macros to set errno using the VAX thread-safe calls, if present */
39 #if (defined(__DECC) || defined(__DECCXX)) && !defined(__ALPHA)
40 # define set_errno(v) (cma$tis_errno_set_value(v))
41 # define set_vaxc_errno(v) (vaxc$errno = (v))
43 # define set_errno(v) (errno = (v))
44 # define set_vaxc_errno(v) (vaxc$errno = (v))
47 /* Handy way to vet calls to VMS system services and RTL routines. */
48 #define _ckvmssts(call) { register unsigned long int __ckvms_sts; \
49 if (!((__ckvms_sts=(call))&1)) { \
50 set_errno(EVMSERR); set_vaxc_errno(__ckvms_sts); \
51 croak("Fatal VMS error at %s, line %d",__FILE__,__LINE__); } }
54 #include "sockadapt.h"
58 * The following symbols are defined (or undefined) according to the RTL
59 * support VMS provides for the corresponding functions. These don't
60 * appear in config.h, so they're dealt with here.
65 /* The VMS C RTL has vfork() but not fork(). Both actually work in a way
66 * that's somewhere between Unix vfork() and VMS lib$spawn(), so it's
67 * probably not a good idea to use them much. That said, we'll try to
68 * use vfork() in either case.
73 * fwrite1() should be a routine with the same calling sequence as fwrite(),
74 * but which outputs all of the bytes requested as a single stream (unlike
75 * fwrite() itself, which on some systems outputs several distinct records
76 * if the number_of_items parameter is >1).
78 #define fwrite1 my_fwrite
80 /* Use our own rmdir() */
81 #define rmdir(name) do_rmdir(name)
83 /* Assorted fiddling with sigs . . . */
85 #define ABORT() abort()
87 /* Used with our my_utime() routine in vms.c */
92 #define utime my_utime
94 /* This is what times() returns, but <times.h> calls it tbuffer_t on VMS */
97 clock_t tms_utime; /* user time */
98 clock_t tms_stime; /* system time - always 0 on VMS */
99 clock_t tms_cutime; /* user time, children */
100 clock_t tms_cstime; /* system time, children - always 0 on VMS */
103 /* VMS doesn't use a real sys_nerr, but we need this when scanning for error
104 * messages in text strings . . .
107 #define sys_nerr EVMSERR /* EVMSERR is as high as we can go. */
109 /* Look up new %ENV values on the fly */
110 #define DYNAMIC_ENV_FETCH 1
111 #define ENV_HV_NAME "%EnV%VmS%"
113 /* Use our own stat() clones, which handle Unix-style directory names */
114 #define Stat(name,bufptr) flex_stat(name,bufptr)
115 #define Fstat(fd,bufptr) flex_fstat(fd,bufptr)
117 /* Setup for the dirent routines:
118 * opendir(), closedir(), readdir(), seekdir(), telldir(), and
119 * vmsreaddirversions(), and preprocessor stuff on which these depend:
120 * Written by Rich $alz, <rsalz@bbn.com> in August, 1990.
121 * This code has no copyright.
123 /* Data structure returned by READDIR(). */
125 char d_name[256]; /* File name */
126 int d_namlen; /* Length of d_name */
127 int vms_verscount; /* Number of versions */
128 int vms_versions[20]; /* Version numbers */
131 /* Handle returned by opendir(), used by the other routines. You
132 * are not supposed to care what's inside this structure. */
133 typedef struct _dirdesc {
135 int vms_wantversions;
136 unsigned long int count;
139 struct dsc$descriptor_s pat;
142 #define rewinddir(dirp) seekdir((dirp), 0)
144 /* used for our emulation of getpw* */
146 char *pw_name; /* Username */
148 Uid_t pw_uid; /* UIC member number */
149 Gid_t pw_gid; /* UIC group number */
150 char *pw_comment; /* Default device/directory (Unix-style) */
151 char *pw_gecos; /* Owner */
152 char *pw_dir; /* Default device/directory (VMS-style) */
153 char *pw_shell; /* Default CLI name (eg. DCL) */
155 #define pw_unixdir pw_comment /* Default device/directory (Unix-style) */
156 #define getpwnam my_getpwnam
157 #define getpwuid my_getpwuid
158 #define getpwent my_getpwent
159 #define endpwent my_endpwent
160 #define setpwent my_endpwent
162 /* Our own stat_t substitute, since we play with st_dev and st_ino -
163 * we want atomic types so Unix-bound code which compares these fields
164 * for two files will work most of the time under VMS
166 /* First, grab the system types, so we don't clobber them later */
168 /* Since we've got to match the size of the CRTL's stat_t, we need
169 * to mimic DECC's alignment settings.
171 #if defined(__DECC) || defined(__DECCXX)
172 # pragma __member_alignment __save
173 # pragma __nomember_alignment
176 # pragma __message __save
177 # pragma __message disable (__MISALGNDSTRCT)
178 # pragma __message disable (__MISALGNDMEM)
182 char *st_devnam; /* pointer to device name */
184 unsigned short fid[3];
185 unsigned long st_ino_mostly;
187 unsigned short st_mode; /* file "mode" i.e. prot, dir, reg, etc. */
188 int st_nlink; /* for compatibility - not really used */
189 unsigned st_uid; /* from ACP - QIO uic field */
190 unsigned short st_gid; /* group number extracted from st_uid */
191 dev_t st_rdev; /* for compatibility - always zero */
192 off_t st_size; /* file size in bytes */
193 unsigned st_atime; /* file access time; always same as st_mtime */
194 unsigned st_mtime; /* last modification time */
195 unsigned st_ctime; /* file creation time */
196 char st_fab_rfm; /* record format */
197 char st_fab_rat; /* record attributes */
198 char st_fab_fsz; /* fixed header size */
199 unsigned st_dev; /* encoded device name */
204 #define st_ino st_inode_u.st_ino_mostly
206 typedef unsigned mydev_t;
207 #define dev_t mydev_t
208 typedef unsigned long myino_t;
209 #define ino_t myino_t
210 #if defined(__DECC) || defined(__DECCXX)
211 # pragma __member_alignment __restore
214 # pragma __message __restore
216 /* Cons up a 'delete' bit for testing access */
217 #define S_IDUSR (S_IWUSR | S_IXUSR)
218 #define S_IDGRP (S_IWGRP | S_IXGRP)
219 #define S_IDOTH (S_IWOTH | S_IXOTH)
221 /* Prototypes for functions unique to vms.c. Don't include replacements
222 * for routines in the mainline source files excluded by #ifndef VMS;
223 * their prototypes are already in proto.h.
225 * In order to keep Gen_ShrFls.Pl happy, functions which are to be made
226 * available to images linked to PerlShr.Exe must be declared between the
227 * __VMS_PROTOTYPES__ and __VMS_SEPYTOTORP__ lines, and must be in the form
228 * <data type><TAB>name<WHITESPACE>_((<prototype args>));
230 typedef char __VMS_PROTOTYPES__; /* prototype section start marker */
231 char * my_getenv _((char *));
232 unsigned long int waitpid _((unsigned long int, int *, int));
233 char * my_gconvert _((double, int, int, char *));
234 int do_rmdir _((char *));
235 int kill_file _((char *));
236 int my_utime _((char *, struct utimbuf *));
237 char * fileify_dirspec _((char *, char *));
238 char * fileify_dirspec_ts _((char *, char *));
239 char * pathify_dirspec _((char *, char *));
240 char * pathify_dirspec_ts _((char *, char *));
241 char * tounixspec _((char *, char *));
242 char * tounixspec_ts _((char *, char *));
243 char * tovmsspec _((char *, char *));
244 char * tovmsspec_ts _((char *, char *));
245 char * tounixpath _((char *, char *));
246 char * tounixpath_ts _((char *, char *));
247 char * tovmspath _((char *, char *));
248 char * tovmspath_ts _((char *, char *));
249 void getredirection _(());
250 DIR * opendir _((char *));
251 struct dirent * readdir _((DIR *));
252 long telldir _((DIR *));
253 void seekdir _((DIR *, long));
254 void closedir _((DIR *));
255 void vmsreaddirversions _((DIR *, int));
256 void getredirection _((int *, char ***));
257 I32 cando_by_name _((I32, I32, char *));
258 int flex_fstat _((int, struct stat *));
259 int flex_stat _((char *, struct stat *));
260 int trim_unixpath _((char *, char*));
261 bool vms_do_aexec _((SV *, SV **, SV **));
262 bool vms_do_exec _((char *));
263 unsigned long int do_aspawn _((SV *, SV **, SV **));
264 unsigned long int do_spawn _((char *));
265 int my_fwrite _((void *, size_t, size_t, FILE *));
266 struct passwd * my_getpwnam _((char *name));
267 struct passwd * my_getpwuid _((Uid_t uid));
268 struct passwd * my_getpwent _(());
269 void my_endpwent _(());
270 void init_os_extras _(());
271 typedef char __VMS_SEPYTOTORP__; /* prototype section end marker */
273 #ifndef VMS_DO_SOCKETS
274 /* This relies on tricks in perl.h to pick up that these manifest constants
275 * are undefined and set up conversion routines. It will then redefine
276 * these manifest constants, so the actual values will match config.h
284 #endif /* __vmsish_h_included */