1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */ 2*758e9fbaSOystein Eftevaag /* 3*758e9fbaSOystein Eftevaag * Copyright (c) 2015 - 2018 Intel Corporation 4*758e9fbaSOystein Eftevaag * All rights reserved. 5*758e9fbaSOystein Eftevaag */ 6*758e9fbaSOystein Eftevaag #ifndef UTIL_IO_H 7*758e9fbaSOystein Eftevaag #define UTIL_IO_H 8*758e9fbaSOystein Eftevaag 9*758e9fbaSOystein Eftevaag #ifdef _WIN32 10*758e9fbaSOystein Eftevaag #include <basetsd.h> 11*758e9fbaSOystein Eftevaag #include <winsock2.h> 12*758e9fbaSOystein Eftevaag #include <ws2tcpip.h> 13*758e9fbaSOystein Eftevaag #ifdef _MSC_VER 14*758e9fbaSOystein Eftevaag typedef SSIZE_T ssize_t; 15*758e9fbaSOystein Eftevaag #endif 16*758e9fbaSOystein Eftevaag #define _HOST_NAME_MAX MAX_COMPUTERNAME_LENGTH 17*758e9fbaSOystein Eftevaag 18*758e9fbaSOystein Eftevaag #else 19*758e9fbaSOystein Eftevaag #include <arpa/inet.h> 20*758e9fbaSOystein Eftevaag #include <errno.h> 21*758e9fbaSOystein Eftevaag #include <sys/socket.h> 22*758e9fbaSOystein Eftevaag #include <sys/un.h> 23*758e9fbaSOystein Eftevaag #define _HOST_NAME_MAX _POSIX_HOST_NAME_MAX 24*758e9fbaSOystein Eftevaag #define SOCKET int 25*758e9fbaSOystein Eftevaag #define INVALID_SOCKET - 1 26*758e9fbaSOystein Eftevaag #define SOCKET_ERROR - 1 27*758e9fbaSOystein Eftevaag #endif 28*758e9fbaSOystein Eftevaag 29*758e9fbaSOystein Eftevaag #include "tss2_tpm2_types.h" 30*758e9fbaSOystein Eftevaag 31*758e9fbaSOystein Eftevaag #ifdef _WIN32 32*758e9fbaSOystein Eftevaag #define TEMP_RETRY(dest, exp) \ 33*758e9fbaSOystein Eftevaag { int __ret; \ 34*758e9fbaSOystein Eftevaag do { \ 35*758e9fbaSOystein Eftevaag __ret = exp; \ 36*758e9fbaSOystein Eftevaag } while (__ret == SOCKET_ERROR && WSAGetLastError() == WSAEINTR); \ 37*758e9fbaSOystein Eftevaag dest = __ret; } 38*758e9fbaSOystein Eftevaag #else 39*758e9fbaSOystein Eftevaag #define TEMP_RETRY(dest, exp) \ 40*758e9fbaSOystein Eftevaag { int __ret; \ 41*758e9fbaSOystein Eftevaag do { \ 42*758e9fbaSOystein Eftevaag __ret = exp; \ 43*758e9fbaSOystein Eftevaag } while (__ret == SOCKET_ERROR && errno == EINTR); \ 44*758e9fbaSOystein Eftevaag dest =__ret; } 45*758e9fbaSOystein Eftevaag #endif 46*758e9fbaSOystein Eftevaag 47*758e9fbaSOystein Eftevaag #ifdef __cplusplus 48*758e9fbaSOystein Eftevaag extern "C" { 49*758e9fbaSOystein Eftevaag #endif 50*758e9fbaSOystein Eftevaag 51*758e9fbaSOystein Eftevaag /* 52*758e9fbaSOystein Eftevaag * Read 'size' bytes from file descriptor 'fd' into buffer 'buf'. Additionally 53*758e9fbaSOystein Eftevaag * this function will retry calls to the 'read' function when temporary errors 54*758e9fbaSOystein Eftevaag * are detected. This is currently limited to interrupted system calls and 55*758e9fbaSOystein Eftevaag * short reads. 56*758e9fbaSOystein Eftevaag */ 57*758e9fbaSOystein Eftevaag ssize_t 58*758e9fbaSOystein Eftevaag read_all ( 59*758e9fbaSOystein Eftevaag SOCKET fd, 60*758e9fbaSOystein Eftevaag uint8_t *data, 61*758e9fbaSOystein Eftevaag size_t size); 62*758e9fbaSOystein Eftevaag /* 63*758e9fbaSOystein Eftevaag * Write 'size' bytes from 'buf' to file descriptor 'fd'. Additionally this 64*758e9fbaSOystein Eftevaag * function will retry calls to the 'write' function when recoverable errors 65*758e9fbaSOystein Eftevaag * are detected. This is currently limited to interrupted system calls and 66*758e9fbaSOystein Eftevaag * short writes. 67*758e9fbaSOystein Eftevaag */ 68*758e9fbaSOystein Eftevaag ssize_t 69*758e9fbaSOystein Eftevaag write_all ( 70*758e9fbaSOystein Eftevaag SOCKET fd, 71*758e9fbaSOystein Eftevaag const uint8_t *buf, 72*758e9fbaSOystein Eftevaag size_t size); 73*758e9fbaSOystein Eftevaag TSS2_RC 74*758e9fbaSOystein Eftevaag socket_connect ( 75*758e9fbaSOystein Eftevaag const char *hostname, 76*758e9fbaSOystein Eftevaag uint16_t port, 77*758e9fbaSOystein Eftevaag SOCKET *socket); 78*758e9fbaSOystein Eftevaag TSS2_RC 79*758e9fbaSOystein Eftevaag socket_close ( 80*758e9fbaSOystein Eftevaag SOCKET *socket); 81*758e9fbaSOystein Eftevaag ssize_t 82*758e9fbaSOystein Eftevaag socket_recv_buf ( 83*758e9fbaSOystein Eftevaag SOCKET sock, 84*758e9fbaSOystein Eftevaag uint8_t *data, 85*758e9fbaSOystein Eftevaag size_t size); 86*758e9fbaSOystein Eftevaag TSS2_RC 87*758e9fbaSOystein Eftevaag socket_xmit_buf ( 88*758e9fbaSOystein Eftevaag SOCKET sock, 89*758e9fbaSOystein Eftevaag const void *buf, 90*758e9fbaSOystein Eftevaag size_t size); 91*758e9fbaSOystein Eftevaag 92*758e9fbaSOystein Eftevaag #ifdef __cplusplus 93*758e9fbaSOystein Eftevaag } 94*758e9fbaSOystein Eftevaag #endif 95*758e9fbaSOystein Eftevaag #endif /* UTIL_IO_H */ 96