Annotation of researchv10no/libc/gen/setupshares.c, revision 1.1

1.1     ! root        1: /*
        !             2: **     Set up parameters for share scheduler
        !             3: */
        !             4: 
        !             5: #include <shares.h>
        !             6: #include <sys/share.h>
        !             7: #include <signal.h>
        !             8: #include <setjmp.h>
        !             9: #include <stdio.h>
        !            10: #include <errno.h>
        !            11: 
        !            12: #define        DEFSHARES       1       /* Default number of shares for a group 0 user */
        !            13: #define        SYSERROR        (-1)
        !            14: #ifndef        ETOOMANYU
        !            15: #define        ETOOMANYU       ENOSPC  /* Must go in errno.h or lnode.h */
        !            16: #endif
        !            17: 
        !            18: static int     catchsys();
        !            19: static jmp_buf Sigsysbuf;
        !            20: 
        !            21: int
        !            22: setupshares(uid, efp)
        !            23:        int                     uid;
        !            24:        void                    (*efp)();
        !            25: {
        !            26:        register int            (*oldsig)();
        !            27:        register unsigned long  extime;
        !            28:        struct sh_consts        shconsts;
        !            29:        struct lnode            share;
        !            30:        extern unsigned long    time();
        !            31: 
        !            32:        if ( uid == 0 )
        !            33:                return 0;       /* root needs no set-up */
        !            34: 
        !            35:        oldsig = signal(SIGSYS, catchsys);
        !            36: 
        !            37:        if
        !            38:        (
        !            39:                setjmp(Sigsysbuf)
        !            40:                ||
        !            41:                limits((struct lnode *)&shconsts, L_GETCOSTS) == SYSERROR
        !            42:                ||
        !            43:                (Shareflags & NOSHARE)
        !            44:        )
        !            45:        {
        !            46:                (void)signal(SIGSYS, oldsig);
        !            47:                return 0;       /* Share not installed/active */
        !            48:        }
        !            49: 
        !            50:        (void)signal(SIGSYS, oldsig);
        !            51: 
        !            52:        if ( (extime = getshares(&share, uid, 0)) == 0 )
        !            53:        {
        !            54:                if ( uid == IDLEUID )
        !            55:                {
        !            56:                        share.l_shares = IDLESHARES;
        !            57:                        share.l_group = IDLEGROUP;
        !            58:                }
        !            59:                else
        !            60:                if ( uid == OTHERUID )
        !            61:                {
        !            62:                        share.l_shares = OTHERSHARES;
        !            63:                        share.l_group = OTHERGROUP;
        !            64:                }
        !            65:                else
        !            66:                {
        !            67:                        if ( efp != (void (*)())0 )
        !            68:                                (*efp)("Cannot get shares for uid %d -- using defaults.", uid);
        !            69:                        share.l_shares = DEFSHARES;
        !            70:                }
        !            71:        }
        !            72:        else
        !            73:        if ( limits(&share, L_OTHLIM) == SYSERROR )
        !            74:        {
        !            75:                /*
        !            76:                **      Decay usage by time since last access.
        !            77:                */
        !            78: 
        !            79:                if ( (extime = (time((long *)0) - extime) / Delta) > 0 )
        !            80:                {
        !            81:                        extern double   pow();
        !            82: 
        !            83:                        share.l_usage *= pow(DecayUsage, (float)extime);
        !            84:                }
        !            85:        }
        !            86: 
        !            87:        if ( setlimits(&share) == SYSERROR )
        !            88:        {
        !            89:                if ( errno == ETOOMANYU )
        !            90:                {
        !            91:                        char * cp = "other";
        !            92: 
        !            93:                        share.l_uid = OTHERUID;
        !            94: 
        !            95:                        if ( limits(&share, L_OTHLIM) != SYSERROR )
        !            96:                                (void)setlimits(&share);
        !            97:                        else
        !            98:                                cp = "root";
        !            99: 
        !           100:                        if ( efp != (void (*)())0 )
        !           101:                                (*efp)("Warning: system out of share structures, using \"%s\".\n", cp);
        !           102:                }
        !           103:                else
        !           104:                {
        !           105:                        if ( efp != (void (*)())0 )
        !           106:                                (*efp)("setlimits(3) error");
        !           107:                        closeshares();
        !           108:                        return 1;
        !           109:                }
        !           110:        }
        !           111: 
        !           112:        closeshares();
        !           113: 
        !           114:        return 0;
        !           115: }
        !           116: 
        !           117: static int
        !           118: catchsys(sig)
        !           119: {
        !           120:        longjmp(Sigsysbuf, 1);
        !           121:        abort();
        !           122: }

unix.superglobalmegacorp.com

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