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

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

unix.superglobalmegacorp.com

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