2 * Copyright (C) 2006 Andre Noll <maan@systemlinux.org>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
20 * based on client.c of dccp-cs-0.01.tar.bz2,
21 * (C) 2005 Ian McDonald <imcdnzl@gmail.com>
31 #include "dccp_recv.cmdline.h"
33 /* needed by getaddrinfo */
34 #include <sys/types.h>
35 #include <sys/socket.h>
39 #define DCCP_BUFSIZE 4096
42 * data specific to the dccp receiver
44 * \sa receiver receiver_node
46 struct private_dccp_recv_data
{
47 /** the file descriptor for the dccp socket */
52 static void dccp_recv_close(struct receiver_node
*rn
)
55 struct private_dccp_recv_data
*pdd
= rn
->private_data
;
57 if (pdd
&& pdd
->fd
> 0)
61 free(rn
->private_data
);
62 rn
->private_data
= NULL
;
66 static int dccp_recv_open(struct receiver_node
*rn
)
68 struct private_dccp_recv_data
*pdd
;
69 struct gengetopt_args_info
*conf
= rn
->conf
;
74 rn
->buf
= para_calloc(DCCP_BUFSIZE
);
75 rn
->private_data
= para_calloc(sizeof(struct private_dccp_recv_data
));
76 pdd
= rn
->private_data
;
77 ret
= dccp_get_socket();
82 tmp
= make_message("%d", conf
->port_arg
);
83 ret
= getaddrinfo(conf
->host_arg
, tmp
, NULL
, &ai
);
89 ret
= dccp_set_socket(pdd
->fd
);
92 PARA_NOTICE_LOG("connecting to %s:%d\n", conf
->host_arg
, conf
->port_arg
);
93 ret
= -E_DCCP_CONNECT
;
94 if (connect(pdd
->fd
, ai
->ai_addr
, ai
->ai_addrlen
) < 0)
102 static void dccp_shutdown(void)
104 ; /* nothing to do */
107 static void *dccp_recv_parse_config(int argc
, char **argv
)
109 struct gengetopt_args_info
*tmp
= para_calloc(sizeof(struct gengetopt_args_info
));
111 if (!dccp_recv_cmdline_parser(argc
, argv
, tmp
))
117 static int dccp_recv_pre_select(struct receiver_node
*rn
, fd_set
*rfds
,
118 __unused fd_set
*wfds
, __unused
struct timeval
*timeout
)
120 struct private_dccp_recv_data
*pdd
= rn
->private_data
;
124 FD_SET(pdd
->fd
, rfds
);
128 static int dccp_recv_post_select(struct receiver_node
*rn
, int select_ret
,
129 fd_set
*rfds
, __unused fd_set
*wfds
)
132 struct private_dccp_recv_data
*pdd
= rn
->private_data
;
134 if (!select_ret
|| !pdd
|| !FD_ISSET(pdd
->fd
, rfds
))
135 return 1; /* nothing to do */
136 if (rn
->loaded
>= DCCP_BUFSIZE
)
137 return -E_DCCP_OVERRUN
;
138 ret
= recv_bin_buffer(pdd
->fd
, rn
->buf
+ rn
->loaded
,
139 DCCP_BUFSIZE
- rn
->loaded
);
141 PARA_INFO_LOG("%s\n", ret
? PARA_STRERROR(-ret
) : "eof");
149 * the init function of the dccp receiver
151 * \param r pointer to the receiver struct to initialize
153 * Initialize all function pointers of \a r
155 void dccp_recv_init(struct receiver
*r
)
157 r
->shutdown
= dccp_shutdown
;
158 r
->open
= dccp_recv_open
;
159 r
->close
= dccp_recv_close
;
160 r
->pre_select
= dccp_recv_pre_select
;
161 r
->post_select
= dccp_recv_post_select
;
162 r
->parse_config
= dccp_recv_parse_config
;