components/open-fabrics/rds-tools/rds-vendor.c
changeset 715 eed3ed08f692
equal deleted inserted replaced
714:b205ca9f0d84 715:eed3ed08f692
       
     1 /*
       
     2  * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
       
     3  *
       
     4  * This software is available to you under a choice of one of two
       
     5  * licenses.  You may choose to be licensed under the terms of the GNU
       
     6  * General Public License (GPL) Version 2, available from the file
       
     7  * COPYING in the main directory of this source tree, or the
       
     8  * OpenIB.org BSD license below:
       
     9  *
       
    10  *     Redistribution and use in source and binary forms, with or
       
    11  *     without modification, are permitted provided that the following
       
    12  *     conditions are met:
       
    13  *
       
    14  *      - Redistributions of source code must retain the above
       
    15  *        copyright notice, this list of conditions and the following
       
    16  *        disclaimer.
       
    17  *
       
    18  *      - Redistributions in binary form must reproduce the above
       
    19  *        copyright notice, this list of conditions and the following
       
    20  *        disclaimer in the documentation and/or other materials
       
    21  *        provided with the distribution.
       
    22  *
       
    23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
       
    24  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
       
    25  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
       
    26  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
       
    27  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
       
    28  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
       
    29  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
       
    30  * SOFTWARE.
       
    31  */
       
    32 /*
       
    33  * OFED Solaris ioctl wrapper
       
    34  */
       
    35 #if defined(__SVR4) && defined(__sun)
       
    36 
       
    37 #include <stdio.h>
       
    38 #include <string.h>
       
    39 #include <stdlib.h>
       
    40 #include <errno.h>
       
    41 #include <strings.h>
       
    42 #include <unistd.h>
       
    43 #include <stropts.h>
       
    44 #include <sys/rds.h>
       
    45 
       
    46 int
       
    47 sol_ioctl(int fd, int opt_val, struct rds_info_arg *argp, socklen_t *ulen,
       
    48     int *item_size)
       
    49 {
       
    50 	int len;
       
    51 	struct rds_info_arg arg = *argp;
       
    52 
       
    53 	/* 1st call gets the length of the data available */
       
    54 	*ulen = 0;
       
    55 	bzero(&arg, sizeof (struct rds_info_arg));
       
    56 	arg.lenp = (uint64_t)(uintptr_t)ulen;
       
    57 	arg.datap = NULL;
       
    58 	*item_size = ioctl(fd, opt_val, &arg);
       
    59 	argp->lenp = arg.lenp;
       
    60 	argp->datap = arg.datap;
       
    61 	if ((*item_size < 0) && (errno != ENOSPC))
       
    62 		return (1);
       
    63 
       
    64 	do {
       
    65 		if (*ulen == 0)
       
    66 			return (0);
       
    67 		if (arg.datap)
       
    68 			arg.datap = (uint64_t)(uintptr_t)realloc(
       
    69 			    (char *)(uintptr_t)arg.datap, *ulen);
       
    70 		else
       
    71 			arg.datap = (uint64_t)(uintptr_t)malloc(*ulen);
       
    72 
       
    73 		if (arg.datap == NULL)
       
    74 			return (2);
       
    75 
       
    76 		/* 2nd call gets the data */
       
    77 		len = *ulen;
       
    78 		*item_size = ioctl(fd, opt_val, &arg);
       
    79 		argp->lenp = arg.lenp;
       
    80 		argp->datap = arg.datap;
       
    81 		if ((*item_size < 0) && (errno != ENOSPC)) {
       
    82 			return (3);
       
    83 		}
       
    84 	} while (*ulen > len);
       
    85 	return (0);
       
    86 }
       
    87 #endif