/* te-vms.c -- Utilities for VMS.
- Copyright (C) 2009-2014 Free Software Foundation, Inc.
+ Copyright (C) 2009-2019 Free Software Foundation, Inc.
Written by Douglas B Rupp <rupp@gnat.com>
#include "as.h"
#include "te-vms.h"
-/* The purspose of the two alternate versions below is to have one that
+/* The purpose of the two alternate versions below is to have one that
works for native VMS and one that works on an NFS mounted filesystem
(Unix Server/VMS client). The main issue being to generate the special
VMS file timestamps for the debug info. */
char *rfo,
int *ver)
{
- char fullname[strlen (dirname) + strlen (filename) + 1];
+ char * fullname;
+
#ifdef VMS
struct FAB fab;
struct NAM nam;
return 0;
}
- strcpy (fullname, dirname);
- strcat (fullname, filename);
-
+ fullname = concat (dirname, filename, NULL);
tryfile = to_vms_file_spec (fullname);
/* Allocate and initialize a FAB and NAM structures. */
/* Validate filespec syntax and device existence. */
status = SYS$PARSE (&fab, 0, 0);
if ((status & 1) != 1)
- return 1;
+ {
+ free (fullname);
+ return 1;
+ }
file.string[nam.nam$b_esl] = 0;
/* Find matching filespec. */
status = SYS$SEARCH (&fab, 0, 0);
if ((status & 1) != 1)
- return 1;
+ {
+ free (fullname);
+ return 1;
+ }
file.string[nam.nam$b_esl] = 0;
result.string[result.length=nam.nam$b_rsl] = 0;
chan = 0;
status = SYS$ASSIGN (&devicedsc, &chan, 0, 0, 0);
if ((status & 1) != 1)
- return 1;
+ {
+ free (fullname);
+ return 1;
+ }
/* Initialize the FIB and fill in the directory id field. */
memset (&fib, 0, sizeof (fib));
= SYS$QIOW (0, chan, IO$_ACCESS|IO$M_ACCESS, &iosb, 0, 0,
&fibdsc, &filedsc, &result.length, &resultdsc, &atrlst, 0);
if ((status & 1) != 1)
- return 1;
+ {
+ free (fullname);
+ return 1;
+ }
+
if ((iosb.status & 1) != 1)
- return 1;
+ {
+ free (fullname);
+ return 1;
+ }
result.string[result.length] = 0;
status = SYS$QIOW (0, chan, IO$_DEACCESS, &iosb, 0, 0, &fibdsc, 0, 0, 0,
&atrlst, 0);
if ((status & 1) != 1)
- return 1;
+ {
+ free (fullname);
+ return 1;
+ }
+
if ((iosb.status & 1) != 1)
- return 1;
+ {
+ free (fullname);
+ return 1;
+ }
/* Deassign the channel and exit. */
status = SYS$DASSGN (chan);
if ((status & 1) != 1)
- return 1;
+ {
+ free (fullname);
+ return 1;
+ }
if (cdt) *cdt = create;
if (siz) *siz = (512 * 65536 * recattr.fat$w_efblkh) +
struct tm *ts;
long long gmtoff, secs, nsecs;
- strcpy (fullname, dirname);
- strcat (fullname, filename);
+ fullname = concat (dirname, filename, NULL);
if ((stat (fullname, &buff)) != 0)
- return 1;
+ {
+ free (fullname);
+ return 1;
+ }
if (cdt)
{
*ver = 1;
#endif /* VMS */
+ free (fullname);
return 0;
}
static char buff [255 + 7];
vms_file_stats_name (dirname, filename, 0, 0, 0, &ver);
- snprintf (buff, 255 + 7, "%s;%d", filename, ver);
+ snprintf (buff, 255 + 7, "%s;%d", filename, ver);
return buff;
}