#define my_getpwuid Perl_my_getpwuid
#define my_flush Perl_my_flush
#define readdir Perl_readdir
+#define readdir_r Perl_readdir_r
#else
#define my_getenv_len(a,b,c) Perl_my_getenv_len(aTHX_ a,b,c)
#define vmssetenv(a,b,c) Perl_vmssetenv(aTHX_ a,b,c)
#define my_getpwuid(a) Perl_my_getpwuid(aTHX_ a)
#define my_flush(a) Perl_my_flush(aTHX_ a)
#define readdir(a) Perl_readdir(aTHX_ a)
+#define readdir_r(a,b,c) Perl_readdir_r(aTHX_ a,b,c)
#endif
#define my_gconvert Perl_my_gconvert
#define telldir Perl_telldir
#define COMPLEX_STATUS 1 /* We track both "POSIX" and VMS values */
#define HINT_V_VMSISH 24
-#define HINT_M_VMSISH_HUSHED 0x20000000 /* stifle error msgs on exit */
#define HINT_M_VMSISH_STATUS 0x40000000 /* system, $? return VMS status */
#define HINT_M_VMSISH_TIME 0x80000000 /* times are local, not UTC */
#define NATIVE_HINTS (PL_hints >> HINT_V_VMSISH) /* used in op.c */
#define TEST_VMSISH(h) (PL_curcop->op_private & ((h) >> HINT_V_VMSISH))
-#define VMSISH_HUSHED TEST_VMSISH(HINT_M_VMSISH_HUSHED)
#define VMSISH_STATUS TEST_VMSISH(HINT_M_VMSISH_STATUS)
#define VMSISH_TIME TEST_VMSISH(HINT_M_VMSISH_TIME)
+/* VMS-specific data storage */
+
+#define HAVE_INTERP_INTERN
+struct interp_intern {
+ int hushed;
+ double inv_rand_max;
+};
+#define VMSISH_HUSHED (PL_sys_intern.hushed)
+#define MY_INV_RAND_MAX (PL_sys_intern.inv_rand_max)
+
/* Flags for vmstrnenv() */
#define PERL__TRNENV_SECURE 0x01
+#define PERL__TRNENV_JOIN_SEARCHLIST 0x02
/* Handy way to vet calls to VMS system services and RTL routines. */
#define _ckvmssts(call) STMT_START { register unsigned long int __ckvms_sts; \
#endif
#define BIT_BUCKET "_NLA0:"
-#define PERL_SYS_INIT(c,v) vms_image_init((c),(v)); MALLOC_INIT
+#define PERL_SYS_INIT(c,v) MALLOC_CHECK_TAINT2(*c,*v) vms_image_init((c),(v)); MALLOC_INIT
#define PERL_SYS_TERM() OP_REFCNT_TERM; MALLOC_TERM
#define dXSUB_SYS
#define HAS_KILL
* This symbol, if defined, indicates that the ioctl() routine is
* available to set I/O characteristics
*/
+#if defined(__CRTL_VER) && __CRTL_VER >= 70000000
+#define HAS_IOCTL /**/
+#else
#undef HAS_IOCTL /**/
+#endif
/* HAS_UTIME:
* This symbol, if defined, indicates that the routine utime() is
# define sa_mask sv_mask
# define sigsuspend(set) sigpause(*set)
# define sigpending(a) (not_here("sigpending"),0)
+#else
+/*
+ * The C RTL's sigaction fails to check for invalid signal numbers so we
+ * help it out a bit.
+ */
+# ifndef DONT_MASK_RTL_CALLS
+# define sigaction(a,b,c) Perl_my_sigaction(aTHX_ a,b,c)
+# endif
+#endif
+#ifdef KILL_BY_SIGPRC
+# define kill Perl_my_kill
#endif
+
/* VMS doesn't use a real sys_nerr, but we need this when scanning for error
* messages in text strings . . .
*/
char *pattern;
struct dirent entry;
struct dsc$descriptor_s pat;
+ void *mutex;
} DIR;
#define rewinddir(dirp) seekdir((dirp), 0)
/* Since we've got to match the size of the CRTL's stat_t, we need
* to mimic DECC's alignment settings.
*/
+#ifdef USE_LARGE_FILES
+/* Mimic the new stat structure, filler fields, and alignment. */
+#if defined(__DECC) || defined(__DECCXX)
+# pragma __member_alignment __save
+# pragma member_alignment
+#endif
+
+struct mystat
+{
+ char *st_devnam; /* pointer to device name */
+ char *st_fill_dev;
+ unsigned st_ino; /* hack - CRTL uses unsigned short[3] for */
+ unsigned short rvn; /* FID (num,seq,rvn) */
+ unsigned short st_fill_ino;
+ unsigned short st_mode; /* file "mode" i.e. prot, dir, reg, etc. */
+ unsigned short st_fill_mode;
+ int st_nlink; /* for compatibility - not really used */
+ unsigned st_uid; /* from ACP - QIO uic field */
+ unsigned short st_gid; /* group number extracted from st_uid */
+ unsigned short st_fill_gid;
+ dev_t st_rdev; /* for compatibility - always zero */
+ off_t st_size; /* file size in bytes */
+ unsigned st_atime; /* file access time; always same as st_mtime */
+ unsigned st_fill_atime;
+ unsigned st_mtime; /* last modification time */
+ unsigned st_fill_mtime;
+ unsigned st_ctime; /* file creation time */
+ unsigned st_fill_ctime;
+ char st_fab_rfm; /* record format */
+ char st_fab_rat; /* record attributes */
+ char st_fab_fsz; /* fixed header size */
+ char st_fab_fill;
+ unsigned st_fab_mrs; /* record size */
+ int st_fill_expand[7]; /* will probably fill from beginning, so put our st_dev at end */
+ unsigned st_dev; /* encoded device name */
+};
+
+#else /* !defined(USE_LARGE_FILES) */
+
#if defined(__DECC) || defined(__DECCXX)
# pragma __member_alignment __save
# pragma __nomember_alignment
# pragma __message disable (__MISALGNDSTRCT)
# pragma __message disable (__MISALGNDMEM)
#endif
+
struct mystat
{
char *st_devnam; /* pointer to device name */
*/
char st_fill1[sizeof(void *) - (3*sizeof(unsigned short) + 3*sizeof(char))%sizeof(void *)];
};
+
+#if defined(__DECC)
+# pragma __message __restore
+#endif
+
+#endif /* defined(USE_LARGE_FILES) */
+
+#if defined(__DECC) || defined(__DECCXX)
+# pragma __member_alignment __restore
+#endif
+
typedef unsigned mydev_t;
typedef unsigned myino_t;
# define dev_t mydev_t
# define ino_t myino_t
#endif
-#if defined(__DECC) || defined(__DECCXX)
-# pragma __member_alignment __restore
-#endif
-#if defined(__DECC)
-# pragma __message __restore
-#endif
/* Cons up a 'delete' bit for testing access */
#define S_IDUSR (S_IWUSR | S_IXUSR)
#define S_IDGRP (S_IWGRP | S_IXGRP)
bool Perl_vms_do_aexec (pTHX_ SV *, SV **, SV **);
#endif
char * Perl_my_getenv_len (pTHX_ const char *, unsigned long *, bool);
-int Perl_vmssetenv (pTHX_ char *, char *, struct dsc$descriptor_s **);
+int Perl_vmssetenv (pTHX_ const char *, const char *, struct dsc$descriptor_s **);
void Perl_vmssetuserlnm(pTHX_ char *name, char *eqv);
char * Perl_my_crypt (pTHX_ const char *, const char *);
Pid_t Perl_my_waitpid (pTHX_ Pid_t, int *, int);
int Perl_kill_file (pTHX_ char *);
int Perl_my_chdir (pTHX_ char *);
FILE * Perl_my_tmpfile ();
-int Perl_my_utime (pTHX_ char *, struct utimbuf *);
+#ifndef HOMEGROWN_POSIX_SIGNALS
+int Perl_my_sigaction (pTHX_ int, const struct sigaction*, struct sigaction*);
+#endif
+#ifdef KILL_BY_SIGPRC
+unsigned int Perl_sig_to_vmscondition (int);
+int Perl_my_kill (int, int);
+void Perl_csighandler_init (void);
+#endif
+int Perl_my_utime (pTHX_ const char *, const struct utimbuf *);
void Perl_vms_image_init (int *, char ***);
struct dirent * Perl_readdir (pTHX_ DIR *);
+int Perl_readdir_r(pTHX_ DIR *, struct dirent *, struct dirent **);
long telldir (DIR *);
void Perl_seekdir (pTHX_ DIR *, long);
void closedir (DIR *);