Annotation of XNU/bsd/kern/bsd_init.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: /*
                     23:  * Copyright (c) 1982, 1986, 1989, 1991, 1992, 1993
                     24:  *     The Regents of the University of California.  All rights reserved.
                     25:  * (c) UNIX System Laboratories, Inc.
                     26:  * All or some portions of this file are derived from material licensed
                     27:  * to the University of California by American Telephone and Telegraph
                     28:  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
                     29:  * the permission of UNIX System Laboratories, Inc.
                     30:  *
                     31:  * Redistribution and use in source and binary forms, with or without
                     32:  * modification, are permitted provided that the following conditions
                     33:  * are met:
                     34:  * 1. Redistributions of source code must retain the above copyright
                     35:  *    notice, this list of conditions and the following disclaimer.
                     36:  * 2. Redistributions in binary form must reproduce the above copyright
                     37:  *    notice, this list of conditions and the following disclaimer in the
                     38:  *    documentation and/or other materials provided with the distribution.
                     39:  * 3. All advertising materials mentioning features or use of this software
                     40:  *    must display the following acknowledgement:
                     41:  *     This product includes software developed by the University of
                     42:  *     California, Berkeley and its contributors.
                     43:  * 4. Neither the name of the University nor the names of its contributors
                     44:  *    may be used to endorse or promote products derived from this software
                     45:  *    without specific prior written permission.
                     46:  *
                     47:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     48:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     49:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     50:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     51:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     52:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     53:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     54:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     55:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     56:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     57:  * SUCH DAMAGE.
                     58:  *
                     59:  *     @(#)init_main.c 8.16 (Berkeley) 5/14/95
                     60:  */
                     61: 
                     62: /* 
                     63:  *
                     64:  * Mach Operating System
                     65:  * Copyright (c) 1987 Carnegie-Mellon University
                     66:  * All rights reserved.  The CMU software License Agreement specifies
                     67:  * the terms and conditions for use and redistribution.
                     68:  */
                     69: /*
                     70:  * HISTORY
                     71:  * 16-Apr-98  A. Ramesh at Apple
                     72:  *     Created for Apple Core from DR2 init_main.c.
                     73:  */
                     74: 
                     75: #include <quota.h>
                     76: 
                     77: #include <sys/param.h>
                     78: #include <sys/filedesc.h>
                     79: #include <sys/kernel.h>
                     80: #include <sys/mount.h>
                     81: #include <sys/proc.h>
                     82: #include <sys/systm.h>
                     83: #include <sys/vnode.h>
                     84: #include <sys/conf.h>
                     85: #include <sys/buf.h>
                     86: #include <sys/clist.h>
                     87: #include <sys/user.h>
                     88: #include <ufs/ufs/quota.h>
                     89: 
                     90: #include <sys/malloc.h>
                     91: #include <sys/dkstat.h>
                     92: 
                     93: #include <machine/spl.h>
                     94: #include <kern/thread.h>
                     95: #include <kern/task.h>
                     96: #include <kern/ast.h>
                     97: 
                     98: #include <mach/vm_param.h>
                     99: 
                    100: #include <vm/vm_map.h>
                    101: #include <vm/vm_kern.h>
                    102: 
                    103: #include <sys/ux_exception.h>
                    104: 
                    105: #include <sys/reboot.h>
                    106: #include <mach/exception_types.h>
                    107: #include <dev/busvar.h>
                    108: 
                    109: char    copyright[] =
                    110: "Copyright (c) 1982, 1986, 1989, 1991, 1993\n\tThe Regents of the University of California.  All rights reserved.\n\n";
                    111: 
                    112: extern void    ux_handler();
                    113: 
                    114: /* Components of the first process -- never freed. */
                    115: struct proc proc0;
                    116: struct session session0;
                    117: struct pgrp pgrp0;
                    118: struct pcred cred0;
                    119: struct filedesc filedesc0;
                    120: struct plimit limit0;
                    121: struct pstats pstats0;
                    122: struct sigacts sigacts0;
                    123: struct proc *kernproc, *initproc;
                    124: 
                    125: 
                    126: long cp_time[CPUSTATES];
                    127: long dk_seek[DK_NDRIVE];
                    128: long dk_time[DK_NDRIVE];
                    129: long dk_wds[DK_NDRIVE];
                    130: long dk_wpms[DK_NDRIVE];
                    131: long dk_xfer[DK_NDRIVE];
                    132: long dk_bps[DK_NDRIVE];
                    133: 
                    134: int dk_busy;
                    135: int dk_ndrive;
                    136: 
                    137: long tk_cancc;
                    138: long tk_nin;
                    139: long tk_nout;
                    140: long tk_rawcc;
                    141: 
                    142: /* Global variables to make pstat happy. We do swapping differently */
                    143: int nswdev, nswap;
                    144: int nswapmap;
                    145: void *swapmap;
                    146: struct swdevt swdevt[1];
                    147: 
                    148: dev_t  rootdev;                /* device of the root */
                    149: dev_t  dumpdev;                /* device to take dumps on */
                    150: long   dumplo;                 /* offset into dumpdev */
                    151: long   hostid;
                    152: char   hostname[MAXHOSTNAMELEN];
                    153: int    hostnamelen;
                    154: char   domainname[MAXDOMNAMELEN];
                    155: int    domainnamelen;
                    156: 
                    157: char rootdevice[16];   /* hfs device names have at least 9 chars */
                    158: struct timeval boottime;               /* GRODY!  This has to go... */
                    159: #if FIXME  /* [ */
                    160: struct timeval time;
                    161: #endif  /* FIXME ] */
                    162: 
                    163: #ifdef  KMEMSTATS
                    164: struct kmemstats kmemstats[M_LAST];
                    165: #endif
                    166: 
                    167: int    lbolt;                          /* awoken once a second */
                    168: struct vnode *rootvp;
                    169: int boothowto = RB_DEBUG;
                    170: 
                    171: vm_map_t       bsd_pageable_map;
                    172: vm_map_t       mb_map;
                    173: 
                    174: int    cmask = CMASK;
                    175: 
                    176: int parse_bsd_args(void);
                    177: extern int bsd_hardclockinit;
                    178: 
                    179: /*
                    180:  * Initialization code.
                    181:  * Called from cold start routine as
                    182:  * soon as a stack and segmentation
                    183:  * have been established.
                    184:  * Functions:
                    185:  *     clear and free user core
                    186:  *     turn on clock
                    187:  *     hand craft 0th process
                    188:  *     call all initialization routines
                    189:  *     fork - process 0 to schedule
                    190:  *          - process 1 execute bootstrap
                    191:  *          - process 2 to page out
                    192:  */
                    193: 
                    194: /*
                    195:  *     Sets the name for the given task.
                    196:  */
                    197: void proc_name(s, p)
                    198:        char            *s;
                    199:        struct proc *p;
                    200: {
                    201:        int             length = strlen(s);
                    202: 
                    203:        bcopy(s, p->p_comm,
                    204:                length >= sizeof(p->p_comm) ? sizeof(p->p_comm) :
                    205:                        length + 1);
                    206: }
                    207: 
                    208: 
                    209: /* To allow these values to be patched, they're globals here */
                    210: #include <machine/vmparam.h>
                    211: struct rlimit vm_initial_limit_stack = { DFLSSIZ, MAXSSIZ };
                    212: struct rlimit vm_initial_limit_data = { DFLDSIZ, MAXDSIZ };
                    213: struct rlimit vm_initial_limit_core = { DFLCSIZ, MAXCSIZ };
                    214: 
                    215: extern thread_t first_thread;
                    216: 
                    217: #define SPL_DEBUG      0
                    218: #if    SPL_DEBUG
                    219: #define        dprintf(x)      printf x
                    220: #else  SPL_DEBUG
                    221: #define dprintf(x)
                    222: #endif /* SPL_DEBUG */
                    223: 
                    224: void
                    225: bsd_init()
                    226: {
                    227:        register struct proc *p;
                    228:        extern struct ucred *rootcred;
                    229:        register int i;
                    230:        int s;
                    231:        thread_t        th;
                    232:        extern void     bsdinit_task();
                    233:        extern void     netisr_thread();
                    234:        void            lightning_bolt(void );
                    235:        kern_return_t   ret;
                    236:        boolean_t funnel_state;
                    237:        extern thread_t cloneproc();
                    238: 
                    239:        extern int (*mountroot) __P((void));
                    240: 
                    241:        funnel_state = thread_set_funneled(TRUE);
                    242: 
                    243:        printf(copyright);
                    244: 
                    245:        kmeminit();
                    246:        
                    247:        parse_bsd_args();
                    248: 
                    249:        bsd_bufferinit();
                    250: 
                    251:        /*
                    252:         * Initialize process and pgrp structures.
                    253:         */
                    254:        procinit();
                    255: 
                    256:        kernproc = &proc0;
                    257: 
                    258:        p = kernproc;
                    259: 
                    260:        /* kernel_task->proc = kernproc; */
                    261:        set_bsdtask_info(kernel_task,(void *)kernproc);
                    262:        p->p_pid = 0;
                    263: 
                    264:        /* give kernproc a name */
                    265:        proc_name("kernel_task", p);
                    266: 
                    267:        if (current_task() != kernel_task)
                    268:                printf("We are in for problem, current task in not kernel task\n");
                    269:        
                    270:        /*
                    271:         * Create process 0.
                    272:         */
                    273:        LIST_INSERT_HEAD(&allproc, p, p_list);
                    274:        p->p_pgrp = &pgrp0;
                    275:        LIST_INSERT_HEAD(PGRPHASH(0), &pgrp0, pg_hash);
                    276:        LIST_INIT(&pgrp0.pg_members);
                    277:        LIST_INSERT_HEAD(&pgrp0.pg_members, p, p_pglist);
                    278: 
                    279:        pgrp0.pg_session = &session0;
                    280:        session0.s_count = 1;
                    281:        session0.s_leader = p;
                    282: 
                    283:        p->task = kernel_task;
                    284:        
                    285:        p->p_stat = SRUN;
                    286:        p->p_flag = P_INMEM|P_SYSTEM;
                    287:        p->p_nice = NZERO;
                    288:        p->p_pptr = p;
                    289:        simple_lock_init(&p->siglock);
                    290:        p->sigwait = FALSE;
                    291:        p->sigwait_thread = THREAD_NULL;
                    292:        p->exit_thread = THREAD_NULL;
                    293: 
                    294:        /* Create credentials. */
                    295:        lockinit(&cred0.pc_lock, PLOCK, "proc0 cred", 0, 0);
                    296:        cred0.p_refcnt = 1;
                    297:        p->p_cred = &cred0;
                    298:        p->p_ucred = crget();
                    299:        p->p_ucred->cr_ngroups = 1;     /* group 0 */
                    300: 
                    301:        /* Create the file descriptor table. */
                    302:        filedesc0.fd_refcnt = 1+1;      /* +1 so shutdown will not _FREE_ZONE */
                    303:        p->p_fd = &filedesc0;
                    304:        filedesc0.fd_cmask = cmask;
                    305: 
                    306:        /* Create the limits structures. */
                    307:        p->p_limit = &limit0;
                    308:        for (i = 0; i < sizeof(p->p_rlimit)/sizeof(p->p_rlimit[0]); i++)
                    309:                limit0.pl_rlimit[i].rlim_cur = 
                    310:                        limit0.pl_rlimit[i].rlim_max = RLIM_INFINITY;
                    311:        limit0.pl_rlimit[RLIMIT_NOFILE].rlim_cur = NOFILE;
                    312:        limit0.pl_rlimit[RLIMIT_NPROC].rlim_cur = MAXUPRC;
                    313:        limit0.pl_rlimit[RLIMIT_STACK] = vm_initial_limit_stack;
                    314:        limit0.pl_rlimit[RLIMIT_DATA] = vm_initial_limit_data;
                    315:        limit0.pl_rlimit[RLIMIT_CORE] = vm_initial_limit_core;
                    316:        limit0.p_refcnt = 1;
                    317: 
                    318:        p->p_stats = &pstats0;
                    319:        p->p_sigacts = &sigacts0;
                    320: 
                    321:        /*
                    322:         * Charge root for one process.
                    323:         */
                    324:        (void)chgproccnt(0, 1);
                    325: 
                    326:        
                    327:        /*
                    328:         *      Allocate a kernel submap for pageable memory
                    329:         *      for temporary copying (table(), execve()).
                    330:         */
                    331:        {
                    332:            vm_offset_t min, max;
                    333: 
                    334:         ret = kmem_suballoc(kernel_map,
                    335:                        &min,
                    336:                        (vm_size_t)512*1024,
                    337:                        TRUE,
                    338:                        TRUE,
                    339:                        &bsd_pageable_map);
                    340:        if (ret != KERN_SUCCESS) 
                    341:                panic("Failed to allocare bsd pageable map\n");
                    342:        }
                    343: 
                    344:        /*
                    345:        * Initialize the calendar by
                    346:        * reading the BBC, if not already set.
                    347:        */
                    348:        IOKitResetTime();
                    349: 
                    350:        mapfs_init();
                    351: 
                    352:        /* Initialize the file systems. */
                    353:        vfsinit();
                    354: 
                    355:        /* Initialize mbuf's. */
                    356:        mbinit();
                    357: 
                    358:        /* Initialize syslog */
                    359:        log_init();
                    360: 
                    361:        /* Initialize SysV shm */
                    362:        shminit();
                    363: 
                    364:        /*
                    365:         * Initialize protocols.  Block reception of incoming packets
                    366:         * until everything is ready.
                    367:         */
                    368:        s = splimp();
                    369:        sysctl_register_fixed(); 
                    370:        dlil_init();
                    371:        socketinit();
                    372:        domaininit();
                    373:        splx(s);
                    374: 
                    375:        /*
                    376:         *      Create kernel idle cpu processes.  This must be done
                    377:         *      before a context switch can occur (and hence I/O can
                    378:         *      happen in the binit() call).
                    379:         */
                    380:        p->p_fd->fd_cdir = NULL;
                    381:        p->p_fd->fd_rdir = NULL;
                    382: 
                    383: 
                    384: #ifdef GPROF
                    385:        /* Initialize kernel profiling. */
                    386:        kmstartup();
                    387: #endif
                    388: 
                    389:        /* kick off timeout driven events by calling first time */
                    390:        lightning_bolt();
                    391: 
                    392:        /*
                    393:         * Start up netisr thread now in case we are doing an nfs_mountroot.
                    394:         */
                    395:        (void) kernel_thread(kernel_task, netisr_thread);
                    396: 
                    397:        bsd_autoconf();
                    398: 
                    399:        /*
                    400:         * We attach the loopback interface *way* down here to ensure
                    401:         * it happens after autoconf(), otherwise it becomes the
                    402:         * "primary" interface.
                    403:         */
                    404: #include <loop.h>
                    405: #if NLOOP > 0
                    406:        loopattach();                   /* XXX */
                    407: #endif
                    408: 
                    409: 
                    410:        /* Mount the root file system. */
                    411:        while( TRUE) {
                    412:            int err;
                    413: 
                    414:             setconf();
                    415:            /* read the time after clock_initialize_calendar()
                    416:             * and before nfs mount */
                    417:             microtime(&time);
                    418: 
                    419:             if (0 == (err = vfs_mountroot()))
                    420:                break;
                    421:             printf("cannot mount root, errno = %d\n", err);
                    422:            boothowto |= RB_ASKNAME;
                    423:        }
                    424: 
                    425:        mountlist.cqh_first->mnt_flag |= MNT_ROOTFS;
                    426: 
                    427:        /* Get the vnode for '/'.  Set fdp->fd_fd.fd_cdir to reference it. */
                    428:        if (VFS_ROOT(mountlist.cqh_first, &rootvnode))
                    429:                panic("cannot find root vnode");
                    430:        filedesc0.fd_cdir = rootvnode;
                    431:        VREF(rootvnode);
                    432:        VOP_UNLOCK(rootvnode, 0, p);
                    433:        
                    434: 
                    435:        /*
                    436:         * Now can look at time, having had a chance to verify the time
                    437:         * from the file system.  Reset p->p_rtime as it may have been
                    438:         * munched in mi_switch() after the time got set.
                    439:         */
                    440:        p->p_stats->p_start = boottime = time;
                    441:        p->p_rtime.tv_sec = p->p_rtime.tv_usec = 0;
                    442: 
                    443: #ifdef DEVFS
                    444:        {
                    445:            extern void devfs_kernel_mount(char * str);
                    446:            
                    447:            devfs_kernel_mount("/dev");
                    448:        }
                    449: #endif DEVFS
                    450:        
                    451:        /* Initialize signal state for process 0. */
                    452:        siginit(p);
                    453: 
                    454:        vnode_pager_bootstrap();
                    455:        /* printf("vnode pager  initialized\n"); */
                    456: 
                    457:        /* printf("Launching user process\n"); */
                    458: 
                    459:        bsd_utaskbootstrap();
                    460: 
                    461:        (void) thread_set_funneled(funnel_state);
                    462: }
                    463: 
                    464: void
                    465: bsdinit_task()
                    466: {
                    467:        struct proc *p = current_proc();
                    468:        struct uthread *ut;
                    469:        kern_return_t   kr;
                    470:        thread_act_t th_act;
                    471:        boolean_t funnel_state;
                    472: 
                    473:        funnel_state = thread_set_funneled(TRUE);
                    474: 
                    475: #if FIXME  /* [ */
                    476: 
                    477:        ipc_port_t      master_bootstrap_port;
                    478:        task_t          bootstrap_task;
                    479:        thread_act_t    bootstrap_thr_act;
                    480:        ipc_port_t      root_device_port;
                    481: 
                    482:        master_bootstrap_port = ipc_port_alloc_kernel();
                    483:        if (master_bootstrap_port == IP_NULL)
                    484:                panic("can't allocate master bootstrap port");
                    485:        task_set_special_port(bootstrap_task,
                    486:                              TASK_BOOTSTRAP_PORT,
                    487:                              ipc_port_make_send(master_bootstrap_port));
                    488:        printf("setting bootstrap port \n");
                    489:        printf("Setting exception port for the init task\n");
                    490:        (void) task_set_exception_ports(get_threadtask(th),
                    491:                                        EXC_MASK_ALL &
                    492:                                        ~(EXC_MASK_SYSCALL |
                    493:                          EXC_MASK_MACH_SYSCALL | EXC_MASK_RPC_ALERT),
                    494:                                        ux_exception_port,
                    495:                                        EXCEPTION_DEFAULT, 0);
                    496: 
                    497: #endif /* FIXME  ] */
                    498:        proc_name("init", p);
                    499: 
                    500:        ux_handler_init();
                    501:        /* port_reference(ux_exception_port);*/
                    502: 
                    503:        th_act = current_act();
                    504:        (void) task_set_exception_ports(get_threadtask(th_act),
                    505:                                        EXC_MASK_ALL &
                    506:                                        ~(EXC_MASK_SYSCALL |
                    507:                          EXC_MASK_MACH_SYSCALL | EXC_MASK_RPC_ALERT),
                    508:                                        ux_exception_port,
                    509:                                        EXCEPTION_DEFAULT, 0);
                    510: 
                    511: 
                    512: 
                    513: 
                    514:        ut = (uthread_t)get_bsdthread_info(th_act);
                    515:        ut->uu_ar0 = (void *)get_user_regs(th_act);
                    516: 
                    517:        bsd_hardclockinit = 1;  /* Start bsd hardclock */
                    518:        load_init_program(p);
                    519: 
                    520:        (void) thread_set_funneled(funnel_state);
                    521:        
                    522: }
                    523: 
                    524: void
                    525: lightning_bolt()
                    526: {                      
                    527:        thread_wakeup(&lbolt);
                    528:        timeout(lightning_bolt,0,hz);
                    529: }
                    530: 
                    531: bsd_autoconf(){
                    532:         extern kern_return_t IOKitBSDInit( void );
                    533: 
                    534:        kminit();
                    535: 
                    536:        /* 
                    537:         * Early startup for bsd pseudodevices.
                    538:         */
                    539:        {
                    540:            struct pseudo_init *pi;
                    541:        
                    542:            for (pi = pseudo_inits; pi->ps_func; pi++)
                    543:                (*pi->ps_func) (pi->ps_count);
                    544:        }
                    545: 
                    546:         return( IOKitBSDInit());
                    547: }
                    548: 
                    549: 
                    550: #include <sys/disklabel.h>  // for MAXPARTITIONS
                    551: 
                    552: setconf()
                    553: {      
                    554:        extern kern_return_t IOFindBSDRoot( char * rootName,
                    555:                                dev_t * root, u_int32_t * flags );
                    556: 
                    557:        extern int      (*mountroot) __P((void));
                    558:        extern int      nfs_mountroot();        /* nfs_vfsops.c */
                    559: 
                    560:        u_int32_t       flags;
                    561:        kern_return_t   err;
                    562: 
                    563:        err = IOFindBSDRoot( rootdevice, &rootdev, &flags );
                    564:        if( err) {
                    565:                printf("setconf: IOFindBSDRoot returned an error (%d); setting rootdevice to 'sd0a'.\n", err); /* XXX DEBUG TEMP */
                    566:                rootdev = makedev( 6, 0 );
                    567:                strcpy( rootdevice, "sd0a" );
                    568:                flags = 0;
                    569:        }
                    570: 
                    571:        /* if network device then force nfs root */
                    572:        if( flags & 1 ) {
                    573:                printf("mounting nfs root\n");
                    574:                mountroot = nfs_mountroot;
                    575:        } else {
                    576:                /* otherwise have vfs determine root filesystem */
                    577:                printf("probing for root file system\n");
                    578:                mountroot = NULL;
                    579:        }
                    580: 
                    581: }
                    582: 
                    583: bsd_utaskbootstrap()
                    584: {
                    585:        thread_act_t th_act;
                    586: 
                    587:        th_act = cloneproc(kernproc);
                    588:        initproc = pfind(1);                            
                    589:        thread_hold(th_act);
                    590:        (void) thread_stop_wait(getshuttle_thread(th_act));
                    591:        thread_ast_set(th_act,AST_BSD_INIT);
                    592:        thread_release(th_act);
                    593:        thread_unstop(getshuttle_thread(th_act));
                    594:        (void) thread_resume(th_act);
                    595: }
                    596: 
                    597: parse_bsd_args()
                    598: {
                    599:        extern char init_args[];
                    600:        char    namep[16];
                    601:        extern int boothowto;
                    602:        extern int srv;
                    603:        extern int ncl;
                    604:        extern int bufpages;
                    605:        extern int nbuf;
                    606: 
                    607:        int len;
                    608: 
                    609:        if (PE_parse_boot_arg("-s", namep)) {
                    610:                boothowto |= RB_SINGLE;
                    611:                len = strlen(init_args);
                    612:                if(len != 0)
                    613:                        strcat(init_args," -s");
                    614:                else
                    615:                        strcat(init_args,"-s");
                    616:        }
                    617:        if (PE_parse_boot_arg("-b", namep)) {
                    618:                boothowto |= RB_NOBOOTRC;
                    619:                len = strlen(init_args);
                    620:                if(len != 0)
                    621:                        strcat(init_args," -b");
                    622:                else
                    623:                        strcat(init_args,"-b");
                    624:        }
                    625: 
                    626:        if (PE_parse_boot_arg("-F", namep)) {
                    627:                len = strlen(init_args);
                    628:                if(len != 0)
                    629:                        strcat(init_args," -F");
                    630:                else
                    631:                        strcat(init_args,"-F");
                    632:        }
                    633: 
                    634:        if (PE_parse_boot_arg("-v", namep)) {
                    635:                len = strlen(init_args);
                    636:                if(len != 0)
                    637:                        strcat(init_args," -v");
                    638:                else
                    639:                        strcat(init_args,"-v");
                    640:        }
                    641: 
                    642:        PE_parse_boot_arg("srv", &srv);
                    643:        PE_parse_boot_arg("ncl", &ncl);
                    644:        PE_parse_boot_arg("nbuf", &nbuf);
                    645:        PE_parse_boot_arg("bufpages", &bufpages);
                    646: 
                    647:        return 0;
                    648: }

unix.superglobalmegacorp.com

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