[stgt] [PATCH 10/15] tgt: os.h: getnameinfo() is different on none-Linux systems
FUJITA Tomonori
fujita.tomonori at lab.ntt.co.jp
Mon Mar 2 10:07:07 CET 2009
On Sun, 1 Mar 2009 18:52:26 +0200
Boaz Harrosh <bharrosh at panasas.com> wrote:
> Systems other then Linux are more picky with the addr length
> passed to getnameinfo. They expect it to be set from the
> returned length of the call to getsockname. Use an
> os_getsockname_ss, that is implemented diffrently for BSD
> or Linux.
>
> Both getsockname and getnameinfo might fail check for
> errors.
>
> Also added a couple of dprints in error cases.
>
> Signed-off-by: Boaz Harrosh <bharrosh at panasas.com>
> ---
> usr/bsd/os.c | 9 +++++++++
> usr/iscsi/iscsid.c | 22 +++++++++++++++++-----
> usr/linux/os.c | 9 +++++++++
> usr/os.h | 4 ++++
> 4 files changed, 39 insertions(+), 5 deletions(-)
>
> diff --git a/usr/bsd/os.c b/usr/bsd/os.c
> index d2dfdab..12d2ec4 100644
> --- a/usr/bsd/os.c
> +++ b/usr/bsd/os.c
> @@ -53,3 +53,12 @@ int os_bind_ipc(int fd, struct sockaddr_un *addr, const char *ipc_name_space)
>
> return bind(fd, (struct sockaddr *)addr, addr->sun_len);
> }
> +
> +int os_getnameinfo_ss(struct sockaddr_storage *ss, char *host, size_t hostlen,
> + char *serv, size_t servlen, int flags)
> +{
> + size_t slen = ((struct sockaddr *)&ss)->sa_len;
> +
> + return getnameinfo((struct sockaddr *)ss, slen, host, hostlen,
> + serv, servlen, flags);
> +}
> diff --git a/usr/iscsi/iscsid.c b/usr/iscsi/iscsid.c
> index bfaec87..3d0a976 100644
> --- a/usr/iscsi/iscsid.c
> +++ b/usr/iscsi/iscsid.c
> @@ -39,6 +39,7 @@
> #include "driver.h"
> #include "scsi.h"
> #include "crc32c.h"
> +#include "os.h"
>
> #define MAX_QUEUE_CMD 128
>
> @@ -743,6 +744,7 @@ static void text_scan_text(struct iscsi_connection *conn)
> {
> char *key, *value, *data;
> int datasize;
> + int ret;
>
> data = conn->req.data;
> datasize = conn->req.datasize;
> @@ -760,22 +762,32 @@ static void text_scan_text(struct iscsi_connection *conn)
> blen = sizeof(buf);
>
> slen = sizeof(ss);
> - conn->tp->ep_getsockname(conn, (struct sockaddr *) &ss,
> - &slen);
> + ret = conn->tp->ep_getsockname(conn,
> + (struct sockaddr *) &ss, &slen);
> + if (ret)
> + eprintf("getsockname Faild=>%d\n", ret);
> +
> if (ss.ss_family == AF_INET6) {
> *p++ = '[';
> blen--;
> }
>
> - slen = sizeof(ss);
> - getnameinfo((struct sockaddr *) &ss, slen, p, blen,
> - NULL, 0, NI_NUMERICHOST);
> + ret = os_getnameinfo_ss(&ss, p, blen, NULL, 0,
> + NI_NUMERICHOST);
> + if (ret) {
> + eprintf("getnameinfo Faild=>%d: %s\n",
> + ret, gai_strerror(ret));
> + /* Let failure show in target traces */
> + strcpy(p, "getnameinfo_Faild");
Hmm, you put "getnameinfo_Faild" in a buffer that will be sent to an
initiator? If so, it's unacceptable. Just use eprintf.
> + }
>
> p = buf + strlen(buf);
>
> if (ss.ss_family == AF_INET6)
> *p++ = ']';
>
> + dprintf("getnameinfo => %s\n", buf);
> +
> sprintf(p, ":%d,1", ISCSI_LISTEN_PORT);
> target_list_build(conn, buf,
> strcmp(value, "All") ? value : NULL);
> diff --git a/usr/linux/os.c b/usr/linux/os.c
> index 5b50aff..3392637 100644
> --- a/usr/linux/os.c
> +++ b/usr/linux/os.c
> @@ -14,6 +14,7 @@
> #include <stdio.h>
> #include <string.h>
> #include <inttypes.h>
> +#include <netdb.h>
> #include <unistd.h>
> #include <fcntl.h>
> #include <sys/ioctl.h>
> @@ -105,3 +106,11 @@ int os_bind_ipc(int fd, struct sockaddr_un *addr, const char *ipc_name_space)
>
> return bind(fd, (struct sockaddr *)addr, sizeof(*addr));
> }
> +
> +
> +int os_getnameinfo_ss(struct sockaddr_storage *ss, char *host, size_t hostlen,
> + char *serv, size_t servlen, int flags)
> +{
> + return getnameinfo((struct sockaddr *)ss, sizeof(*ss), host, hostlen,
> + serv, servlen, flags);
> +}
> diff --git a/usr/os.h b/usr/os.h
> index 7c0c538..9908bb5 100644
> --- a/usr/os.h
> +++ b/usr/os.h
> @@ -18,4 +18,8 @@ int os_blockdev_size(int fd, uint64_t *size);
> struct sockaddr_un;
> int os_bind_ipc(int fd, struct sockaddr_un *addr, const char *ipc_name_space);
>
> +struct sockaddr_storage;
> +int os_getnameinfo_ss(struct sockaddr_storage *ss, char *host, size_t hostlen,
> + char *serv, size_t servlen, int flags);
> +
> #endif /* ndef __TGT_OS_H__*/
> --
> 1.6.0.6
>
> --
> To unsubscribe from this list: send the line "unsubscribe stgt" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
More information about the stgt
mailing list