1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /* lib/krb5/os/mk_faddr.c - Generate full address from IP addr and port */
3 /*
4  * Copyright 1995, 2009 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 #include "k5-int.h"
28 
29 #ifdef HAVE_NETINET_IN_H
30 
31 #include "os-proto.h"
32 #if !defined(_WINSOCKAPI_)
33 
34 #include <netinet/in.h>
35 #endif
36 
37 krb5_error_code
krb5_make_fulladdr(krb5_context context,krb5_address * kaddr,krb5_address * kport,krb5_address * raddr)38 krb5_make_fulladdr(krb5_context context, krb5_address *kaddr,
39                    krb5_address *kport, krb5_address *raddr)
40 {
41     krb5_octet *marshal;
42     krb5_int32 tmp32;
43     krb5_int16 tmp16;
44 
45     if (kaddr == NULL || kport == NULL)
46         return EINVAL;
47 
48     raddr->length = kaddr->length + kport->length + (4 * sizeof(krb5_int32));
49     if (!(raddr->contents = (krb5_octet *)malloc(raddr->length)))
50         return ENOMEM;
51 
52     raddr->addrtype = ADDRTYPE_ADDRPORT;
53     marshal = raddr->contents;
54 
55     tmp16 = kaddr->addrtype;
56     *marshal++ = 0x00;
57     *marshal++ = 0x00;
58     store_16_le(tmp16, marshal);
59     marshal += 2;
60 
61     tmp32 = kaddr->length;
62     store_32_le(tmp32, marshal);
63     marshal += 4;
64 
65     (void) memcpy(marshal, kaddr->contents, kaddr->length);
66     marshal += kaddr->length;
67 
68     tmp16 = kport->addrtype;
69     *marshal++ = 0x00;
70     *marshal++ = 0x00;
71     store_16_le(tmp16, marshal);
72     marshal += 2;
73 
74     tmp32 = kport->length;
75     store_32_le(tmp32, marshal);
76     marshal += 4;
77 
78     (void) memcpy(marshal, kport->contents, kport->length);
79     marshal += kport->length;
80     return 0;
81 }
82 #endif
83