--- /dev/null
+/*
+ * $Source$
+ * $Author$
+ *
+ * Copyright 1991 by the Massachusetts Institute of Technology.
+ * All Rights Reserved.
+ *
+ * For copying and distribution information, please see the file
+ * <krb5/copyright.h>.
+ *
+ * Take an IP addr & port and generate a full IP address.
+ */
+
+#if !defined(lint) && !defined(SABER)
+static char rcsid_full_ipadr_c[] =
+"$Id$";
+#endif /* !lint & !SABER */
+
+#include <krb5/krb5.h>
+#include <krb5/ext-proto.h>
+#include <krb5/libos-proto.h>
+#include <netinet/in.h>
+
+krb5_error_code
+krb5_make_full_ipaddr(DECLARG(krb5_int32, adr),
+ DECLARG(krb5_int16, port),
+ DECLARG(krb5_address **,outaddr))
+OLDDECLARG(krb5_int32, adr)
+OLDDECLARG(krb5_int16, port)
+OLDDECLARG(krb5_address **,outaddr)
+{
+ unsigned long smushaddr = (unsigned long) adr; /* already in net order */
+ unsigned short smushport = (unsigned short) port; /* ditto */
+ register krb5_address *retaddr;
+ register krb5_octet *marshal;
+ krb5_addrtype temptype;
+ krb5_int32 templength;
+
+ if (!(retaddr = (krb5_address *)malloc(sizeof(*retaddr)))) {
+ return ENOMEM;
+ }
+ retaddr->addrtype = ADDRTYPE_ADDRPORT;
+ retaddr->length = sizeof(smushaddr)+ sizeof(smushport) +
+ 2*sizeof(temptype) + 2*sizeof(templength);
+
+ if (!(retaddr->contents = (krb5_octet *)malloc(retaddr->length))) {
+ xfree(retaddr);
+ return ENOMEM;
+ }
+ marshal = retaddr->contents;
+
+ temptype = htons(ADDRTYPE_INET);
+ (void) memcpy((char *)marshal, (char *)&temptype, sizeof(temptype));
+ marshal += sizeof(temptype);
+
+ templength = htonl(sizeof(smushaddr));
+ (void) memcpy((char *)marshal, (char *)&templength, sizeof(templength));
+ marshal += sizeof(templength);
+
+ (void) memcpy((char *)marshal, (char *)&smushaddr, sizeof(smushaddr));
+ marshal += sizeof(smushaddr);
+
+ temptype = htons(ADDRTYPE_IPPORT);
+ (void) memcpy((char *)marshal, (char *)&temptype, sizeof(temptype));
+ marshal += sizeof(temptype);
+
+ templength = htonl(sizeof(smushport));
+ (void) memcpy((char *)marshal, (char *)&templength, sizeof(templength));
+ marshal += sizeof(templength);
+
+ (void) memcpy((char *)marshal, (char *)&smushport, sizeof(smushport));
+ marshal += sizeof(smushport);
+
+ *outaddr = retaddr;
+ return 0;
+}
--- /dev/null
+/*
+ * $Source$
+ * $Author$
+ *
+ * Copyright 1991 by the Massachusetts Institute of Technology.
+ * All Rights Reserved.
+ *
+ * For copying and distribution information, please see the file
+ * <krb5/copyright.h>.
+ *
+ * Take an ADDRPORT address and split into IP addr & port.
+ */
+
+#if !defined(lint) && !defined(SABER)
+static char rcsid_port2ip_c[] =
+"$Id$";
+#endif /* !lint & !SABER */
+
+#include <krb5/krb5.h>
+#include <krb5/ext-proto.h>
+#include <krb5/libos-proto.h>
+#include <netinet/in.h>
+
+krb5_error_code
+krb5_unpack_full_ipaddr(inaddr, adr, port)
+krb5_address *inaddr;
+krb5_int32 *adr;
+krb5_int16 *port;
+{
+ unsigned long smushaddr;
+ unsigned short smushport;
+ register krb5_octet *marshal;
+ krb5_addrtype temptype;
+ krb5_int32 templength;
+
+ if (inaddr->addrtype != ADDRTYPE_ADDRPORT)
+ return KRB5KRB_AP_ERR_BADADDR; /* XXX */
+
+ if (inaddr->length != sizeof(smushaddr)+ sizeof(smushport) +
+ 2*sizeof(temptype) + 2*sizeof(templength))
+ return KRB5KRB_AP_ERR_BADADDR; /* XXX */
+
+ marshal = inaddr->contents;
+
+ (void) memcpy((char *)&temptype, (char *)marshal, sizeof(temptype));
+ marshal += sizeof(temptype);
+ if (temptype != htons(ADDRTYPE_INET))
+ return KRB5KRB_AP_ERR_BADADDR; /* XXX */
+
+ (void) memcpy((char *)&templength, (char *)marshal, sizeof(templength));
+ marshal += sizeof(templength);
+ if (templength != htonl(sizeof(smushaddr)))
+ return KRB5KRB_AP_ERR_BADADDR; /* XXX */
+
+ (void) memcpy((char *)&smushaddr, (char *)marshal, sizeof(smushaddr));
+ /* leave in net order */
+ marshal += sizeof(smushaddr);
+
+ (void) memcpy((char *)&temptype, (char *)marshal, sizeof(temptype));
+ marshal += sizeof(temptype);
+ if (temptype != htons(ADDRTYPE_IPPORT))
+ return KRB5KRB_AP_ERR_BADADDR; /* XXX */
+
+ (void) memcpy((char *)&templength, (char *)marshal, sizeof(templength));
+ marshal += sizeof(templength);
+ if (templength != htonl(sizeof(smushport)))
+ return KRB5KRB_AP_ERR_BADADDR; /* XXX */
+
+ (void) memcpy((char *)&smushport, (char *)marshal, sizeof(smushport));
+ /* leave in net order */
+
+ *adr = (krb5_int32) smushaddr;
+ *port = (krb5_int16) smushport;
+ return 0;
+}