/* mycur - send a message via port 5137 to ximtool and * fire up a graphics cursor. * * Tom Trebisky 7/12/2019 */ #include #include #include #include #include #include /* Returns a socket */ int ip_connect ( int ip, int port ) { struct sockaddr_in sockaddr; unsigned short portnumber = port; int s; if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0) { printf ( "Cannot allocate a socket\n" ); return -1; } bzero ((char *)(&sockaddr), sizeof(sockaddr)); sockaddr.sin_family = AF_INET; sockaddr.sin_port = htons (portnumber); sockaddr.sin_addr.s_addr= htonl (ip); if (connect (s, (struct sockaddr *)&sockaddr, sizeof (sockaddr)) < 0) { printf ( "Connect fails\n" ); return -1; } return s; } void ip_close ( int s ) { close ( s ); } int ip_read ( int s, char *buf, int nbytes ) { int n; int nxfer; for (n = 0; n < nbytes; n += nxfer) { if ((nxfer = read (s, buf+n, nbytes-n) ) <= 0) { return -1; } } return 0; } int ip_write ( int s, char *buf, int nbytes ) { int n; int nxfer; for (n = 0; n < nbytes; n += nxfer) { if ( (nxfer = write ( s, buf+n, nbytes-n ) ) < 0 ) { return -1; } } return 0; } int get_localhost_ip ( void ) { struct hostent *hp; uint32_t ipnumber; uint32_t ip; int alen; if ((hp = gethostbyname ( "localhost" )) == 0) return (0); alen = sizeof(ipnumber); if ( hp->h_length < alen ) alen = hp->h_length; bcopy ((char *)hp->h_addr, (char *)&ipnumber, alen ); ip = ntohl (ipnumber); return (ip); } #define IM_PORT 5137 // char msg1[] = { 0, 0x01, 0xfd, 0xff, 0x0c, 0, 0xf6, 0x7e, 0, 0x80, 0, 0, 0, 0, 0, 0 }; // char zeros[] = { 0, 0, 0, 0, 0, 0 }; char msg2[] = { 0, 0x80, 0x60, 0xff, 0x10, 0x80, 0x8e, 0, 0, 0, 0, 0, 0x01, 0, 0, 0 }; int get_cursor ( void ) { int ipa; int cur_socket; char buf[256]; int i; ipa = get_localhost_ip (); // printf ( "%08x\n", ipa ); cur_socket = ip_connect ( ipa, IM_PORT ); if ( cur_socket < 0 ) { printf ( "It doesn't look like ximtool is running\n" ); return 1; } /* ip_write ( cur_socket, msg1, 16 ); ip_write ( cur_socket, zeros, 6 ); */ ip_write ( cur_socket, msg2, 16 ); ip_read ( cur_socket, buf, 160 ); for ( i=0; i<160; i++ ) if ( buf[i] == '\n' ) break; if ( i == 160 ) { printf ( "Trouble !!\n" ); return 1; } printf ( "Newline at: %d\n", i); buf[i] = '\0'; printf ( "Result: %s\n", buf ); ip_close ( cur_socket ); return 0; } int main () { return get_cursor (); } /* The END */