--- smaclient.old 2015-08-11 16:24:15.468078559 +0200
+++ smaclient 2015-08-11 16:29:54.163066653 +0200
@@ -9954,292 +9954,7 @@
# =============================================================================
function Build_SMIUCV_Helper
{
- # Define local variables
- local opath
-
- which gcc >/dev/null 2>&1
- if [ "${?}" -ne 0 ]
- then
- echo "Unable to build smiucv helper ... can't find gcc"
- exit 1
- fi
-
- opath=$(dirname "${0}")
- gcc -O3 -Wl,-s -o "${opath}/smiucv" -x c - <<END_OF_SMIUCV
-/*
-||=======================================================================
-|| smiucv - Helper utility that provides an IUCV interface to the z/VM
-|| System Management API (SMAPI).
-||
-|| This utility reads requests from stdin, sends them to the SMAPI server
-|| via IUCV and writes the response to stdout. It's intended for use by
-|| the smaclient shell command.
-||
-|| Usage:
-||
-|| smiucv [user] [name] <request >response
-||
-|| User and name are optional and will default to VSMREQIU and DMSRSRQU.
-||
-|| Written by Leland Lucius
-||=======================================================================
-*/
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <netinet/in.h>
-#include <netiucv/iucv.h>
-#include <sys/socket.h>
-
-/*
-|| Default remote IUCV user and name
-*/
-#define IUCV_USER "VSMREQIU"
-#define IUCV_NAME "DMSRSRQU"
-
-/*
-|| Read data from the SMAPI server and write it to stdout
-*/
-int
-readwrite( int fd, void *ptr, int len )
-{
- unsigned char *buffer = (unsigned char *) ptr;
- struct timeval timeout;
- fd_set readfds;
- int i;
- int rc;
-
- /*
- || Initialize timeout
- */
- timeout.tv_sec = 30;
- timeout.tv_usec = 0;
-
- /*
- || Large responses will arrive in chunks
- */
- for( i = 0; i < len; i += rc )
- {
- /*
- || Wait for timeout or data
- */
- FD_ZERO( &readfds);
- FD_SET( fd, &readfds );
- if( ( rc = select( fd + 1, &readfds, NULL, NULL, &timeout ) ) < 0 )
- {
- fprintf( stderr, "select() failed: %d - %s\n", errno, strerror( errno ) );
- return 1;
- }
- else if( rc == 0 )
- {
- fprintf( stderr, "Timeout waiting for response from remote\n" );
- return 1;
- }
-
- /*
- || Read it
- */
- if( ( rc = recv( fd, &buffer[i], len - i, 0 ) ) < 0 )
- {
- fprintf( stderr, "Error reading from socket: %d - %s\n", errno, strerror( errno ) );
- return 1;
- }
- else if( rc == 0 )
- {
- fprintf( stderr, "Connection closed by remote\n" );
- return 1;
- }
- }
-
- /*
- || Write to stdout
- */
- if( write( fileno( stdout ), buffer, len ) != len )
- {
- fprintf( stderr, "Error writing to stdout: %d - %s\n", errno, strerror( errno ) );
- return 1;
- }
-
- return 0;
-}
-
-int
-main( int argc, char *argv[] )
-{
- struct sockaddr_iucv siu;
- unsigned char *buffer = NULL;
- char *user;
- char *name;
- int used = 0;
- int bufsize = 0;
- int fd = -1;
- int rc = 0;
- int len;
- int reqid;
-
- /*
- || Initialize sockaddr
- */
- memset( &siu, 0, sizeof( siu ) );
- siu.siucv_family = AF_IUCV;
- memset( &siu.siucv_nodeid, ' ', 8 );
- memset( &siu.siucv_user_id, ' ', 8 );
- memset( &siu.siucv_name, ' ', 8 );
-
- /*
- || Set userid...default or first command line argument
- */
- user = IUCV_USER;
- if( argc > 1 && argv[ 1 ] )
- {
- user = argv[ 1 ];
- }
- len = strlen( user );
- memcpy( &siu.siucv_user_id, user, ( len > 8 ? 8 : len ) );
-
- /*
- || Set name...default or second command line argument
- */
- name = IUCV_NAME;
- if( argc > 2 && argv[ 2 ] )
- {
- name = argv[ 2 ];
- }
- len = strlen( name );
- memcpy( &siu.siucv_name, name, ( len > 8 ? 8 : len ) );
-
- /*
- || Allocate an IUCV socket
- */
- fd = socket( AF_IUCV, SOCK_STREAM, IPPROTO_IP );
- if( fd == -1 )
- {
- fprintf( stderr, "Unable to create socket: %d - %s", errno, strerror( errno ) );
- rc = 1;
- goto die;
- }
-
- /*
- || Bind it
- */
- rc = bind( fd, (struct sockaddr *) &siu, sizeof( siu ) );
- if( rc < 0 )
- {
- fprintf( stderr, "Unable to bind: %d - %s", errno, strerror( errno ) );
- rc = 1;
- goto die;
- }
-
- /*
- || Connect to partner
- */
- rc = connect( fd, (struct sockaddr *) &siu, sizeof( siu ) );
- if( rc == -1 )
- {
- fprintf( stderr, "Unable to connect: %d - %s", errno, strerror( errno ) );
- rc = 1;
- goto die;
- }
-
- /*
- || Read request into buffer
- */
- do
- {
- if( used == bufsize )
- {
- bufsize += 8192;
- buffer = realloc( buffer, bufsize );
- if( buffer == NULL )
- {
- fprintf( stderr, "Unable to alloc buffer: %d - %s\n", errno, strerror( errno ) );
- rc = 1;
- goto die;
- }
- }
- } while( read( fileno( stdin ), &buffer[ used++ ], 1 ) == 1 );
-
- /*
- || Send it to the server
- */
- if( write( fd, buffer, --used ) != used )
- {
- fprintf( stderr, "Error writing to socket: %d - %s\n", errno, strerror( errno ) );
- rc = 1;
- goto die;
- }
-
- /*
- || Get the first request ID
- */
- if( ( rc = readwrite( fd, &reqid, sizeof( reqid ) ) ) != 0 )
- {
- goto die;
- }
-
- /*
- || Get the response length
- */
- if( ( rc = readwrite( fd, &len, sizeof( len ) ) ) != 0 )
- {
- goto die;
- }
-
- /*
- || Free original buffer and allocate a new one
- */
- free( buffer );
- buffer = malloc( len );
- if( buffer == NULL )
- {
- fprintf( stderr, "Unable to alloc buffer: %d - %s\n", errno, strerror( errno ) );
- rc = 1;
- goto die;
- }
-
- /*
- || Get the response
- */
- if( ( rc = readwrite( fd, buffer, len ) ) != 0 )
- {
- goto die;
- }
-
-die:
-
- /*
- || Free the buffer
- */
- if( buffer )
- {
- free( buffer );
- }
-
- /*
- || Kill the socket
- */
- if( fd != -1 )
- {
- shutdown( fd, SHUT_RDWR );
- close( fd );
- }
-
- return rc;
-}
-END_OF_SMIUCV
-
- if [ "${?}" -ne 0 ]
- then
- echo "Failed to build smiucv..."
- exit 1
- fi
-
- echo "smiucv built as ${opath}/smiucv"
- echo
- echo "Make sure \"${opath}\" is included in PATH."
+ exit 0
}
# =============================================================================