Annotation of driverkit/tests/ux.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
        !             7:  * Reserved.  This file contains Original Code and/or Modifications of
        !             8:  * Original Code as defined in and that are subject to the Apple Public
        !             9:  * Source License Version 1.1 (the "License").  You may not use this file
        !            10:  * except in compliance with the License.  Please obtain a copy of the
        !            11:  * License at http://www.apple.com/publicsource and read it before using
        !            12:  * this file.
        !            13:  * 
        !            14:  * The Original Code and all software distributed under the License are
        !            15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
        !            19:  * License for the specific language governing rights and limitations
        !            20:  * under the License.
        !            21:  * 
        !            22:  * @APPLE_LICENSE_HEADER_END@
        !            23:  */
        !            24: /*     Copyright (c) 1991 NeXT Computer, Inc.  All rights reserved. 
        !            25:  *
        !            26:  * ux - user-level XPR utility.
        !            27:  *
        !            28:  * HISTORY
        !            29:  * 22-Feb-91    Doug Mitchell at NeXT
        !            30:  *      Created. 
        !            31:  */
        !            32: 
        !            33: #import <bsd/sys/types.h>
        !            34: #import <driverkit/debuggingMsg.h>
        !            35: #import <mach/mach.h>
        !            36: #import <servers/netname.h>
        !            37: #import <bsd/libc.h>
        !            38: #import <mach/mach_error.h>
        !            39: 
        !            40: static void usage(char **argv);
        !            41: static int ux_clear(port_name_t serverPort, 
        !            42:        port_name_t localPort);
        !            43: static int ux_setmask(port_name_t serverPort, 
        !            44:        port_name_t localPort, 
        !            45:        u_int bitmask);
        !            46: static int ux_dump(port_name_t serverPort, 
        !            47:        port_name_t localPort, 
        !            48:        int numbufs);
        !            49: static int ux_simplemsg(port_name_t serverPort, 
        !            50:        port_name_t localPort,
        !            51:        int msg_id, 
        !            52:        u_int maskValue,
        !            53:        u_int index, 
        !            54:        char *op);
        !            55: 
        !            56: /*
        !            57:  * Template for creating IODDMMsg's.
        !            58:  */
        !            59: static IODDMMsg msgTemplate = {
        !            60: 
        !            61:        {                                               // header 
        !            62:                0,                                      // msg_unused 
        !            63:                1,                                      // msg_simple 
        !            64:                sizeof(IODDMMsg),                       // msg_size 
        !            65:                MSG_TYPE_NORMAL,                        // msg_type 
        !            66:                PORT_NULL,                              // msg_local_port 
        !            67:                PORT_NULL,                              // msg_remote_port - TO
        !            68:                                                        //   BE FILLED IN 
        !            69:                0                                       // msg_id - TO BE 
        !            70:                                                        //   FILLED IN
        !            71:        },
        !            72:        {                                               // argType 
        !            73:                MSG_TYPE_INTEGER_32,                    // msg_type_name 
        !            74:                sizeof(int) * 8,                        // msg_type_size 
        !            75:                5,                                      // msg_type_number 
        !            76:                1,                                      // msg_type_inline 
        !            77:                0,                                      // msg_type_longform 
        !            78:                0,                                      // msg_type_deallocate 
        !            79:                0                                       // msg_type_unused
        !            80:        },
        !            81:        0,                                              // index
        !            82:        0,                                              // maskValue
        !            83:        0,                                              // status
        !            84:        0,                                              // timestampHighInt
        !            85:        0,                                              // timestampLowInt
        !            86:        0,                                              // cpuNumber
        !            87:        {                                               // stringType 
        !            88:                MSG_TYPE_CHAR,                          // msg_type_name 
        !            89:                1,                                      // msg_type_size 
        !            90:                IO_DDM_STRING_LENGTH,                   // msg_type_number 
        !            91:                1,                                      // msg_type_inline 
        !            92:                0,                                      // msg_type_longform 
        !            93:                0,                                      // msg_type_deallocate 
        !            94:                0                                       // msg_type_unused
        !            95:        },
        !            96:        0                                               // the string 
        !            97: };
        !            98: 
        !            99: typedef enum { ACT_CLEAR, ACT_DUMP, ACT_SETMASK, ACT_NONE } action_t;
        !           100: 
        !           101: int main(int argc, char **argv)
        !           102: {
        !           103:        port_name_t serverPort, localPort;
        !           104:        action_t action = ACT_NONE;
        !           105:        int numbufs = -1;
        !           106:        int optarg = -1;
        !           107:        char *hostname = "";
        !           108:        u_int bitmask = 0;
        !           109:        int rtn;
        !           110:        netname_name_t nn_portName, nn_hostName;
        !           111:        kern_return_t krtn;
        !           112:        
        !           113:        if(argc < 3)
        !           114:                usage(argv);
        !           115:        switch(argv[2][0]) {
        !           116:            case 'd':
        !           117:                action = ACT_DUMP;
        !           118:                optarg = 3;
        !           119:                if(argc > 3) {
        !           120:                        switch(argv[3][0]) {
        !           121:                            case 'b':
        !           122:                                numbufs = atoi(&argv[3][2]);
        !           123:                                optarg++;
        !           124:                                break;
        !           125:                            default:
        !           126:                                break;
        !           127:                        }
        !           128:                }
        !           129:                break;
        !           130:            case 'c':
        !           131:                optarg = 3;
        !           132:                action = ACT_CLEAR;
        !           133:                break;
        !           134:                
        !           135:            case 's':
        !           136:                optarg = 4;
        !           137:                action = ACT_SETMASK;
        !           138:                bitmask = atoi(argv[3]);
        !           139:                break;
        !           140:                
        !           141:            default:
        !           142:                usage(argv);
        !           143:        }
        !           144:        
        !           145:        while(optarg < argc) {
        !           146:                switch(argv[optarg][0]) {
        !           147:                    case 'h':
        !           148:                        hostname = argv[optarg];
        !           149:                        break;
        !           150:                    default:
        !           151:                        usage(argv);
        !           152:                }
        !           153:        }
        !           154:        
        !           155:        /*
        !           156:         * Connect to the server.
        !           157:         */
        !           158:        strcpy(nn_portName, argv[1]);
        !           159:        strcpy(nn_hostName, hostname);
        !           160:        if(netname_look_up(name_server_port, 
        !           161:            nn_hostName, 
        !           162:            nn_portName,
        !           163:            &serverPort) != KERN_SUCCESS) {
        !           164:                printf("Couldn't connect to device %s\n", argv[1]);
        !           165:                exit(1);
        !           166:        }
        !           167: 
        !           168:        krtn = port_allocate(task_self(), &localPort);
        !           169:        if(krtn) {
        !           170:                mach_error("port_allocate", krtn);
        !           171:                exit(1);
        !           172:        }
        !           173:        
        !           174:        /*
        !           175:         * Lock the xpr state.
        !           176:         */
        !           177:        if(ux_simplemsg(serverPort, 
        !           178:            localPort, 
        !           179:            IO_LOCK_DDM_MSG, 
        !           180:            0, 0,
        !           181:            "Lock"))
        !           182:                exit(1);
        !           183:                
        !           184:        /* 
        !           185:         * What do we want to do...?
        !           186:         */
        !           187:        switch(action) {
        !           188:            case ACT_CLEAR:
        !           189:                rtn = ux_clear(serverPort, localPort);
        !           190:                break;
        !           191:            case ACT_SETMASK:
        !           192:                rtn = ux_setmask(serverPort, localPort, bitmask);
        !           193:                break;
        !           194:            case ACT_DUMP:
        !           195:                rtn = ux_dump(serverPort, localPort, numbufs);
        !           196:                break;
        !           197:            default:
        !           198:                printf("bogus bogality\n");
        !           199:                exit(1);
        !           200:        }
        !           201:        
        !           202:        /*
        !           203:          * Unlock the xpr state.
        !           204:         */
        !           205:        ux_simplemsg(serverPort, 
        !           206:                localPort, 
        !           207:                IO_UNLOCK_DDM_MSG, 
        !           208:                0, 0,
        !           209:                "Unlock");
        !           210:        return(rtn);
        !           211: }
        !           212: 
        !           213: static void usage(char **argv)
        !           214: {
        !           215:        printf("Usage: \n");
        !           216:        printf("\t%s server_name d(ump) [b=buffer_count] [h=hostname]\n",
        !           217:                argv[0]);
        !           218:        printf("\t%s server_name s(etmask) bitmask [h=hostname]\n", argv[0]);
        !           219:        printf("\t%s server_name c(lear) [h=hostname]\n", argv[0]);
        !           220:        exit(1);
        !           221: }
        !           222: 
        !           223: static int ux_simplemsg(port_name_t serverPort, 
        !           224:        port_name_t localPort,
        !           225:        int msg_id, 
        !           226:        u_int maskValue,
        !           227:        u_int index, 
        !           228:        char *op)
        !           229: {
        !           230:        IODDMMsg msg;
        !           231:        kern_return_t krtn;
        !           232:        
        !           233:        msg = msgTemplate;
        !           234:        msg.header.msg_remote_port = serverPort;
        !           235:        msg.header.msg_local_port  = localPort;
        !           236:        msg.header.msg_id = msg_id;
        !           237:        msg.index = index;
        !           238:        msg.maskValue = maskValue;
        !           239:        krtn = msg_rpc(&msg.header, 
        !           240:                MSG_OPTION_NONE, 
        !           241:                sizeof(msg),
        !           242:                0,
        !           243:                0);
        !           244:        if(krtn) {
        !           245:                printf("%s: msg_rpc failure\n", op);
        !           246:                mach_error("msg_rpc", krtn);
        !           247:                return(1);
        !           248:        }
        !           249:        return(0);
        !           250: }
        !           251: 
        !           252: /*
        !           253:  * All of these functions assume that the xpr buffer has already been locked.
        !           254:  */
        !           255: static int ux_clear(port_name_t serverPort, port_name_t localPort)
        !           256: {
        !           257:        return(ux_simplemsg(serverPort, 
        !           258:                localPort, 
        !           259:                IO_CLEAR_DDM_MSG, 
        !           260:                0, 0,
        !           261:                "Clear")); 
        !           262: }
        !           263: 
        !           264: static int ux_setmask(port_name_t serverPort, 
        !           265:        port_name_t localPort,
        !           266:        u_int bitmask)
        !           267: {
        !           268:        return(ux_simplemsg(serverPort, 
        !           269:                localPort, 
        !           270:                IO_SET_DDM_MASK_MSG, 
        !           271:                bitmask, 
        !           272:                0,              // index
        !           273:                "Set Mask")); 
        !           274: }
        !           275: 
        !           276: static int ux_dump(port_name_t serverPort, 
        !           277:        port_name_t localPort,
        !           278:        int numbufs)
        !           279: {
        !           280:        int offset;
        !           281:        IODDMMsg msg;
        !           282:        kern_return_t krtn;
        !           283:        unsigned long long timestamp;
        !           284:        
        !           285:        msg = msgTemplate;
        !           286:        
        !           287:        /*
        !           288:         * Careful with this loop - numbufs == -1 means "run forever".
        !           289:         */
        !           290:        for(offset=0; offset!=numbufs; offset++) {
        !           291:                msg.header.msg_remote_port = serverPort;
        !           292:                msg.header.msg_local_port  = localPort;
        !           293:                msg.header.msg_id = IO_GET_DDM_ENTRY_MSG;
        !           294:                msg.index = offset;
        !           295:                krtn = msg_rpc(&msg.header, 
        !           296:                        MSG_OPTION_NONE, 
        !           297:                        sizeof(msg),
        !           298:                        0,
        !           299:                        0);
        !           300:                if(krtn) {
        !           301:                        mach_error("ux_dump: msg_rpc failure", krtn);
        !           302:                        return(1);
        !           303:                }
        !           304:                switch(msg.status) {
        !           305:                    case IO_DDM_SUCCESS:
        !           306:                        /*
        !           307:                         * Display one string.
        !           308:                         */
        !           309:                        timestamp = IONsTimeFromDDMMsg(&msg);
        !           310:                        printf("%10u c:%d %s", (unsigned)timestamp,
        !           311:                                msg.cpuNumber, msg.string);
        !           312:                        break;
        !           313:                        
        !           314:                    case IO_NO_DDM_BUFFER:
        !           315:                        /*
        !           316:                         * This is OK, it means we got to the end of the 
        !           317:                         * buffer.
        !           318:                         */
        !           319:                        printf("\n");
        !           320:                        return(0);
        !           321:                
        !           322:                    default:
        !           323:                        printf("ux_dump: Bogus xpr status (%d)\n", msg.status);
        !           324:                        return(1);
        !           325:                }
        !           326:        }
        !           327:        return(0);
        !           328: }

unix.superglobalmegacorp.com

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