a2533b6fe8506d7c88c7330a12854e75287938b4
Stefan Schuermans v1.0.0

Stefan Schuermans authored 13 years ago

1) /*
2)  * FlexiPix library
Stefan Schuermans v1.0.3

Stefan Schuermans authored 13 years ago

3)  * !version: 1.0.3! !date: 2010-09-12!
Stefan Schuermans v1.0.0

Stefan Schuermans authored 13 years ago

4)  *
5)  * Copyright 2010 Stefan Schuermans <stefan schuermans info>
6)  *
7)  * This program is free software: you can redistribute it and/or modify
8)  * it under the terms of the GNU General Public License as published by
9)  * the Free Software Foundation, version 3 of the License.
10)  *
11)  *
12)  * This program is distributed in the hope that it will be useful,
13)  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14)  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15)  * GNU General Public License for more details.
16)  *
17)  * You should have received a copy of the GNU Lesser General Public License
18)  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19)  */
20) 
21) #include <errno.h>
22) #include <stdlib.h>
23) #include <string.h>
24) 
25) #include <flexipix/display.h>
26) #include <flexipix/msg.h>
27) #include <flexipix/types.h>
28) #include <intern/config.h>
29) #include <intern/constants.h>
30) #include <intern/net.h>
31) #include <intern/types.h>
32) 
33) /**
34)  * \brief create a new FlexiPix display
35)  *
36)  * \param[in] sz_config_file name of config file to read
37)  * \param[in] p_msg_func message callback function or NULL
38)  * \param[in] p_msg_ctx user context for message callback
39)  * \return pointer to new FlexiPix display on success
40)  *         or NULL on error
41)  */
42) flp_display_t *flp_display_create(const char *sz_config_file,
43)                                   flp_msg_func_p_t p_msg_func,
44)                                   void *p_msg_ctx)
45) {
46)   flp_display_t *p_display;
47) 
48)   /* basic display setup */
49) 
50)   /* create display structure */
51)   p_display = (flp_display_t *)calloc(1, sizeof (flp_display_t));
52)   if (!p_display) {
53)     if (p_msg_func)
54)       p_msg_func(p_msg_ctx, flp_msg_type_err,
55)                  "out of memory\n");
56)     return NULL;
57)   }
58) 
59)   /* set default bind address */
60)   p_display->bind_addr.sin_family = AF_INET;
61)   p_display->bind_addr.sin_port = htons(FLP_BIND_PORT);
62)   p_display->bind_addr.sin_addr.s_addr = htonl(FLP_BIND_IP);
63) 
64)   /* no socket yet */
65)   p_display->sock = -1;
66) 
67)   /* config file */
68) 
69)   /* read config file */
70)   if(flp_config_proc_file(p_display, sz_config_file,
71)                           p_msg_func, p_msg_ctx)) {
72)     flp_display_free(p_display); /* cleanup everything that config file
73)                                     processing might heave created already */
74)     p_msg_func(p_msg_ctx, flp_msg_type_err, "reading config file failed\n");
75)     return NULL;
76)   }
77) 
78)   /* set up UDP socket */
79) 
80)   /* create socket */
81)   p_display->sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
82)   if (p_display->sock < 0) {
83)     flp_display_free(p_display);
Stefan Schuermans v1.0.2

Stefan Schuermans authored 13 years ago

84)     if (p_msg_func) {
85)       char errmsg[256];
86)       strerror_r(errno, errmsg, sizeof(errmsg));
Stefan Schuermans v1.0.0

Stefan Schuermans authored 13 years ago

87)       p_msg_func(p_msg_ctx, flp_msg_type_err,
Stefan Schuermans v1.0.2

Stefan Schuermans authored 13 years ago

88)                  "could not create UDP socket: %s\n", errmsg);
89)     }
Stefan Schuermans v1.0.0

Stefan Schuermans authored 13 years ago

90)     return NULL;
91)   }
92) 
93)   /* bind socket */
94)   if (bind(p_display->sock, (struct sockaddr *)&p_display->bind_addr,
95)            sizeof (p_display->bind_addr))) {
96)     flp_display_free(p_display);
Stefan Schuermans v1.0.2

Stefan Schuermans authored 13 years ago

97)     if (p_msg_func) {
98)       char errmsg[256];
99)       strerror_r(errno, errmsg, sizeof(errmsg));
Stefan Schuermans v1.0.0

Stefan Schuermans authored 13 years ago

100)       p_msg_func(p_msg_ctx, flp_msg_type_err,
101)                  "could not bind UDP socket to \"%s:%u\": %s\n",
102)                  inet_ntoa(p_display->bind_addr.sin_addr),
Stefan Schuermans v1.0.2

Stefan Schuermans authored 13 years ago

103)                  (unsigned int)ntohs(p_display->bind_addr.sin_port), errmsg);
104)     }