- /* Set the socket information for bind() */
- memset(&server, 0, sizeof(server));
- server.sin_family = PF_INET;
- if (port)
- server.sin_port = htons(port);
-
- /* Convert IP address to network byte order */
- if (ip_addr)
- inet_aton(ip_addr, &server.sin_addr);
- else
- server.sin_addr.s_addr = INADDR_ANY;
-
- /* Bind the server socket */
- rval = bind(sock, (struct sockaddr *)&server, sizeof(server));
- if (rval < 0) {
- SILC_LOG_ERROR(("Cannot bind socket: %s", strerror(errno)));
- return -1;
+int silc_net_set_socket_opt(int sock, int level, int option, int on)
+{
+ return setsockopt(sock, level, option, (void *)&on, sizeof(on));
+}
+
+/* Get socket options */
+
+int silc_net_get_socket_opt(int sock, int level, int option,
+ void *optval, int *opt_len)
+{
+ return getsockopt(sock, level, option, optval, opt_len);
+}
+
+/* Checks whether IP address sent as argument is valid IPv4 address. */
+
+SilcBool silc_net_is_ip4(const char *addr)
+{
+ int count = 0;
+
+ while (*addr) {
+ if (*addr != '.' && !isdigit((int)*addr))
+ return FALSE;
+ if (*addr == '.')
+ count++;
+ addr++;