Annotation of researchv10no/libc/gen/setupshares.c, revision 1.1.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.