summaryrefslogtreecommitdiff
path: root/libvxi11client
diff options
context:
space:
mode:
authordaniel <danieruru@gmail.com>2013-01-10 14:59:36 +0900
committerdaniel <danieruru@gmail.com>2013-01-10 14:59:36 +0900
commit7f6453d0778108eed02ea0ff7a87fea3a4b6b34d (patch)
treeb736c8ec5db2d336fddef752658f737c32002895 /libvxi11client
parent1b91b096d164b5524a45b2585269109fd000fd40 (diff)
add support for the abort channel on the client side
Diffstat (limited to 'libvxi11client')
-rw-r--r--libvxi11client/Makefile2
-rw-r--r--libvxi11client/libvxi11client.c37
2 files changed, 37 insertions, 2 deletions
diff --git a/libvxi11client/Makefile b/libvxi11client/Makefile
index 94c22fc..560fb7a 100644
--- a/libvxi11client/Makefile
+++ b/libvxi11client/Makefile
@@ -1,4 +1,4 @@
-CFLAGS = -Wall
+CFLAGS = -Wall -std=gnu99
all: client
diff --git a/libvxi11client/libvxi11client.c b/libvxi11client/libvxi11client.c
index 6234c0f..e814fdf 100644
--- a/libvxi11client/libvxi11client.c
+++ b/libvxi11client/libvxi11client.c
@@ -1,6 +1,15 @@
#include <stdbool.h>
+#include <rpc/rpc.h>
+#include <netinet/in.h>
#include "vxi11.h"
+#define DEBUG
+
+#ifdef DEBUG
+#include <stdio.h>
+#include <arpa/inet.h>
+#endif
+
/**
* This is a thin wrapper around the rpcgen generated code to give it a simpler interface.
* Only one server with a single link is supported.
@@ -13,6 +22,7 @@
#define VXI11_DEFAULT_TIMEOUT 1000
static CLIENT* clnt = NULL;
+static CLIENT* abortclnt = NULL;
static Device_Link link;
static Device_Flags vxi11_generateflags(bool waitlock, bool end, bool termchrset) {
@@ -33,6 +43,7 @@ static Device_Flags vxi11_generateflags(bool waitlock, bool end, bool termchrset
int vxi11_open(char* address, char* device) {
clnt = clnt_create(address, DEVICE_CORE, DEVICE_CORE_VERSION, "tcp");
+
if (clnt == NULL)
return 0;
@@ -46,6 +57,30 @@ int vxi11_open(char* address, char* device) {
Create_LinkResp* linkresp = create_link_1(&link_parms, clnt);
if (linkresp != NULL && linkresp->error == 0) {
link = linkresp->lid;
+
+#ifdef DEBUG
+ printf("Link created, abort channel port %d\n", linkresp->abortPort);
+#endif
+
+ struct sockaddr_in serveraddr;
+ if (clnt_control(clnt, CLGET_SERVER_ADDR, (char*) &serveraddr)) {
+
+#ifdef DEBUG
+ char addressstring[INET_ADDRSTRLEN];
+ *inet_ntop(AF_INET, &serveraddr.sin_addr, addressstring, sizeof(addressstring));
+ printf("Remote is %s\n", addressstring);
+#endif
+
+ int sock = RPC_ANYSOCK;
+ abortclnt = clnttcp_create(&serveraddr, DEVICE_ASYNC, DEVICE_ASYNC_VERSION, &sock, 0, 0);
+ if (abortclnt == NULL)
+ return 0;
+
+ }
+ else
+ // failed!
+ return 0;
+
return 1;
}
else if (linkresp == NULL)
@@ -286,7 +321,7 @@ int vxi11_destroy_intr_chan() {
*/
int vxi11_abort() {
- if (clnt == NULL)
+ if (abortclnt == NULL)
return 0;
Device_Error* error = device_abort_1(&link, clnt);
if (error != NULL && error->error == 0)