Home | History | Annotate | Line # | Download | only in sys
      1 /*	$NetBSD: compat___stat30.c,v 1.5 2026/01/02 22:22:21 nia Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1997 Frank van der Linden
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  * 3. The name of the author may not be used to endorse or promote products
     16  *    derived from this software without specific prior written permission
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     23  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28  */
     29 
     30 #include <sys/cdefs.h>
     31 #if defined(LIBC_SCCS) && !defined(lint)
     32 __RCSID("$NetBSD: compat___stat30.c,v 1.5 2026/01/02 22:22:21 nia Exp $");
     33 #endif /* LIBC_SCCS and not lint */
     34 
     35 #define __LIBC12_SOURCE__
     36 
     37 #include <sys/types.h>
     38 #include <sys/param.h>
     39 #include <sys/stat.h>
     40 #include <sys/mount.h>
     41 #include <compat/sys/time.h>
     42 #include <compat/sys/stat.h>
     43 #include <compat/sys/mount.h>
     44 
     45 __warn_references(__stat30,
     46     "warning: reference to compatibility __stat30(); include <sys/stat.h> to generate correct reference")
     47 
     48 __warn_references(__fstat30,
     49     "warning: reference to compatibility __fstat30(); include <sys/stat.h> to generate correct reference")
     50 
     51 __warn_references(__lstat30,
     52     "warning: reference to compatibility __lstat30(); include <sys/stat.h> to generate correct reference")
     53 
     54 __warn_references(__fhstat40,
     55     "warning: reference to compatibility __fhstat40(); include <sys/mount.h> to generate correct reference")
     56 
     57 
     58 __strong_alias(__stat30, __compat___stat30)
     59 __strong_alias(__fstat30, __compat___fstat30)
     60 __strong_alias(__lstat30, __compat___lstat30)
     61 __strong_alias(__fhstat40, __compat___fhstat40)
     62 
     63 /*
     64  * Convert from a new to an old stat structure.
     65  */
     66 
     67 static void cvtstat(struct stat30 *, const struct stat *);
     68 
     69 static void
     70 cvtstat(struct stat30 *ost, const struct stat *st)
     71 {
     72 
     73 	ost->st_dev = (uint32_t)st->st_dev;
     74 	ost->st_ino = st->st_ino;
     75 	ost->st_mode = st->st_mode;
     76 	ost->st_nlink = st->st_nlink;
     77 	ost->st_uid = st->st_uid;
     78 	ost->st_gid = st->st_gid;
     79 	ost->st_rdev = (uint32_t)st->st_rdev;
     80 	timespec_to_timespec50(&st->st_atimespec, &ost->st_atimespec);
     81 	timespec_to_timespec50(&st->st_mtimespec, &ost->st_mtimespec);
     82 	timespec_to_timespec50(&st->st_ctimespec, &ost->st_ctimespec);
     83 	timespec_to_timespec50(&st->st_birthtimespec, &ost->st_birthtimespec);
     84 	ost->st_size = st->st_size;
     85 	ost->st_blocks = st->st_blocks;
     86 	ost->st_blksize = st->st_blksize;
     87 	ost->st_flags = st->st_flags;
     88 	ost->st_gen = st->st_gen;
     89 }
     90 
     91 int
     92 __compat___stat30(const char *file, struct stat30 *ost)
     93 {
     94 	struct stat nst;
     95 	int ret;
     96 
     97 	if ((ret = __stat50(file, &nst)) == -1)
     98 		return ret;
     99 	cvtstat(ost, &nst);
    100 	return ret;
    101 }
    102 
    103 int
    104 __compat___fstat30(int f, struct stat30 *ost)
    105 {
    106 	struct stat nst;
    107 	int ret;
    108 
    109 	if ((ret = __fstat50(f, &nst)) == -1)
    110 		return ret;
    111 	cvtstat(ost, &nst);
    112 	return ret;
    113 }
    114 
    115 int
    116 __compat___lstat30(const char *file, struct stat30 *ost)
    117 {
    118 	struct stat nst;
    119 	int ret;
    120 
    121 	if ((ret = __lstat50(file, &nst)) == -1)
    122 		return ret;
    123 	cvtstat(ost, &nst);
    124 	return ret;
    125 }
    126 
    127 int
    128 __compat___fhstat40(const void *fh, size_t fh_size, struct stat30 *ost)
    129 {
    130 	struct stat nst;
    131 	int ret;
    132 
    133 	if ((ret = __fhstat50(fh, fh_size, &nst)) == -1)
    134 		return ret;
    135 	cvtstat(ost, &nst);
    136 	return ret;
    137 }
    138