Annotation of 43BSDReno/contrib/isode-beta/others/X/server/access.c, revision 1.1

1.1     ! root        1: /***********************************************************
        !             2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
        !             3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
        !             4: 
        !             5:                         All Rights Reserved
        !             6: 
        !             7: Permission to use, copy, modify, and distribute this software and its 
        !             8: documentation for any purpose and without fee is hereby granted, 
        !             9: provided that the above copyright notice appear in all copies and that
        !            10: both that copyright notice and this permission notice appear in 
        !            11: supporting documentation, and that the names of Digital or MIT not be
        !            12: used in advertising or publicity pertaining to distribution of the
        !            13: software without specific, written prior permission.  
        !            14: 
        !            15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
        !            16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
        !            17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
        !            18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
        !            19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
        !            20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
        !            21: SOFTWARE.
        !            22: 
        !            23: ******************************************************************/
        !            24: 
        !            25: /* $XConsortium: access.c,v 1.26 88/09/06 15:51:03 jim Exp $ */
        !            26: #ifdef ISOCONN
        !            27: #include <math.h>
        !            28: /*
        !            29:  * i'm sorry, i'm sorry
        !            30:  *
        !            31:  * By Analogy with per host auth, we keep all the TSAPaddr but
        !            32:  * do access control on NSAPaddr part only...
        !            33:  */
        !            34: #endif /* ISOCONN */
        !            35: 
        !            36: #include "X.h"
        !            37: #include "Xproto.h"
        !            38: #include "misc.h"
        !            39: #include "site.h"
        !            40: #include <errno.h>
        !            41: #include <sys/types.h>
        !            42: #include <sys/socket.h>
        !            43: #include <sys/ioctl.h>
        !            44: 
        !            45: #ifdef hpux
        !            46: #include <sys/utsname.h>
        !            47: #else
        !            48: #include <net/if.h>
        !            49: #endif /* hpux */
        !            50: 
        !            51: #include <netdb.h>
        !            52: #ifdef TCPCONN
        !            53: #include <netinet/in.h>
        !            54: #endif /* TCPCONN */
        !            55: #ifdef DNETCONN
        !            56: #include <netdnet/dn.h>
        !            57: #include <netdnet/dnetdb.h>
        !            58: #endif
        !            59: #ifdef ISOCONN
        !            60: #include <isode/psap.h>
        !            61: #include <isode/tsap.h>
        !            62: #include <isode/isoservent.h>
        !            63: #endif
        !            64: #undef NULL
        !            65: #include <stdio.h>
        !            66: #include "dixstruct.h"
        !            67: #include "osdep.h"
        !            68: 
        !            69: #define acmp(a1, a2, len) bcmp((char *)(a1), (char *)(a2), len)
        !            70: #define acopy(a1, a2, len) bcopy((char *)(a1), (char *)(a2), len)
        !            71: 
        !            72: #define DONT_CHECK -1
        !            73: extern char    *index();
        !            74: 
        !            75: typedef struct _host {
        !            76:        short           family;
        !            77:        short           len;
        !            78: #ifdef ISOCONN
        !            79:        struct TSAPaddr addr;           /* and so it is!! */
        !            80: #else /* ISOCONN */
        !            81:        unsigned char   addr[4];        /* will need to be bigger eventually */
        !            82: #endif /* ISOCONN */
        !            83:        struct _host *next;
        !            84: } HOST;
        !            85: 
        !            86: static HOST *selfhosts = NULL;
        !            87: static HOST *validhosts = NULL;
        !            88: static int AccessEnabled = DEFAULT_ACCESS_CONTROL;
        !            89: 
        !            90: typedef struct {
        !            91:     int af, xf;
        !            92: } FamilyMap;
        !            93: 
        !            94: static FamilyMap familyMap[] = {
        !            95: #ifdef ISOCONN 
        !            96: /*
        !            97:  * This has to be visible to the protocol via X.h...
        !            98:  */
        !            99:     {AF_OSI, FamilyIso},
        !           100: #endif /* ISOCONN */
        !           101: #ifdef     AF_DECnet
        !           102:     {AF_DECnet, FamilyDECnet},
        !           103: #endif /* AF_DECnet */
        !           104: #ifdef     AF_CHAOS
        !           105:     {AF_CHAOS, FamilyChaos},
        !           106: #endif /* AF_CHAOS */
        !           107: #ifdef    AF_INET
        !           108:     {AF_INET, FamilyInternet}
        !           109: #endif
        !           110: };
        !           111: 
        !           112: #define FAMILIES ((sizeof familyMap)/(sizeof familyMap[0]))
        !           113: 
        !           114: #ifdef hpux
        !           115: /* Define this host for access control.  Find all the hosts the OS knows about 
        !           116:  * for this fd and add them to the selfhosts list.
        !           117:  * HPUX version - hpux does not have SIOCGIFCONF ioctl;
        !           118:  */
        !           119: DefineSelf (fd)
        !           120:     int fd;
        !           121: {
        !           122:     register int n;
        !           123:     int        len;
        !           124:     caddr_t    addr;
        !           125:     int                family;
        !           126:     register HOST      *host;
        !           127: 
        !           128:     struct utsname name;
        !           129:     register struct hostent  *hp;
        !           130: 
        !           131:     union {
        !           132:        struct  sockaddr   sa;
        !           133:        struct  sockaddr_in  in;
        !           134:     } saddr;
        !           135:        
        !           136:     struct     sockaddr_in     *inetaddr;
        !           137: 
        !           138:     /* Why not use gethostname()?  Well, at least on my system, I've had to
        !           139:      * make an ugly kernel patch to get a name longer than 8 characters, and
        !           140:      * uname() lets me access to the whole string (it smashes release, you
        !           141:      * see), whereas gethostname() kindly truncates it for me.
        !           142:      */
        !           143:     uname(&name);
        !           144:     hp = gethostbyname (name.nodename);
        !           145:     if (hp != NULL) {
        !           146:        saddr.sa.sa_family = hp->h_addrtype;
        !           147:        inetaddr = (struct sockaddr_in *) (&(saddr.sa));
        !           148:        acopy ( hp->h_addr, &(inetaddr->sin_addr), hp->h_length);
        !           149:        family = ConvertAddr ( &(saddr.sa), &len, &addr);
        !           150:        if ( family > 0) {
        !           151:            for (host = selfhosts;
        !           152:                 host && ( family != host->family ||
        !           153:                          acmp ( addr, host->addr, len));
        !           154:                 host = host->next) ;
        !           155:            if (!host) {
        !           156:                /* add this host to the host list.      */
        !           157:                host = (HOST *) xalloc (sizeof (HOST));
        !           158:                host->family = family;
        !           159:                host->len = len;
        !           160:                acopy ( addr, host->addr, len);
        !           161:                host->next = selfhosts;
        !           162:                selfhosts = host;
        !           163:            }
        !           164:        }
        !           165:     }
        !           166: }
        !           167: 
        !           168: #else
        !           169: /* Define this host for access control.  Find all the hosts the OS knows about 
        !           170:  * for this fd and add them to the selfhosts list.
        !           171:  */
        !           172: DefineSelf (fd)
        !           173:     int fd;
        !           174: {
        !           175:     char               buf[2048];
        !           176:     struct ifconf      ifc;
        !           177:     register int       n;
        !           178:     int                len;
        !           179:     pointer            addr;
        !           180:     int                family;
        !           181:     register HOST      *host;
        !           182:     register struct ifreq *ifr;
        !           183: #ifdef ISOCONN
        !           184:     AEI                        aei;
        !           185:     struct PSAPaddr    *pa;
        !           186: #endif /* ISOCONN */
        !           187:     
        !           188: #ifdef TCPCONN || UNIXCONN || DNETCONN
        !           189:     ifc.ifc_len = sizeof (buf);
        !           190:     ifc.ifc_buf = buf;
        !           191:     if (ioctl (fd, (int) SIOCGIFCONF, (pointer) &ifc) < 0)
        !           192:         Error ("Getting interface configuration");
        !           193:     for (ifr = ifc.ifc_req, n = ifc.ifc_len / sizeof (struct ifreq); --n >= 0;
        !           194:      ifr++)
        !           195:     {
        !           196: #ifdef DNETCONN
        !           197:        /*
        !           198:         * this is ugly but SIOCGIFCONF returns decnet addresses in
        !           199:         * a different form from other decnet calls
        !           200:         */
        !           201:        if (ifr->ifr_addr.sa_family == AF_DECnet) {
        !           202:                len = sizeof (struct dn_naddr);
        !           203:                addr = (pointer)ifr->ifr_addr.sa_data;
        !           204:                family = AF_DECnet;
        !           205:        } else
        !           206: #endif /* DNETCONN */
        !           207:         if ((family = ConvertAddr (&ifr->ifr_addr, &len, &addr)) <= 0)
        !           208:            continue;
        !           209:         for (host = selfhosts; host && (family != host->family ||
        !           210:          acmp (addr, host->addr, len)); host = host->next)
        !           211:            ;
        !           212:         if (host)
        !           213:            continue;
        !           214:         host = (HOST *) xalloc (sizeof (HOST));
        !           215:         host->family = family;
        !           216:         host->len = len;
        !           217:         acopy(addr, host->addr, len);
        !           218:         host->next = selfhosts;
        !           219:         selfhosts = host;
        !           220:     }
        !           221: #endif TCPCONN
        !           222: #ifdef ISOCONN
        !           223: /* 
        !           224:  * This is dubious - we should be able to take an fd (transport
        !           225:  * descriptor) and get the list of possible transport interfaces...
        !           226:  *
        !           227:  * Well strictly, for this TSAP, a list of NSAPs that are valid
        !           228:  */
        !           229:        host = (HOST *)xalloc (sizeof (HOST));
        !           230:         host->family = AF_OSI;
        !           231:        aei = str2aei(TLocalHostName(), DEFAULTTSERVICE);
        !           232:        if (aei == NULLAEI) {
        !           233:                Error("Unknown Display\n");
        !           234:                return;
        !           235:        }
        !           236:        if ((pa = aei2addr (aei)) == NULLPA) {
        !           237:                fprintf (stderr, "address translation failed");
        !           238:                return;
        !           239:        }
        !           240:        acopy(&(pa->pa_addr.sa_addr), &(host->addr), sizeof(struct TSAPaddr));
        !           241:        host->len = NASIZE;
        !           242:        host->next = selfhosts;
        !           243:        selfhosts = host;
        !           244: #ifdef ISODEBUG
        !           245:        if (isodexbug) {
        !           246:                int i; char *hp = (char *)&(host->addr);
        !           247:                fprintf(stderr, "Self: ");
        !           248:                for(i=0; i<host->len; i++)
        !           249:                        fprintf(stderr, "%x ", (*hp++)&0xff);
        !           250:                fprintf(stderr, "\n");
        !           251:        }
        !           252: #endif /* ISODEBUG */
        !           253: #endif /* ISOCONN */
        !           254: }
        !           255: #endif hpux
        !           256: 
        !           257: /* Reset access control list to initial hosts */
        !           258: ResetHosts (display)
        !           259:     char *display;
        !           260: {
        !           261:     register HOST      *host, *self;
        !           262:     char               hostname[120];
        !           263:     char               fname[32];
        !           264:     FILE               *fd;
        !           265:     char               *ptr;
        !           266:     union {
        !           267:         struct sockaddr        sa;
        !           268: #ifdef TCPCONN
        !           269:         struct sockaddr_in in;
        !           270: #endif /* TCPCONN */
        !           271: #ifdef DNETCONN
        !           272:         struct sockaddr_dn dn;
        !           273: #endif
        !           274: #ifdef ISOCONN
        !           275:        struct TSAPaddr ta;
        !           276: #endif /* ISOCONN */
        !           277:     }                  saddr;
        !           278: #ifdef DNETCONN
        !           279:     struct nodeent     *np;
        !           280:     struct dn_naddr    dnaddr, *dnaddrp, *dnet_addr();
        !           281: #endif
        !           282:     int                        family;
        !           283:     int                        len;
        !           284:     pointer            addr;
        !           285:     register struct hostent *hp;
        !           286: 
        !           287:     AccessEnabled = DEFAULT_ACCESS_CONTROL;
        !           288:     while (host = validhosts)
        !           289:     {
        !           290:         validhosts = host->next;
        !           291:         xfree (host);
        !           292:     }
        !           293:     for (self = selfhosts; self; self = self->next)
        !           294:     {
        !           295:         host = (HOST *) xalloc (sizeof (HOST));
        !           296:         *host = *self;
        !           297:         host->next = validhosts;
        !           298:         validhosts = host;
        !           299:     }
        !           300:     strcpy (fname, "/etc/X");
        !           301:     strcat (fname, display);
        !           302:     strcat (fname, ".hosts");
        !           303:     if (fd = fopen (fname, "r")) 
        !           304:     {
        !           305:         while (fgets (hostname, sizeof (hostname), fd))
        !           306:        {
        !           307:        if (ptr = index (hostname, '\n'))
        !           308:            *ptr = 0;
        !           309: #ifdef DNETCONN
        !           310:        if ((ptr = index (hostname, ':')) && (*(ptr + 1) == ':'))
        !           311:        {
        !           312:            /* node name (DECnet names end in "::") */
        !           313:            *ptr = 0;
        !           314:            if (dnaddrp = dnet_addr(hostname))
        !           315:            {
        !           316:                    /* allow nodes to be specified by address */
        !           317:                    NewHost ((short) AF_DECnet, (pointer) dnaddrp);
        !           318:            }
        !           319:            else
        !           320:            {
        !           321:                if (np = getnodebyname (hostname))
        !           322:                {
        !           323:                    /* node was specified by name */
        !           324:                    saddr.sa.sa_family = np->n_addrtype;
        !           325:                    if ((family = ConvertAddr (&saddr.sa, &len, &addr)) ==
        !           326:                      AF_DECnet)
        !           327:                    {
        !           328:                        bzero ((pointer) &dnaddr, sizeof (dnaddr));
        !           329:                        dnaddr.a_len = np->n_length;
        !           330:                        acopy (np->n_addr, dnaddr.a_addr, np->n_length);
        !           331:                        NewHost (family, (pointer) &dnaddr);
        !           332:                    }
        !           333:                }
        !           334:            }
        !           335:        }
        !           336:        else
        !           337:        {
        !           338: #endif /* DNETCONN */
        !           339: #ifdef ISOCONN
        !           340: /*
        !           341:  * ISO displays are host:T-Namedisplay number
        !           342:  * only AEI are allowed (i.e. no raw addrs) 
        !           343:  * XXX Fix to allow T/X and other T-Names...
        !           344:  */
        !           345:        if ((ptr = index (hostname, ':')) && 
        !           346:                ((*(ptr + 1) == 'X') || (*(ptr + 1) == 'T')))
        !           347:        {
        !           348:                AEI aei;
        !           349:                struct PSAPaddr *pa;
        !           350:                *ptr++ = '\0';
        !           351:                if (ptr)
        !           352:                        aei = str2aei(hostname, ptr);
        !           353:                else
        !           354:                        aei = str2aei(hostname, DEFAULTTSERVICE);
        !           355:                if (aei == NULLAEI) {
        !           356:                        fprintf (stderr, "%s %s Unknown Display\n",
        !           357:                                hostname, ptr);
        !           358:                        continue;
        !           359:                }
        !           360:                if ((pa = aei2addr (aei)) == NULLPA) {
        !           361:                        fprintf (stderr, "address translation failed");
        !           362:                        continue;
        !           363:                }
        !           364:                family = AF_OSI;
        !           365:                NewHost(family, pa);
        !           366:        }
        !           367: #endif ISOCONN
        !           368: #ifdef TCPCONN
        !           369:            /* host name */
        !           370:            if (hp = gethostbyname (hostname))
        !           371:            {
        !           372:                saddr.sa.sa_family = hp->h_addrtype;
        !           373:                if ((family = ConvertAddr (&saddr.sa, &len, &addr)) > 0)
        !           374: #ifdef NEW_HEADER_WITH_OLD_LIBRARY
        !           375:                    NewHost (family, (pointer)hp->h_addr_list);
        !           376: #else
        !           377:                    NewHost (family, (pointer)hp->h_addr);
        !           378: #endif
        !           379: 
        !           380:            }
        !           381: #endif /* TCPCONN */
        !           382: #ifdef DNETCONN 
        !           383:        }       
        !           384: #endif /* DNETCONN */
        !           385:         }
        !           386:         fclose (fd);
        !           387:     }
        !           388: }
        !           389: 
        !           390: static Bool
        !           391: AuthorizedClient(client)
        !           392:     ClientPtr client;
        !           393: {
        !           394:     int                alen, family;
        !           395: #ifndef ISOCONN
        !           396:     struct sockaddr    from;
        !           397: #endif
        !           398:     pointer            addr;
        !           399:     register HOST      *host;
        !           400: #ifdef ISOCONN
        !           401:     struct TSAPaddr    from;
        !           402: #endif /* ISOCONN */
        !           403: #ifdef ISOCONN
        !           404: /*
        !           405:  * XXXXXXXXXXXXXXXXX
        !           406:  * Just til I fix the X.25 calling addr stuff
        !           407:  */
        !           408: return TRUE;
        !           409: #endif /* ISOCONN */
        !           410: 
        !           411:     alen = sizeof (from);
        !           412: #ifdef ISOCONN
        !           413:     if (!SGetPeerName (((OsCommPtr)client->osPrivate)->fd, &from, &alen))
        !           414: #else /* ISOCONN */
        !           415:     if (!getpeername (((OsCommPtr)client->osPrivate)->fd, &from, &alen))
        !           416: #endif /* ISOCONN */
        !           417:     {
        !           418:         if ((family = ConvertAddr (&from, &alen, &addr)) >= 0)
        !           419:        {
        !           420:            if (family == 0)
        !           421:                return TRUE;
        !           422:            for (host = selfhosts; host; host = host->next)
        !           423:            {
        !           424: #ifdef ISOCONN
        !           425:                if (family == host->family && !acmp (addr, &(host->addr), alen))
        !           426: #else /* ISOCONN */
        !           427:                if (family == host->family && !acmp (addr, host->addr, alen))
        !           428: #endif /* ISOCONN */
        !           429:                    return TRUE;
        !           430:            }
        !           431:        }
        !           432:     }
        !           433:     return FALSE;
        !           434: }
        !           435: 
        !           436: /* Add a host to the access control list.  This is the external interface
        !           437:  * called from the dispatcher */
        !           438: 
        !           439: int
        !           440: AddHost (client, family, length, pAddr)
        !           441:     ClientPtr          client;
        !           442:     int                 family;
        !           443:     unsigned            length;        /* of bytes in pAddr */
        !           444:     pointer             pAddr;
        !           445: {
        !           446:     int                        len;
        !           447:     register HOST      *host;
        !           448:     int                 unixFamily;
        !           449: 
        !           450:     if (!AuthorizedClient(client))
        !           451:        return(BadAccess);
        !           452:     unixFamily = UnixFamily(family);
        !           453:     if ((len = CheckFamily (DONT_CHECK, unixFamily)) < 0)
        !           454:     {
        !           455:        client->errorValue = family;
        !           456:         return(-len);
        !           457:     }
        !           458: 
        !           459:     if (len != length)
        !           460:     {
        !           461:        client->errorValue = length;
        !           462:         return(BadValue);
        !           463:     }
        !           464:     for (host = validhosts; host; host = host->next)
        !           465:     {
        !           466: #ifdef ISOCONN
        !           467:         if (unixFamily == host->family && !acmp (pAddr, &(host->addr), len))
        !           468:            return (Success);
        !           469: #else /* ISOCONN */
        !           470:         if (unixFamily == host->family && !acmp (pAddr, host->addr, len))
        !           471:            return (Success);
        !           472: #endif /* ISOCONN */
        !           473:     }
        !           474:     host = (HOST *) xalloc (sizeof (HOST));
        !           475:     host->family = unixFamily;
        !           476:     host->len = len;
        !           477: #ifdef ISOCONN
        !           478:     acopy(pAddr, &(host->addr), len);
        !           479: #else /* ISOCONN */
        !           480:     acopy(pAddr, host->addr, len);
        !           481: #endif /* ISOCONN */
        !           482:     host->next = validhosts;
        !           483:     validhosts = host;
        !           484:     return (Success);
        !           485: }
        !           486: 
        !           487: /* Add a host to the access control list. This is the internal interface 
        !           488:  * called when starting or resetting the server */
        !           489: NewHost (family, addr)
        !           490:     short      family;
        !           491:     pointer    addr;
        !           492: {
        !           493:     int                len;
        !           494:     register HOST *host;
        !           495: 
        !           496:     if ((len = CheckFamily (DONT_CHECK, family)) < 0)
        !           497:         return;
        !           498:     for (host = validhosts; host; host = host->next)
        !           499:     {
        !           500: #ifdef ISOCONN
        !           501:         if (family == host->family && !acmp (addr, &(host->addr), len))
        !           502:                return;
        !           503: #else /* ISOCONN */
        !           504:         if (family == host->family && !acmp (addr, host->addr, len))
        !           505:                return;
        !           506: #endif /* ISOCONN */
        !           507:     }
        !           508:     host = (HOST *) xalloc (sizeof (HOST));
        !           509:     host->family = family;
        !           510:     host->len = len;
        !           511: #ifdef ISOCONN
        !           512:     acopy(addr, &(host->addr), len);
        !           513: #else /* ISOCONN */
        !           514:     acopy(addr, host->addr, len);
        !           515: #endif /* ISOCONN */
        !           516:     host->next = validhosts;
        !           517:     validhosts = host;
        !           518: }
        !           519: 
        !           520: /* Remove a host from the access control list */
        !           521: 
        !           522: int
        !           523: RemoveHost (client, family, length, pAddr)
        !           524:     ClientPtr          client;
        !           525:     int                 family;
        !           526:     unsigned            length;        /* of bytes in pAddr */
        !           527:     pointer             pAddr;
        !           528: {
        !           529:     int                        len,
        !           530:                         unixFamily;
        !           531:     register HOST      *host, **prev;
        !           532: 
        !           533:     if (!AuthorizedClient(client))
        !           534:        return(BadAccess);
        !           535:     unixFamily = UnixFamily(family);
        !           536:     if ((len = CheckFamily (DONT_CHECK, unixFamily)) < 0)
        !           537:     {
        !           538:        client->errorValue = family;
        !           539:         return(-len);
        !           540:     }
        !           541:     if (len != length)
        !           542:     {
        !           543:        client->errorValue = length;
        !           544:         return(BadValue);
        !           545:     }
        !           546:     for (prev = &validhosts;
        !           547:          (host = *prev) && (unixFamily != host->family ||
        !           548: #ifdef ISOCONN
        !           549:                            acmp (pAddr, &(host->addr), len));
        !           550: #else /* ISOCONN */
        !           551:                            acmp (pAddr, host->addr, len));
        !           552: #endif /* ISOCONN */
        !           553:          prev = &host->next)
        !           554:         ;
        !           555:     if (host)
        !           556:     {
        !           557:         *prev = host->next;
        !           558:         xfree (host);
        !           559:     }
        !           560:     return (Success);
        !           561: }
        !           562: 
        !           563: /* Get all hosts in the access control list */
        !           564: int
        !           565: GetHosts (data, pnHosts, pEnabled)
        !           566:     pointer            *data;
        !           567:     int                        *pnHosts;
        !           568:     BOOL               *pEnabled;
        !           569: {
        !           570:     int                        len;
        !           571:     register int       n = 0;
        !           572:     register pointer   ptr;
        !           573:     register HOST      *host;
        !           574:     int                        nHosts = 0;
        !           575:     int                        *lengths = (int *) NULL;
        !           576: 
        !           577:     *pEnabled = AccessEnabled ? EnableAccess : DisableAccess;
        !           578:     for (host = validhosts; host; host = host->next)
        !           579:     {
        !           580:         if ((len = CheckFamily (DONT_CHECK, host->family)) < 0)
        !           581:             return (-1);
        !           582:        lengths = (int *) xrealloc(lengths, (nHosts + 1) * sizeof(int));
        !           583:        lengths[nHosts++] = len;
        !           584:        n += (((len + 3) >> 2) << 2) + sizeof(xHostEntry);
        !           585:     }
        !           586:     if (n)
        !           587:     {
        !           588:         *data = ptr = (pointer) xalloc (n);
        !           589:        nHosts = 0;
        !           590:         for (host = validhosts; host; host = host->next)
        !           591:        {
        !           592: #ifdef ISOCONN
        !           593: #ifdef ISODEBUG
        !           594:        if (isodexbug) 
        !           595:        {
        !           596:                int i; char *hp = (char *)(&host->addr);
        !           597:                fprintf(stderr, "List(%d): ", host->family);
        !           598:                for(i=0; i<len; i++)
        !           599:                        fprintf(stderr, "%x ", (*hp++)&0xff);
        !           600:                fprintf(stderr, "\n");
        !           601:        }
        !           602: #endif ISODEBUG
        !           603: #endif /* ISOCONN */
        !           604: 
        !           605:            len = lengths[nHosts++];
        !           606:            ((xHostEntry *)ptr)->family = XFamily(host->family);
        !           607:            ((xHostEntry *)ptr)->length = len;
        !           608:            ptr += sizeof(xHostEntry);
        !           609: #ifdef ISOCONN
        !           610:            acopy (&host->addr, ptr, len);
        !           611: #else /* ISOCONN */
        !           612:            acopy (host->addr, ptr, len);
        !           613: #endif /* ISOCONN */
        !           614:            ptr += ((len + 3) >> 2) << 2;
        !           615:         }
        !           616:     }
        !           617:     *pnHosts = nHosts;
        !           618:     xfree(lengths);
        !           619:     return (n);
        !           620: }
        !           621: 
        !           622: /* Check for valid address family, and for local host if client modification.
        !           623:  * Return address length.
        !           624:  */
        !           625: 
        !           626: CheckFamily (connection, family)
        !           627:     int                        connection;
        !           628:     int                        family;
        !           629: {
        !           630: #ifdef ISOCONN
        !           631:     struct TSAPaddr    from;
        !           632: #else /* ISOCONN */
        !           633:     struct sockaddr    from;
        !           634: #endif /* ISOCONN */
        !           635:     int                        alen;
        !           636:     pointer            addr;
        !           637:     register HOST      *host;
        !           638:     int                len;
        !           639: 
        !           640:     switch (family)
        !           641:     {
        !           642: #ifdef TCPCONN
        !           643:       case AF_INET:
        !           644:         len = sizeof (struct in_addr);
        !           645:         break;
        !           646: #endif 
        !           647: #ifdef DNETCONN
        !           648:       case AF_DECnet:
        !           649:         len = sizeof (struct dn_naddr);
        !           650:         break;
        !           651: #endif
        !           652: #ifdef ISOCONN
        !           653:       case AF_OSI:
        !           654:         len = NASIZE;
        !           655:        break;
        !           656: #endif /* ISOCONN */
        !           657:       default:
        !           658:         return (-BadValue);
        !           659:     }
        !           660:     if (connection == DONT_CHECK)
        !           661:         return (len);
        !           662: #ifdef ISOCONN
        !           663:     alen = NASIZE;
        !           664:     if (!SGetPeerName(connection, &from, &alen))
        !           665: #else /* ISOCONN */
        !           666:     alen = sizeof (from);
        !           667:     if (!getpeername (connection, &from, &alen))
        !           668: #endif /* ISOCONN */
        !           669:     {
        !           670:         if ((family = ConvertAddr (&from, &alen, &addr)) >= 0)
        !           671:        {
        !           672:            if (family == 0)
        !           673:                return (len);
        !           674:            for (host = selfhosts; host; host = host->next)
        !           675:            {
        !           676:                if (family == host->family &&
        !           677: #ifdef ISOCONN
        !           678:                    !acmp (addr, &(host->addr), alen))
        !           679: #else /* ISOCONN */
        !           680:                    !acmp (addr, host->addr, alen))
        !           681: #endif /* ISOCONN */
        !           682:                    return (len);
        !           683:            }
        !           684:        }
        !           685:     }
        !           686:     /* Bad Access */
        !           687:     return (-1);
        !           688: }
        !           689: 
        !           690: /* Check if a host is not in the access control list. 
        !           691:  * Returns 1 if host is invalid, 0 if we've found it. */
        !           692: 
        !           693: InvalidHost (saddr, len)
        !           694: #ifdef ISOCONN
        !           695:     register struct TSAPaddr   *saddr;
        !           696: #else /* ISOCONN */
        !           697:     register struct sockaddr   *saddr;
        !           698: #endif /* ISOCONN */
        !           699:     int                                len;
        !           700: {
        !           701:     int                        family;
        !           702:     pointer                    addr;
        !           703:     register HOST              *host;
        !           704: #ifdef ISOCONN
        !           705:     len = NASIZE;
        !           706: #endif /* ISOCONN */
        !           707: 
        !           708:     if ((family = ConvertAddr (saddr, len ? &len : 0, &addr)) < 0)
        !           709:         return (1);
        !           710: #ifdef ISOCONN
        !           711: #ifdef ISODEBUG
        !           712:        if (isodexbug) {
        !           713:                int i; char *hp = (char *)(addr);
        !           714:                fprintf(stderr, "Other(%d): ", family);
        !           715:                for(i=0; i<len; i++)
        !           716:                        fprintf(stderr, "%x ", (*hp++)&0xff);
        !           717:                fprintf(stderr, "\n");
        !           718:        }
        !           719: #endif /* ISODEBUG */
        !           720: #endif /* ISOCONN */
        !           721:     if (family == 0)
        !           722:         return (0);
        !           723: 
        !           724: #ifdef ISOCONN
        !           725: /*
        !           726:  * XXXXXXXXXXXXXXXXX
        !           727:  * Just til I fix the X.25 calling addr stuff
        !           728:  */
        !           729: return 0;
        !           730: #endif
        !           731: 
        !           732:     if (!AccessEnabled)   /* just let them in */
        !           733:         return(0);    
        !           734:     for (host = validhosts; host; host = host->next)
        !           735:     {
        !           736: #ifdef ISOCONN
        !           737: #ifdef ISODEBUG
        !           738:        if (isodexbug) {
        !           739:                int i; char *hp = (char *)&(host->addr);
        !           740:                fprintf(stderr, "List(%d): ", host->family);
        !           741:                for(i=0; i<host->len; i++)
        !           742:                        fprintf(stderr, "%x ", (*hp++)&0xff);
        !           743:                fprintf(stderr, "\n");
        !           744:        }
        !           745: #endif /* ISODEBUG */
        !           746:         if (family == host->family && !acmp (addr, &(host->addr), len))
        !           747: #else /* ISOCONN */
        !           748:         if (family == host->family && !acmp (addr, host->addr, len))
        !           749: #endif /* ISOCONN */
        !           750:            return (0);
        !           751:     }
        !           752:     return (1);
        !           753: }
        !           754: 
        !           755: ConvertAddr (saddr, len, addr)
        !           756: #ifdef ISOCONN
        !           757:     register struct TSAPaddr *saddr;
        !           758: #else /* ISOCONN */
        !           759:     register struct sockaddr   *saddr;
        !           760: #endif /* ISOCONN */
        !           761:     int                                *len;
        !           762:     pointer                    *addr;
        !           763: {
        !           764:     if (len == 0)
        !           765:         return (0);
        !           766: #ifdef ISOCONN
        !           767: /*
        !           768:  * NULL ish type acttion, but maybe later we'd change this to
        !           769:  * use AEIs as the thing for access ctl, and need to get from
        !           770:  * transport descriptor to T-SAPs to AEI...
        !           771:  */
        !           772:     *len = NASIZE;
        !           773:     *addr = (pointer)saddr;
        !           774:     return (AF_OSI);
        !           775: 
        !           776: #else /* ISOCONN */
        !           777:     switch (saddr->sa_family)
        !           778:     {
        !           779:       case AF_UNSPEC:
        !           780: #ifndef hpux
        !           781:       case AF_UNIX:
        !           782: #endif
        !           783:         return (0);
        !           784:       case AF_INET:
        !           785: #ifdef TCPCONN
        !           786:         *len = sizeof (struct in_addr);
        !           787:         *addr = (pointer) &(((struct sockaddr_in *) saddr)->sin_addr);
        !           788:         return (AF_INET);
        !           789: #else
        !           790:        break;
        !           791: #endif
        !           792: 
        !           793: #ifdef DNETCONN
        !           794:       case AF_DECnet:
        !           795:         *len = sizeof (struct dn_naddr);
        !           796:         *addr = (pointer) &(((struct sockaddr_dn *) saddr)->sdn_add);
        !           797:         return (AF_DECnet);
        !           798: #else
        !           799:        break;
        !           800: #endif
        !           801:       default:
        !           802:         break;
        !           803:     }
        !           804:     return (-1);
        !           805: #endif /* ISOCONN */
        !           806: }
        !           807: 
        !           808: int
        !           809: ChangeAccessControl(client, fEnabled)
        !           810:     ClientPtr client;
        !           811:     int fEnabled;
        !           812: {
        !           813:     if (!AuthorizedClient(client))
        !           814:        return BadAccess;
        !           815:     AccessEnabled = fEnabled;
        !           816:     return Success;
        !           817: }
        !           818: 
        !           819: static int XFamily(af)
        !           820:     int af;
        !           821: {
        !           822:     int i;
        !           823:     for (i = 0; i < FAMILIES; i++)
        !           824:         if (familyMap[i].af == af)
        !           825:             return familyMap[i].xf;
        !           826:     return -1;
        !           827: }
        !           828: 
        !           829: static int UnixFamily(xf)
        !           830:     int xf;
        !           831: {
        !           832:     int i;
        !           833:     for (i = 0; i < FAMILIES; i++)
        !           834:         if (familyMap[i].xf == xf)
        !           835:             return familyMap[i].af;
        !           836:     return -1;
        !           837: }
        !           838: 

unix.superglobalmegacorp.com

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