1/*
2 * lib/krb5/os/full_ipadr.c
3 *
4 * Copyright 1991 by the Massachusetts Institute of Technology.
5 * All Rights Reserved.
6 *
7 * Export of this software from the United States of America may
8 *   require a specific license from the United States Government.
9 *   It is the responsibility of any person or organization contemplating
10 *   export to obtain such a license before exporting.
11 *
12 * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
13 * distribute this software and its documentation for any purpose and
14 * without fee is hereby granted, provided that the above copyright
15 * notice appear in all copies and that both that copyright notice and
16 * this permission notice appear in supporting documentation, and that
17 * the name of M.I.T. not be used in advertising or publicity pertaining
18 * to distribution of the software without specific, written prior
19 * permission.  Furthermore if you modify this software you must label
20 * your software as modified software and not distribute it in such a
21 * fashion that it might be confused with the original M.I.T. software.
22 * M.I.T. makes no representations about the suitability of
23 * this software for any purpose.  It is provided "as is" without express
24 * or implied warranty.
25 *
26 *
27 * Take an IP addr & port and generate a full IP address.
28 */
29
30#include "k5-int.h"
31
32#ifdef HAVE_NETINET_IN_H
33
34#include "os-proto.h"
35
36krb5_error_code
37krb5_make_full_ipaddr(krb5_context context, krb5_int32 adr,
38		      /*krb5_int16*/int port, krb5_address **outaddr)
39{
40    unsigned long smushaddr = (unsigned long) adr; /* already in net order */
41    unsigned short smushport = (unsigned short) port; /* ditto */
42    register krb5_address *retaddr;
43    register krb5_octet *marshal;
44    krb5_addrtype temptype;
45    krb5_int32 templength;
46
47    if (!(retaddr = (krb5_address *)malloc(sizeof(*retaddr)))) {
48	return ENOMEM;
49    }
50    retaddr->magic = KV5M_ADDRESS;
51    retaddr->addrtype = ADDRTYPE_ADDRPORT;
52    retaddr->length = sizeof(smushaddr)+ sizeof(smushport) +
53	2*sizeof(temptype) + 2*sizeof(templength);
54
55    if (!(retaddr->contents = (krb5_octet *)malloc(retaddr->length))) {
56	krb5_xfree(retaddr);
57	return ENOMEM;
58    }
59    marshal = retaddr->contents;
60
61    temptype = htons(ADDRTYPE_INET);
62    (void) memcpy((char *)marshal, (char *)&temptype, sizeof(temptype));
63    marshal += sizeof(temptype);
64
65    templength = htonl(sizeof(smushaddr));
66    (void) memcpy((char *)marshal, (char *)&templength, sizeof(templength));
67    marshal += sizeof(templength);
68
69    (void) memcpy((char *)marshal, (char *)&smushaddr, sizeof(smushaddr));
70    marshal += sizeof(smushaddr);
71
72    temptype = htons(ADDRTYPE_IPPORT);
73    (void) memcpy((char *)marshal, (char *)&temptype, sizeof(temptype));
74    marshal += sizeof(temptype);
75
76    templength = htonl(sizeof(smushport));
77    (void) memcpy((char *)marshal, (char *)&templength, sizeof(templength));
78    marshal += sizeof(templength);
79
80    (void) memcpy((char *)marshal, (char *)&smushport, sizeof(smushport));
81    marshal += sizeof(smushport);
82
83    *outaddr = retaddr;
84    return 0;
85}
86#endif
87