ce6829060ee37d9827c78a240fa9b5697c3b4389
[p5sagit/p5-mst-13.2.git] / vms / vmsish.h
1 /*  vmsish.h
2  *
3  * VMS-specific C header file for perl5.
4  *
5  * Last revised: 12-Dec-1994 by Charles Bailey  bailey@genetics.upenn.edu
6  */
7
8 #ifndef __vmsish_h_included
9 #define __vmsish_h_included
10
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 */
15
16 /* DEC's C compilers and gcc use incompatible definitions of _to(upp|low)er() */
17 #ifdef _toupper
18 #  undef _toupper
19 #endif
20 #define _toupper(c) (((c) < 'a' || (c) > 'z') ? (c) : (c) & ~040)
21 #ifdef _tolower
22 #  undef _tolower
23 #endif
24 #define _tolower(c) (((c) < 'A' || (c) > 'Z') ? (c) : (c) | 040)
25
26 /* Assorted things to look like Unix */
27 #ifdef __GNUC__
28 #ifndef _IOLBF /* gcc's stdio.h doesn't define this */
29 #define _IOLBF 1
30 #endif
31 #endif
32 #include <processes.h> /* for vfork() */
33 #include <unixio.h>
34 #include <unixlib.h>
35 #include <file.h>  /* it's not <sys/file.h>, so don't use I_SYS_FILE */
36 #define unlink kill_file
37
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))
42 #else
43 #  define set_errno(v)      (errno = (v))
44 #  define set_vaxc_errno(v) (vaxc$errno = (v))
45 #endif
46
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__); } }
52
53 #ifdef VMS_DO_SOCKETS
54 #include "sockadapt.h"
55 #endif
56
57 /*
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.
61  */
62 #define HAS_KILL
63 #define HAS_WAIT
64
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.
69  */
70 #define fork vfork
71
72 /*
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).
77  */
78 #define fwrite1 my_fwrite
79
80 /* Use our own rmdir() */
81 #define rmdir(name) do_rmdir(name)
82
83 /* Assorted fiddling with sigs . . . */
84 # include <signal.h>
85 #define ABORT() abort()
86
87 /* Used with our my_utime() routine in vms.c */
88 struct utimbuf {
89   time_t actime;
90   time_t modtime;
91 };
92 #define utime my_utime
93
94 /* This is what times() returns, but <times.h> calls it tbuffer_t on VMS */
95
96 struct tms {
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 */
101 };
102
103 /* VMS doesn't use a real sys_nerr, but we need this when scanning for error
104  * messages in text strings . . .
105  */
106
107 #define sys_nerr EVMSERR  /* EVMSERR is as high as we can go. */
108
109 /* Look up new %ENV values on the fly */
110 #define DYNAMIC_ENV_FETCH 1
111 #define ENV_HV_NAME "%EnV%VmS%"
112
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)
116
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.
122  */
123     /* Data structure returned by READDIR(). */
124 struct dirent {
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      */
129 };
130
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 {
134     long                        context;
135     int                         vms_wantversions;
136     unsigned long int           count;
137     char                        *pattern;
138     struct dirent               entry;
139     struct dsc$descriptor_s     pat;
140 } DIR;
141
142 #define rewinddir(dirp)         seekdir((dirp), 0)
143
144 /* used for our emulation of getpw* */
145 struct passwd {
146         char    *pw_name;    /* Username */
147         char    *pw_passwd;
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) */
154 };
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
161
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
165  */
166 /* First, grab the system types, so we don't clobber them later */
167 #include <stat.h>
168 /* Since we've got to match the size of the CRTL's stat_t, we need
169  * to mimic DECC's alignment settings.
170  */
171 #if defined(__DECC) || defined(__DECCXX)
172 #  pragma __member_alignment __save
173 #  pragma __nomember_alignment
174 #endif
175 #if defined(__DECC) 
176 #  pragma __message __save
177 #  pragma __message disable (__MISALGNDSTRCT)
178 #  pragma __message disable (__MISALGNDMEM)
179 #endif
180 struct mystat
181 {
182         char *st_devnam;  /* pointer to device name */
183         union {
184           unsigned short fid[3];
185           unsigned long st_ino_mostly;
186         } st_inode_u;
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 */
200 };
201 #ifdef st_ino
202 #  undef st_ino
203 #endif
204 #define st_ino st_inode_u.st_ino_mostly
205 #define stat mystat
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
212 #endif
213 #if defined(__DECC) 
214 #  pragma __message __restore
215 #endif
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)
220
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.
224  *
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>));
229  */
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 */
272
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
277  */
278 #undef HAS_HTONS
279 #undef HAS_NTOHS
280 #undef HAS_HTONL
281 #undef HAS_NTOHL
282 #endif
283
284 #endif  /* __vmsish_h_included */