Annotation of Gnu-Mach/linux/src/init/main.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *  linux/init/main.c
        !             3:  *
        !             4:  *  Copyright (C) 1991, 1992  Linus Torvalds
        !             5:  *
        !             6:  *  GK 2/5/95  -  Changed to support mounting root fs via NFS
        !             7:  *  Added initrd & change_root: Werner Almesberger & Hans Lermen, Feb '96
        !             8:  *  Moan early if gcc is old, avoiding bogus kernels - Paul Gortmaker, May '96
        !             9:  */
        !            10: 
        !            11: #define __KERNEL_SYSCALLS__
        !            12: #include <stdarg.h>
        !            13: 
        !            14: #include <asm/system.h>
        !            15: #include <asm/io.h>
        !            16: 
        !            17: #include <linux/types.h>
        !            18: #include <linux/fcntl.h>
        !            19: #include <linux/config.h>
        !            20: #include <linux/sched.h>
        !            21: #include <linux/kernel.h>
        !            22: #include <linux/tty.h>
        !            23: #include <linux/head.h>
        !            24: #include <linux/unistd.h>
        !            25: #include <linux/string.h>
        !            26: #include <linux/timer.h>
        !            27: #include <linux/fs.h>
        !            28: #include <linux/ctype.h>
        !            29: #include <linux/delay.h>
        !            30: #include <linux/utsname.h>
        !            31: #include <linux/ioport.h>
        !            32: #include <linux/hdreg.h>
        !            33: #include <linux/mm.h>
        !            34: #include <linux/major.h>
        !            35: #include <linux/blk.h>
        !            36: #ifdef CONFIG_ROOT_NFS
        !            37: #include <linux/nfs_fs.h>
        !            38: #endif
        !            39: #ifdef CONFIG_MTRR
        !            40: #include <asm/mtrr.h>
        !            41: #endif
        !            42: 
        !            43: #include <asm/bugs.h>
        !            44: 
        !            45: /*
        !            46:  * Versions of gcc older than that listed below may actually compile
        !            47:  * and link okay, but the end product can have subtle run time bugs.
        !            48:  * To avoid associated bogus bug reports, we flatly refuse to compile
        !            49:  * with a gcc that is known to be too old from the very beginning.
        !            50:  */
        !            51: #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 6)
        !            52: #error sorry, your GCC is too old. It builds incorrect kernels.
        !            53: #endif
        !            54: 
        !            55: extern char _stext, _etext;
        !            56: extern const char *linux_banner;
        !            57: 
        !            58: static char printbuf[1024];
        !            59: 
        !            60: extern int console_loglevel;
        !            61: 
        !            62: static int init(void *);
        !            63: extern int bdflush(void *);
        !            64: extern int kswapd(void *);
        !            65: extern void kswapd_setup(void);
        !            66: 
        !            67: extern void init_IRQ(void);
        !            68: extern void init_modules(void);
        !            69: extern long console_init(long, long);
        !            70: extern long kmalloc_init(long,long);
        !            71: extern void sock_init(void);
        !            72: extern unsigned long pci_init(unsigned long, unsigned long);
        !            73: extern void sysctl_init(void);
        !            74: 
        !            75: extern void no_scroll(char *str, int *ints);
        !            76: extern void swap_setup(char *str, int *ints);
        !            77: extern void buff_setup(char *str, int *ints);
        !            78: extern void panic_setup(char *str, int *ints);
        !            79: extern void bmouse_setup(char *str, int *ints);
        !            80: extern void msmouse_setup(char *str, int *ints);
        !            81: extern void lp_setup(char *str, int *ints);
        !            82: extern void eth_setup(char *str, int *ints);
        !            83: extern void xd_setup(char *str, int *ints);
        !            84: extern void xd_manual_geo_init(char *str, int *ints);
        !            85: extern void floppy_setup(char *str, int *ints);
        !            86: extern void st_setup(char *str, int *ints);
        !            87: extern void st0x_setup(char *str, int *ints);
        !            88: extern void advansys_setup(char *str, int *ints);
        !            89: extern void tmc8xx_setup(char *str, int *ints);
        !            90: extern void t128_setup(char *str, int *ints);
        !            91: extern void pas16_setup(char *str, int *ints);
        !            92: extern void generic_NCR5380_setup(char *str, int *intr);
        !            93: extern void generic_NCR53C400_setup(char *str, int *intr);
        !            94: extern void aha152x_setup(char *str, int *ints);
        !            95: extern void aha1542_setup(char *str, int *ints);
        !            96: extern void gdth_setup(char *str, int *ints);
        !            97: extern void aic7xxx_setup(char *str, int *ints);
        !            98: extern void AM53C974_setup(char *str, int *ints);
        !            99: extern void BusLogic_Setup(char *str, int *ints);
        !           100: extern void ncr53c8xx_setup(char *str, int *ints);
        !           101: extern void eata2x_setup(char *str, int *ints);
        !           102: extern void u14_34f_setup(char *str, int *ints);
        !           103: extern void fdomain_setup(char *str, int *ints);
        !           104: extern void in2000_setup(char *str, int *ints);
        !           105: extern void NCR53c406a_setup(char *str, int *ints);
        !           106: extern void wd7000_setup(char *str, int *ints);
        !           107: extern void ppa_setup(char *str, int *ints);
        !           108: extern void scsi_luns_setup(char *str, int *ints);
        !           109: extern void sound_setup(char *str, int *ints);
        !           110: extern void apm_setup(char *str, int *ints);
        !           111: extern void reboot_setup(char *str, int *ints);
        !           112: #ifdef CONFIG_CDU31A
        !           113: extern void cdu31a_setup(char *str, int *ints);
        !           114: #endif CONFIG_CDU31A
        !           115: #ifdef CONFIG_MCD
        !           116: extern void mcd_setup(char *str, int *ints);
        !           117: #endif CONFIG_MCD
        !           118: #ifdef CONFIG_MCDX
        !           119: extern void mcdx_setup(char *str, int *ints);
        !           120: #endif CONFIG_MCDX
        !           121: #ifdef CONFIG_SBPCD
        !           122: extern void sbpcd_setup(char *str, int *ints);
        !           123: #endif CONFIG_SBPCD
        !           124: #ifdef CONFIG_AZTCD
        !           125: extern void aztcd_setup(char *str, int *ints);
        !           126: #endif CONFIG_AZTCD
        !           127: #ifdef CONFIG_CDU535
        !           128: extern void sonycd535_setup(char *str, int *ints);
        !           129: #endif CONFIG_CDU535
        !           130: #ifdef CONFIG_GSCD
        !           131: extern void gscd_setup(char *str, int *ints);
        !           132: #endif CONFIG_GSCD
        !           133: #ifdef CONFIG_CM206
        !           134: extern void cm206_setup(char *str, int *ints);
        !           135: #endif CONFIG_CM206
        !           136: #ifdef CONFIG_OPTCD
        !           137: extern void optcd_setup(char *str, int *ints);
        !           138: #endif CONFIG_OPTCD
        !           139: #ifdef CONFIG_SJCD
        !           140: extern void sjcd_setup(char *str, int *ints);
        !           141: #endif CONFIG_SJCD
        !           142: #ifdef CONFIG_ISP16_CDI
        !           143: extern void isp16_setup(char *str, int *ints);
        !           144: #endif CONFIG_ISP16_CDI
        !           145: #ifdef CONFIG_BLK_DEV_RAM
        !           146: static void ramdisk_start_setup(char *str, int *ints);
        !           147: static void load_ramdisk(char *str, int *ints);
        !           148: static void prompt_ramdisk(char *str, int *ints);
        !           149: static void ramdisk_size(char *str, int *ints);
        !           150: #ifdef CONFIG_BLK_DEV_INITRD
        !           151: static void no_initrd(char *s,int *ints);
        !           152: #endif
        !           153: #endif CONFIG_BLK_DEV_RAM
        !           154: #ifdef CONFIG_ISDN_DRV_ICN
        !           155: extern void icn_setup(char *str, int *ints);
        !           156: #endif
        !           157: #ifdef CONFIG_ISDN_DRV_HISAX
        !           158: extern void HiSax_setup(char *str, int *ints);
        !           159: #endif
        !           160: #ifdef CONFIG_ISDN_DRV_PCBIT
        !           161: extern void pcbit_setup(char *str, int *ints);
        !           162: #endif
        !           163: 
        !           164: #ifdef CONFIG_ATARIMOUSE
        !           165: extern void atari_mouse_setup (char *str, int *ints);
        !           166: #endif
        !           167: #ifdef CONFIG_DMASOUND
        !           168: extern void dmasound_setup (char *str, int *ints);
        !           169: #endif
        !           170: #ifdef CONFIG_ATARI_SCSI
        !           171: extern void atari_scsi_setup (char *str, int *ints);
        !           172: #endif
        !           173: extern void wd33c93_setup (char *str, int *ints);
        !           174: extern void gvp11_setup (char *str, int *ints);
        !           175: 
        !           176: #ifdef CONFIG_CYCLADES
        !           177: extern void cy_setup(char *str, int *ints);
        !           178: #endif
        !           179: #ifdef CONFIG_DIGI
        !           180: extern void pcxx_setup(char *str, int *ints);
        !           181: #endif
        !           182: #ifdef CONFIG_RISCOM8
        !           183: extern void riscom8_setup(char *str, int *ints);
        !           184: #endif
        !           185: #ifdef CONFIG_SPECIALIX
        !           186: extern void specialix_setup(char *str, int *ints);
        !           187: #endif
        !           188: #ifdef CONFIG_BAYCOM
        !           189: extern void baycom_setup(char *str, int *ints);
        !           190: #endif
        !           191: 
        !           192: #ifdef CONFIG_PARIDE_PD
        !           193: extern void pd_setup(char *str, int *ints);
        !           194: #endif
        !           195: #ifdef CONFIG_PARIDE_PF
        !           196: extern void pf_setup(char *str, int *ints);
        !           197: #endif
        !           198: #ifdef CONFIG_PARIDE_PT
        !           199: extern void pt_setup(char *str, int *ints);
        !           200: #endif
        !           201: #ifdef CONFIG_PARIDE_PG
        !           202: extern void pg_setup(char *str, int *ints);
        !           203: #endif
        !           204: #ifdef CONFIG_PARIDE_PCD
        !           205: extern void pcd_setup(char *str, int *ints);
        !           206: #endif
        !           207: 
        !           208: #if defined(CONFIG_SYSVIPC) || defined(CONFIG_KERNELD)
        !           209: extern void ipc_init(void);
        !           210: #endif
        !           211: 
        !           212: /*
        !           213:  * Boot command-line arguments
        !           214:  */
        !           215: #define MAX_INIT_ARGS 8
        !           216: #define MAX_INIT_ENVS 8
        !           217: 
        !           218: extern void time_init(void);
        !           219: 
        !           220: static unsigned long memory_start = 0;
        !           221: static unsigned long memory_end = 0;
        !           222: 
        !           223: int rows, cols;
        !           224: 
        !           225: #ifdef CONFIG_BLK_DEV_RAM
        !           226: extern int rd_doload;          /* 1 = load ramdisk, 0 = don't load */
        !           227: extern int rd_prompt;          /* 1 = prompt for ramdisk, 0 = don't prompt */
        !           228: extern int rd_size;            /* Size of the ramdisk(s) */
        !           229: extern int rd_image_start;     /* starting block # of image */
        !           230: #ifdef CONFIG_BLK_DEV_INITRD
        !           231: kdev_t real_root_dev;
        !           232: #endif
        !           233: #endif
        !           234: 
        !           235: int root_mountflags = MS_RDONLY;
        !           236: char *execute_command = 0;
        !           237: 
        !           238: #ifdef CONFIG_ROOT_NFS
        !           239: char nfs_root_name[NFS_ROOT_NAME_LEN] = { "default" };
        !           240: char nfs_root_addrs[NFS_ROOT_ADDRS_LEN] = { "" };
        !           241: #endif
        !           242: 
        !           243: extern void dquot_init(void);
        !           244: 
        !           245: static char * argv_init[MAX_INIT_ARGS+2] = { "init", NULL, };
        !           246: static char * envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, };
        !           247: 
        !           248: static char * argv_rc[] = { "/bin/sh", NULL };
        !           249: static char * envp_rc[] = { "HOME=/", "TERM=linux", NULL };
        !           250: 
        !           251: static char * argv[] = { "-/bin/sh",NULL };
        !           252: static char * envp[] = { "HOME=/usr/root", "TERM=linux", NULL };
        !           253: 
        !           254: char *get_options(char *str, int *ints)
        !           255: {
        !           256:        char *cur = str;
        !           257:        int i=1;
        !           258: 
        !           259:        while (cur && isdigit(*cur) && i <= 10) {
        !           260:                ints[i++] = simple_strtoul(cur,NULL,0);
        !           261:                if ((cur = strchr(cur,',')) != NULL)
        !           262:                        cur++;
        !           263:        }
        !           264:        ints[0] = i-1;
        !           265:        return(cur);
        !           266: }
        !           267: 
        !           268: static void profile_setup(char *str, int *ints)
        !           269: {
        !           270:        if (ints[0] > 0)
        !           271:                prof_shift = (unsigned long) ints[1];
        !           272:        else
        !           273: #ifdef CONFIG_PROFILE_SHIFT
        !           274:                prof_shift = CONFIG_PROFILE_SHIFT;
        !           275: #else
        !           276:                prof_shift = 2;
        !           277: #endif
        !           278: }
        !           279: 
        !           280: struct kernel_param {
        !           281:        const char *str;
        !           282:        void (*setup_func)(char *, int *);
        !           283: } ;
        !           284: 
        !           285: struct kernel_param bootsetups[] = {
        !           286:        { "reserve=", reserve_setup },
        !           287:        { "profile=", profile_setup },
        !           288: #ifdef CONFIG_BLK_DEV_RAM
        !           289:        { "ramdisk_start=", ramdisk_start_setup },
        !           290:        { "load_ramdisk=", load_ramdisk },
        !           291:        { "prompt_ramdisk=", prompt_ramdisk },
        !           292:        { "ramdisk=", ramdisk_size },
        !           293:        { "ramdisk_size=", ramdisk_size },
        !           294: #ifdef CONFIG_BLK_DEV_INITRD
        !           295:        { "noinitrd", no_initrd },
        !           296: #endif
        !           297: #endif
        !           298:        { "swap=", swap_setup },
        !           299:        { "buff=", buff_setup },
        !           300:        { "panic=", panic_setup },
        !           301:        { "no-scroll", no_scroll },
        !           302: #ifdef CONFIG_BUGi386
        !           303:        { "no-hlt", no_halt },
        !           304:        { "no387", no_387 },
        !           305:        { "reboot=", reboot_setup },
        !           306: #endif
        !           307: #ifdef CONFIG_INET
        !           308:        { "ether=", eth_setup },
        !           309: #endif
        !           310: #ifdef CONFIG_PRINTER
        !           311:         { "lp=", lp_setup },
        !           312: #endif
        !           313: #ifdef CONFIG_SCSI
        !           314:        { "max_scsi_luns=", scsi_luns_setup },
        !           315: #endif
        !           316: #ifdef CONFIG_SCSI_ADVANSYS
        !           317:        { "advansys=", advansys_setup },
        !           318: #endif
        !           319: #if defined(CONFIG_BLK_DEV_HD)
        !           320:        { "hd=", hd_setup },
        !           321: #endif
        !           322: #ifdef CONFIG_CHR_DEV_ST
        !           323:        { "st=", st_setup },
        !           324: #endif
        !           325: #ifdef CONFIG_BUSMOUSE
        !           326:        { "bmouse=", bmouse_setup },
        !           327: #endif
        !           328: #ifdef CONFIG_MS_BUSMOUSE
        !           329:        { "msmouse=", msmouse_setup },
        !           330: #endif
        !           331: #ifdef CONFIG_SCSI_SEAGATE
        !           332:        { "st0x=", st0x_setup },
        !           333:        { "tmc8xx=", tmc8xx_setup },
        !           334: #endif
        !           335: #ifdef CONFIG_SCSI_T128
        !           336:        { "t128=", t128_setup },
        !           337: #endif
        !           338: #ifdef CONFIG_SCSI_PAS16
        !           339:        { "pas16=", pas16_setup },
        !           340: #endif
        !           341: #ifdef CONFIG_SCSI_GENERIC_NCR5380
        !           342:        { "ncr5380=", generic_NCR5380_setup },
        !           343:        { "ncr53c400=", generic_NCR53C400_setup },
        !           344: #endif
        !           345: #ifdef CONFIG_SCSI_AHA152X
        !           346:        { "aha152x=", aha152x_setup},
        !           347: #endif
        !           348: #ifdef CONFIG_SCSI_AHA1542
        !           349:        { "aha1542=", aha1542_setup},
        !           350: #endif
        !           351: #ifdef CONFIG_SCSI_GDTH
        !           352:        { "gdth=", gdth_setup},
        !           353: #endif
        !           354: #ifdef CONFIG_SCSI_AIC7XXX
        !           355:        { "aic7xxx=", aic7xxx_setup},
        !           356: #endif
        !           357: #ifdef CONFIG_SCSI_BUSLOGIC
        !           358:        { "BusLogic=", BusLogic_Setup},
        !           359: #endif
        !           360: #ifdef CONFIG_SCSI_NCR53C8XX
        !           361:        { "ncr53c8xx=", ncr53c8xx_setup},
        !           362: #endif
        !           363: #ifdef CONFIG_SCSI_EATA
        !           364:        { "eata=", eata2x_setup},
        !           365: #endif
        !           366: #ifdef CONFIG_SCSI_U14_34F
        !           367:        { "u14-34f=", u14_34f_setup},
        !           368: #endif
        !           369: #ifdef CONFIG_SCSI_AM53C974
        !           370:         { "AM53C974=", AM53C974_setup},
        !           371: #endif
        !           372: #ifdef CONFIG_SCSI_NCR53C406A
        !           373:        { "ncr53c406a=", NCR53c406a_setup},
        !           374: #endif
        !           375: #ifdef CONFIG_SCSI_FUTURE_DOMAIN
        !           376:        { "fdomain=", fdomain_setup},
        !           377: #endif
        !           378: #ifdef CONFIG_SCSI_IN2000
        !           379:        { "in2000=", in2000_setup},
        !           380: #endif
        !           381: #ifdef CONFIG_SCSI_7000FASST
        !           382:        { "wd7000=", wd7000_setup},
        !           383: #endif
        !           384: #ifdef CONFIG_SCSI_PPA
        !           385:         { "ppa=", ppa_setup },
        !           386: #endif
        !           387: #ifdef CONFIG_BLK_DEV_XD
        !           388:        { "xd=", xd_setup },
        !           389:        { "xd_geo=", xd_manual_geo_init },
        !           390: #endif
        !           391: #ifdef CONFIG_BLK_DEV_FD
        !           392:        { "floppy=", floppy_setup },
        !           393: #endif
        !           394: #ifdef CONFIG_CDU31A
        !           395:        { "cdu31a=", cdu31a_setup },
        !           396: #endif CONFIG_CDU31A
        !           397: #ifdef CONFIG_MCD
        !           398:        { "mcd=", mcd_setup },
        !           399: #endif CONFIG_MCD
        !           400: #ifdef CONFIG_MCDX
        !           401:        { "mcdx=", mcdx_setup },
        !           402: #endif CONFIG_MCDX
        !           403: #ifdef CONFIG_SBPCD
        !           404:        { "sbpcd=", sbpcd_setup },
        !           405: #endif CONFIG_SBPCD
        !           406: #ifdef CONFIG_AZTCD
        !           407:        { "aztcd=", aztcd_setup },
        !           408: #endif CONFIG_AZTCD
        !           409: #ifdef CONFIG_CDU535
        !           410:        { "sonycd535=", sonycd535_setup },
        !           411: #endif CONFIG_CDU535
        !           412: #ifdef CONFIG_GSCD
        !           413:        { "gscd=", gscd_setup },
        !           414: #endif CONFIG_GSCD
        !           415: #ifdef CONFIG_CM206
        !           416:        { "cm206=", cm206_setup },
        !           417: #endif CONFIG_CM206
        !           418: #ifdef CONFIG_OPTCD
        !           419:        { "optcd=", optcd_setup },
        !           420: #endif CONFIG_OPTCD
        !           421: #ifdef CONFIG_SJCD
        !           422:        { "sjcd=", sjcd_setup },
        !           423: #endif CONFIG_SJCD
        !           424: #ifdef CONFIG_ISP16_CDI
        !           425:        { "isp16=", isp16_setup },
        !           426: #endif CONFIG_ISP16_CDI
        !           427: #ifdef CONFIG_SOUND
        !           428:        { "sound=", sound_setup },
        !           429: #endif
        !           430: #ifdef CONFIG_ISDN_DRV_ICN
        !           431:        { "icn=", icn_setup },
        !           432: #endif
        !           433: #ifdef CONFIG_ISDN_DRV_HISAX
        !           434:        { "hisax=", HiSax_setup },
        !           435:        { "HiSax=", HiSax_setup },
        !           436: #endif
        !           437: #ifdef CONFIG_ISDN_DRV_PCBIT
        !           438:        { "pcbit=", pcbit_setup },
        !           439: #endif
        !           440: #ifdef CONFIG_ATARIMOUSE
        !           441:        { "atamouse=", atari_mouse_setup },
        !           442: #endif
        !           443: #ifdef CONFIG_DMASOUND
        !           444:        { "dmasound=", dmasound_setup },
        !           445: #endif
        !           446: #ifdef CONFIG_ATARI_SCSI
        !           447:        { "atascsi=", atari_scsi_setup },
        !           448: #endif
        !           449: #if defined(CONFIG_A3000_SCSI) || defined(CONFIG_A2091_SCSI) \
        !           450:            || defined(CONFIG_GVP11_SCSI)
        !           451:        { "wd33c93=", wd33c93_setup },
        !           452: #endif
        !           453: #if defined(CONFIG_GVP11_SCSI)
        !           454:        { "gvp11=", gvp11_setup },
        !           455: #endif
        !           456: #ifdef CONFIG_CYCLADES
        !           457:        { "cyclades=", cy_setup },
        !           458: #endif
        !           459: #ifdef CONFIG_DIGI
        !           460:        { "digi=", pcxx_setup },
        !           461: #endif
        !           462: #ifdef CONFIG_RISCOM8
        !           463:        { "riscom8=", riscom8_setup },
        !           464: #endif
        !           465: #ifdef CONFIG_SPECIALIX
        !           466:        { "specialix=", specialix_setup },
        !           467: #endif
        !           468: #ifdef CONFIG_BAYCOM
        !           469:        { "baycom=", baycom_setup },
        !           470: #endif
        !           471: #ifdef CONFIG_APM
        !           472:        { "apm=", apm_setup },
        !           473: #endif
        !           474:        { 0, 0 }
        !           475: };
        !           476: 
        !           477: static struct kernel_param raw_params[] = {
        !           478: 
        !           479: #ifdef CONFIG_PARIDE_PD
        !           480:        { "pd.", pd_setup },
        !           481: #endif
        !           482: #ifdef CONFIG_PARIDE_PCD
        !           483:        { "pcd.", pcd_setup },
        !           484: #endif
        !           485: #ifdef CONFIG_PARIDE_PF
        !           486:        { "pf.", pf_setup },
        !           487: #endif
        !           488: #ifdef CONFIG_PARIDE_PT
        !           489:        { "pt.", pt_setup },
        !           490: #endif
        !           491: #ifdef CONFIG_PARIDE_PG
        !           492:        { "pg.", pg_setup },
        !           493: #endif
        !           494:        { 0, 0 }
        !           495: } ;
        !           496: 
        !           497: 
        !           498: #ifdef CONFIG_BLK_DEV_RAM
        !           499: static void ramdisk_start_setup(char *str, int *ints)
        !           500: {
        !           501:    if (ints[0] > 0 && ints[1] >= 0)
        !           502:       rd_image_start = ints[1];
        !           503: }
        !           504: 
        !           505: static void load_ramdisk(char *str, int *ints)
        !           506: {
        !           507:    if (ints[0] > 0 && ints[1] >= 0)
        !           508:       rd_doload = ints[1] & 3;
        !           509: }
        !           510: 
        !           511: static void prompt_ramdisk(char *str, int *ints)
        !           512: {
        !           513:    if (ints[0] > 0 && ints[1] >= 0)
        !           514:       rd_prompt = ints[1] & 1;
        !           515: }
        !           516: 
        !           517: static void ramdisk_size(char *str, int *ints)
        !           518: {
        !           519:        if (ints[0] > 0 && ints[1] >= 0)
        !           520:                rd_size = ints[1];
        !           521: }
        !           522: 
        !           523: #endif
        !           524: 
        !           525: static int checksetup(char *line)
        !           526: {
        !           527:        int i = 0;
        !           528:        int ints[11];
        !           529: 
        !           530: #ifdef CONFIG_BLK_DEV_IDE
        !           531:        /* ide driver needs the basic string, rather than pre-processed values */
        !           532:        if (!strncmp(line,"ide",3) || (!strncmp(line,"hd",2) && line[2] != '=')) {
        !           533:                ide_setup(line);
        !           534:                return 1;
        !           535:        }
        !           536: #endif
        !           537:        while (bootsetups[i].str) {
        !           538:                int n = strlen(bootsetups[i].str);
        !           539:                if (!strncmp(line,bootsetups[i].str,n)) {
        !           540:                        bootsetups[i].setup_func(get_options(line+n,ints), ints);
        !           541:                        return 1;
        !           542:                }
        !           543:                i++;
        !           544:        }
        !           545: 
        !           546:         for (i=0; raw_params[i].str; i++) {
        !           547:                 int n = strlen(raw_params[i].str);
        !           548:                 if (!strncmp(line,raw_params[i].str,n)) {
        !           549:                         raw_params[i].setup_func(line+n, NULL);
        !           550:                         return 1;
        !           551:                 }
        !           552:         }
        !           553: 
        !           554:        return 0;
        !           555: }
        !           556: 
        !           557: /* this should be approx 2 Bo*oMips to start (note initial shift), and will
        !           558:    still work even if initially too large, it will just take slightly longer */
        !           559: unsigned long loops_per_sec = (1<<12);
        !           560: 
        !           561: #if defined(__SMP__) && defined(__i386__)
        !           562: unsigned long smp_loops_per_tick = 1000000;
        !           563: #endif
        !           564: 
        !           565: /* This is the number of bits of precision for the loops_per_second.  Each
        !           566:    bit takes on average 1.5/HZ seconds.  This (like the original) is a little
        !           567:    better than 1% */
        !           568: #define LPS_PREC 8
        !           569: 
        !           570: void calibrate_delay(void)
        !           571: {
        !           572:        int ticks;
        !           573:        int loopbit;
        !           574:        int lps_precision = LPS_PREC;
        !           575: 
        !           576:        loops_per_sec = (1<<12);
        !           577: 
        !           578:        printk("Calibrating delay loop.. ");
        !           579:        while (loops_per_sec <<= 1) {
        !           580:                /* wait for "start of" clock tick */
        !           581:                ticks = jiffies;
        !           582:                while (ticks == jiffies)
        !           583:                        /* nothing */;
        !           584:                /* Go .. */
        !           585:                ticks = jiffies;
        !           586:                __delay(loops_per_sec);
        !           587:                ticks = jiffies - ticks;
        !           588:                if (ticks)
        !           589:                        break;
        !           590:                }
        !           591: 
        !           592: /* Do a binary approximation to get loops_per_second set to equal one clock
        !           593:    (up to lps_precision bits) */
        !           594:        loops_per_sec >>= 1;
        !           595:        loopbit = loops_per_sec;
        !           596:        while ( lps_precision-- && (loopbit >>= 1) ) {
        !           597:                loops_per_sec |= loopbit;
        !           598:                ticks = jiffies;
        !           599:                while (ticks == jiffies);
        !           600:                ticks = jiffies;
        !           601:                __delay(loops_per_sec);
        !           602:                if (jiffies != ticks)   /* longer than 1 tick */
        !           603:                        loops_per_sec &= ~loopbit;
        !           604:        }
        !           605: 
        !           606: /* finally, adjust loops per second in terms of seconds instead of clocks */   
        !           607:        loops_per_sec *= HZ;
        !           608: /* Round the value and print it */     
        !           609:        printk("ok - %lu.%02lu BogoMIPS\n",
        !           610:                (loops_per_sec+2500)/500000,
        !           611:                ((loops_per_sec+2500)/5000) % 100);
        !           612: 
        !           613: #if defined(__SMP__) && defined(__i386__)
        !           614:        smp_loops_per_tick = loops_per_sec / 400;
        !           615: #endif
        !           616: }
        !           617: 
        !           618: static void parse_root_dev(char * line)
        !           619: {
        !           620:        int base = 0;
        !           621:        static struct dev_name_struct {
        !           622:                const char *name;
        !           623:                const int num;
        !           624:        } devices[] = {
        !           625:                { "nfs",     0x00ff },
        !           626:                { "loop",    0x0700 },
        !           627:                { "hda",     0x0300 },
        !           628:                { "hdb",     0x0340 },
        !           629:                { "hdc",     0x1600 },
        !           630:                { "hdd",     0x1640 },
        !           631:                { "hde",     0x2100 },
        !           632:                { "hdf",     0x2140 },
        !           633:                { "hdg",     0x2200 },
        !           634:                { "hdh",     0x2240 },
        !           635:                { "sda",     0x0800 },
        !           636:                { "sdb",     0x0810 },
        !           637:                { "sdc",     0x0820 },
        !           638:                { "sdd",     0x0830 },
        !           639:                { "sde",     0x0840 },
        !           640:                { "sdf",     0x0850 },
        !           641:                { "sdg",     0x0860 },
        !           642:                { "sdh",     0x0870 },
        !           643:                { "sdi",     0x0880 },
        !           644:                { "sdj",     0x0890 },
        !           645:                { "sdk",     0x08a0 },
        !           646:                { "sdl",     0x08b0 },
        !           647:                { "sdm",     0x08c0 },
        !           648:                { "sdn",     0x08d0 },
        !           649:                { "sdo",     0x08e0 },
        !           650:                { "sdp",     0x08f0 },
        !           651:                { "fd",      0x0200 },
        !           652:                { "xda",     0x0d00 },
        !           653:                { "xdb",     0x0d40 },
        !           654:                { "ram",     0x0100 },
        !           655:                { "scd",     0x0b00 },
        !           656:                { "mcd",     0x1700 },
        !           657:                { "cdu535",  0x1800 },
        !           658:                { "aztcd",   0x1d00 },
        !           659:                { "cm206cd", 0x2000 },
        !           660:                { "gscd",    0x1000 },
        !           661:                { "sbpcd",   0x1900 },
        !           662:                { "sonycd",  0x1800 },
        !           663: #ifdef CONFIG_PARIDE_PD
        !           664:                        { "pda",     0x2d00 },
        !           665:                        { "pdb",     0x2d10 },
        !           666:                        { "pdc",     0x2d20 },
        !           667:                        { "pdd",     0x2d30 },
        !           668: #endif
        !           669: #ifdef CONFIG_PARIDE_PCD
        !           670:                { "pcd",     0x2e00 },
        !           671: #endif
        !           672: #ifdef CONFIG_PARIDE_PF
        !           673:                { "pf",      0x2f00 },
        !           674: #endif
        !           675:                { NULL, 0 }
        !           676:        };
        !           677: 
        !           678:        if (strncmp(line,"/dev/",5) == 0) {
        !           679:                struct dev_name_struct *dev = devices;
        !           680:                line += 5;
        !           681:                do {
        !           682:                        int len = strlen(dev->name);
        !           683:                        if (strncmp(line,dev->name,len) == 0) {
        !           684:                                line += len;
        !           685:                                base = dev->num;
        !           686:                                break;
        !           687:                        }
        !           688:                        dev++;
        !           689:                } while (dev->name);
        !           690:        }
        !           691:        ROOT_DEV = to_kdev_t(base + simple_strtoul(line,NULL,base?10:16));
        !           692: }
        !           693: 
        !           694: /*
        !           695:  * This is a simple kernel command line parsing function: it parses
        !           696:  * the command line, and fills in the arguments/environment to init
        !           697:  * as appropriate. Any cmd-line option is taken to be an environment
        !           698:  * variable if it contains the character '='.
        !           699:  *
        !           700:  *
        !           701:  * This routine also checks for options meant for the kernel.
        !           702:  * These options are not given to init - they are for internal kernel use only.
        !           703:  */
        !           704: static void parse_options(char *line)
        !           705: {
        !           706:        char *next;
        !           707:        int args, envs;
        !           708: 
        !           709:        if (!*line)
        !           710:                return;
        !           711:        args = 0;
        !           712:        envs = 1;       /* TERM is set to 'linux' by default */
        !           713:        next = line;
        !           714:        while ((line = next) != NULL) {
        !           715:                if ((next = strchr(line,' ')) != NULL)
        !           716:                        *next++ = 0;
        !           717:                /*
        !           718:                 * check for kernel options first..
        !           719:                 */
        !           720:                if (!strncmp(line,"root=",5)) {
        !           721:                        parse_root_dev(line+5);
        !           722:                        continue;
        !           723:                }
        !           724: #ifdef CONFIG_ROOT_NFS
        !           725:                if (!strncmp(line, "nfsroot=", 8)) {
        !           726:                        int n;
        !           727:                        line += 8;
        !           728:                        ROOT_DEV = MKDEV(UNNAMED_MAJOR, 255);
        !           729:                        if (line[0] == '/' || line[0] == ',' || (line[0] >= '0' && line[0] <= '9')) {
        !           730:                                strncpy(nfs_root_name, line, sizeof(nfs_root_name));
        !           731:                                nfs_root_name[sizeof(nfs_root_name)-1] = '\0';
        !           732:                                continue;
        !           733:                        }
        !           734:                        n = strlen(line) + strlen(NFS_ROOT);
        !           735:                        if (n >= sizeof(nfs_root_name))
        !           736:                                line[sizeof(nfs_root_name) - strlen(NFS_ROOT) - 1] = '\0';
        !           737:                        sprintf(nfs_root_name, NFS_ROOT, line);
        !           738:                        continue;
        !           739:                }
        !           740:                if (!strncmp(line, "nfsaddrs=", 9)) {
        !           741:                        line += 9;
        !           742:                        strncpy(nfs_root_addrs, line, sizeof(nfs_root_addrs));
        !           743:                        nfs_root_addrs[sizeof(nfs_root_addrs)-1] = '\0';
        !           744:                        continue;
        !           745:                }
        !           746: #endif
        !           747:                if (!strcmp(line,"ro")) {
        !           748:                        root_mountflags |= MS_RDONLY;
        !           749:                        continue;
        !           750:                }
        !           751:                if (!strcmp(line,"rw")) {
        !           752:                        root_mountflags &= ~MS_RDONLY;
        !           753:                        continue;
        !           754:                }
        !           755:                if (!strcmp(line,"debug")) {
        !           756:                        console_loglevel = 10;
        !           757:                        continue;
        !           758:                }
        !           759:                if (!strncmp(line,"init=",5)) {
        !           760:                        line += 5;
        !           761:                        execute_command = line;
        !           762:                        continue;
        !           763:                }
        !           764:                if (checksetup(line))
        !           765:                        continue;
        !           766:                /*
        !           767:                 * Then check if it's an environment variable or
        !           768:                 * an option.
        !           769:                 */
        !           770:                if (strchr(line,'=')) {
        !           771:                        if (envs >= MAX_INIT_ENVS)
        !           772:                                break;
        !           773:                        envp_init[++envs] = line;
        !           774:                } else {
        !           775:                        if (args >= MAX_INIT_ARGS)
        !           776:                                break;
        !           777:                        argv_init[++args] = line;
        !           778:                }
        !           779:        }
        !           780:        argv_init[args+1] = NULL;
        !           781:        envp_init[envs+1] = NULL;
        !           782: }
        !           783: 
        !           784: 
        !           785: extern void setup_arch(char **, unsigned long *, unsigned long *);
        !           786: extern void arch_syms_export(void);
        !           787: 
        !           788: #ifndef __SMP__
        !           789: 
        !           790: /*
        !           791:  *     Uniprocessor idle thread
        !           792:  */
        !           793:  
        !           794: int cpu_idle(void *unused)
        !           795: {
        !           796:        for(;;)
        !           797:                idle();
        !           798: }
        !           799: 
        !           800: #else
        !           801: 
        !           802: /*
        !           803:  *     Multiprocessor idle thread is in arch/...
        !           804:  */
        !           805:  
        !           806: extern int cpu_idle(void * unused);
        !           807: 
        !           808: /*
        !           809:  *     Activate a secondary processor.
        !           810:  */
        !           811:  
        !           812: asmlinkage void start_secondary(void)
        !           813: {
        !           814:        trap_init();
        !           815:        init_IRQ();
        !           816:        smp_callin();
        !           817:        cpu_idle(NULL);
        !           818: }
        !           819: 
        !           820: 
        !           821: 
        !           822: /*
        !           823:  *     Called by CPU#0 to activate the rest.
        !           824:  */
        !           825:  
        !           826: static void smp_init(void)
        !           827: {
        !           828:        int i, j;
        !           829:        smp_boot_cpus();
        !           830:        
        !           831:        /*
        !           832:         *      Create the slave init tasks as sharing pid 0.
        !           833:         *
        !           834:         *      This should only happen if we have virtual CPU numbers
        !           835:         *      higher than 0.
        !           836:         */
        !           837: 
        !           838:        for (i=1; i<smp_num_cpus; i++)
        !           839:        {
        !           840:                struct task_struct *n, *p;
        !           841: 
        !           842:                j = cpu_logical_map[i];
        !           843:                /*
        !           844:                 *      We use kernel_thread for the idlers which are
        !           845:                 *      unlocked tasks running in kernel space.
        !           846:                 */
        !           847:                kernel_thread(cpu_idle, NULL, CLONE_PID);
        !           848:                /*
        !           849:                 *      Don't assume linear processor numbering
        !           850:                 */
        !           851:                current_set[j]=task[i];
        !           852:                current_set[j]->processor=j;
        !           853:                cli();
        !           854:                n = task[i]->next_run;
        !           855:                p = task[i]->prev_run;
        !           856:                nr_running--;
        !           857:                n->prev_run = p;
        !           858:                p->next_run = n;
        !           859:                task[i]->next_run = task[i]->prev_run = task[i];
        !           860:                sti();
        !           861:        }
        !           862: }              
        !           863: 
        !           864: /*
        !           865:  *     The autoprobe routines assume CPU#0 on the i386
        !           866:  *     so we don't actually set the game in motion until
        !           867:  *     they are finished.
        !           868:  */
        !           869:  
        !           870: static void smp_begin(void)
        !           871: {
        !           872:        smp_threads_ready=1;
        !           873:        smp_commence();
        !           874: }
        !           875:        
        !           876: #endif
        !           877: 
        !           878: /*
        !           879:  *     Activate the first processor.
        !           880:  */
        !           881:  
        !           882: asmlinkage void start_kernel(void)
        !           883: {
        !           884:        char * command_line;
        !           885: 
        !           886: /*
        !           887:  *     This little check will move.
        !           888:  */
        !           889: 
        !           890: #ifdef __SMP__
        !           891:        static int first_cpu=1;
        !           892:        
        !           893:        if(!first_cpu)
        !           894:                start_secondary();
        !           895:        first_cpu=0;
        !           896:        
        !           897: #endif 
        !           898: /*
        !           899:  * Interrupts are still disabled. Do necessary setups, then
        !           900:  * enable them
        !           901:  */
        !           902:        setup_arch(&command_line, &memory_start, &memory_end);
        !           903:        memory_start = paging_init(memory_start,memory_end);
        !           904:        trap_init();
        !           905:        init_IRQ();
        !           906:        sched_init();
        !           907:        time_init();
        !           908:        parse_options(command_line);
        !           909: #ifdef CONFIG_MODULES
        !           910:        init_modules();
        !           911: #endif
        !           912: #ifdef CONFIG_PROFILE
        !           913:        if (!prof_shift)
        !           914: #ifdef CONFIG_PROFILE_SHIFT
        !           915:                prof_shift = CONFIG_PROFILE_SHIFT;
        !           916: #else
        !           917:                prof_shift = 2;
        !           918: #endif
        !           919: #endif
        !           920:        if (prof_shift) {
        !           921:                prof_buffer = (unsigned int *) memory_start;
        !           922:                /* only text is profiled */
        !           923:                prof_len = (unsigned long) &_etext - (unsigned long) &_stext;
        !           924:                prof_len >>= prof_shift;
        !           925:                memory_start += prof_len * sizeof(unsigned int);
        !           926:                memset(prof_buffer, 0, prof_len * sizeof(unsigned int));
        !           927:        }
        !           928:        memory_start = console_init(memory_start,memory_end);
        !           929: #ifdef CONFIG_PCI
        !           930:        memory_start = pci_init(memory_start,memory_end);
        !           931: #endif
        !           932:        memory_start = kmalloc_init(memory_start,memory_end);
        !           933:        sti();
        !           934:        calibrate_delay();
        !           935:        memory_start = inode_init(memory_start,memory_end);
        !           936:        memory_start = file_table_init(memory_start,memory_end);
        !           937:        memory_start = name_cache_init(memory_start,memory_end);
        !           938: #ifdef CONFIG_BLK_DEV_INITRD
        !           939:        if (initrd_start && initrd_start < memory_start) {
        !           940:                printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - "
        !           941:                    "disabling it.\n",initrd_start,memory_start);
        !           942:                initrd_start = 0;
        !           943:        }
        !           944: #endif
        !           945:        mem_init(memory_start,memory_end);
        !           946:        buffer_init();
        !           947:        sock_init();
        !           948: #if defined(CONFIG_SYSVIPC) || defined(CONFIG_KERNELD)
        !           949:        ipc_init();
        !           950: #endif
        !           951:        dquot_init();
        !           952:        arch_syms_export();
        !           953:        sti();
        !           954:        check_bugs();
        !           955: 
        !           956: #if defined(CONFIG_MTRR) && defined(__SMP__)
        !           957:        init_mtrr_config();
        !           958: #endif
        !           959: 
        !           960: 
        !           961:        printk(linux_banner);
        !           962: #ifdef __SMP__
        !           963:        smp_init();
        !           964: #endif
        !           965:        sysctl_init();
        !           966:        /* 
        !           967:         *      We count on the initial thread going ok 
        !           968:         *      Like idlers init is an unlocked kernel thread, which will
        !           969:         *      make syscalls (and thus be locked).
        !           970:         */
        !           971:        kernel_thread(init, NULL, 0);
        !           972: /*
        !           973:  * task[0] is meant to be used as an "idle" task: it may not sleep, but
        !           974:  * it might do some general things like count free pages or it could be
        !           975:  * used to implement a reasonable LRU algorithm for the paging routines:
        !           976:  * anything that can be useful, but shouldn't take time from the real
        !           977:  * processes.
        !           978:  *
        !           979:  * Right now task[0] just does a infinite idle loop.
        !           980:  */
        !           981:        cpu_idle(NULL);
        !           982: }
        !           983: 
        !           984: static int printf(const char *fmt, ...)
        !           985: {
        !           986:        va_list args;
        !           987:        int i;
        !           988: 
        !           989:        va_start(args, fmt);
        !           990:        write(1,printbuf,i=vsprintf(printbuf, fmt, args));
        !           991:        va_end(args);
        !           992:        return i;
        !           993: }
        !           994: 
        !           995: static int do_rc(void * rc)
        !           996: {
        !           997:        close(0);
        !           998:        if (open(rc,O_RDONLY,0))
        !           999:                return -1;
        !          1000:        return execve("/bin/sh", argv_rc, envp_rc);
        !          1001: }
        !          1002: 
        !          1003: static int do_shell(void * shell)
        !          1004: {
        !          1005:        close(0);close(1);close(2);
        !          1006:        setsid();
        !          1007:        (void) open("/dev/tty1",O_RDWR,0);
        !          1008:        (void) dup(0);
        !          1009:        (void) dup(0);
        !          1010:        return execve(shell, argv, envp);
        !          1011: }
        !          1012: 
        !          1013: #ifdef CONFIG_BLK_DEV_INITRD
        !          1014: static int do_linuxrc(void * shell)
        !          1015: {
        !          1016:        static char *argv[] = { "linuxrc", NULL, };
        !          1017: 
        !          1018:        close(0);close(1);close(2);
        !          1019:        setsid();
        !          1020:        (void) open("/dev/tty1",O_RDWR,0);
        !          1021:        (void) dup(0);
        !          1022:        (void) dup(0);
        !          1023:        return execve(shell, argv, envp_init);
        !          1024: }
        !          1025: 
        !          1026: static void no_initrd(char *s,int *ints)
        !          1027: {
        !          1028:        mount_initrd = 0;
        !          1029: }
        !          1030: #endif
        !          1031: 
        !          1032: static int init(void * unused)
        !          1033: {
        !          1034:        int pid,i;
        !          1035: #ifdef CONFIG_BLK_DEV_INITRD
        !          1036:        int real_root_mountflags;
        !          1037: #endif
        !          1038: 
        !          1039:        /* Launch bdflush from here, instead of the old syscall way. */
        !          1040:        kernel_thread(bdflush, NULL, 0);
        !          1041:        /* Start the background pageout daemon. */
        !          1042:        kswapd_setup();
        !          1043:        kernel_thread(kswapd, NULL, 0);
        !          1044: 
        !          1045: #ifdef CONFIG_BLK_DEV_INITRD
        !          1046:        real_root_dev = ROOT_DEV;
        !          1047:        real_root_mountflags = root_mountflags;
        !          1048:        if (initrd_start && mount_initrd) root_mountflags &= ~MS_RDONLY;
        !          1049:        else mount_initrd =0;
        !          1050: #endif
        !          1051:        setup();
        !          1052: 
        !          1053: #ifdef __SMP__
        !          1054:        /*
        !          1055:         *      With the devices probed and setup we can
        !          1056:         *      now enter SMP mode.
        !          1057:         */
        !          1058:        
        !          1059:        smp_begin();
        !          1060: #endif 
        !          1061: 
        !          1062:        #ifdef CONFIG_UMSDOS_FS
        !          1063:        {
        !          1064:                /*
        !          1065:                        When mounting a umsdos fs as root, we detect
        !          1066:                        the pseudo_root (/linux) and initialise it here.
        !          1067:                        pseudo_root is defined in fs/umsdos/inode.c
        !          1068:                */
        !          1069:                extern struct inode *pseudo_root;
        !          1070:                if (pseudo_root != NULL){
        !          1071:                        current->fs->root = pseudo_root;
        !          1072:                        current->fs->pwd  = pseudo_root;
        !          1073:                }
        !          1074:        }
        !          1075:        #endif
        !          1076: 
        !          1077: #ifdef CONFIG_BLK_DEV_INITRD
        !          1078:        root_mountflags = real_root_mountflags;
        !          1079:        if (mount_initrd && ROOT_DEV != real_root_dev && ROOT_DEV == MKDEV(RAMDISK_MAJOR,0)) {
        !          1080:                int error;
        !          1081: 
        !          1082:                pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD);
        !          1083:                if (pid>0)
        !          1084:                        while (pid != wait(&i));
        !          1085:                if (real_root_dev != MKDEV(RAMDISK_MAJOR, 0)) {
        !          1086:                        error = change_root(real_root_dev,"/initrd");
        !          1087:                        if (error)
        !          1088:                                printk(KERN_ERR "Change root to /initrd: "
        !          1089:                                    "error %d\n",error);
        !          1090:                }
        !          1091:        }
        !          1092: #endif
        !          1093:        
        !          1094:        /*
        !          1095:         *      This keeps serial console MUCH cleaner, but does assume
        !          1096:         *      the console driver checks there really is a video device
        !          1097:         *      attached (Sparc effectively does).
        !          1098:         */
        !          1099: 
        !          1100:        if ((open("/dev/tty1",O_RDWR,0) < 0) &&
        !          1101:            (open("/dev/ttyS0",O_RDWR,0) < 0))
        !          1102:                printk("Unable to open an initial console.\n");
        !          1103:                        
        !          1104:        (void) dup(0);
        !          1105:        (void) dup(0);
        !          1106: 
        !          1107:        if (!execute_command) {
        !          1108:                execve("/etc/init",argv_init,envp_init);
        !          1109:                execve("/bin/init",argv_init,envp_init);
        !          1110:                execve("/sbin/init",argv_init,envp_init);
        !          1111:                /* if this fails, fall through to original stuff */
        !          1112: 
        !          1113:                pid = kernel_thread(do_rc, "/etc/rc", SIGCHLD);
        !          1114:                if (pid>0)
        !          1115:                        while (pid != wait(&i))
        !          1116:                                /* nothing */;
        !          1117:        }
        !          1118: 
        !          1119:        while (1) {
        !          1120:                pid = kernel_thread(do_shell,
        !          1121:                        execute_command ? execute_command : "/bin/sh",
        !          1122:                        SIGCHLD);
        !          1123:                if (pid < 0) {
        !          1124:                        printf("Fork failed in init\n\r");
        !          1125:                        continue;
        !          1126:                }
        !          1127:                while (1)
        !          1128:                        if (pid == wait(&i))
        !          1129:                                break;
        !          1130:                printf("\n\rchild %d died with code %04x\n\r",pid,i);
        !          1131:                sync();
        !          1132:        }
        !          1133:        return -1;
        !          1134: }

unix.superglobalmegacorp.com

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