[BACK]Return to svr4_stat.c CVS log [TXT][DIR] Up to [local] / sys / compat / svr4

Annotation of sys/compat/svr4/svr4_stat.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: svr4_stat.c,v 1.27 2005/08/07 00:18:33 deraadt Exp $   */
                      2: /*     $NetBSD: svr4_stat.c,v 1.21 1996/04/22 01:16:07 christos Exp $   */
                      3:
                      4: /*
                      5:  * Copyright (c) 1994 Christos Zoulas
                      6:  * All rights reserved.
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  * 3. The name of the author may not be used to endorse or promote products
                     17:  *    derived from this software without specific prior written permission
                     18:  *
                     19:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     20:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     21:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     22:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     23:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     24:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     25:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     26:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     27:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     28:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     29:  */
                     30:
                     31: #include <sys/param.h>
                     32: #include <sys/systm.h>
                     33: #include <sys/namei.h>
                     34: #include <sys/proc.h>
                     35: #include <sys/file.h>
                     36: #include <sys/stat.h>
                     37: #include <sys/filedesc.h>
                     38: #include <sys/ioctl.h>
                     39: #include <sys/kernel.h>
                     40: #include <sys/mount.h>
                     41: #include <sys/malloc.h>
                     42: #include <sys/unistd.h>
                     43:
                     44: #include <sys/time.h>
                     45: #include <sys/ucred.h>
                     46: #include <uvm/uvm_extern.h>
                     47: #include <sys/sysctl.h>
                     48:
                     49: #include <sys/syscallargs.h>
                     50:
                     51: #include <compat/svr4/svr4_types.h>
                     52: #include <compat/svr4/svr4_signal.h>
                     53: #include <compat/svr4/svr4_syscallargs.h>
                     54: #include <compat/svr4/svr4_util.h>
                     55: #include <compat/svr4/svr4_stat.h>
                     56: #include <compat/svr4/svr4_ustat.h>
                     57: #include <compat/svr4/svr4_fuser.h>
                     58: #include <compat/svr4/svr4_utsname.h>
                     59: #include <compat/svr4/svr4_systeminfo.h>
                     60: #include <compat/svr4/svr4_time.h>
                     61: #include <compat/svr4/svr4_socket.h>
                     62:
                     63: #ifdef __sparc__
                     64: /*
                     65:  * Solaris-2.4 on the sparc has the old stat call using the new
                     66:  * stat data structure...
                     67:  */
                     68: # define SVR4_NO_OSTAT
                     69: #endif
                     70:
                     71: static void bsd_to_svr4_xstat(struct stat *, struct svr4_xstat *);
                     72: static void bsd_to_svr4_stat64(struct stat *, struct svr4_stat64 *);
                     73: int svr4_ustat(struct proc *, void *, register_t *);
                     74: static int svr4_to_bsd_pathconf(int);
                     75:
                     76: /*
                     77:  * SVR4 uses named pipes as named sockets, so we tell programs
                     78:  * that sockets are named pipes with mode 0
                     79:  */
                     80: #define BSD_TO_SVR4_MODE(mode) (S_ISSOCK(mode) ? S_IFIFO : (mode))
                     81:
                     82:
                     83: #ifndef SVR4_NO_OSTAT
                     84: static void bsd_to_svr4_stat(struct stat *, struct svr4_stat *);
                     85:
                     86: static void
                     87: bsd_to_svr4_stat(st, st4)
                     88:        struct stat             *st;
                     89:        struct svr4_stat        *st4;
                     90: {
                     91:        bzero(st4, sizeof(*st4));
                     92:        st4->st_dev = bsd_to_svr4_odev_t(st->st_dev);
                     93:        st4->st_ino = st->st_ino;
                     94:        st4->st_mode = BSD_TO_SVR4_MODE(st->st_mode);
                     95:        st4->st_nlink = st->st_nlink;
                     96:        st4->st_uid = st->st_uid;
                     97:        st4->st_gid = st->st_gid;
                     98:        st4->st_rdev = bsd_to_svr4_odev_t(st->st_rdev);
                     99:        st4->st_size = st->st_size;
                    100:        st4->st_atim = st->st_atimespec.tv_sec;
                    101:        st4->st_mtim = st->st_mtimespec.tv_sec;
                    102:        st4->st_ctim = st->st_ctimespec.tv_sec;
                    103: }
                    104: #endif
                    105:
                    106:
                    107: static void
                    108: bsd_to_svr4_xstat(st, st4)
                    109:        struct stat             *st;
                    110:        struct svr4_xstat       *st4;
                    111: {
                    112:        bzero(st4, sizeof(*st4));
                    113:        st4->st_dev = bsd_to_svr4_dev_t(st->st_dev);
                    114:        st4->st_ino = st->st_ino;
                    115:        st4->st_mode = BSD_TO_SVR4_MODE(st->st_mode);
                    116:        st4->st_nlink = st->st_nlink;
                    117:        st4->st_uid = st->st_uid;
                    118:        st4->st_gid = st->st_gid;
                    119:        st4->st_rdev = bsd_to_svr4_dev_t(st->st_rdev);
                    120:        st4->st_size = st->st_size;
                    121:        st4->st_atim = st->st_atimespec;
                    122:        st4->st_mtim = st->st_mtimespec;
                    123:        st4->st_ctim = st->st_ctimespec;
                    124:        st4->st_blksize = st->st_blksize;
                    125:        st4->st_blocks = st->st_blocks;
                    126:        strlcpy(st4->st_fstype, "unknown", sizeof st4->st_fstype);
                    127: }
                    128:
                    129: static void
                    130: bsd_to_svr4_stat64(st, st4)
                    131:        struct stat             *st;
                    132:        struct svr4_stat64      *st4;
                    133: {
                    134:        bzero(st4, sizeof(*st4));
                    135:        st4->st_dev = bsd_to_svr4_dev_t(st->st_dev);
                    136:        st4->st_ino = st->st_ino;
                    137:        st4->st_mode = BSD_TO_SVR4_MODE(st->st_mode);
                    138:        st4->st_nlink = st->st_nlink;
                    139:        st4->st_uid = st->st_uid;
                    140:        st4->st_gid = st->st_gid;
                    141:        st4->st_rdev = bsd_to_svr4_dev_t(st->st_rdev);
                    142:        st4->st_size = st->st_size;
                    143:        st4->st_atim = st->st_atimespec;
                    144:        st4->st_mtim = st->st_mtimespec;
                    145:        st4->st_ctim = st->st_ctimespec;
                    146:        st4->st_blksize = st->st_blksize;
                    147:        st4->st_blocks = st->st_blocks;
                    148:        strlcpy(st4->st_fstype, "unknown", sizeof st4->st_fstype);
                    149: }
                    150:
                    151:
                    152: int
                    153: svr4_sys_stat(p, v, retval)
                    154:        register struct proc *p;
                    155:        void *v;
                    156:        register_t *retval;
                    157: {
                    158:        struct svr4_sys_stat_args *uap = v;
                    159: #ifdef SVR4_NO_OSTAT
                    160:        struct svr4_sys_xstat_args cup;
                    161:
                    162:        SCARG(&cup, two) = 2;
                    163:        SCARG(&cup, path) = SCARG(uap, path);
                    164:        SCARG(&cup, ub) = (struct svr4_xstat *) SCARG(uap, ub);
                    165:        return svr4_sys_xstat(p, &cup, retval);
                    166: #else
                    167:        struct stat             st;
                    168:        struct svr4_stat        svr4_st;
                    169:        struct sys_stat_args    cup;
                    170:        int                     error;
                    171:
                    172:        caddr_t sg = stackgap_init(p->p_emul);
                    173:        SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(struct stat));
                    174:        SVR4_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
                    175:
                    176:        SCARG(&cup, path) = SCARG(uap, path);
                    177:
                    178:
                    179:        if ((error = sys_stat(p, &cup, retval)) != 0)
                    180:                return error;
                    181:
                    182:        if ((error = copyin(SCARG(&cup, ub), &st, sizeof st)) != 0)
                    183:                return error;
                    184:
                    185:        bsd_to_svr4_stat(&st, &svr4_st);
                    186:
                    187:        if (S_ISSOCK(st.st_mode))
                    188:                (void) svr4_add_socket(p, SCARG(uap, path), &st);
                    189:
                    190:        if ((error = copyout(&svr4_st, SCARG(uap, ub), sizeof svr4_st)) != 0)
                    191:                return error;
                    192:
                    193:        return 0;
                    194: #endif
                    195: }
                    196:
                    197: int
                    198: svr4_sys_lstat(p, v, retval)
                    199:        register struct proc *p;
                    200:        void *v;
                    201:        register_t *retval;
                    202: {
                    203:        struct svr4_sys_lstat_args *uap = v;
                    204: #ifdef SVR4_NO_OSTAT
                    205:        struct svr4_sys_lxstat_args cup;
                    206:
                    207:        SCARG(&cup, two) = 2;
                    208:        SCARG(&cup, path) = SCARG(uap, path);
                    209:        SCARG(&cup, ub) = (struct svr4_xstat *) SCARG(uap, ub);
                    210:        return svr4_sys_lxstat(p, &cup, retval);
                    211: #else
                    212:        struct stat             st;
                    213:        struct svr4_stat        svr4_st;
                    214:        struct sys_lstat_args   cup;
                    215:        int                     error;
                    216:
                    217:        caddr_t sg = stackgap_init(p->p_emul);
                    218:        SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(struct stat));
                    219:        SVR4_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
                    220:
                    221:        SCARG(&cup, path) = SCARG(uap, path);
                    222:
                    223:        if ((error = sys_lstat(p, &cup, retval)) != 0)
                    224:                return error;
                    225:
                    226:        if ((error = copyin(SCARG(&cup, ub), &st, sizeof st)) != 0)
                    227:                return error;
                    228:
                    229:        bsd_to_svr4_stat(&st, &svr4_st);
                    230:
                    231:        if (S_ISSOCK(st.st_mode))
                    232:                (void) svr4_add_socket(p, SCARG(uap, path), &st);
                    233:
                    234:        if ((error = copyout(&svr4_st, SCARG(uap, ub), sizeof svr4_st)) != 0)
                    235:                return error;
                    236:
                    237:        return 0;
                    238: #endif
                    239: }
                    240:
                    241: int
                    242: svr4_sys_fstat(p, v, retval)
                    243:        register struct proc *p;
                    244:        void *v;
                    245:        register_t *retval;
                    246: {
                    247:        struct svr4_sys_fstat_args *uap = v;
                    248: #ifdef SVR4_NO_OSTAT
                    249:        struct svr4_sys_fxstat_args cup;
                    250:
                    251:        SCARG(&cup, two) = 2;
                    252:        SCARG(&cup, fd) = SCARG(uap, fd);
                    253:        SCARG(&cup, sb) = (struct svr4_xstat *) SCARG(uap, sb);
                    254:        return svr4_sys_fxstat(p, &cup, retval);
                    255: #else
                    256:        struct stat             st;
                    257:        struct svr4_stat        svr4_st;
                    258:        struct sys_fstat_args   cup;
                    259:        int                     error;
                    260:
                    261:        caddr_t sg = stackgap_init(p->p_emul);
                    262:
                    263:        SCARG(&cup, fd) = SCARG(uap, fd);
                    264:        SCARG(&cup, sb) = stackgap_alloc(&sg, sizeof(struct stat));
                    265:
                    266:        if ((error = sys_fstat(p, &cup, retval)) != 0)
                    267:                return error;
                    268:
                    269:        if ((error = copyin(SCARG(&cup, sb), &st, sizeof st)) != 0)
                    270:                return error;
                    271:
                    272:        bsd_to_svr4_stat(&st, &svr4_st);
                    273:
                    274:        if ((error = copyout(&svr4_st, SCARG(uap, sb), sizeof svr4_st)) != 0)
                    275:                return error;
                    276:
                    277:        return 0;
                    278: #endif
                    279: }
                    280:
                    281:
                    282: int
                    283: svr4_sys_xstat(p, v, retval)
                    284:        register struct proc *p;
                    285:        void *v;
                    286:        register_t *retval;
                    287: {
                    288:        struct svr4_sys_xstat_args *uap = v;
                    289:        struct stat             st;
                    290:        struct svr4_xstat       svr4_st;
                    291:        struct sys_stat_args    cup;
                    292:        int                     error;
                    293:
                    294:        caddr_t sg = stackgap_init(p->p_emul);
                    295:        SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(struct stat));
                    296:        SVR4_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
                    297:
                    298:        SCARG(&cup, path) = SCARG(uap, path);
                    299:
                    300:        if ((error = sys_stat(p, &cup, retval)) != 0)
                    301:                return error;
                    302:
                    303:        if ((error = copyin(SCARG(&cup, ub), &st, sizeof st)) != 0)
                    304:                return error;
                    305:
                    306:        bsd_to_svr4_xstat(&st, &svr4_st);
                    307:
                    308:        if (S_ISSOCK(st.st_mode))
                    309:                (void) svr4_add_socket(p, SCARG(uap, path), &st);
                    310:
                    311:        if ((error = copyout(&svr4_st, SCARG(uap, ub), sizeof svr4_st)) != 0)
                    312:                return error;
                    313:
                    314:        return 0;
                    315: }
                    316:
                    317: int
                    318: svr4_sys_lxstat(p, v, retval)
                    319:        register struct proc *p;
                    320:        void *v;
                    321:        register_t *retval;
                    322: {
                    323:        struct svr4_sys_lxstat_args *uap = v;
                    324:        struct stat             st;
                    325:        struct svr4_xstat       svr4_st;
                    326:        struct sys_lstat_args   cup;
                    327:        int                     error;
                    328:
                    329:        caddr_t sg = stackgap_init(p->p_emul);
                    330:        SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(struct stat));
                    331:        SVR4_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
                    332:
                    333:        SCARG(&cup, path) = SCARG(uap, path);
                    334:
                    335:        if ((error = sys_lstat(p, &cup, retval)) != 0)
                    336:                return error;
                    337:
                    338:        if ((error = copyin(SCARG(&cup, ub), &st, sizeof st)) != 0)
                    339:                return error;
                    340:
                    341:        bsd_to_svr4_xstat(&st, &svr4_st);
                    342:
                    343:        if (S_ISSOCK(st.st_mode))
                    344:                (void) svr4_add_socket(p, SCARG(uap, path), &st);
                    345:
                    346:        if ((error = copyout(&svr4_st, SCARG(uap, ub), sizeof svr4_st)) != 0)
                    347:                return error;
                    348:
                    349:        return 0;
                    350: }
                    351:
                    352: int
                    353: svr4_sys_fxstat(p, v, retval)
                    354:        register struct proc *p;
                    355:        void *v;
                    356:        register_t *retval;
                    357: {
                    358:        struct svr4_sys_fxstat_args *uap = v;
                    359:        struct stat             st;
                    360:        struct svr4_xstat       svr4_st;
                    361:        struct sys_fstat_args   cup;
                    362:        int                     error;
                    363:
                    364:        caddr_t sg = stackgap_init(p->p_emul);
                    365:
                    366:        SCARG(&cup, fd) = SCARG(uap, fd);
                    367:        SCARG(&cup, sb) = stackgap_alloc(&sg, sizeof(struct stat));
                    368:
                    369:        if ((error = sys_fstat(p, &cup, retval)) != 0)
                    370:                return error;
                    371:
                    372:        if ((error = copyin(SCARG(&cup, sb), &st, sizeof st)) != 0)
                    373:                return error;
                    374:
                    375:        bsd_to_svr4_xstat(&st, &svr4_st);
                    376:
                    377:        if ((error = copyout(&svr4_st, SCARG(uap, sb), sizeof svr4_st)) != 0)
                    378:                return error;
                    379:
                    380:        return 0;
                    381: }
                    382:
                    383:
                    384: int
                    385: svr4_sys_stat64(p, v, retval)
                    386:        struct proc *p;
                    387:        void *v;
                    388:        register_t *retval;
                    389: {
                    390:        struct svr4_sys_stat64_args *uap = v;
                    391:        struct stat             st;
                    392:        struct svr4_stat64      svr4_st;
                    393:        struct sys_stat_args    cup;
                    394:        int                     error;
                    395:
                    396:        caddr_t sg = stackgap_init(p->p_emul);
                    397:
                    398:        SCARG(&cup, path) = SCARG(uap, path);
                    399:        SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(struct stat));
                    400:
                    401:        if ((error = sys_stat(p, &cup, retval)) != 0)
                    402:                return error;
                    403:
                    404:        if ((error = copyin(SCARG(&cup, ub), &st, sizeof st)) != 0)
                    405:                return error;
                    406:
                    407:        bsd_to_svr4_stat64(&st, &svr4_st);
                    408:
                    409:        if (S_ISSOCK(st.st_mode))
                    410:                (void) svr4_add_socket(p, SCARG(uap, path), &st);
                    411:
                    412:        if ((error = copyout(&svr4_st, SCARG(uap, sb), sizeof svr4_st)) != 0)
                    413:                return error;
                    414:
                    415:        return 0;
                    416: }
                    417:
                    418:
                    419: int
                    420: svr4_sys_lstat64(p, v, retval)
                    421:        struct proc *p;
                    422:        void *v;
                    423:        register_t *retval;
                    424: {
                    425:        struct svr4_sys_lstat64_args *uap = v;
                    426:        struct stat             st;
                    427:        struct svr4_stat64      svr4_st;
                    428:        struct sys_lstat_args   cup;
                    429:        int                     error;
                    430:
                    431:        caddr_t sg = stackgap_init(p->p_emul);
                    432:
                    433:        SCARG(&cup, path) = SCARG(uap, path);
                    434:        SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(struct stat));
                    435:
                    436:        if ((error = sys_lstat(p, &cup, retval)) != 0)
                    437:                return error;
                    438:
                    439:        if ((error = copyin(SCARG(&cup, ub), &st, sizeof st)) != 0)
                    440:                return error;
                    441:
                    442:        bsd_to_svr4_stat64(&st, &svr4_st);
                    443:
                    444:        if (S_ISSOCK(st.st_mode))
                    445:                (void) svr4_add_socket(p, SCARG(uap, path), &st);
                    446:
                    447:        if ((error = copyout(&svr4_st, SCARG(uap, sb), sizeof svr4_st)) != 0)
                    448:                return error;
                    449:
                    450:        return 0;
                    451: }
                    452:
                    453:
                    454: int
                    455: svr4_sys_fstat64(p, v, retval)
                    456:        register struct proc *p;
                    457:        void *v;
                    458:        register_t *retval;
                    459: {
                    460:        struct svr4_sys_fstat64_args *uap = v;
                    461:        struct stat             st;
                    462:        struct svr4_stat64      svr4_st;
                    463:        struct sys_fstat_args   cup;
                    464:        int                     error;
                    465:
                    466:        caddr_t sg = stackgap_init(p->p_emul);
                    467:
                    468:        SCARG(&cup, fd) = SCARG(uap, fd);
                    469:        SCARG(&cup, sb) = stackgap_alloc(&sg, sizeof(struct stat));
                    470:
                    471:        if ((error = sys_fstat(p, &cup, retval)) != 0)
                    472:                return error;
                    473:
                    474:        if ((error = copyin(SCARG(&cup, sb), &st, sizeof st)) != 0)
                    475:                return error;
                    476:
                    477:        bsd_to_svr4_stat64(&st, &svr4_st);
                    478:
                    479:        if ((error = copyout(&svr4_st, SCARG(uap, sb), sizeof svr4_st)) != 0)
                    480:                return error;
                    481:
                    482:        return 0;
                    483: }
                    484:
                    485:
                    486: struct svr4_ustat_args {
                    487:        syscallarg(svr4_dev_t)          dev;
                    488:        syscallarg(struct svr4_ustat *) name;
                    489: };
                    490:
                    491: int
                    492: svr4_ustat(p, v, retval)
                    493:        register struct proc *p;
                    494:        void *v;
                    495:        register_t *retval;
                    496: {
                    497:        struct svr4_ustat_args /* {
                    498:                syscallarg(svr4_dev_t)          dev;
                    499:                syscallarg(struct svr4_ustat *) name;
                    500:        } */ *uap = v;
                    501:        struct svr4_ustat       us;
                    502:        int                     error;
                    503:
                    504:        bzero(&us, sizeof us);
                    505:
                    506:        /*
                    507:         * XXX: should set f_tfree and f_tinode at least
                    508:         * How do we translate dev -> fstat? (and then to svr4_ustat)
                    509:         */
                    510:        if ((error = copyout(&us, SCARG(uap, name), sizeof us)) != 0)
                    511:                return (error);
                    512:
                    513:        return 0;
                    514: }
                    515:
                    516:
                    517:
                    518: int
                    519: svr4_sys_uname(p, v, retval)
                    520:        register struct proc *p;
                    521:        void *v;
                    522:        register_t *retval;
                    523: {
                    524:        struct svr4_sys_uname_args *uap = v;
                    525:        struct svr4_utsname     *sut;
                    526:        extern char hostname[], machine[];
                    527:        const char *cp;
                    528:        char *dp, *ep;
                    529:        int error;
                    530:
                    531:        sut = malloc(sizeof(*sut), M_TEMP, M_WAITOK);
                    532:        bzero(sut, sizeof(*sut));
                    533:        strlcpy(sut->sysname, ostype, sizeof(sut->sysname));
                    534:        strlcpy(sut->nodename, hostname, sizeof(sut->nodename));
                    535:        strlcpy(sut->release, osrelease, sizeof(sut->release));
                    536:
                    537:        dp = sut->version;
                    538:        ep = &sut->version[sizeof(sut->version) - 1];
                    539:        for (cp = version; *cp && *cp != '('; cp++)
                    540:                ;
                    541:        for (cp++; *cp && *cp != ')' && dp < ep; cp++)
                    542:                *dp++ = *cp;
                    543:        for (; *cp && *cp != '#'; cp++)
                    544:                ;
                    545:        for (; *cp && *cp != ':' && dp < ep; cp++)
                    546:                *dp++ = *cp;
                    547:        *dp = '\0';
                    548:
                    549:        strlcpy(sut->machine, machine, sizeof(sut->machine));
                    550:
                    551:        error = copyout(sut, SCARG(uap, name), sizeof(struct svr4_utsname));
                    552:        free(sut, M_TEMP);
                    553:        return (error);
                    554: }
                    555:
                    556: int
                    557: svr4_sys_systeminfo(p, v, retval)
                    558:        register struct proc *p;
                    559:        void *v;
                    560:        register_t *retval;
                    561: {
                    562:        struct svr4_sys_systeminfo_args *uap = v;
                    563:        const char *str;
                    564:        int name;
                    565:        int error;
                    566:        long len;
                    567:        extern char hostname[], machine[], domainname[];
                    568: #ifdef __sparc__
                    569:        extern char *cpu_class;
                    570: #endif
                    571:
                    572:        u_int rlen = SCARG(uap, len);
                    573:
                    574:        switch (SCARG(uap, what)) {
                    575:        case SVR4_SI_SYSNAME:
                    576:                str = ostype;
                    577:                break;
                    578:
                    579:        case SVR4_SI_HOSTNAME:
                    580:                str = hostname;
                    581:                break;
                    582:
                    583:        case SVR4_SI_RELEASE:
                    584:                str = osrelease;
                    585:                break;
                    586:
                    587:        case SVR4_SI_VERSION:
                    588:                str = version;
                    589:                break;
                    590:
                    591:        case SVR4_SI_MACHINE:
                    592:                str = machine;
                    593:                break;
                    594:
                    595:        case SVR4_SI_ARCHITECTURE:
                    596:                str = machine;
                    597:                break;
                    598:
                    599:        case SVR4_SI_HW_SERIAL:
                    600:                str = "0";
                    601:                break;
                    602:
                    603:        case SVR4_SI_HW_PROVIDER:
                    604:                str = ostype;
                    605:                break;
                    606:
                    607:        case SVR4_SI_SRPC_DOMAIN:
                    608:                str = domainname;
                    609:                break;
                    610:
                    611:        case SVR4_SI_PLATFORM:
                    612: #ifdef __sparc__
                    613:                str = cpu_class;
                    614: #else
                    615:                str = machine;
                    616: #endif
                    617:                break;
                    618:
                    619:        case SVR4_SI_KERB_REALM:
                    620:                str = "unsupported";
                    621:                break;
                    622:
                    623:        case SVR4_SI_SET_HOSTNAME:
                    624:                if ((error = suser(p, 0)) != 0)
                    625:                        return error;
                    626:                name = KERN_HOSTNAME;
                    627:                return kern_sysctl(&name, 1, 0, 0, SCARG(uap, buf), rlen, p);
                    628:
                    629:        case SVR4_SI_SET_SRPC_DOMAIN:
                    630:                if ((error = suser(p, 0)) != 0)
                    631:                        return error;
                    632:                name = KERN_DOMAINNAME;
                    633:                return kern_sysctl(&name, 1, 0, 0, SCARG(uap, buf), rlen, p);
                    634:
                    635:        case SVR4_SI_SET_KERB_REALM:
                    636:                return 0;
                    637:
                    638:        default:
                    639:                DPRINTF(("Bad systeminfo command %d\n", SCARG(uap, what)));
                    640:                return ENOSYS;
                    641:        }
                    642:
                    643:        /* on success, sysinfo() returns byte count including \0 */
                    644:        /* result is not diminished if user buffer was too small */
                    645:        len = strlen(str) + 1;
                    646:        *retval = len;
                    647:
                    648:        /* nothing to copy if user buffer is empty */
                    649:        if (rlen == 0)
                    650:                return 0;
                    651:
                    652:        if (len > rlen) {
                    653:                char nul = 0;
                    654:
                    655:                /* if str overruns buffer, put NUL in last place */
                    656:                len = rlen - 1;
                    657:                if (copyout(&nul, SCARG(uap, buf), sizeof(char)) != 0)
                    658:                        return EFAULT;
                    659:        }
                    660:
                    661:        return copyout(str, SCARG(uap, buf), len);
                    662: }
                    663:
                    664:
                    665: int
                    666: svr4_sys_utssys(p, v, retval)
                    667:        register struct proc *p;
                    668:        void *v;
                    669:        register_t *retval;
                    670: {
                    671:        struct svr4_sys_utssys_args *uap = v;
                    672:
                    673:        switch (SCARG(uap, sel)) {
                    674:        case 0:         /* uname(2)  */
                    675:                {
                    676:                        struct svr4_sys_uname_args ua;
                    677:                        SCARG(&ua, name) = SCARG(uap, a1);
                    678:                        return svr4_sys_uname(p, &ua, retval);
                    679:                }
                    680:
                    681:        case 2:         /* ustat(2)  */
                    682:                {
                    683:                        struct svr4_ustat_args ua;
                    684:                        SCARG(&ua, dev) = (svr4_dev_t) SCARG(uap, a2);
                    685:                        SCARG(&ua, name) = SCARG(uap, a1);
                    686:                        return svr4_ustat(p, &ua, retval);
                    687:                }
                    688:
                    689:        case 3:         /* fusers(2) */
                    690:                return ENOSYS;
                    691:
                    692:        default:
                    693:                return ENOSYS;
                    694:        }
                    695:        return ENOSYS;
                    696: }
                    697:
                    698:
                    699: int
                    700: svr4_sys_utime(p, v, retval)
                    701:        register struct proc *p;
                    702:        void *v;
                    703:        register_t *retval;
                    704: {
                    705:        struct svr4_sys_utime_args *uap = v;
                    706:        struct svr4_utimbuf ub;
                    707:        struct timeval tbuf[2];
                    708:        struct sys_utimes_args ap;
                    709:        int error;
                    710:        caddr_t sg = stackgap_init(p->p_emul);
                    711:
                    712:        SCARG(&ap, tptr) = stackgap_alloc(&sg, sizeof(tbuf));
                    713:        SVR4_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
                    714:        SCARG(&ap, path) = SCARG(uap, path);
                    715:        if (SCARG(uap, ubuf) != NULL) {
                    716:                if ((error = copyin(SCARG(uap, ubuf), &ub, sizeof(ub))) != 0)
                    717:                        return error;
                    718:                tbuf[0].tv_sec = ub.actime;
                    719:                tbuf[0].tv_usec = 0;
                    720:                tbuf[1].tv_sec = ub.modtime;
                    721:                tbuf[1].tv_usec = 0;
                    722:                error = copyout(tbuf, (struct timeval *)SCARG(&ap, tptr), sizeof(tbuf));
                    723:                if (error)
                    724:                        return error;
                    725:        }
                    726:        else
                    727:                SCARG(&ap, tptr) = NULL;
                    728:        return sys_utimes(p, &ap, retval);
                    729: }
                    730:
                    731:
                    732: int
                    733: svr4_sys_utimes(p, v, retval)
                    734:        register struct proc *p;
                    735:        void *v;
                    736:        register_t *retval;
                    737: {
                    738:        struct svr4_sys_utimes_args *uap = v;
                    739:        caddr_t sg = stackgap_init(p->p_emul);
                    740:        SVR4_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
                    741:        return sys_utimes(p, uap, retval);
                    742: }
                    743:
                    744:
                    745: static int
                    746: svr4_to_bsd_pathconf(name)
                    747:        int name;
                    748: {
                    749:        switch (name) {
                    750:        case SVR4_PC_LINK_MAX:
                    751:                return _PC_LINK_MAX;
                    752:
                    753:        case SVR4_PC_MAX_CANON:
                    754:                return _PC_MAX_CANON;
                    755:
                    756:        case SVR4_PC_MAX_INPUT:
                    757:                return _PC_MAX_INPUT;
                    758:
                    759:        case SVR4_PC_NAME_MAX:
                    760:                return _PC_NAME_MAX;
                    761:
                    762:        case SVR4_PC_PATH_MAX:
                    763:                return _PC_PATH_MAX;
                    764:
                    765:        case SVR4_PC_PIPE_BUF:
                    766:                return _PC_PIPE_BUF;
                    767:
                    768:        case SVR4_PC_NO_TRUNC:
                    769:                return _PC_NO_TRUNC;
                    770:
                    771:        case SVR4_PC_VDISABLE:
                    772:                return _PC_VDISABLE;
                    773:
                    774:        case SVR4_PC_CHOWN_RESTRICTED:
                    775:                return _PC_CHOWN_RESTRICTED;
                    776:
                    777:        case SVR4_PC_ASYNC_IO:
                    778:        case SVR4_PC_PRIO_IO:
                    779:        case SVR4_PC_SYNC_IO:
                    780:                /* Not supported */
                    781:                return 0;
                    782:
                    783:        default:
                    784:                /* Invalid */
                    785:                return -1;
                    786:        }
                    787: }
                    788:
                    789:
                    790: int
                    791: svr4_sys_pathconf(p, v, retval)
                    792:        register struct proc *p;
                    793:        void *v;
                    794:        register_t *retval;
                    795: {
                    796:        struct svr4_sys_pathconf_args *uap = v;
                    797:        caddr_t sg = stackgap_init(p->p_emul);
                    798:
                    799:        SVR4_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
                    800:
                    801:        SCARG(uap, name) = svr4_to_bsd_pathconf(SCARG(uap, name));
                    802:
                    803:        switch (SCARG(uap, name)) {
                    804:        case -1:
                    805:                *retval = -1;
                    806:                return EINVAL;
                    807:        case 0:
                    808:                *retval = 0;
                    809:                return 0;
                    810:        default:
                    811:                return sys_pathconf(p, uap, retval);
                    812:        }
                    813: }
                    814:
                    815: int
                    816: svr4_sys_fpathconf(p, v, retval)
                    817:        register struct proc *p;
                    818:        void *v;
                    819:        register_t *retval;
                    820: {
                    821:        struct svr4_sys_fpathconf_args *uap = v;
                    822:
                    823:        SCARG(uap, name) = svr4_to_bsd_pathconf(SCARG(uap, name));
                    824:
                    825:        switch (SCARG(uap, name)) {
                    826:        case -1:
                    827:                *retval = -1;
                    828:                return EINVAL;
                    829:        case 0:
                    830:                *retval = 0;
                    831:                return 0;
                    832:        default:
                    833:                return sys_fpathconf(p, uap, retval);
                    834:        }
                    835: }

CVSweb