Annotation of driverkit/tests/ux.c, revision 1.1.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.