On Tue, 30 May 2023 19:54:41 -0700
Mark Hatle <[email protected]> wrote:

> -     int existed = (real___xstat64(_STAT_VER, path, &buf) != -1);
> +     int existed = (base_stat64(path, &buf) != -1);

Honestly, with the benefit of hindsight, I actually can't even think
why I ever thought I should be using those directly instead of through
the base_foo wrappers. Probably for a reason.

... Just in case, definitely don't merge this before testing it in
case there's some insane reason for which the base_* wrappers didn't
work here.

 
>       rc = real_fopen64(path, mode);
>       save_errno = errno;
> @@ -20,7 +20,7 @@
>               int fd = fileno(rc);
>  
>               pseudo_debug(PDBGF_FILE, "fopen64 '%s': fd %d <FILE
> %p>\n", path, fd, (void *) rc);
> -             if (real___fxstat64(_STAT_VER, fd, &buf) != -1) {
> +             if (base_fstat64(fd, &buf) != -1) {
>                       if (!existed) {
>                               real_fchmod(fd, PSEUDO_FS_MODE(0666
> & ~pseudo_umask, 0)); pseudo_client_op(OP_CREAT, 0, -1, -1, path,
> &buf); diff --git a/ports/linux/guts/freopen64.c
> b/ports/linux/guts/freopen64.c index 5fc9073..9bcc06a 100644
> --- a/ports/linux/guts/freopen64.c
> +++ b/ports/linux/guts/freopen64.c
> @@ -10,7 +10,7 @@
>   */
>       struct stat64 buf;
>       int save_errno;
> -     int existed = (real___xstat64(_STAT_VER, path, &buf) != -1);
> +     int existed = (base_stat64(path, &buf) != -1);
>  
>       rc = real_freopen64(path, mode, stream);
>       save_errno = errno;
> @@ -19,7 +19,7 @@
>               int fd = fileno(rc);
>  
>               pseudo_debug(PDBGF_FILE, "freopen64 '%s': fd %d\n",
> path, fd);
> -             if (real___fxstat64(_STAT_VER, fd, &buf) != -1) {
> +             if (base_fstat64(fd, &buf) != -1) {
>                       if (!existed) {
>                               real_fchmod(fd, PSEUDO_FS_MODE(0666
> & ~pseudo_umask, 0)); pseudo_client_op(OP_CREAT, 0, -1, -1, path,
> &buf); diff --git a/ports/linux/guts/fstat.c
> b/ports/linux/guts/fstat.c index b089b15..80933e2 100644
> --- a/ports/linux/guts/fstat.c
> +++ b/ports/linux/guts/fstat.c
> @@ -8,7 +8,13 @@
>   *   int rc = -1;
>   */
>  
> -     rc = wrap___fxstat(_STAT_VER, fd, buf);
> +     struct stat64 buf64;
> +     /* populate buffer with complete data */
> +     real_fstat(fd, buf);
> +     /* obtain fake data */
> +     rc = wrap_fstat64(fd, &buf64);
> +     /* overwrite */
> +     pseudo_stat32_from64(buf, &buf64);
>  
>  /*   return rc;
>   * }
> diff --git a/ports/linux/guts/fstat64.c b/ports/linux/guts/fstat64.c
> index 6dd97da..22d46a9 100644
> --- a/ports/linux/guts/fstat64.c
> +++ b/ports/linux/guts/fstat64.c
> @@ -8,8 +8,20 @@
>   *   int rc = -1;
>   */
>  
> -     rc = wrap___fxstat64(_STAT_VER, fd, buf);
> +     pseudo_msg_t *msg;
> +     int save_errno;
>  
> +     rc = real_fstat64(fd, buf);
> +     save_errno = errno;
> +     if (rc == -1) {
> +             return rc;
> +     }
> +     msg = pseudo_client_op(OP_FSTAT, 0, fd, -1, 0, buf);
> +     if (msg && msg->result == RESULT_SUCCEED) {
> +             pseudo_stat_msg(buf, msg);
> +     }
> +
> +     errno = save_errno;
>  /*   return rc;
>   * }
>   */
> diff --git a/ports/linux/guts/fstatat.c b/ports/linux/guts/fstatat.c
> index 3267641..7b9652d 100644
> --- a/ports/linux/guts/fstatat.c
> +++ b/ports/linux/guts/fstatat.c
> @@ -1,4 +1,5 @@
>  /*
> + * Copyright (c) 2008-2010 Wind River Systems; see
>   * Copyright (c) 2021 Linux Foundation; see
>   * guts/COPYRIGHT for information.
>   *
> @@ -8,7 +9,13 @@
>   *   int rc = -1;
>   */
>  
> -     rc = wrap___fxstatat(_STAT_VER, dirfd, path, buf, flags);
> +     struct stat64 buf64;
> +     /* populate buffer with complete data */
> +     real_fstatat(dirfd, path, buf, flags);
> +     /* obtain fake data */
> +     rc = wrap_fstatat64(dirfd, path, &buf64, flags);
> +     /* overwrite */
> +     pseudo_stat32_from64(buf, &buf64);
>  
>  /*   return rc;
>   * }
> diff --git a/ports/linux/guts/fstatat64.c
> b/ports/linux/guts/fstatat64.c index c981e14..13c1143 100644
> --- a/ports/linux/guts/fstatat64.c
> +++ b/ports/linux/guts/fstatat64.c
> @@ -1,4 +1,5 @@
>  /*
> + * Copyright (c) 2008-2010 Wind River Systems;
>   * Copyright (c) 2021 Linux Foundation; see
>   * guts/COPYRIGHT for information.
>   *
> @@ -8,7 +9,46 @@
>   *   int rc = -1;
>   */
>  
> -     rc = wrap___fxstatat64(_STAT_VER, dirfd, path, buf, flags);
> +     pseudo_msg_t *msg;
> +     int save_errno;
> +
> +#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
> +     if (dirfd != AT_FDCWD) {
> +             errno = ENOSYS;
> +             return -1;
> +     }
> +#endif
> +     if (flags & AT_SYMLINK_NOFOLLOW) {
> +#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
> +             rc = real_lstat64(path, buf);
> +#else
> +             rc = real_fstatat64(dirfd, path, buf, flags);
> +#endif
> +             if (rc == -1) {
> +                     return rc;
> +             }
> +     } else {
> +#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
> +             rc = real_stat64(path, buf);
> +#else
> +             rc = real_fstatat64(dirfd, path, buf, flags);
> +#endif
> +             if (rc == -1) {
> +                     return rc;
> +             }
> +     }
> +     save_errno = errno;
> +
> +     /* query database
> +      * note that symlink canonicalizing is now automatic, so we
> +      * don't need to check for a symlink on this end
> +      */
> +     msg = pseudo_client_op(OP_STAT, 0, -1, dirfd, path, buf);
> +     if (msg && msg->result == RESULT_SUCCEED) {
> +             pseudo_stat_msg(buf, msg);
> +     }
> +
> +     errno = save_errno;
>  
>  /*   return rc;
>   * }
> diff --git a/ports/linux/guts/lstat.c b/ports/linux/guts/lstat.c
> index d2c4d50..0bc9362 100644
> --- a/ports/linux/guts/lstat.c
> +++ b/ports/linux/guts/lstat.c
> @@ -8,7 +8,7 @@
>   *   int rc = -1;
>   */
>  
> -     rc = wrap___fxstatat(_STAT_VER, AT_FDCWD, path, buf,
> AT_SYMLINK_NOFOLLOW);
> +     rc = wrap_fstatat(AT_FDCWD, path, buf, AT_SYMLINK_NOFOLLOW);
>  
>  /*   return rc;
>   * }
> diff --git a/ports/linux/guts/lstat64.c b/ports/linux/guts/lstat64.c
> index 43d0ce1..9e0ff19 100644
> --- a/ports/linux/guts/lstat64.c
> +++ b/ports/linux/guts/lstat64.c
> @@ -8,7 +8,7 @@
>   *   int rc = -1;
>   */
>  
> -     rc = wrap___fxstatat64(_STAT_VER, AT_FDCWD, path, buf,
> AT_SYMLINK_NOFOLLOW);
> +     rc = wrap_fstatat64(AT_FDCWD, path, buf,
> AT_SYMLINK_NOFOLLOW); 
>  /*   return rc;
>   * }
> diff --git a/ports/linux/guts/mknod.c b/ports/linux/guts/mknod.c
> index 61fd320..66787c0 100644
> --- a/ports/linux/guts/mknod.c
> +++ b/ports/linux/guts/mknod.c
> @@ -8,7 +8,7 @@
>   *   int rc = -1;
>   */
>  
> -     rc = wrap___xmknod(_MKNOD_VER, path, mode, &dev);
> +     rc = wrap_mknodat(AT_FDCWD, path, mode, dev);
>  
>  /*   return rc;
>   * }
> diff --git a/ports/linux/guts/mknodat.c b/ports/linux/guts/mknodat.c
> index a7e4293..c51a82d 100644
> --- a/ports/linux/guts/mknodat.c
> +++ b/ports/linux/guts/mknodat.c
> @@ -1,4 +1,5 @@
>  /*
> + * Copyright (c) 2008-2010 Wind River Systems; see
>   * Copyright (c) 2016 Wind River Systems; see
>   * guts/COPYRIGHT for information.
>   *
> @@ -8,7 +9,75 @@
>   *   int rc = -1;
>   */
>  
> -     rc = wrap___xmknodat(_MKNOD_VER, dirfd, path, mode, &dev);
> +     pseudo_msg_t *msg;
> +     struct stat64 buf;
> +
> +     /* mask out mode bits appropriately */
> +     mode = mode & ~pseudo_umask;
> +        /* if you don't specify a type, assume regular file */
> +        if (!(mode & S_IFMT)) {
> +                mode |= S_IFREG;
> +        }
> +        pseudo_debug(PDBGF_FILE, "mknodat creating '%s', mode 0%o\n",
> +                path ? path : "<no name>", (int) mode);
> +
> +#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
> +     if (dirfd != AT_FDCWD) {
> +             errno = ENOSYS;
> +             return -1;
> +     }
> +     rc = real_stat64(path, &buf);
> +#else
> +     rc = real_fstatat64(dirfd, path, &buf, AT_SYMLINK_NOFOLLOW);
> +#endif
> +     if (rc != -1) {
> +             /* if we can stat the file, you can't mknod it */
> +             errno = EEXIST;
> +             return -1;
> +     }
> +     if (!dev) {
> +             errno = EINVAL;
> +             return -1;
> +     }
> +#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
> +     rc = real_open(path, O_CREAT | O_WRONLY | O_EXCL,
> +             PSEUDO_FS_MODE(mode, 0));
> +#else
> +     rc = real_openat(dirfd, path, O_CREAT | O_WRONLY | O_EXCL,
> +             PSEUDO_FS_MODE(mode, 0));
> +#endif
> +     if (rc == -1) {
> +             return -1;
> +     }
> +     real_fchmod(rc, PSEUDO_FS_MODE(mode, 0));
> +     real_fstat64(rc, &buf);
> +     /* mknod does not really open the file.  We don't have
> +      * to use wrap_close because we've never exposed this file
> +      * descriptor to the client code.
> +      */
> +     real_close(rc);
> +
> +     /* mask in the mode type bits again */
> +     buf.st_mode = (PSEUDO_DB_MODE(buf.st_mode, mode) & 07777) |
> +                     (mode & ~07777);
> +     buf.st_rdev = dev;
> +     msg = pseudo_client_op(OP_MKNOD, 0, -1, dirfd, path, &buf);
> +     if (msg && msg->result != RESULT_SUCCEED) {
> +             errno = EPERM;
> +             rc = -1;
> +     } else {
> +             /* just pretend we worked */
> +             rc = 0;
> +     }
> +     if (rc == -1) {
> +             int save_errno = errno;
> +#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
> +             real_unlink(path);
> +#else
> +             real_unlinkat(dirfd, path, AT_SYMLINK_NOFOLLOW);
> +#endif
> +             errno = save_errno;
> +     }
>  
>  /*   return rc;
>   * }
> diff --git a/ports/linux/guts/mkostemp64.c
> b/ports/linux/guts/mkostemp64.c index 502211b..694070b 100644
> --- a/ports/linux/guts/mkostemp64.c
> +++ b/ports/linux/guts/mkostemp64.c
> @@ -35,7 +35,7 @@
>       if (rc != -1) {
>               save_errno = errno;
>  
> -             if (real___fxstat64(_STAT_VER, rc, &buf) != -1) {
> +             if (base_fstat64(rc, &buf) != -1) {
>                       real_fchmod(rc, PSEUDO_FS_MODE(0600, 0));
>                       pseudo_client_op(OP_CREAT, 0, -1, -1,
> tmp_template, &buf); pseudo_client_op(OP_OPEN, PSA_READ | PSA_WRITE,
> rc, -1, tmp_template, &buf); diff --git a/ports/linux/guts/openat.c
> b/ports/linux/guts/openat.c index 656ac2b..d027154 100644
> --- a/ports/linux/guts/openat.c
> +++ b/ports/linux/guts/openat.c
> @@ -56,12 +56,12 @@
>               save_errno = errno;
>  #ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
>               if (flags & O_NOFOLLOW) {
> -                     rc = real___lxstat64(_STAT_VER, path, &buf);
> +                     rc = base_lstat64(path, &buf);
>               } else {
> -                     rc = real___xstat64(_STAT_VER, path, &buf);
> +                     rc = base_stat64(path, &buf);
>               }
>  #else
> -             rc = real___fxstatat64(_STAT_VER, dirfd, path, &buf,
> (flags & O_NOFOLLOW) ? AT_SYMLINK_NOFOLLOW : 0);
> +             rc = base_fstatat64(dirfd, path, &buf, (flags &
> O_NOFOLLOW) ? AT_SYMLINK_NOFOLLOW : 0); #endif
>               existed = (rc != -1);
>               if (!existed)
> @@ -77,12 +77,12 @@
>               save_errno = errno;
>  #ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
>               if (flags & O_NOFOLLOW) {
> -                     rc = real___lxstat64(_STAT_VER, path, &buf);
> +                     rc = base_lstat64(path, &buf);
>               } else {
> -                     rc = real___xstat64(_STAT_VER, path, &buf);
> +                     rc = base_stat64(path, &buf);
>               }
>  #else
> -             rc = real___fxstatat64(_STAT_VER, dirfd, path, &buf,
> (flags & O_NOFOLLOW) ? AT_SYMLINK_NOFOLLOW : 0);
> +             rc = base_fstatat64(dirfd, path, &buf, (flags &
> O_NOFOLLOW) ? AT_SYMLINK_NOFOLLOW : 0); #endif
>               if (rc != -1 && S_ISFIFO(buf.st_mode)) {
>                       overly_magic_nonblocking = 1;
> @@ -135,12 +135,12 @@
>  #endif
>  #ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
>               if (flags & O_NOFOLLOW) {
> -                     stat_rc = real___lxstat64(_STAT_VER, path,
> &buf);
> +                     stat_rc = base_lstat64(path, &buf);
>               } else {
> -                     stat_rc = real___xstat64(_STAT_VER, path,
> &buf);
> +                     stat_rc = base_xstat64(path, &buf);
>               }
>  #else
> -             stat_rc = real___fxstatat64(_STAT_VER, dirfd, path,
> &buf, (flags & O_NOFOLLOW) ? AT_SYMLINK_NOFOLLOW : 0);
> +             stat_rc = base_fstatat64(dirfd, path, &buf, (flags &
> O_NOFOLLOW) ? AT_SYMLINK_NOFOLLOW : 0); #endif
>  
>               pseudo_debug(PDBGF_FILE, "openat(path %s), flags %o,
> stat rc %d, stat mode %o\n", diff --git a/ports/linux/guts/stat.c
> b/ports/linux/guts/stat.c index f8c73f7..ccd00db 100644
> --- a/ports/linux/guts/stat.c
> +++ b/ports/linux/guts/stat.c
> @@ -8,7 +8,7 @@
>   *   int rc = -1;
>   */
>  
> -     rc = wrap___fxstatat(_STAT_VER, AT_FDCWD, path, buf, 0);
> +     rc = wrap_fstatat(AT_FDCWD, path, buf, 0);
>  
>  /*   return rc;
>   * }
> diff --git a/ports/linux/guts/stat64.c b/ports/linux/guts/stat64.c
> index d8b3f36..391a73f 100644
> --- a/ports/linux/guts/stat64.c
> +++ b/ports/linux/guts/stat64.c
> @@ -8,7 +8,7 @@
>   *   int rc = -1;
>   */
>  
> -     rc = wrap___fxstatat64(_STAT_VER, AT_FDCWD, path, buf, 0);
> +     rc = wrap_fstatat64(AT_FDCWD, path, buf, 0);
>  
>  /*   return rc;
>   * }
> diff --git a/ports/linux/old__x/README b/ports/linux/old__x/README
> new file mode 100644
> index 0000000..c94413f
> --- /dev/null
> +++ b/ports/linux/old__x/README
> @@ -0,0 +1,28 @@
> +Older glibcs contain stat functions such as:
> +
> +__fxstat
> +__fxstatat
> +__lxstat
> +__xstat
> +
> +__fxstat64
> +__fxstatat64
> +__lxstat64
> +__xstat64
> +
> +The format of these functions use the _STAT_VER defintion.  New
> glibc no +longer define or utilize these functions, so neither can we.
> +
> +We only use this subport when the functions are present, this is
> checked +by with the existence of _STAT_VER.

"by with the existence"? Looks like a typo.

Anyway, looks reasonable to me, thanks!

-s
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#181985): 
https://lists.openembedded.org/g/openembedded-core/message/181985
Mute This Topic: https://lists.openembedded.org/mt/99234918/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to