From 22aec6f1407965a7b5243ce79b2822ef65e0fb64 Mon Sep 17 00:00:00 2001 From: Bill Sommerfeld Date: Tue, 30 Jan 1990 00:51:42 +0000 Subject: [PATCH] First version git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@193 dc483132-0cff-0310-8789-dd5450dbe970 --- src/lib/krb5/ccache/Imakefile | 13 +++ src/lib/krb5/ccache/ccdefault.c | 30 +++++ src/lib/krb5/os/ccdefname.c | 38 +++++++ src/lib/krb5/os/localaddr.c | 191 ++++++++++++++++++++++++++++++++ 4 files changed, 272 insertions(+) create mode 100644 src/lib/krb5/ccache/Imakefile create mode 100644 src/lib/krb5/ccache/ccdefault.c create mode 100644 src/lib/krb5/os/ccdefname.c create mode 100644 src/lib/krb5/os/localaddr.c diff --git a/src/lib/krb5/ccache/Imakefile b/src/lib/krb5/ccache/Imakefile new file mode 100644 index 000000000..b5925611a --- /dev/null +++ b/src/lib/krb5/ccache/Imakefile @@ -0,0 +1,13 @@ +#define IHaveSubdirs +#define PassCDebugFlags + + SUBDIRS = file + +MakeSubdirs($(SUBDIRS)) + +NormalLibraryObjectRule() + +OBJS= default.o \ + destroy.o + +NormalLibraryTarget(cred,$(OBJS)) diff --git a/src/lib/krb5/ccache/ccdefault.c b/src/lib/krb5/ccache/ccdefault.c new file mode 100644 index 000000000..365086bef --- /dev/null +++ b/src/lib/krb5/ccache/ccdefault.c @@ -0,0 +1,30 @@ +/* + * $Source$ + * $Author$ + * + * Copyright 1990 by the Massachusetts Institute of Technology. + * + * For copying and distribution information, please see the file + * . + * + * Find default credential cache + */ + +#if !defined(lint) && !defined(SABER) +static char rcsid_default_c[] = +"$Id$"; +#endif /* !lint & !SABER */ + +#include +#include +#include + +static krb5_ccache default_ccache; + +krb5_ccache krb5_cc_default() +{ + if (default_ccache == 0) + assert(krb5_cc_resolve (krb5_cc_default_name(), &default_ccache) == 0); /* XXX error handling? */ + + return default_ccache; +} diff --git a/src/lib/krb5/os/ccdefname.c b/src/lib/krb5/os/ccdefname.c new file mode 100644 index 000000000..53719bff3 --- /dev/null +++ b/src/lib/krb5/os/ccdefname.c @@ -0,0 +1,38 @@ +/* + * $Source$ + * $Author$ + * + * Copyright 1990 by the Massachusetts Institute of Technology. + * + * For copying and distribution information, please see the file + * . + * + * Return default cred. cache name. + */ + +#if !defined(lint) && !defined(SABER) +static char rcsid_defname_c[] = +"$Id$"; +#endif /* !lint & !SABER */ + +#include +#include + +#include +#include + +char *krb5_cc_default_name() +{ + char *name = getenv ("KRB5CCNAME"); + static char *name_buf; + + if (name == 0) { + if (name_buf == 0) + name_buf = malloc (30); + + sprintf(name_buf, "/tmp/krb5cc_%d", getuid()); + name = name_buf; + } + return name; +} + diff --git a/src/lib/krb5/os/localaddr.c b/src/lib/krb5/os/localaddr.c new file mode 100644 index 000000000..1b1acbf45 --- /dev/null +++ b/src/lib/krb5/os/localaddr.c @@ -0,0 +1,191 @@ +/* + * $Source$ + * $Author$ + * + * Copyright 1990 by the Massachusetts Institute of Technology. + * + * For copying and distribution information, please see the file + * . + * + * Return the protocol addresses supported by this host. + * + * XNS support is untested, but "Should just work". + */ + +#if !defined(lint) && !defined(SABER) +static char rcsid_getaddr_c[] = +"$Id$"; +#endif /* !lint & !SABER */ + +#include +#include +#include + +#include +#include +#include +#include +#include + +/* + * The SIOCGIF* ioctls require a socket. + * It doesn't matter *what* kind of socket they use, but it has to be + * a socket. + * + * Of course, you can't just ask the kernel for a socket of arbitrary + * type; you have to ask for one with a valid type. + * + */ +#ifdef KRB5_USE_INET + +#include + +#ifndef USE_AF +#define USE_AF AF_INET +#define USE_TYPE SOCK_DGRAM +#define USE_PROTO 0 +#endif + +#endif + +#ifdef KRB5_USE_NS + +#include + +#ifndef USE_AF +#define USE_AF AF_NS +#define USE_TYPE SOCK_DGRAM +#define USE_PROTO 0 /* guess */ +#endif + +#endif +/* + * Add more address families here. + */ + +extern int errno; + +/* + * Return all the protocol addresses of this host. + * + * We could kludge up something to return all addresses, assuming that + * they're valid kerberos protocol addresses, but we wouldn't know the + * real size of the sockaddr or know which part of it was actually the + * host part. + * + * This uses the SIOCGIFCONF, SIOCGIFFLAGS, and SIOCGIFADDR ioctl's. + */ + +int krb5_os_localaddr(addr) + krb5_address ***addr; +{ + struct ifreq *ifr; + struct ifconf ifc; + int s, code, n, i; + char buf[1024]; + krb5_address *addr_temp [ 1024/sizeof(struct ifreq) ]; + int n_found; + int mem_err = 0; + + ifc.ifc_len = sizeof(buf); + ifc.ifc_buf = buf; + + s = socket (USE_AF, USE_TYPE, USE_PROTO); + if (s < 0) + return errno; + + code = ioctl (s, SIOCGIFCONF, (char *)&ifc); + if (code < 0) { + close(s); + return errno; + } + n = ifc.ifc_len / sizeof (struct ifreq); + + for (n_found=0, i=0; iifr_flags & IFF_LOOPBACK) + continue; +#endif + + if (!(ifr->ifr_flags & IFF_UP)) + /* interface is down; skip */ + continue; + + if (ioctl (s, SIOCGIFADDR, (char *)ifr) < 0) + /* can't get address */ + continue; + + /* ifr->ifr_addr has what we want! */ + switch (ifr->ifr_addr.sa_family) { +#ifdef KRB5_USE_INET + case AF_INET: + { + struct sockaddr_in *in = + (struct sockaddr_in *)&ifr->ifr_addr; + + address = (krb5_address *) + malloc (sizeof(krb5_address) + sizeof(struct in_addr)); + if (address) { + address->addrtype = ADDRTYPE_INET; + address->length = sizeof(struct in_addr); + memcpy ((char *)address->contents, (char *)&in->sin_addr, + address->length); + break; + } else mem_err++; + } +#endif +#ifdef KRB5_USE_NS + case AF_XNS: + { + struct sockaddr_ns *ns = + (struct sockaddr_ns *)&ifr->ifr_addr; + address = (krb5_address *) + malloc (sizeof (krb5_address) + sizeof (struct ns_addr)); + if (address) { + address->addrtype = ADDRTYPE_XNS; + + /* XXX should we perhaps use ns_host instead? */ + + address->length = sizeof(struct ns_addr); + memcpy ((char *)address->contents, (char *)&ns->sns_addr, + address->length); + } else mem_err++; + break; + } +#endif + /* + * Add more address families here.. + */ + default: + continue; + } + if (address) + addr_temp[n_found++] = address; + address = 0; + } + close(s); + + *addr = (krb5_address **)malloc (sizeof (krb5_address *) * (n_found+1)); + if (*addr == 0) + mem_err++; + + if (mem_err) { + for (i=0; i