2 * Copyright (c) 2009-2012 Zmanda, Inc. All Rights Reserved.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 * Contact information: Zmanda Inc., 465 S. Mathilda Ave., Suite 300
19 * Sunnyvale, CA 94085, USA, or: http://www.zmanda.com
23 * SWIG typemaps for DirectTCP-related stuff.
26 %typemap(out) DirectTCPAddr * {
27 /* we assume this is an *array* of addresses, and return an arrayref or, if
28 * the result is NULL, undef. */
29 DirectTCPAddr *iter = $1;
35 while (iter && SU_GET_FAMILY(iter) != 0) {
36 char *addr = str_sockaddr_no_port(iter);
39 g_assert(NULL != av_store(tuple, 0, newSVpv(addr, 0)));
40 g_assert(NULL != av_store(tuple, 1, newSViv(SU_GET_PORT(iter))));
41 g_assert(NULL != av_store(av, i++, newRV_noinc((SV *)tuple)));
45 $result = newRV_noinc((SV *)av);
49 %typemap(in,numinputs=0) DirectTCPAddr **addrs
50 (DirectTCPAddr *addrs) {
54 %typemap(argout) DirectTCPAddr **addrs {
56 DirectTCPAddr *iter = *$1;
60 while (iter && SU_GET_FAMILY(iter) != 0) {
61 char *addr = str_sockaddr_no_port(iter);
64 g_assert(NULL != av_store(tuple, 0, newSVpv(addr, 0)));
65 g_assert(NULL != av_store(tuple, 1, newSViv(SU_GET_PORT(iter))));
66 g_assert(NULL != av_store(av, i++, newRV_noinc((SV *)tuple)));
70 $result = newRV_noinc((SV *)av);
75 %typemap(in) DirectTCPAddr *addrs {
79 if (!SvROK($input) || SvTYPE(SvRV($input)) != SVt_PVAV) {
80 SWIG_exception_fail(SWIG_TypeError, "must provide an arrayref of DirectTCPAddrs");
82 addrs_av = (AV *)SvRV($input);
83 num_addrs = av_len(addrs_av)+1;
85 $1 = g_new0(DirectTCPAddr, num_addrs+1);
87 for (i = 0; i < num_addrs; i++) {
88 SV **svp = av_fetch(addrs_av, i, 0);
93 if (!svp || !SvROK(*svp) || SvTYPE(SvRV(*svp)) != SVt_PVAV
94 || av_len((AV *)SvRV(*svp))+1 != 2) {
95 SWIG_exception_fail(SWIG_TypeError, "each DirectTCPAddr must be a 2-element arrayref");
98 addr_av = (AV *)SvRV(*svp);
101 svp = av_fetch(addr_av, 0, 0);
102 if (!svp || !SvPOK(*svp) || !str_to_sockaddr(SvPV_nolen(*svp), &addr)) {
103 SWIG_exception_fail(SWIG_TypeError, "invalid IPv4 addr in address");
107 svp = av_fetch(addr_av, 1, 0);
108 if (!svp || !SvIOK(*svp) || (port = SvIV(*svp)) <= 0 || port >= 65536) {
109 SWIG_exception_fail(SWIG_TypeError, "invalid port in address");
111 SU_SET_PORT(&addr, port);
113 copy_sockaddr($1, &addr);