Annotation of coherent/b/STREAMS/conf_79/streams/confinfo.c, revision 1.1

1.1     ! root        1: #define        _DDI_DKI        1
        !             2: #define        _SYSV3          1
        !             3: 
        !             4: /*
        !             5:  * This file contains supplementary definitions used to deal with or aid the
        !             6:  * implementation of the automatically generated device configuration code
        !             7:  * in the "conf.c" file.
        !             8:  *
        !             9:  * Note that we are in the _SYSV3 world because we touch <sys/uproc.h>
        !            10:  */
        !            11: /*
        !            12:  *-IMPORTS:
        !            13:  *     <common/ccompat.h>
        !            14:  *             __USE_PROTO__
        !            15:  *             __ARGS ()
        !            16:  *     <common/xdebug.h>
        !            17:  *             __LOCAL__
        !            18:  *     <sys/debug.h>
        !            19:  *             ASSERT ()
        !            20:  *     <sys/types.h>
        !            21:  *             cred_t
        !            22:  *             n_dev_t
        !            23:  *             o_dev_t
        !            24:  *             makedevice ()
        !            25:  *     <sys/cmn_err.h>
        !            26:  *             CE_PANIC
        !            27:  *             cmn_err ()
        !            28:  *     <sys/file.h>
        !            29:  *             FREAD
        !            30:  *             FWRITE
        !            31:  *             FNDELAY
        !            32:  *             FNONBLOCK
        !            33:  *             FEXCL
        !            34:  *     <sys/open.h>
        !            35:  *             OTYP_BLK
        !            36:  *             OTYP_CHR
        !            37:  *             OTYP_LYR
        !            38:  *     <sys/uio.h>
        !            39:  *             iovec_t
        !            40:  *             uio_t
        !            41:  *     <stddef.h>
        !            42:  *             NULL
        !            43:  *     <sys/errno.h>
        !            44:  *             ENXIO
        !            45:  */
        !            46: 
        !            47: #include <common/ccompat.h>
        !            48: #include <common/xdebug.h>
        !            49: #include <kernel/strmlib.h>
        !            50: #include <sys/debug.h>
        !            51: #include <sys/types.h>
        !            52: #include <sys/cmn_err.h>
        !            53: #include <sys/file.h>
        !            54: #include <sys/open.h>
        !            55: #include <sys/uio.h>
        !            56: #include <sys/errno.h>
        !            57: #include <stddef.h>
        !            58: 
        !            59: #include <kernel/confinfo.h>
        !            60: 
        !            61: 
        !            62: /*
        !            63:  * These are Coherent header files! Treat with all the caution you would
        !            64:  * normally use for handling toxic waste!
        !            65:  *
        !            66:  *     <sys/io.h>
        !            67:  *             IO
        !            68:  *     <sys/stat.h>
        !            69:  *             major ()
        !            70:  *             minor ()
        !            71:  *     <sys/uproc.h>
        !            72:  *             u.u_uid
        !            73:  *             u.u_gid
        !            74:  *     <sys/con.h>
        !            75:  *             DFBLK
        !            76:  *
        !            77:  * The following values which used to be in Coherent <sys/inode.h> have been
        !            78:  * moved here so we can use them. <sys/inode.h> is too much of a mess.
        !            79:  *
        !            80:  *     <sys/file.h>
        !            81:  *             IPR
        !            82:  *             IPW
        !            83:  *             IPNDLY
        !            84:  *             IPEXCL
        !            85:  *
        !            86:  * Note that the actual magic u area variable 'u' is extern'ed in
        !            87:  * <sys/coherent.h>.
        !            88:  */
        !            89: 
        !            90: #include <sys/io.h>
        !            91: #include <sys/stat.h>
        !            92: 
        !            93: #if    __COHERENT__
        !            94: 
        !            95: #define        __KERNEL__      2
        !            96: #include <sys/uproc.h>
        !            97: #undef __KERNEL__
        !            98: 
        !            99: extern UPROC   u;
        !           100: 
        !           101: #define        SETUERROR(e)    u.u_error = (e)
        !           102: 
        !           103: #else
        !           104: 
        !           105: #define        SETUERROR(e)    ASSERT (e == 0 || "Hit error" == NULL)
        !           106: 
        !           107: #endif
        !           108: 
        !           109: 
        !           110: /*
        !           111:  * This function initialises a cred_t structure from Coherent's internal data
        !           112:  * structures. This function would normally be local, but it is also called
        !           113:  * upon by code in "drv_ddi.c" to implement the drv_getparm () and
        !           114:  * drv_setparm () utilities.
        !           115:  */
        !           116: 
        !           117: #if    __USE_PROTO__
        !           118: cred_t * (MAKE_CRED) (cred_t * credp)
        !           119: #else
        !           120: cred_t *
        !           121: MAKE_CRED __ARGS ((credp))
        !           122: cred_t       * credp;
        !           123: #endif
        !           124: {
        !           125:        credp->cr_ref = 1;
        !           126:        credp->cr_ngroups = 0;  /* no supplementary groups */
        !           127: 
        !           128: #ifdef __MSDOS__
        !           129:        credp->cr_uid = credp->cr_ruid = credp->cr_suid = 0;
        !           130:        credp->cr_gid = credp->cr_rgid = credp->cr_sgid = 0;
        !           131: #else
        !           132:        credp->cr_uid = u.u_uid;
        !           133:        credp->cr_gid = u.u_gid;
        !           134:        credp->cr_ruid = u.u_ruid;
        !           135:        credp->cr_rgid = u.u_rgid;
        !           136:        credp->cr_suid = u.u_euid;      /* u.u_euid is saved effective uid */
        !           137:        credp->cr_sgid = u.u_egid;      /* u.u_egid is saved effective gid */
        !           138: #endif
        !           139:        return credp;
        !           140: }
        !           141: 
        !           142: 
        !           143: /*
        !           144:  * This local function is called to build a "uio_t" structure from Coherent's
        !           145:  * UIO structure.
        !           146:  */
        !           147: 
        !           148: #if    __USE_PROTO__
        !           149: __LOCAL__ uio_t * (MAKE_UIO) (uio_t * uiop, iovec_t * iovp, int mode, IO * iop)
        !           150: #else
        !           151: __LOCAL__ uio_t *
        !           152: MAKE_UIO __ARGS ((uiop, iovp, mode, iop))
        !           153: uio_t        * uiop;
        !           154: iovec_t              * iovp;
        !           155: int            mode;
        !           156: IO           * iop;
        !           157: #endif
        !           158: {
        !           159:        uiop->uio_iov = iovp;
        !           160:        uiop->uio_iovcnt = 1;
        !           161:        uiop->uio_offset = iop->io_seek;
        !           162:        uiop->uio_segflg = iop->io_seg == IOSYS ? UIO_SYSSPACE : UIO_USERSPACE;
        !           163:        uiop->uio_fmode = mode | ((iop->io_flag & IONDLY) != 0 ? FNDELAY : 0);
        !           164:        uiop->uio_resid = iop->io_ioc;
        !           165: 
        !           166: #ifdef _I386
        !           167:        iovp->iov_base = iop->io.vbase;
        !           168: #else
        !           169:        iovp->iov_base = iop->io_base;
        !           170: #endif
        !           171:        iovp->iov_len = iop->io_ioc;
        !           172: 
        !           173:        return uiop;
        !           174: }
        !           175: 
        !           176: 
        !           177: /*
        !           178:  * This function is used to copy back the information from a "uio_t" structure
        !           179:  * into a Coherent IO structure.
        !           180:  */
        !           181: 
        !           182: #if    __USE_PROTO__
        !           183: __LOCAL__ void (DESTROY_UIO) (uio_t * uiop, IO * iop)
        !           184: #else
        !           185: __LOCAL__ void
        !           186: DESTROY_UIO __ARGS ((uiop, iop))
        !           187: uio_t        * uiop;
        !           188: IO           * iop;
        !           189: #endif
        !           190: {
        !           191:        ASSERT (uiop->uio_iov != NULL);
        !           192:        ASSERT (uiop->uio_iov->iov_len == uiop->uio_resid);
        !           193: 
        !           194:        iop->io_ioc = uiop->uio_resid;
        !           195:        iop->io_seek = uiop->uio_offset;
        !           196: #ifdef _I386
        !           197:        iop->io.vbase = uiop->uio_iov->iov_base;
        !           198: #else
        !           199:        iop->io_base = uiop->uio_iov->iov_base;
        !           200: #endif
        !           201: }
        !           202: 
        !           203: 
        !           204: /*
        !           205:  * This function is called upon by the machine-generated code in "conf.c" to
        !           206:  * forward a Coherent device open request to a System V device.
        !           207:  */
        !           208: 
        !           209: #if    __USE_PROTO__
        !           210: int (_forward_open) (o_dev_t dev, int mode, int flags, ddi_open_t funcp)
        !           211: #else
        !           212: int
        !           213: _forward_open __ARGS ((dev, mode, flags, funcp))
        !           214: o_dev_t                dev;
        !           215: int            mode;
        !           216: int            flags;
        !           217: ddi_open_t     funcp;
        !           218: #endif
        !           219: {
        !           220:        n_dev_t         newdev = makedevice (major (dev), minor (dev));
        !           221:        cred_t          cred;
        !           222:        int             newmode;
        !           223:        int             ret;
        !           224: 
        !           225:        newmode = 0;
        !           226: 
        !           227:        /*
        !           228:         * These are the flags documented by the Coherent driver kit. In
        !           229:         * actual fact, there are more (corresponding to the DDI/DKI flags)
        !           230:         * that are passed down from the system file table's flag entry. The
        !           231:         * fact that the others are not documented probably reflects the fact
        !           232:         * that calls to dread () either pass only IPR or IPW directly, while
        !           233:         * the existence of the other flags can only be discovered by tracing
        !           234:         * many layers of calls.
        !           235:         */
        !           236: 
        !           237:        if ((mode & IPR) != 0)
        !           238:                newmode |= FREAD;
        !           239:        if ((mode & IPW) != 0)
        !           240:                newmode |= FWRITE;
        !           241: 
        !           242:        /*
        !           243:         * And the other flags. There is no equivalent for FNONBLOCK.
        !           244:         */
        !           245: 
        !           246:        if ((mode & IPEXCL) != 0)
        !           247:                newmode |= FEXCL;
        !           248:        if ((mode & IPNDLY) != 0)
        !           249:                newmode |= FNDELAY;
        !           250: 
        !           251:        flags = (flags & DFBLK) != 0 ? OTYP_BLK : OTYP_CHR;
        !           252: 
        !           253:        ret = (* funcp) (& newdev, newmode, flags, MAKE_CRED (& cred));
        !           254: 
        !           255:        SETUERROR (ret);
        !           256:        return ret;
        !           257: }
        !           258: 
        !           259: 
        !           260: /*
        !           261:  * This function is called upon by the machine-generated code in "conf.c" to
        !           262:  * forward a Coherent device close request to a System V device.
        !           263:  */
        !           264: 
        !           265: #if    __USE_PROTO__
        !           266: int (_forward_close) (o_dev_t dev, int mode, int flags, ddi_close_t funcp)
        !           267: #else
        !           268: int
        !           269: _forward_close __ARGS ((dev, mode, flags, funcp))
        !           270: o_dev_t                dev;
        !           271: int            mode;
        !           272: int            flags;
        !           273: ddi_close_t    funcp;
        !           274: #endif
        !           275: {
        !           276:        n_dev_t         newdev = makedevice (major (dev), minor (dev));
        !           277:        cred_t          cred;
        !           278:        int             newmode;
        !           279:        int             ret;
        !           280: 
        !           281:        newmode = 0;
        !           282: 
        !           283:        /*
        !           284:         * These are the flags documented by the Coherent driver kit. In
        !           285:         * actual fact, there are more (corresponding to the DDI/DKI flags)
        !           286:         * that are passed down from the system file table's flag entry. The
        !           287:         * fact that the others are not documented probably reflects the fact
        !           288:         * that calls to dread () either pass only IPR or IPW directly, while
        !           289:         * the existence of the other flags can only be discovered by tracing
        !           290:         * many layers of calls.
        !           291:         */
        !           292: 
        !           293:        if ((mode & IPR) != 0)
        !           294:                newmode |= FREAD;
        !           295:        if ((mode & IPW) != 0)
        !           296:                newmode |= FWRITE;
        !           297: 
        !           298:        /*
        !           299:         * And the other flags. There is no equivalent for FNONBLOCK.
        !           300:         */
        !           301: 
        !           302:        if ((mode & IPEXCL) != 0)
        !           303:                newmode |= FEXCL;
        !           304:        if ((mode & IPNDLY) != 0)
        !           305:                newmode |= FNDELAY;
        !           306: 
        !           307:        flags = (flags & DFBLK) != 0 ? OTYP_BLK : OTYP_CHR;
        !           308: 
        !           309:        ret = (* funcp) (newdev, newmode, flags, MAKE_CRED (& cred));
        !           310: 
        !           311:        SETUERROR (ret);
        !           312:        return ret;
        !           313: }
        !           314: 
        !           315: 
        !           316: /*
        !           317:  * This function is called upon by the machine-generated code in "conf.c" to
        !           318:  * forward a Coherent device read request to a System V device.
        !           319:  */
        !           320: 
        !           321: #if    __USE_PROTO__
        !           322: int (_forward_read) (o_dev_t dev, IO * iop, ddi_read_t funcp)
        !           323: #else
        !           324: int
        !           325: _forward_read __ARGS ((dev, iop, funcp))
        !           326: o_dev_t                dev;
        !           327: IO           * iop;
        !           328: ddi_read_t     funcp;
        !           329: #endif
        !           330: {
        !           331:        n_dev_t         newdev = makedevice (major (dev), minor (dev));
        !           332:        cred_t          cred;
        !           333:        iovec_t         iov;
        !           334:        uio_t           uio;
        !           335:        int             ret;
        !           336: 
        !           337:        ret = (* funcp) (newdev, MAKE_UIO (& uio, & iov, FREAD, iop),
        !           338:                                 MAKE_CRED (& cred));
        !           339:        DESTROY_UIO (& uio, iop);
        !           340:        SETUERROR (ret);
        !           341:        return ret;
        !           342: }
        !           343: 
        !           344: 
        !           345: /*
        !           346:  * This function is called upon by the machine-generated code in "conf.c" to
        !           347:  * forward a Coherent device write request to a System V device.
        !           348:  */
        !           349: 
        !           350: #if    __USE_PROTO__
        !           351: int (_forward_write) (o_dev_t dev, IO * iop, ddi_write_t funcp)
        !           352: #else
        !           353: int
        !           354: _forward_write __ARGS ((dev, iop, funcp))
        !           355: o_dev_t                dev;
        !           356: IO           * iop;
        !           357: ddi_write_t    funcp;
        !           358: #endif
        !           359: {
        !           360:        n_dev_t         newdev = makedevice (major (dev), minor (dev));
        !           361:        cred_t          cred;
        !           362:        iovec_t         iov;
        !           363:        uio_t           uio;
        !           364:        int             ret;
        !           365: 
        !           366:        ret = (* funcp) (newdev, MAKE_UIO (& uio, & iov, FWRITE, iop),
        !           367:                                 MAKE_CRED (& cred));
        !           368:        DESTROY_UIO (& uio, iop);
        !           369:        SETUERROR (ret);
        !           370:        return ret;
        !           371: }
        !           372: 
        !           373: 
        !           374: /*
        !           375:  * This function is called upon by the machine-generated code in "conf.c" to
        !           376:  * forward a Coherent device ioctl request to a System V device.
        !           377:  */
        !           378: 
        !           379: #if    __USE_PROTO__
        !           380: int (_forward_ioctl) (o_dev_t dev, int cmd, _VOID * arg, int mode,
        !           381:                      ddi_ioctl_t funcp)
        !           382: #else
        !           383: int
        !           384: _forward_ioctl __ARGS ((dev, cmd, arg, mode, funcp))
        !           385: o_dev_t                dev;
        !           386: int            cmd;
        !           387: _VOID        * arg;
        !           388: int            mode;
        !           389: ddi_ioctl_t    funcp;
        !           390: #endif
        !           391: {
        !           392:        n_dev_t         newdev = makedevice (major (dev), minor (dev));
        !           393:        cred_t          cred;
        !           394:        int             rval;
        !           395:        int             newmode;
        !           396:        int             ret;
        !           397: 
        !           398:        newmode = 0;
        !           399: 
        !           400:        /*
        !           401:         * These are the flags documented by the Coherent driver kit. In
        !           402:         * actual fact, there are more (corresponding to the DDI/DKI flags)
        !           403:         * that are passed down from the system file table's flag entry. The
        !           404:         * fact that the others are not documented probably reflects the fact
        !           405:         * that calls to dread () either pass only IPR or IPW directly, while
        !           406:         * the existence of the other flags can only be discovered by tracing
        !           407:         * many layers of calls.
        !           408:         */
        !           409: 
        !           410:        if ((mode & IPR) != 0)
        !           411:                newmode |= FREAD;
        !           412:        if ((mode & IPW) != 0)
        !           413:                newmode |= FWRITE;
        !           414: 
        !           415:        /*
        !           416:         * And the other flags. There is no equivalent for FNONBLOCK.
        !           417:         */
        !           418: 
        !           419:        if ((mode & IPEXCL) != 0)
        !           420:                newmode |= FEXCL;
        !           421:        if ((mode & IPNDLY) != 0)
        !           422:                newmode |= FNDELAY;
        !           423: 
        !           424:        ret = (* funcp) (newdev, cmd, arg, mode, MAKE_CRED (& cred), & rval);
        !           425: 
        !           426:        SETUERROR (ret);
        !           427:        return rval;
        !           428: }
        !           429: 
        !           430: 
        !           431: 
        !           432: #if 0
        !           433: /*
        !           434:  * This function is called upon by the machine-generated code in "conf.c" to
        !           435:  * forward a Coherent device block request to a System V device.
        !           436:  */
        !           437: 
        !           438: #if    __USE_PROTO__
        !           439: int (_forward_strategy) (BUF * buf, ddi_strategy_t funcp)
        !           440: #else
        !           441: int
        !           442: _forward_strategy __ARGS ((buf, funcp))
        !           443: BUF          * buf;
        !           444: ddi_strategy_t funcp;
        !           445: #endif
        !           446: {
        !           447:        cmn_err (CE_PANIC, "DDI/DKI block drivers not yet supported");
        !           448: }
        !           449: #endif
        !           450: 
        !           451: 
        !           452: /*
        !           453:  * This function is called upon by the machine-generated code in "conf.c" to
        !           454:  * forward a Coherent device poll request to a System V device.
        !           455:  */
        !           456: 
        !           457: #if    __USE_PROTO__
        !           458: int (_forward_poll) (o_dev_t dev, int events, int msec, ddi_chpoll_t funcp)
        !           459: #else
        !           460: int
        !           461: _forward_poll __ARGS ((dev, events, msec, funcp))
        !           462: o_dev_t                dev;
        !           463: int            events;
        !           464: int            msec;
        !           465: ddi_chpoll_t   funcp;
        !           466: #endif
        !           467: {
        !           468:        int             ret;
        !           469: 
        !           470:        cmn_err (CE_PANIC, "DDI/DKI polling not yet supported");
        !           471: 
        !           472: /*     ret = (* funcp) (newdev, events, msec == 0, & revents, pollhead) */
        !           473: 
        !           474:        return 0;
        !           475: }
        !           476: 
        !           477: 
        !           478: /*
        !           479:  * Forward Coh open request to actual STREAMS driver-request-processing code.
        !           480:  */
        !           481: 
        !           482: #if    __USE_PROTO__
        !           483: int (_streams_open) (o_dev_t dev, int mode, int __NOTUSED (flags),
        !           484:                     struct streamtab * stabp)
        !           485: #else
        !           486: int
        !           487: _streams_open __ARGS ((dev, mode, flags, stabp))
        !           488: o_dev_t                dev;
        !           489: int            mode;
        !           490: int            flags;
        !           491: struct streamtab
        !           492:              * stabp;
        !           493: #endif
        !           494: {
        !           495:        n_dev_t         newdev = makedevice (major (dev), minor (dev));
        !           496:        n_dev_t         olddev = newdev;
        !           497:        cred_t          cred;
        !           498:        int             newmode;
        !           499:        int             ret;
        !           500: 
        !           501:        newmode = 0;
        !           502: 
        !           503:        if ((mode & IPR) != 0)
        !           504:                newmode |= FREAD;
        !           505:        if ((mode & IPW) != 0)
        !           506:                newmode |= FWRITE;
        !           507:        if ((mode & IPEXCL) != 0)
        !           508:                newmode |= FEXCL;
        !           509:        if ((mode & IPNDLY) != 0)
        !           510:                newmode |= FNDELAY;
        !           511: 
        !           512:        ret = STREAMS_OPEN (& newdev, stabp, newmode, MAKE_CRED (& cred));
        !           513: 
        !           514:        if (olddev != newdev)
        !           515:                cmn_err (CE_PANIC, "No cloning permitted through the Coherent driver system");
        !           516: 
        !           517:        SETUERROR (ret);
        !           518:        return ret;
        !           519: }
        !           520: 
        !           521: 
        !           522: /*
        !           523:  * Forward Coh close request to actual STREAMS driver-request-processing code.
        !           524:  */
        !           525: 
        !           526: #if    __USE_PROTO__
        !           527: int (_streams_close) (o_dev_t dev, int mode, int __NOTUSED (flags),
        !           528:                      struct streamtab * __NOTUSED (stabp))
        !           529: #else
        !           530: int
        !           531: _streams_close __ARGS ((dev, mode, flags, stabp))
        !           532: o_dev_t                dev;
        !           533: int            mode;
        !           534: int            flags;
        !           535: struct streamtab
        !           536:              * stabp;
        !           537: #endif
        !           538: {
        !           539:        shead_t       * sheadp;
        !           540:        cred_t          cred;
        !           541:        int             newmode;
        !           542:        int             ret;
        !           543: 
        !           544:        if ((sheadp = SHEAD_FIND (makedevice (major (dev), minor (dev)),
        !           545:                                  DEV_SLIST)) == NULL) {
        !           546:                SETUERROR (ENXIO);
        !           547:                return -1;
        !           548:        }
        !           549: 
        !           550:        newmode = 0;
        !           551: 
        !           552:        if ((mode & IPR) != 0)
        !           553:                newmode |= FREAD;
        !           554:        if ((mode & IPW) != 0)
        !           555:                newmode |= FWRITE;
        !           556:        if ((mode & IPEXCL) != 0)
        !           557:                newmode |= FEXCL;
        !           558:        if ((mode & IPNDLY) != 0)
        !           559:                newmode |= FNDELAY;
        !           560: 
        !           561:        ret = STREAMS_CLOSE (sheadp, newmode, MAKE_CRED (& cred));
        !           562: 
        !           563:        SETUERROR (ret);
        !           564:        return ret;
        !           565: }
        !           566: 
        !           567: 
        !           568: /*
        !           569:  * Forward Coh read request to actual STREAMS driver-request-processing code.
        !           570:  */
        !           571: 
        !           572: #if    __USE_PROTO__
        !           573: int (_streams_read) (o_dev_t dev, IO * iop,
        !           574:                     struct streamtab * __NOTUSED (stabp))
        !           575: #else
        !           576: int
        !           577: _streams_read __ARGS ((dev, iop, stabp))
        !           578: o_dev_t                dev;
        !           579: IO           * iop;
        !           580: struct streamtab
        !           581:              * stabp;
        !           582: #endif
        !           583: {
        !           584:        iovec_t         iov;
        !           585:        uio_t           uio;
        !           586:        int             ret;
        !           587:        shead_t       * sheadp;
        !           588: 
        !           589:        if ((sheadp = SHEAD_FIND (makedevice (major (dev), minor (dev)),
        !           590:                                  DEV_SLIST)) == NULL) {
        !           591:                SETUERROR (ENXIO);
        !           592:                return -1;
        !           593:        }
        !           594: 
        !           595:        ret = STREAMS_READ (sheadp, MAKE_UIO (& uio, & iov, FREAD, iop));
        !           596: 
        !           597:        DESTROY_UIO (& uio, iop);
        !           598:        SETUERROR (ret);
        !           599:        return ret;
        !           600: }
        !           601: 
        !           602: 
        !           603: /*
        !           604:  * Forward Coh write request to actual STREAMS driver-request-processing code.
        !           605:  */
        !           606: 
        !           607: #if    __USE_PROTO__
        !           608: int (_streams_write) (o_dev_t dev, IO * iop,
        !           609:                      struct streamtab * __NOTUSED (stabp))
        !           610: #else
        !           611: int
        !           612: _streams_write __ARGS ((dev, iop, stabp))
        !           613: o_dev_t                dev;
        !           614: IO           * iop;
        !           615: struct streamtab
        !           616:              * stabp;
        !           617: #endif
        !           618: {
        !           619:        iovec_t         iov;
        !           620:        uio_t           uio;
        !           621:        int             ret;
        !           622:        shead_t       * sheadp;
        !           623: 
        !           624:        if ((sheadp = SHEAD_FIND (makedevice (major (dev), minor (dev)),
        !           625:                                  DEV_SLIST)) == NULL) {
        !           626:                SETUERROR (ENXIO);
        !           627:                return -1;
        !           628:        }
        !           629: 
        !           630:        ret = STREAMS_WRITE (sheadp, MAKE_UIO (& uio, & iov, FWRITE, iop));
        !           631: 
        !           632:        DESTROY_UIO (& uio, iop);
        !           633:        SETUERROR (ret);
        !           634:        return ret;
        !           635: }
        !           636: 
        !           637: 
        !           638: /*
        !           639:  * Forward Coh ioctl request to actual STREAMS driver-request-processing code.
        !           640:  */
        !           641: 
        !           642: #if    __USE_PROTO__
        !           643: int (_streams_ioctl) (o_dev_t dev, int cmd, _VOID * arg, int mode,
        !           644:                      struct streamtab * __NOTUSED (stabp))
        !           645: #else
        !           646: int
        !           647: _streams_ioctl __ARGS ((dev, cmd, arg, mode, stabp))
        !           648: o_dev_t                dev;
        !           649: int            cmd;
        !           650: _VOID        * arg;
        !           651: int            mode;
        !           652: struct streamtab
        !           653:              * stabp;
        !           654: #endif
        !           655: {
        !           656:        cred_t          cred;
        !           657:        int             rval;
        !           658:        int             newmode;
        !           659:        int             ret;
        !           660:        shead_t       * sheadp;
        !           661: 
        !           662:        if ((sheadp = SHEAD_FIND (makedevice (major (dev), minor (dev)),
        !           663:                                  DEV_SLIST)) == NULL) {
        !           664:                SETUERROR (ENXIO);
        !           665:                return -1;
        !           666:        }
        !           667: 
        !           668:        newmode = 0;
        !           669: 
        !           670:        if ((mode & IPR) != 0)
        !           671:                newmode |= FREAD;
        !           672:        if ((mode & IPW) != 0)
        !           673:                newmode |= FWRITE;
        !           674:        if ((mode & IPEXCL) != 0)
        !           675:                newmode |= FEXCL;
        !           676:        if ((mode & IPNDLY) != 0)
        !           677:                newmode |= FNDELAY;
        !           678: 
        !           679:        ret = STREAMS_IOCTL (sheadp, cmd, arg, newmode, MAKE_CRED (& cred),
        !           680:                             & rval);
        !           681: 
        !           682:        SETUERROR (ret);
        !           683:        return rval;
        !           684: 
        !           685: }
        !           686: 
        !           687: 
        !           688: /*
        !           689:  * Forward Coh poll request to actual STRAAMS driver-request-processing code.
        !           690:  */
        !           691: 
        !           692: #if    __USE_PROTO__
        !           693: int (_streams_chpoll) (o_dev_t dev, int events, int msec,
        !           694:                       struct streamtab * stabp)
        !           695: #else
        !           696: int
        !           697: _streams_chpoll __ARGS ((dev, events, msec, stabp))
        !           698: o_dev_t                dev;
        !           699: int            events;
        !           700: int            msec;
        !           701: struct streamtab
        !           702:              * stabp;
        !           703: #endif
        !           704: {
        !           705:        int             ret;
        !           706: 
        !           707:        cmn_err (CE_PANIC, "DDI/DKI polling not yet supported");
        !           708: 
        !           709: /*     ret = (* funcp) (newdev, events, msec == 0, & revents, pollhead) */
        !           710: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.