summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libvxi11client/client.c45
-rw-r--r--libvxi11client/libvxi11client.c2
-rw-r--r--vxi11_server.c41
3 files changed, 68 insertions, 20 deletions
diff --git a/libvxi11client/client.c b/libvxi11client/client.c
index eb224f2..799df57 100644
--- a/libvxi11client/client.c
+++ b/libvxi11client/client.c
@@ -7,8 +7,14 @@ static char* geterrorstring(int errorcode) {
switch (errorcode) {
case 0:
return "invalid state (not connected) or no response from server";
+ case -4:
+ return "invalid link identifier";
case -8:
return "operation not supported";
+ case -11:
+ return "device locked by another link";
+ case -12:
+ return "no lock held by this link";
default:
return "unknown error code";
}
@@ -27,6 +33,10 @@ int main(int argc, char *argv[]) {
if ((err = vxi11_open(argv[1], NULL)) > 0) {
+ /**
+ * Basic tests
+ */
+
// write some bytes
int byteswritten = vxi11_write(IDENTIFY, sizeof(IDENTIFY), false);
if (byteswritten >= 0)
@@ -78,6 +88,41 @@ int main(int argc, char *argv[]) {
else
printf("Error reading status byte\n");
+ /**
+ * Locking tests
+ */
+
+ // try locking twice
+ printf("-- Locking twice --\n");
+ if ((err = vxi11_lock()) > 0) {
+ printf("locked\n");
+ if ((err = vxi11_lock()) > 0) {
+ printf("locked again!!\n");
+ exit(1);
+ }
+ else {
+ printf("Second lock failed; %s\n", geterrorstring(err));
+ }
+ }
+ if ((err = vxi11_unlock()) > 0)
+ printf("unlocked\n");
+ else {
+ printf("error unlocking; %s\n", geterrorstring(err));
+ exit(1);
+ }
+
+ printf("\n");
+
+ // try unlocking unlocked device
+ printf("-- Unlocking when unlocked --\n");
+ if ((err = vxi11_unlock()) > 0) {
+ printf("Unlocked!!\n");
+ exit(1);
+ }
+ else
+ printf("error unlocking; %s\n", geterrorstring(err));
+ printf("\n");
+
// create interrupt channel
err = vxi11_create_intr_chan();
diff --git a/libvxi11client/libvxi11client.c b/libvxi11client/libvxi11client.c
index ba7d7b4..4e3efd0 100644
--- a/libvxi11client/libvxi11client.c
+++ b/libvxi11client/libvxi11client.c
@@ -41,7 +41,7 @@ int vxi11_open(char* address, char* device) {
link_parms.clientId = (long) clnt;
link_parms.lockDevice = 0;
link_parms.lock_timeout = VXI11_DEFAULT_TIMEOUT;
- link_parms.device = device;
+ link_parms.device = device != NULL ? device : "device0";
Create_LinkResp* linkresp = create_link_1(&link_parms, clnt);
if (linkresp != NULL && linkresp->error == 0) {
diff --git a/vxi11_server.c b/vxi11_server.c
index 3272b32..950a31d 100644
--- a/vxi11_server.c
+++ b/vxi11_server.c
@@ -36,21 +36,12 @@ static void waitForLock(long timeout) {
}
-static bool lock(int lid) {
- if ((globals.VxiLocks.locked_network_server = NO_SERVER_LOCKED))
- return false;
+static void lock(int lid) {
globals.VxiLocks.locked_network_server = lid;
}
-static bool unlock(int lid) {
- if ((globals.VxiLocks.locked_network_server = NO_SERVER_LOCKED))
- return false;
- else if (globals.VxiLocks.locked_network_server != lid)
- return false;
- else {
- globals.VxiLocks.locked_network_server = NO_SERVER_LOCKED;
- return true;
- }
+static void unlock() {
+ globals.VxiLocks.locked_network_server = NO_SERVER_LOCKED;
}
Device_Error *
@@ -168,11 +159,20 @@ device_local_1_svc(Device_GenericParms *argp, struct svc_req *rqstp) {
Device_Error *
device_lock_1_svc(Device_LockParms *argp, struct svc_req *rqstp) {
- printf("device_lock_1_svc()\n");
-
static Device_Error result;
- result.error = 0;
+ printf("device_lock_1_svc()\n");
+ if (isLocked(argp->lid)) {
+ result.error = ERR_DEVICELOCKEDBYANOTHERLINK;
+ if (haveLock(argp->lid)) {
+ // maybe do something here to warn about a device trying to lock multiple times?
+ }
+ }
+ else {
+ lock(argp->lid);
+ result.error = 0;
+ }
+
return &result;
}
@@ -180,10 +180,13 @@ Device_Error *
device_unlock_1_svc(Device_Link *argp, struct svc_req *rqstp) {
static Device_Error result;
printf("device_unlock_1_svc()\n");
- /*
- * insert server code here
- */
- result.error = 0;
+
+ if (!isLocked(*argp) || !haveLock(*argp))
+ result.error = ERR_NOLOCKHELDBYTHISLINK;
+ else {
+ result.error = 0;
+ unlock();
+ }
return &result;
}