kopia lustrzana https://github.com/Hamlib/Hamlib
getaddrinfo replacement
git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@2456 7ae35d74-ebe9-4afe-98af-79ac388436b8Hamlib-1.2.8
rodzic
c436bdcd46
commit
7c4dcfeb00
|
@ -2,7 +2,7 @@
|
||||||
* Hamlib Interface - network communication low-level support
|
* Hamlib Interface - network communication low-level support
|
||||||
* Copyright (c) 2000-2008 by Stephane Fillod
|
* Copyright (c) 2000-2008 by Stephane Fillod
|
||||||
*
|
*
|
||||||
* $Id: network.c,v 1.4 2008-10-31 07:51:46 fillods Exp $
|
* $Id: network.c,v 1.5 2008-11-02 12:42:45 fillods Exp $
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or modify
|
* This library is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Library General Public License as
|
* it under the terms of the GNU Library General Public License as
|
||||||
|
@ -30,8 +30,8 @@
|
||||||
* \file network.c
|
* \file network.c
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* needed for getaddrinfo, will not work with Win95/Win98 */
|
/* Forcing WINVER in MinGW yanks in getaddrinfo(), but locks out Win95/Win98 */
|
||||||
#define WINVER 0x0501
|
/* #define WINVER 0x0501 */
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
@ -52,7 +52,9 @@
|
||||||
|
|
||||||
#ifdef HAVE_NETINET_IN_H
|
#ifdef HAVE_NETINET_IN_H
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <netdb.h> /* TODO */
|
#endif
|
||||||
|
#if HAVE_NETDB_H
|
||||||
|
#include <netdb.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_ARPA_INET_H
|
#ifdef HAVE_ARPA_INET_H
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
@ -63,11 +65,75 @@
|
||||||
#include <ws2tcpip.h>
|
#include <ws2tcpip.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include "hamlib/rig.h"
|
#include "hamlib/rig.h"
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef HAVE_STRUCT_ADDRINFO
|
||||||
|
struct addrinfo {
|
||||||
|
int ai_family;
|
||||||
|
int ai_socktype;
|
||||||
|
int ai_protocol;
|
||||||
|
struct sockaddr *ai_addr;
|
||||||
|
socklen_t ai_addrlen;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Replacement for getaddrinfo. Only one addrinfo is returned.
|
||||||
|
* Weak checking.
|
||||||
|
*/
|
||||||
|
#ifndef HAVE_GETADDRINFO
|
||||||
|
static int getaddrinfo(const char *node, const char *service,
|
||||||
|
const struct addrinfo *hints, struct addrinfo **res)
|
||||||
|
{
|
||||||
|
struct addrinfo *p;
|
||||||
|
|
||||||
|
p = malloc(sizeof(struct addrinfo));
|
||||||
|
if (!p)
|
||||||
|
return ENOMEM;
|
||||||
|
/* limitation: this replacement function only for IPv4 */
|
||||||
|
if (hints && hints->ai_family != AF_INET)
|
||||||
|
return EINVAL;
|
||||||
|
memset(p, 0, sizeof(struct addrinfo));
|
||||||
|
p->ai_family = hints->ai_family;
|
||||||
|
p->ai_socktype = hints->ai_socktype;
|
||||||
|
p->ai_protocol = hints->ai_protocol;
|
||||||
|
p->ai_addrlen = sizeof(struct sockaddr_in);
|
||||||
|
p->ai_addr = malloc(p->ai_addrlen);
|
||||||
|
if (!p->ai_addr) {
|
||||||
|
free(p);
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
memset((char *) p->ai_addr, 0, p->ai_addrlen);
|
||||||
|
|
||||||
|
((struct sockaddr_in*)p->ai_addr)->sin_family = p->ai_family;
|
||||||
|
/* limitation: the service must be a port _number_ */
|
||||||
|
((struct sockaddr_in*)p->ai_addr)->sin_port = htons(atoi(service));
|
||||||
|
/* limitation: the node must be in numbers-and-dots notation */
|
||||||
|
((struct sockaddr_in*)p->ai_addr)->sin_addr.s_addr = inet_addr(node);
|
||||||
|
|
||||||
|
*res = p;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void freeaddrinfo(struct addrinfo *res)
|
||||||
|
{
|
||||||
|
free(res->ai_addr);
|
||||||
|
free(res);
|
||||||
|
}
|
||||||
|
#endif /* !HAVE_GETADDRINFO */
|
||||||
|
|
||||||
|
#if !defined(HAVE_GAI_STRERROR) && !defined(gai_strerror)
|
||||||
|
static const char *gai_strerror(int errcode)
|
||||||
|
{
|
||||||
|
return strerror(errcode);
|
||||||
|
}
|
||||||
|
#endif /* !HAVE_GAI_STRERROR */
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Open network port using rig.state data
|
* \brief Open network port using rig.state data
|
||||||
*
|
*
|
||||||
|
@ -79,7 +145,6 @@
|
||||||
*/
|
*/
|
||||||
int network_open(hamlib_port_t *rp, int default_port)
|
int network_open(hamlib_port_t *rp, int default_port)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_GETADDRINFO
|
|
||||||
int fd; /* File descriptor for the port */
|
int fd; /* File descriptor for the port */
|
||||||
int status;
|
int status;
|
||||||
struct addrinfo hints, *res;
|
struct addrinfo hints, *res;
|
||||||
|
@ -137,9 +202,6 @@ int network_open(hamlib_port_t *rp, int default_port)
|
||||||
rp->fd = fd;
|
rp->fd = fd;
|
||||||
|
|
||||||
return RIG_OK;
|
return RIG_OK;
|
||||||
#else
|
|
||||||
return -RIG_ENAVAIL;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
Ładowanie…
Reference in New Issue