Annotation of 43BSDReno/contrib/isode-beta/others/X/server/access.c, revision 1.1.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.