|
From: | Igor Todorovski |
Subject: | Z/OS Enhancement to gnu lib |
Date: | Mon, 30 Jan 2023 04:09:45 +0000 |
Hi, I was wondering if the following changes I made to findutils (to get it to function on z/OS) can be merged into gnulib.
The first change (fdopendir.c)
guards the close call. Otherwise we get a bad file descriptor on z/OS. I am not sure if this has any other consequences, but so far I haven’t seen any issues with findutils.
The second change (openat-proc.c)
adds a way to get the pathname when given a file descriptor as an input. If you have any comments, please let me know:
--- a/gl/lib/fdopendir.c
+++ b/gl/lib/fdopendir.c
@@ -151,7 +151,9 @@ fdopendir_with_dup (int fd, int older_dupfd, struct saved_cwd const *cwd)
}
else
{
+#ifndef __MVS__
close (fd);
+#endif
dir = fd_clone_opendir (dupfd, cwd);
saved_errno = errno;
if (! dir)
diff --git a/gl/lib/openat-proc.c b/gl/lib/openat-proc.c
index 3bacf7d..bb788fd 100644
--- a/gl/lib/openat-proc.c
+++ b/gl/lib/openat-proc.c
@@ -28,6 +28,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <termios.h>
#include <unistd.h>
#ifdef __KLIBC__
@@ -53,7 +54,27 @@ openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd, char const *file)
return buf;
}
-#ifndef __KLIBC__
+#ifdef __MVS__
+ {
+ char dir[_XOPEN_PATH_MAX];
+ int rc = w_ioctl(fd, _IOCC_GPN, _XOPEN_PATH_MAX, dir);
+ if (rc == 0) {
+ __e2a_l(dir, _XOPEN_PATH_MAX);
+ }
+ size_t bufsize;
+ dirlen = strlen (dir);
+ bufsize = dirlen + 1 + strlen (file) + 1; /* 1 for '/', 1 for null */
+ if (OPENAT_BUFFER_SIZE < bufsize)
+ {
+ result = malloc (bufsize);
+ if (! result)
+ return NULL;
+ }
+
+ strcpy (result, dir);
+ result[dirlen++] = '/';
+ }
+#elif !defined( __KLIBC__)
# define PROC_SELF_FD_FORMAT "/proc/self/fd/%d/"
{
enum { |
[Prev in Thread] | Current Thread | [Next in Thread] |