patches/libavc1394-02-solaris.diff
author drdoug007
Wed, 03 Oct 2007 05:06:35 +0000
changeset 519 6a1d01ce9198
permissions -rw-r--r--
2007-10-03 Doug Scott <[email protected]> * SFEtun.spec: Build with tap from latest source * SFEwine.spec: bump to 0.9.46 * SFEopenvpn.spec: Added modified tun.c * SFEmpfr.spec: bump to 2.3.0 * base-specs/eclipse.spec: bump to eclipse-3.4M2 * base-specs/libiec61883.spec: added updates from cvsdude * base-specs/libraw1394.spec: added updates from cvsdude * base-specs/libavc1394.spec: added updates from cvsdude * patches/eclipse-01-make.diff: Solaris 10 fixes * patches/tun-01-solaris.diff: solaris modifications * patches/eclipse-02-solaris.diff: updated for eclipse-3.4M2 * patches/libraw1394-04-eremoteio.diff: deleted, not required * patches/libavc1394-02-solaris.diff: merged patches from cvsdude * patches/libraw1394-01-solaris.diff: merged patches from cvsdude * patches/libraw1394-03-kernel.diff: deleted, not required * patches/libraw1394-01-configure.diff: deleted, not required * patches/libraw1394-02-u_int.diff: deleted, not required * patches/libiec61883-03-warning.diff: fix warnings
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
519
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
     1
diff -ur libavc1394-0.5.3.orig/libavc1394/avc1394.h libavc1394-0.5.3/libavc1394/avc1394.h
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
     2
--- libavc1394-0.5.3.orig/libavc1394/avc1394.h	2006-05-22 07:11:14.000000000 +0700
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
     3
+++ libavc1394-0.5.3/libavc1394/avc1394.h	2007-09-30 21:03:19.658948532 +0700
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
     4
@@ -24,6 +24,7 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
     5
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
     6
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
     7
 #include <libraw1394/raw1394.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
     8
+#include <libraw1394/solaris.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
     9
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    10
 /* AV/C response codes */
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    11
 #define AVC1394_RESPONSE_NOT_IMPLEMENTED 0x08000000
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    12
diff -ur libavc1394-0.5.3.orig/libavc1394/avc1394_simple.c libavc1394-0.5.3/libavc1394/avc1394_simple.c
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    13
--- libavc1394-0.5.3.orig/libavc1394/avc1394_simple.c	2006-04-13 23:16:41.000000000 +0700
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    14
+++ libavc1394-0.5.3/libavc1394/avc1394_simple.c	2007-09-30 21:03:27.419832101 +0700
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    15
@@ -37,46 +37,152 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    16
 #include "avc1394_internal.h"
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    17
 #include "../common/raw1394util.h"
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    18
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    19
-/* For select() */
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    20
-#include <sys/time.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    21
+#include <sys/1394/ieee1394.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    22
+#include <sys/av/iec61883.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    23
+#include <sys/stat.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    24
 #include <sys/types.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    25
+#include <netinet/in.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    26
+#include <assert.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    27
+#include <errno.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    28
+#include <fcntl.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    29
+#include <inttypes.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    30
+#include <sys/time.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    31
 #include <sys/poll.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    32
 #include <unistd.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    33
 #include <time.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    34
 #include <string.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    35
-#include <netinet/in.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    36
 #include <stdlib.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    37
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    38
 #ifdef DEBUG
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    39
 #include <stdio.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    40
 #endif
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    41
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    42
+extern int errno;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    43
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    44
-int avc1394_send_command(raw1394handle_t handle, nodeid_t node, quadlet_t command)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    45
-{
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    46
-	quadlet_t cmd = htonl(command);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    47
+/*
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    48
+ * Send an AV/C quadlet command.
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    49
+ * On failure, returns -1 with errno set.
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    50
+ */
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    51
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    52
-	return cooked1394_write(handle, 0xffc0 | node, FCP_COMMAND_ADDR, sizeof(quadlet_t), &cmd);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    53
+int
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    54
+avc1394_send_command(raw1394handle_t handle, nodeid_t node, quadlet_t command)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    55
+{
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    56
+    int fd;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    57
+    iec61883_arq_t arq;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    58
+    ssize_t ssz;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    59
+    fd = solaris_get_fd(handle, node, 1);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    60
+    if (fd < 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    61
+        return -1;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    62
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    63
+    arq.arq_type = IEC61883_ARQ_FCP_CMD;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    64
+    arq.arq_len = IEEE1394_QUADLET;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    65
+    arq.arq_data.quadlet = htonl(command);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    66
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    67
+again:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    68
+    ssz = write(fd, &arq, sizeof (arq));
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    69
+    if (ssz == sizeof (arq))
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    70
+        return 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    71
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    72
+    if (ssz != -1)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    73
+        solaris_bad_error(__FILE__, __LINE__, "write", -1);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    74
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    75
+    switch(errno) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    76
+        case EAGAIN:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    77
+        case EDQUOT:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    78
+        case EFBIG:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    79
+        case EIO:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    80
+        case ENOLCK:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    81
+        case ENOLINK:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    82
+        case ENOSPC:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    83
+        case EPIPE:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    84
+        case ERANGE:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    85
+        case EINVAL:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    86
+            solaris_close_fd(handle, node, 1);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    87
+            errno = ENODEV;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    88
+            return -1;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    89
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    90
+        case ENOSR:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    91
+        case ENXIO:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    92
+            return -1;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    93
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    94
+        case EINTR:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    95
+            goto again;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    96
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    97
+        case EBADF:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    98
+        case EDEADLK:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
    99
+        case EFAULT:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   100
+        default:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   101
+            solaris_bad_error(__FILE__, __LINE__, "write", errno);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   102
+    }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   103
+#ifdef DEBUG
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   104
+    fprintf(stderr, "avc1394_send_command: ");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   105
+    for (int i = 0; i < command_len; i++)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   106
+        (void) fprintf(stderr, " 0x%08X", htonl(command[i]));
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   107
+    (void) fprintf(stderr, " (%s)\n", decode_ctype(command[0]));
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   108
+#endif
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   109
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   110
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   111
-int avc1394_send_command_block(raw1394handle_t handle, nodeid_t node,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   112
+int
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   113
+avc1394_send_command_block(raw1394handle_t handle, nodeid_t node,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   114
                            quadlet_t *command, int command_len)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   115
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   116
-	quadlet_t cmd[command_len];
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   117
-	int i;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   118
-	
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   119
-	for (i=0; i < command_len; i++) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   120
-		cmd[i] = htonl(command[i]);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   121
-	}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   122
-
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   123
-#ifdef DEBUG
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   124
-	fprintf(stderr, "avc1394_send_command_block: ");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   125
-	for (i=0; i < command_len; i++)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   126
-		fprintf(stderr, " 0x%08X", htonl(command[i]));
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   127
-	fprintf(stderr, " (%s)\n", decode_ctype(command[0]));
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   128
-#endif
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   129
-	return cooked1394_write(handle, 0xffc0 | node, FCP_COMMAND_ADDR,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   130
-	                        command_len * sizeof(quadlet_t), cmd);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   131
+    int fd;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   132
+    iec61883_arq_t *arqp;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   133
+    size_t asz;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   134
+    ssize_t ssz;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   135
+    uint32_t *ca;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   136
+	
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   137
+    fd = solaris_get_fd(handle, node, 1);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   138
+    if (fd < 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   139
+        return -1;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   140
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   141
+    asz = sizeof (*arqp) - sizeof (arqp->arq_data) + command_len * 4;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   142
+    arqp = malloc(asz);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   143
+    if (arqp == NULL)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   144
+        return -1;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   145
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   146
+    arqp->arq_type = IEC61883_ARQ_FCP_CMD;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   147
+    arqp->arq_len = command_len * 4;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   148
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   149
+    ca = (quadlet_t *)&arqp->arq_data;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   150
+    for (int i = 0; i < command_len; ++i)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   151
+        ca[i] = htonl(command[i]);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   152
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   153
+again:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   154
+    ssz = write(fd, arqp, asz);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   155
+    if (ssz == asz)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   156
+        return 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   157
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   158
+    if (ssz != -1)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   159
+        solaris_bad_error(__FILE__, __LINE__, "write", -1);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   160
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   161
+    switch(errno) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   162
+        case EAGAIN:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   163
+        case EDQUOT:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   164
+        case EFBIG:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   165
+        case EIO:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   166
+        case ENOLCK:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   167
+        case ENOLINK:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   168
+        case ENOSPC:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   169
+        case EPIPE:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   170
+        case ERANGE:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   171
+        case EINVAL:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   172
+            solaris_close_fd(handle, node, 1);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   173
+            errno = ENODEV;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   174
+            return -1;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   175
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   176
+        case ENOSR:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   177
+        case ENXIO:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   178
+            return -1;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   179
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   180
+        case EINTR:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   181
+            goto again;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   182
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   183
+        case EBADF:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   184
+        case EDEADLK:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   185
+        case EFAULT:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   186
+            solaris_bad_error(__FILE__, __LINE__, "write", errno);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   187
+    }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   188
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   189
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   190
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   191
@@ -90,73 +196,54 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   192
  * RETURNS:	the AV/C response if everything went well, -1 in case of an
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   193
  * 		error
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   194
  */
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   195
-quadlet_t avc1394_transaction(raw1394handle_t handle, nodeid_t node,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   196
+quadlet_t
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   197
+avc1394_transaction(raw1394handle_t handle, nodeid_t node,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   198
                           quadlet_t request, int retry)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   199
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   200
-	quadlet_t response = 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   201
-	struct pollfd raw1394_poll;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   202
-	raw1394_poll.fd = raw1394_get_fd(handle);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   203
-	raw1394_poll.events = POLLIN;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   204
-	struct fcp_response fr;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   205
-
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   206
-	do {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   207
-		response = 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   208
-		fr.length = 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   209
-
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   210
-		init_avc_response_handler(handle, &fr);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   211
-		if (avc1394_send_command(handle, node, request) < 0) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   212
-			struct timespec ts = {0, AVC1394_SLEEP};
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   213
-			fprintf(stderr,"send oops\n");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   214
-			nanosleep(&ts, NULL);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   215
-			continue;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   216
-		}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   217
-	
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   218
-		// Only poll if the receive handler hasn't been called yet.
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   219
-		// This can occur while waiting for command acknowledgement inside of
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   220
-		// raw1394_write.
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   221
-		if (fr.length==0) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   222
-			if ( poll( &raw1394_poll, 1, AVC1394_POLL_TIMEOUT) > 0 ) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   223
-				if (raw1394_poll.revents & POLLIN) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   224
-					raw1394_loop_iterate(handle);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   225
-					response = ntohl(fr.data[0]);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   226
-				}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   227
-			}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   228
-		} else {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   229
-			response = ntohl(fr.data[0]);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   230
-		}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   231
-		if (response != 0) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   232
-			while (AVC1394_MASK_RESPONSE(response) == AVC1394_RESPONSE_INTERIM) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   233
-#ifdef DEBUG
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   234
-				fprintf(stderr,"INTERIM\n");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   235
-#endif
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   236
-				response = 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   237
-				fr.length = 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   238
-
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   239
-				if ( poll( &raw1394_poll, 1, AVC1394_POLL_TIMEOUT) > 0 ) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   240
-					if (raw1394_poll.revents & POLLIN) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   241
-						raw1394_loop_iterate(handle);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   242
-						response = ntohl(fr.data[0]);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   243
-					}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   244
-				}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   245
-			}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   246
-		}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   247
-		stop_avc_response_handler(handle);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   248
-
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   249
-#ifdef DEBUG
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   250
-		if (response != 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   251
-			fprintf(stderr, "avc1394_transaction: Got AVC response 0x%0x (%s)\n", response, decode_response(response));
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   252
-		else
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   253
-			fprintf(stderr, "avc1394_transaction: no response\n");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   254
-#endif
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   255
+    int fd;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   256
+    iec61883_arq_t arq;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   257
+    ssize_t ssz;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   258
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   259
+    fd = solaris_get_fd(handle, node, 1);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   260
+    if (fd < 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   261
+        return -1;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   262
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   263
+    if (avc1394_send_command(handle, node, request) != 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   264
+        return -1;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   265
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   266
+again:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   267
+    ssz = read(fd, &arq, sizeof (arq));
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   268
+    if (ssz < 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   269
+        return -1;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   270
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   271
+    if (ssz != sizeof (arq)) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   272
+        (void) fprintf(stderr, "Unexpected read() size on node %d "
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   273
+                "(%d bytes)\n", node, ssz);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   274
+        goto again;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   275
+		}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   276
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   277
+    switch (arq.arq_type) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   278
+        case IEC61883_ARQ_FCP_RESP:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   279
+            break;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   280
 		
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   281
-		if (response != 0) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   282
-			return response;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   283
-		}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   284
-
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   285
-	} while (--retry >= 0);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   286
+        case IEC61883_ARQ_BUS_RESET:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   287
+            (void) fprintf(stderr, "Skipping bus reset on node %d.\n",
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   288
+                    node);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   289
+            goto again;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   290
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   291
+        default:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   292
+            (void) fprintf(stderr, "Skipping packet with unexpected "
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   293
+                    "response type %d on node %d.\n", arq.arq_type, node);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   294
+            goto again;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   295
+		}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   296
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   297
+    if (arq.arq_len != IEEE1394_QUADLET) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   298
+        (void) fprintf(stderr, "Skipping packet with unexpected length "
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   299
+                "%d on node %d.\n", arq.arq_len, node);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   300
+        goto again;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   301
+    }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   302
 	
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   303
-	stop_avc_response_handler(handle);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   304
-	return (response == 0 ? -1 : response);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   305
+    return (ntohl(arq.arq_data.quadlet));
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   306
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   307
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   308
 /*
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   309
@@ -171,100 +258,113 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   310
  * RETURNS:	the AV/C response if everything went well, NULL in case of an
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   311
  * 		error.
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   312
  */
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   313
-quadlet_t *avc1394_transaction_block2(raw1394handle_t handle, nodeid_t node,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   314
+quadlet_t*
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   315
+avc1394_transaction_block2(raw1394handle_t handle, nodeid_t node,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   316
 		quadlet_t *request, int len, unsigned int *response_len, int retry)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   317
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   318
-	quadlet_t *response;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   319
-	struct pollfd raw1394_poll;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   320
-	raw1394_poll.fd = raw1394_get_fd(handle);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   321
-	raw1394_poll.events = POLLIN;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   322
-	struct fcp_response *fr = NULL;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   323
+    int fd;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   324
+    iec61883_arq_t *arqp;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   325
+    size_t asz;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   326
+    quadlet_t *rbuf;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   327
+    ssize_t ssz;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   328
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   329
 	*response_len = 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   330
-	fr = calloc(1, sizeof(struct fcp_response));
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   331
-	if (fr == NULL)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   332
+    fd = solaris_get_fd(handle, node, 1);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   333
+    if (fd < 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   334
 		return NULL;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   335
 	
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   336
-	do {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   337
-		response = NULL;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   338
-		fr->length = 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   339
-		*response_len = 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   340
-
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   341
-		init_avc_response_handler(handle, fr);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   342
-		if (avc1394_send_command_block(handle, node, request, len) < 0) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   343
-			struct timespec ts = {0, AVC1394_SLEEP};
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   344
-			fprintf(stderr,"send oops\n");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   345
-			nanosleep(&ts, NULL);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   346
-			continue;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   347
-		}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   348
-	
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   349
-		// Only poll if the receive handler hasn't been called yet.
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   350
-		// This can occur while waiting for command acknowledgement inside of
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   351
-		// raw1394_write.
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   352
-		if (fr->length==0) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   353
-			if ( poll( &raw1394_poll, 1, AVC1394_POLL_TIMEOUT) > 0 ) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   354
-				if (raw1394_poll.revents & POLLIN) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   355
-					raw1394_loop_iterate(handle);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   356
-					response = fr->data;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   357
-					ntohl_block(response, fr->length);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   358
-					*response_len = fr->length;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   359
-				}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   360
-			}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   361
-		} else {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   362
-			response = fr->data;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   363
-			ntohl_block(response, fr->length);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   364
-			*response_len = fr->length;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   365
-		}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   366
-		if (response != NULL) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   367
-			while (AVC1394_MASK_RESPONSE(response[0]) == AVC1394_RESPONSE_INTERIM) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   368
-#ifdef DEBUG
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   369
-				fprintf(stderr,"INTERIM\n");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   370
-#endif
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   371
-				response = NULL;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   372
-				fr->length = 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   373
-				*response_len = 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   374
-
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   375
-				if ( poll( &raw1394_poll, 1, AVC1394_POLL_TIMEOUT) > 0 ) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   376
-					if (raw1394_poll.revents & POLLIN) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   377
-						raw1394_loop_iterate(handle);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   378
-						response = fr->data;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   379
-						ntohl_block(response, fr->length);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   380
-						*response_len = fr->length;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   381
-					}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   382
-				}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   383
-			}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   384
-		}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   385
-		stop_avc_response_handler(handle);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   386
-
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   387
-#ifdef DEBUG
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   388
-		if (response != NULL) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   389
-			int i;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   390
-			fprintf(stderr, "avc1394_transaction_block received response (retry %d): ",
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   391
-				retry);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   392
-			for (i=0; i<len; i++) fprintf(stderr, " 0x%08X", response[i]);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   393
-			fprintf(stderr, " (%s)\n", decode_response(response[0]));
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   394
-		} else {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   395
-			fprintf(stderr, "avc1394_transaction_block: no response\n");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   396
+    asz = sizeof (*arqp) - sizeof (arqp->arq_data) + len * 4;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   397
+    arqp = malloc(asz);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   398
+    if (arqp == NULL)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   399
+        return NULL;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   400
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   401
+    rbuf = malloc(len * 4);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   402
+    if (rbuf == NULL) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   403
+        free(arqp);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   404
+        return NULL;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   405
 		}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   406
-#endif
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   407
 		
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   408
-		if (response != NULL) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   409
-			return response;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   410
-		}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   411
-	} while (--retry >= 0);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   412
+    if (avc1394_send_command_block(handle, node, request, len) < 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   413
+        goto err;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   414
 	
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   415
-	stop_avc_response_handler(handle);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   416
+again:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   417
+    ssz = read(fd, arqp, sizeof (iec61883_arq_t));
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   418
+    if (ssz < 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   419
+        goto err;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   420
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   421
+    if (ssz != sizeof (iec61883_arq_t)) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   422
+        (void) fprintf(stderr, "Unexpected read() size on node %d "
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   423
+                "(%d bytes)\n", node, ssz);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   424
+        goto again;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   425
+    }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   426
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   427
+    switch (arqp->arq_type) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   428
+        case IEC61883_ARQ_FCP_RESP:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   429
+            *response_len = (unsigned int) arqp->arq_len;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   430
+            break;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   431
+        case IEC61883_ARQ_BUS_RESET:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   432
+            (void) fprintf(stderr, "Skipping bus reset on node %d.\n",
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   433
+                    node);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   434
+            goto again;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   435
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   436
+        default:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   437
+            (void) fprintf(stderr, "Skipping packet with unexpected "
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   438
+                    "response type %d on node %d.\n", arqp->arq_type, node);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   439
+            goto again;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   440
+    }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   441
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   442
+    if (arqp->arq_len != len * 4) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   443
+        (void) fprintf(stderr, "Skipping packet with unexpected length "
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   444
+                "%d != %d on node %d.\n", arqp->arq_len, len * 4, node);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   445
+        goto again;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   446
+    }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   447
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   448
+    ssz = read(fd, arqp, asz);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   449
+    if (ssz < 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   450
+        goto err;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   451
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   452
+    if (ssz != asz) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   453
+        (void) fprintf(stderr, "Unexpected read() size on node %d "
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   454
+                "(%d bytes)\n", node, ssz);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   455
+        goto err;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   456
+    }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   457
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   458
+    switch (arqp->arq_type) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   459
+        case IEC61883_ARQ_FCP_RESP:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   460
+            *response_len = (unsigned int) arqp->arq_len;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   461
+            break;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   462
+        case IEC61883_ARQ_BUS_RESET:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   463
+            (void) fprintf(stderr, "Skipping bus reset on node %d.\n",
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   464
+                    node);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   465
+            goto err;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   466
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   467
+        default:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   468
+            (void) fprintf(stderr, "Skipping packet with unexpected "
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   469
+                    "response type %d on node %d.\n", arqp->arq_type, node);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   470
+            goto err;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   471
+    }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   472
+    for (int i = 0; i < len; ++i)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   473
+        rbuf[i] = ntohl(((quadlet_t *)&arqp->arq_data)[i]);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   474
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   475
+    free(arqp);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   476
+    return rbuf;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   477
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   478
+err:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   479
+    free(arqp);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   480
+    free(rbuf);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   481
 	return NULL;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   482
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   483
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   484
 /*
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   485
  * kept for backwards compatibility
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   486
  */
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   487
-quadlet_t *avc1394_transaction_block(raw1394handle_t handle, nodeid_t node,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   488
+quadlet_t*
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   489
+avc1394_transaction_block(raw1394handle_t handle, nodeid_t node,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   490
                               quadlet_t *request, int len, int retry)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   491
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   492
 	unsigned int response_len;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   493
-	return avc1394_transaction_block2(handle, node, request, len, &response_len, retry);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   494
+    return avc1394_transaction_block2(handle, node, request, len,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   495
+            &response_len, retry);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   496
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   497
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   498
 void avc1394_transaction_block_close(raw1394handle_t handle)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   499
@@ -381,9 +481,10 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   500
  *   Caller must call avc1394_transaction_block_close() when finished with 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   501
  *   return value.
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   502
  */
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   503
-unsigned char *avc1394_read_descriptor(raw1394handle_t handle, nodeid_t node,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   504
-                                   quadlet_t subunit,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   505
-                                   unsigned char *descriptor_identifier, int len_descriptor_identifier)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   506
+unsigned char*
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   507
+avc1394_read_descriptor(raw1394handle_t handle, nodeid_t node,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   508
+        quadlet_t subunit, unsigned char *descriptor_identifier,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   509
+        int len_descriptor_identifier)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   510
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   511
 	quadlet_t  request[128];
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   512
 	quadlet_t *response;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   513
@@ -392,8 +493,7 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   514
 		fprintf(stderr, "Unimplemented.\n");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   515
 	
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   516
 	memset(request, 0, 128*4);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   517
-	request[0] = AVC1394_CTYPE_CONTROL | subunit | AVC1394_COMMAND_READ_DESCRIPTOR
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   518
-	             | *descriptor_identifier;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   519
+    request[0] = AVC1394_CTYPE_CONTROL | subunit | AVC1394_COMMAND_READ_DESCRIPTOR | *descriptor_identifier;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   520
 	request[1] = 0xFF000000;	/* read entire descriptor */
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   521
 	request[2] = 0x00000000;	/* beginning from 0x0000 */
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   522
 	
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   523
@@ -408,7 +508,8 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   524
  * Get subunit info
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   525
  */
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   526
 #define EXTENSION_CODE 7
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   527
-int avc1394_subunit_info(raw1394handle_t handle, nodeid_t node, quadlet_t *table)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   528
+int
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   529
+avc1394_subunit_info(raw1394handle_t handle, nodeid_t node, quadlet_t *table)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   530
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   531
 	quadlet_t  request[2];
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   532
 	quadlet_t *response;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   533
@@ -429,11 +530,10 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   534
 	}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   535
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   536
 #ifdef DEBUG
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   537
-	{
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   538
-		fprintf(stderr, "avc_subunit_info:");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   539
-		for (page=0; page < 8; page++) fprintf(stderr, " 0x%08X", table[page]);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   540
-		fprintf(stderr, "\n");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   541
-	}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   542
+    (void) fprintf(stderr, "avc_subunit_info:");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   543
+    for (page=0; page < 8; page++)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   544
+        (void) fprintf(stderr, " 0x%08X", table[page]);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   545
+    (void) fprintf(stderr, "\n");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   546
 #endif
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   547
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   548
 	return 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   549
@@ -448,6 +548,7 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   550
 	
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   551
 	if ( avc1394_subunit_info( handle, node, table) < 0) 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   552
 		return 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   553
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   554
 	for (i=0; i<8; i++) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   555
 		for (j=3; j>=0; j--) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   556
 			entry = (table[i] >> (j * 8)) & 0xFF;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   557
@@ -465,21 +566,21 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   558
  *   Caller must call avc1394_transaction_block_close() when finished with 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   559
  *   return value.
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   560
  */
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   561
-quadlet_t *avc1394_unit_info(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   562
+quadlet_t*
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   563
+avc1394_unit_info(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   564
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   565
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   566
 	quadlet_t  request[2];
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   567
 	quadlet_t *response;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   568
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   569
-	request[0] = AVC1394_CTYPE_STATUS | AVC1394_SUBUNIT_TYPE_UNIT
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   570
-	             | AVC1394_SUBUNIT_ID_IGNORE | AVC1394_COMMAND_UNIT_INFO | 0xFF;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   571
+    request[0] = AVC1394_CTYPE_STATUS | AVC1394_SUBUNIT_TYPE_UNIT | AVC1394_SUBUNIT_ID_IGNORE | AVC1394_COMMAND_UNIT_INFO | 0xFF;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   572
 	request[1] = 0xFFFFFFFF;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   573
 	response = avc1394_transaction_block(handle, node, request, 2, AVC1394_RETRY);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   574
 	if (response == NULL)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   575
 		return NULL;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   576
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   577
 #ifdef DEBUG
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   578
-	fprintf(stderr, "avc_unit_info: 0x%08X 0x%08X\n",
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   579
+    (void) fprintf(stderr, "avc_unit_info: 0x%08X 0x%08X\n",
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   580
 			response[0], response[1]);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   581
 #endif
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   582
 	return response;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   583
@@ -489,7 +590,8 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   584
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   585
 avc1394_command_handler_t g_command_handler = NULL;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   586
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   587
-int target_fcp_handler( raw1394handle_t handle, nodeid_t nodeid, int response, 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   588
+int
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   589
+target_fcp_handler( raw1394handle_t handle, nodeid_t nodeid, int response, 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   590
 	size_t length, unsigned char *data )
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   591
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   592
 	int result;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   593
@@ -500,24 +602,19 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   594
 	memset(&cmd_resp, 0, sizeof(cmd_resp));
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   595
 	memcpy(r, data, length);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   596
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   597
-	if ( response != 0 )
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   598
-	{
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   599
+    if (response != 0) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   600
 		return 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   601
-	}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   602
-	else
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   603
-	{
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   604
+    } else {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   605
 #ifdef DEBUG
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   606
-		{
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   607
 		int q, z;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   608
 		z = (length % 4) ? length + (4 - (length % 4)) : length;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   609
 		printf("----> ");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   610
 		for (q = 0; q < z / 4; q++)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   611
 		    printf("%08x ", r[q]);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   612
-		printf("(length %d)\n", length);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   613
-		printf("----> type=0x%02x subunit_type=0x%x subunit_id=0x%x opcode=0x%x operand0=0x%x\n",
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   614
+        (void) fprintf(stderr, "(length %d)\n", length);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   615
+        (void) fprintf(stderr, "----> type=0x%02x subunit_type=0x%x subunit_id=0x%x opcode=0x%x operand0=0x%x\n",
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   616
 			cmd_resp.status, cmd_resp.subunit_type,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   617
 			cmd_resp.subunit_id, cmd_resp.opcode, cmd_resp.operand[0]);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   618
-	    }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   619
 #endif
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   620
 		result = g_command_handler( &cmd_resp );
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   621
 		
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   622
@@ -525,26 +622,27 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   623
 			cmd_resp.status = AVC1394_RESP_NOT_IMPLEMENTED;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   624
 		
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   625
 #ifdef DEBUG
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   626
-		{
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   627
 		int q, z;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   628
 		z = (length % 4) ? length + (4 - (length % 4)) : length;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   629
 		printf("<---- ");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   630
 		for (q = 0; q < z / 4; q++)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   631
 		    printf("%08x ", r[q]);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   632
-		printf("(length %d)\n", length);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   633
-		printf("<---- type=0x%02x subunit_type=0x%x subunit_id=0x%x opcode=0x%x operand0=0x%x\n",
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   634
+        (void) fprintf(stderr, "(length %d)\n", length);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   635
+        (void) fprintf(stderr, "<---- type=0x%02x subunit_type=0x%x subunit_id=0x%x opcode=0x%x operand0=0x%x\n",
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   636
 			cmd_resp.status, cmd_resp.subunit_type,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   637
 			cmd_resp.subunit_id, cmd_resp.opcode, cmd_resp.operand[0]);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   638
-	    }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   639
 #endif
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   640
 		
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   641
-		return cooked1394_write(handle, 0xffc0 | nodeid, FCP_RESPONSE_ADDR, length, r);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   642
+        result = avc1394_send_command_block(handle, (0xffc0 | nodeid), r,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   643
+                length);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   644
+        return result;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   645
 	}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   646
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   647
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   648
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   649
 int
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   650
-avc1394_init_target( raw1394handle_t handle, avc1394_command_handler_t cmd_handler)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   651
+avc1394_init_target( raw1394handle_t handle,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   652
+        avc1394_command_handler_t cmd_handler)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   653
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   654
 	if (cmd_handler == NULL)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   655
 		return -1;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   656
@@ -560,3 +658,4 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   657
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   658
 	return raw1394_stop_fcp_listen(handle);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   659
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   660
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   661
diff -ur libavc1394-0.5.3.orig/libavc1394/avc1394_vcr.c libavc1394-0.5.3/libavc1394/avc1394_vcr.c
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   662
--- libavc1394-0.5.3.orig/libavc1394/avc1394_vcr.c	2006-04-13 23:16:41.000000000 +0700
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   663
+++ libavc1394-0.5.3/libavc1394/avc1394_vcr.c	2007-09-30 21:15:37.358893716 +0700
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   664
@@ -22,6 +22,8 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   665
 #include <unistd.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   666
 #include <stdio.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   667
 #include <stdlib.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   668
+#include <string.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   669
+#include <errno.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   670
 #include "avc1394_vcr.h"
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   671
 #include "avc1394.h"
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   672
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   673
@@ -35,196 +37,272 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   674
 #define CTLUNIT AVC1394_CTYPE_CONTROL | AVC1394_SUBUNIT_TYPE_UNIT | AVC1394_SUBUNIT_ID_IGNORE
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   675
 #define STATUNIT AVC1394_CTYPE_STATUS | AVC1394_SUBUNIT_TYPE_UNIT | AVC1394_SUBUNIT_ID_IGNORE
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   676
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   677
-int avc1394_vcr_is_playing(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   678
+static void
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   679
+_send_command_failed(const char *file, int line, int err, const char *func)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   680
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   681
-	quadlet_t response = avc1394_transaction(handle, node, STATVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   682
-		| AVC1394_VCR_COMMAND_TRANSPORT_STATE | AVC1394_VCR_OPERAND_TRANSPORT_STATE,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   683
-		AVC1394_RETRY);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   684
-	if (AVC1394_MASK_OPCODE(response)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   685
-		== AVC1394_VCR_RESPONSE_TRANSPORT_STATE_PLAY)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   686
+    (void) fprintf(stderr, "%s:%d: avc1394_send_command() failed with "
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   687
+            "errno %d (%s) in %s\n", file, line, err, strerror(err), func);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   688
+}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   689
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   690
+#define send_command_failed(err, func)  \
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   691
+    _send_command_failed(__FILE__, __LINE__, err, func)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   692
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   693
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   694
+int
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   695
+avc1394_vcr_is_playing(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   696
+{
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   697
+    quadlet_t response;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   698
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   699
+    response = avc1394_transaction(handle, node, STATVCR0 |
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   700
+            AVC1394_VCR_COMMAND_TRANSPORT_STATE |
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   701
+            AVC1394_VCR_OPERAND_TRANSPORT_STATE, AVC1394_RETRY);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   702
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   703
+    if (AVC1394_MASK_OPCODE(response) ==
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   704
+            AVC1394_VCR_RESPONSE_TRANSPORT_STATE_PLAY)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   705
 		return AVC1394_GET_OPERAND0(response);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   706
-	else
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   707
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   708
 		return 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   709
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   710
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   711
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   712
-int avc1394_vcr_is_recording(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   713
+int
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   714
+avc1394_vcr_is_recording(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   715
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   716
-	quadlet_t response = avc1394_transaction(handle, node, STATVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   717
-		| AVC1394_VCR_COMMAND_TRANSPORT_STATE | AVC1394_VCR_OPERAND_TRANSPORT_STATE,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   718
-		AVC1394_RETRY);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   719
-	if (AVC1394_MASK_OPCODE(response)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   720
-		== AVC1394_VCR_RESPONSE_TRANSPORT_STATE_RECORD)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   721
+    quadlet_t response;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   722
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   723
+    response = avc1394_transaction(handle, node, STATVCR0 |
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   724
+            AVC1394_VCR_COMMAND_TRANSPORT_STATE |
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   725
+            AVC1394_VCR_OPERAND_TRANSPORT_STATE, AVC1394_RETRY);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   726
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   727
+    if (AVC1394_MASK_OPCODE(response) ==
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   728
+            AVC1394_VCR_RESPONSE_TRANSPORT_STATE_RECORD)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   729
 		return AVC1394_GET_OPERAND0(response);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   730
-	else
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   731
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   732
 		return 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   733
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   734
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   735
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   736
-void avc1394_vcr_play(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   737
+void
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   738
+avc1394_vcr_play(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   739
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   740
-	if (avc1394_vcr_is_playing(handle, node) == AVC1394_VCR_OPERAND_PLAY_FORWARD) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   741
-		avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   742
-			| AVC1394_VCR_COMMAND_PLAY | AVC1394_VCR_OPERAND_PLAY_SLOWEST_FORWARD);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   743
-	} else {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   744
-		avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   745
-			| AVC1394_VCR_COMMAND_PLAY | AVC1394_VCR_OPERAND_PLAY_FORWARD);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   746
-	}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   747
+    int op;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   748
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   749
+    if (avc1394_vcr_is_playing(handle, node) ==
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   750
+            AVC1394_VCR_OPERAND_PLAY_FORWARD)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   751
+        op = AVC1394_VCR_OPERAND_PLAY_SLOWEST_FORWARD;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   752
+    else
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   753
+        op = AVC1394_VCR_OPERAND_PLAY_FORWARD;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   754
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   755
+    if (avc1394_send_command(handle, node,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   756
+                CTLVCR0 | AVC1394_VCR_COMMAND_PLAY | op) < 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   757
+        send_command_failed(errno, "avc1394_vcr_play");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   758
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   759
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   760
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   761
-void avc1394_vcr_reverse(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   762
+void
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   763
+avc1394_vcr_reverse(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   764
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   765
-	if (avc1394_vcr_is_playing(handle, node) == AVC1394_VCR_OPERAND_PLAY_REVERSE) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   766
-		avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   767
-			| AVC1394_VCR_COMMAND_PLAY | AVC1394_VCR_OPERAND_PLAY_SLOWEST_REVERSE);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   768
-	} else {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   769
-		avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   770
-			| AVC1394_VCR_COMMAND_PLAY | AVC1394_VCR_OPERAND_PLAY_REVERSE);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   771
-	}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   772
+    int op;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   773
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   774
+    if (avc1394_vcr_is_playing(handle, node) ==
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   775
+            AVC1394_VCR_OPERAND_PLAY_REVERSE)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   776
+        op = AVC1394_VCR_OPERAND_PLAY_SLOWEST_REVERSE;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   777
+    else
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   778
+        op = AVC1394_VCR_OPERAND_PLAY_REVERSE;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   779
+    if (avc1394_send_command(handle, node,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   780
+                CTLVCR0 | AVC1394_VCR_COMMAND_PLAY | op) < 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   781
+        send_command_failed(errno, "avc1394_vcr_reverse");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   782
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   783
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   784
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   785
-void avc1394_vcr_trick_play(raw1394handle_t handle, nodeid_t node, int speed)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   786
+void
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   787
+avc1394_vcr_trick_play(raw1394handle_t handle, nodeid_t node, int speed)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   788
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   789
-	if (!avc1394_vcr_is_recording(handle, node)) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   790
+    int op;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   791
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   792
+    if (avc1394_vcr_is_recording(handle, node))
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   793
+        return;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   794
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   795
 	    if (speed == 0) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   796
-		    avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   797
-			    | AVC1394_VCR_COMMAND_PLAY | AVC1394_VCR_OPERAND_PLAY_FORWARD);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   798
+        op = AVC1394_VCR_OPERAND_PLAY_FORWARD;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   799
 	    } else if (speed > 0) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   800
-	        if (speed > 14) speed = 14;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   801
-		    avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   802
-			    | AVC1394_VCR_COMMAND_PLAY | (AVC1394_VCR_OPERAND_PLAY_NEXT_FRAME + speed));	        
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   803
-	    } else {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   804
-	        if (speed < -14) speed = -14;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   805
-		    avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   806
-			    | AVC1394_VCR_COMMAND_PLAY | (AVC1394_VCR_OPERAND_PLAY_PREVIOUS_FRAME - speed));	        
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   807
-	    }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   808
+        if (speed > 14)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   809
+            speed = 14;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   810
+        op = AVC1394_VCR_OPERAND_PLAY_NEXT_FRAME + speed;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   811
+    } else {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   812
+        if (speed < -14)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   813
+            speed = -14;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   814
+        op = AVC1394_VCR_OPERAND_PLAY_PREVIOUS_FRAME - speed;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   815
 	}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   816
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   817
+    if (avc1394_send_command(handle, node,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   818
+                CTLVCR0 | AVC1394_VCR_COMMAND_PLAY | op) < 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   819
+        send_command_failed(errno, "avc1394_vcr_trick_play");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   820
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   821
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   822
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   823
-void avc1394_vcr_stop(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   824
+void
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   825
+avc1394_vcr_stop(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   826
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   827
-	avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   828
-		| AVC1394_VCR_COMMAND_WIND | AVC1394_VCR_OPERAND_WIND_STOP);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   829
+    if (avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   830
+            | AVC1394_VCR_COMMAND_WIND | AVC1394_VCR_OPERAND_WIND_STOP) != 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   831
+        send_command_failed(errno, "avc1394_vcr_stop");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   832
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   833
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   834
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   835
-void avc1394_vcr_rewind(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   836
+void
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   837
+avc1394_vcr_rewind(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   838
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   839
-	if (avc1394_vcr_is_playing(handle, node)) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   840
-		avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   841
-			| AVC1394_VCR_COMMAND_PLAY | AVC1394_VCR_OPERAND_PLAY_FASTEST_REVERSE);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   842
-	} else {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   843
-		avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   844
-			| AVC1394_VCR_COMMAND_WIND | AVC1394_VCR_OPERAND_WIND_REWIND);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   845
-	}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   846
+    int op;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   847
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   848
+    op = avc1394_vcr_is_playing(handle, node) ?
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   849
+        AVC1394_VCR_OPERAND_PLAY_FASTEST_REVERSE :
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   850
+        AVC1394_VCR_OPERAND_WIND_REWIND;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   851
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   852
+    if (avc1394_send_command(handle, node,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   853
+                CTLVCR0 | AVC1394_VCR_COMMAND_PLAY | op) != 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   854
+        send_command_failed(errno, "avc1394_vcr_rewind");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   855
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   856
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   857
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   858
-void avc1394_vcr_pause(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   859
+void
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   860
+avc1394_vcr_pause(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   861
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   862
 	int mode;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   863
+    int cmd;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   864
 	
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   865
-	if ((mode = avc1394_vcr_is_recording(handle, node))) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   866
-		if (mode == AVC1394_VCR_OPERAND_RECORD_PAUSE) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   867
-			avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   868
-			| AVC1394_VCR_COMMAND_RECORD | AVC1394_VCR_OPERAND_RECORD_RECORD);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   869
-		} else {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   870
-			avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   871
-			| AVC1394_VCR_COMMAND_RECORD | AVC1394_VCR_OPERAND_RECORD_PAUSE);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   872
-		}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   873
-	} else {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   874
-		if (avc1394_vcr_is_playing(handle, node)==AVC1394_VCR_OPERAND_PLAY_FORWARD_PAUSE) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   875
-			avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   876
-			| AVC1394_VCR_COMMAND_PLAY | AVC1394_VCR_OPERAND_PLAY_FORWARD);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   877
-		} else {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   878
-			avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   879
-			| AVC1394_VCR_COMMAND_PLAY | AVC1394_VCR_OPERAND_PLAY_FORWARD_PAUSE);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   880
+    mode = avc1394_vcr_is_recording(handle, node);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   881
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   882
+    switch(mode) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   883
+        case AVC1394_VCR_OPERAND_RECORD_PAUSE:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   884
+            cmd = AVC1394_VCR_COMMAND_RECORD |
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   885
+                AVC1394_VCR_OPERAND_RECORD_RECORD;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   886
+            break;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   887
+        default:
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   888
+            cmd = AVC1394_VCR_COMMAND_RECORD |
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   889
+                AVC1394_VCR_OPERAND_RECORD_PAUSE;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   890
+            break;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   891
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   892
+        case 0: {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   893
+            cmd = AVC1394_VCR_COMMAND_PLAY;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   894
+            if (avc1394_vcr_is_playing(handle, node) ==
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   895
+                    AVC1394_VCR_OPERAND_PLAY_FORWARD_PAUSE)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   896
+                cmd |= AVC1394_VCR_OPERAND_PLAY_FORWARD;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   897
+            else
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   898
+                cmd |= AVC1394_VCR_OPERAND_PLAY_FORWARD_PAUSE;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   899
 		}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   900
 	}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   901
-
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   902
+    if (avc1394_send_command(handle, node, CTLVCR0 | cmd) < 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   903
+        send_command_failed(errno, "avc1394_vcr_pause");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   904
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   905
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   906
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   907
-void avc1394_vcr_forward(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   908
+void
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   909
+avc1394_vcr_forward(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   910
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   911
-	if (avc1394_vcr_is_playing(handle, node)) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   912
-		avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   913
-			| AVC1394_VCR_COMMAND_PLAY | AVC1394_VCR_OPERAND_PLAY_FASTEST_FORWARD);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   914
-	} else {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   915
-		avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   916
-			| AVC1394_VCR_COMMAND_WIND | AVC1394_VCR_OPERAND_WIND_FAST_FORWARD);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   917
+    int cmd;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   918
+    if (avc1394_vcr_is_playing(handle, node))
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   919
+        cmd = AVC1394_VCR_COMMAND_PLAY|AVC1394_VCR_OPERAND_PLAY_FASTEST_FORWARD;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   920
+    else
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   921
+        cmd = AVC1394_VCR_COMMAND_WIND|AVC1394_VCR_OPERAND_WIND_FAST_FORWARD;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   922
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   923
-	}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   924
+    if (avc1394_send_command(handle, node, CTLVCR0 | cmd) < 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   925
+        send_command_failed(errno, "avc1394_vcr_forward");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   926
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   927
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   928
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   929
-void avc1394_vcr_next(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   930
+void
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   931
+avc1394_vcr_next(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   932
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   933
-	if (avc1394_vcr_is_playing(handle, node)) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   934
-		avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   935
-			| AVC1394_VCR_COMMAND_PLAY | AVC1394_VCR_OPERAND_PLAY_NEXT_FRAME);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   936
-	} 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   937
+    if (!avc1394_vcr_is_playing(handle, node))
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   938
+        return;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   939
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   940
+    if (avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   941
+            | AVC1394_VCR_COMMAND_PLAY
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   942
+            | AVC1394_VCR_OPERAND_PLAY_NEXT_FRAME) != 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   943
+        send_command_failed(errno, "avc1394_vcr_next");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   944
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   945
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   946
-void avc1394_vcr_next_index(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   947
+void
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   948
+avc1394_vcr_next_index(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   949
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   950
     quadlet_t request[2];
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   951
-	if (avc1394_vcr_is_playing(handle, node)) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   952
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   953
+    if (!avc1394_vcr_is_playing(handle, node))
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   954
+        return ;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   955
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   956
 	    request[0] = CTLVCR0 | AVC1394_VCR_COMMAND_FORWARD | 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   957
 	        AVC1394_VCR_MEASUREMENT_INDEX;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   958
 	    request[1] = 0x01FFFFFF;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   959
-		avc1394_send_command_block(handle, node, request, 2);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   960
-	} 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   961
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   962
+    if (avc1394_send_command_block(handle, node, request, 2) != 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   963
+        (void) fprintf(stderr, "avc1394_send_command_block() failed with "
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   964
+                "errno %d (%s) in avc1394_vcr_next_index()\n", errno,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   965
+                strerror(errno));
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   966
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   967
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   968
-void avc1394_vcr_previous(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   969
+void
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   970
+avc1394_vcr_previous(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   971
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   972
-	if (avc1394_vcr_is_playing(handle, node)) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   973
-		avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   974
-			| AVC1394_VCR_COMMAND_PLAY | AVC1394_VCR_OPERAND_PLAY_PREVIOUS_FRAME);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   975
-	} 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   976
+    if (!avc1394_vcr_is_playing(handle, node))
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   977
+        return;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   978
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   979
+    if (avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   980
+            | AVC1394_VCR_COMMAND_PLAY
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   981
+            | AVC1394_VCR_OPERAND_PLAY_PREVIOUS_FRAME) != 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   982
+        send_command_failed(errno, "avc1394_vcr_previous");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   983
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   984
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   985
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   986
-void avc1394_vcr_previous_index(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   987
+void
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   988
+avc1394_vcr_previous_index(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   989
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   990
     quadlet_t request[2];
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   991
-	if (avc1394_vcr_is_playing(handle, node)) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   992
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   993
+    if (!avc1394_vcr_is_playing(handle, node))
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   994
+        return;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   995
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   996
 	    request[0] = CTLVCR0 | AVC1394_VCR_COMMAND_BACKWARD | 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   997
 	        AVC1394_VCR_MEASUREMENT_INDEX;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   998
 	    request[1] = 0x01FFFFFF;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
   999
-		avc1394_send_command_block(handle, node, request, 2);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1000
-	} 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1001
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1002
+    if (avc1394_send_command_block(handle, node, request, 2) != 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1003
+        (void) fprintf(stderr, "avc1394_send_command_block() failed with "
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1004
+                "errno %d (%s) in avc1394_vcr_previous_index()\n", errno,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1005
+                strerror(errno));
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1006
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1007
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1008
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1009
-void avc1394_vcr_eject(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1010
+void
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1011
+avc1394_vcr_eject(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1012
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1013
-	avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1014
-		| AVC1394_VCR_COMMAND_LOAD_MEDIUM | AVC1394_VCR_OPERAND_LOAD_MEDIUM_EJECT);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1015
+    if (avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1016
+            | AVC1394_VCR_COMMAND_LOAD_MEDIUM
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1017
+            | AVC1394_VCR_OPERAND_LOAD_MEDIUM_EJECT) != 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1018
+        send_command_failed(errno, "avc1394_vcr_eject");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1019
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1020
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1021
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1022
-void avc1394_vcr_record(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1023
+void
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1024
+avc1394_vcr_record(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1025
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1026
-	avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1027
-		| AVC1394_VCR_COMMAND_RECORD | AVC1394_VCR_OPERAND_RECORD_RECORD);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1028
+    if (avc1394_send_command(handle, node, CTLVCR0
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1029
+            | AVC1394_VCR_COMMAND_RECORD
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1030
+            | AVC1394_VCR_OPERAND_RECORD_RECORD) != 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1031
+        send_command_failed(errno, "avc1394_vcr_record");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1032
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1033
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1034
-quadlet_t avc1394_vcr_status(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1035
+quadlet_t
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1036
+avc1394_vcr_status(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1037
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1038
 	return avc1394_transaction(handle, node,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1039
 			STATVCR0 | AVC1394_VCR_COMMAND_TRANSPORT_STATE
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1040
 			| AVC1394_VCR_OPERAND_TRANSPORT_STATE, AVC1394_RETRY);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1041
-
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1042
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1043
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1044
-char *avc1394_vcr_decode_status(quadlet_t response)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1045
+char*
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1046
+avc1394_vcr_decode_status(quadlet_t response)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1047
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1048
-	/*quadlet_t resp0 = AVC1394_MASK_RESPONSE_OPERAND(response, 0);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1049
-	quadlet_t resp1 = AVC1394_MASK_RESPONSE_OPERAND(response, 1);*/
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1050
 	quadlet_t resp2 = AVC1394_MASK_RESPONSE_OPERAND(response, 2);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1051
 	quadlet_t resp3 = AVC1394_MASK_RESPONSE_OPERAND(response, 3);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1052
 	
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1053
@@ -274,25 +352,28 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1054
 	quadlet_t *response;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1055
 	char      *output = NULL;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1056
 		
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1057
+    output = malloc(12);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1058
+    if (output == NULL)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1059
+        return NULL;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1060
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1061
 	request[0] = STATVCR0 | AVC1394_VCR_COMMAND_TIME_CODE | 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1062
 		AVC1394_VCR_OPERAND_TIME_CODE_STATUS;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1063
 	request[1] = 0xFFFFFFFF;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1064
-	response = avc1394_transaction_block(handle, node, request, 2, AVC1394_RETRY);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1065
-	if (response == NULL || response[1] == 0xffffffff) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1066
-		avc1394_transaction_block_close(handle);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1067
+    response =
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1068
+        avc1394_transaction_block(handle, node, request, 2, AVC1394_RETRY);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1069
+    if (response == NULL) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1070
+        free(output);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1071
 		return NULL;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1072
 	}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1073
 	
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1074
-	output = malloc(12);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1075
-	if (output)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1076
 		// consumer timecode format
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1077
-		sprintf(output, "%2.2x:%2.2x:%2.2x:%2.2x",
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1078
+    (void) snprintf(output, 12, "%2.2x:%2.2x:%2.2x:%2.2x",
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1079
 			response[1] & 0x000000ff,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1080
 			(response[1] >> 8) & 0x000000ff,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1081
 			(response[1] >> 16) & 0x000000ff,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1082
 			(response[1] >> 24) & 0x000000ff);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1083
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1084
-	avc1394_transaction_block_close(handle);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1085
+    free(response);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1086
 	return output;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1087
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1088
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1089
@@ -307,19 +388,17 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1090
 		AVC1394_VCR_OPERAND_TIME_CODE_STATUS;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1091
 	request[1] = 0xFFFFFFFF;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1092
 	response = avc1394_transaction_block(handle, node, request, 2, AVC1394_RETRY);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1093
-	if (response == NULL || response[1] == 0xffffffff) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1094
-		avc1394_transaction_block_close(handle);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1095
+    if (response == NULL) {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1096
 		return -1;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1097
 	}
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1098
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1099
 	// consumer timecode format
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1100
-	sprintf(output, "%2.2x:%2.2x:%2.2x:%2.2x",
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1101
+    (void) sprintf(output, "%2.2x:%2.2x:%2.2x:%2.2x",
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1102
 		response[1] & 0x000000ff,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1103
 		(response[1] >> 8) & 0x000000ff,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1104
 		(response[1] >> 16) & 0x000000ff,
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1105
 		(response[1] >> 24) & 0x000000ff);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1106
 	
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1107
-	avc1394_transaction_block_close(handle);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1108
 	return 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1109
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1110
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1111
@@ -335,13 +414,17 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1112
 		AVC1394_VCR_OPERAND_TIME_CODE_CONTROL;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1113
 	
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1114
 	// consumer timecode format
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1115
-	sscanf(timecode, "%2x:%2x:%2x:%2x", &hh, &mm, &ss, &ff);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1116
+	if (sscanf(timecode, "%2x:%2x:%2x:%2x", &hh, &mm, &ss, &ff) != 4)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1117
+            solaris_bad_error(__FILE__, __LINE__, "sscanf", 0);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1118
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1119
 	request[1] = 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1120
 		((ff & 0x000000ff) << 24) |
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1121
 		((ss & 0x000000ff) << 16) |
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1122
 		((mm & 0x000000ff) <<  8) |
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1123
 		((hh & 0x000000ff) <<  0) ;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1124
-	printf("timecode: %08x\n", request[1]);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1125
+	(void) fprintf(stderr, "timecode: %08x\n", request[1]);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1126
 	
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1127
-	avc1394_send_command_block( handle, node, request, 2);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1128
+	if (avc1394_send_command_block( handle, node, request, 2) != 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1129
+            send_command_failed(errno, "avc1394_vcr_seek_timecode");
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1130
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1131
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1132
diff -ur libavc1394-0.5.3.orig/librom1394/rom1394_internal.h libavc1394-0.5.3/librom1394/rom1394_internal.h
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1133
--- libavc1394-0.5.3.orig/librom1394/rom1394_internal.h	2006-04-13 23:16:41.000000000 +0700
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1134
+++ libavc1394-0.5.3/librom1394/rom1394_internal.h	2007-09-30 21:17:18.895748546 +0700
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1135
@@ -35,10 +35,10 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1136
 #define NODECHECK(handle, node) \
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1137
 	if ( ((int16_t) node < 0) || node >= raw1394_get_nodecount( (raw1394handle_t) handle)) FAIL(node,"invalid node"); 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1138
 #ifdef ROM1394_DEBUG
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1139
-#define DEBUG(node, s, args...) \
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1140
-printf("rom1394_%i debug: " s "\n", node, ## args)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1141
+#define DEBUG(node, s, args, ...) \
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1142
+printf("rom1394_%i debug: " s "\n", node, ##args)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1143
 #else
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1144
-#define DEBUG(node, s, args...)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1145
+#define DEBUG(node, s, args, ...)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1146
 #endif
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1147
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1148
 int
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1149
diff -ur libavc1394-0.5.3.orig/librom1394/rom1394_main.c libavc1394-0.5.3/librom1394/rom1394_main.c
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1150
--- libavc1394-0.5.3.orig/librom1394/rom1394_main.c	2006-04-13 23:16:41.000000000 +0700
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1151
+++ libavc1394-0.5.3/librom1394/rom1394_main.c	2007-09-30 21:12:13.684762999 +0700
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1152
@@ -25,12 +25,18 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1153
 #include "rom1394.h"
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1154
 #include "rom1394_internal.h"
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1155
 #include "../common/raw1394util.h"
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1156
+#include <libraw1394/csr.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1157
+#include <libraw1394/solaris.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1158
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1159
 #include <netinet/in.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1160
 #include <stdio.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1161
 #include <stdlib.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1162
 #include <string.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1163
 #include <malloc.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1164
 #include <math.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1165
+#if defined(sun) || defined(__sun)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1166
+#include <sys/av/iec61883.h>
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1167
+#endif
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1168
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1169
 #define MAXLINE 80
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1170
 #define MAX_OFFSETS	256
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1171
@@ -53,16 +59,16 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1172
 	
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1173
 quadlet_t rom1394_get_bus_id(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1174
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1175
+    int fd;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1176
 	quadlet_t 	quadlet;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1177
-	octlet_t 	offset;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1178
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1179
-	NODECHECK(handle, node);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1180
-	offset = CSR_REGISTER_BASE + CSR_CONFIG_ROM + ROM1394_BUS_ID;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1181
-	QUADREADERR (handle, node, offset, &quadlet);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1182
-	quadlet = htonl (quadlet);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1183
+    fd = solaris_get_fd(handle, node, 1);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1184
+    if (fd < 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1185
+        return -1;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1186
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1187
+    if (ioctl(fd, IEC61883_NODE_GET_BUS_NAME, &quadlet) != 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1188
+        return -1;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1189
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1190
-	if (quadlet != 0x31333934)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1191
-		WARN (node, "invalid bus id", offset);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1192
     return quadlet;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1193
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1194
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1195
@@ -87,20 +93,15 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1196
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1197
 octlet_t rom1394_get_guid(raw1394handle_t handle, nodeid_t node)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1198
 {
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1199
-	quadlet_t 	quadlet;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1200
-	octlet_t 	offset;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1201
+    int fd;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1202
 	octlet_t    guid = 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1203
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1204
-	NODECHECK(handle, node);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1205
-	offset = CSR_REGISTER_BASE + CSR_CONFIG_ROM + ROM1394_GUID_HI;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1206
-	QUADREADERR (handle, node, offset, &quadlet);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1207
-	quadlet = htonl (quadlet);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1208
-	guid = quadlet;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1209
-	guid <<= 32;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1210
-	offset = CSR_REGISTER_BASE + CSR_CONFIG_ROM + ROM1394_GUID_LO;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1211
-	QUADREADERR (handle, node, offset, &quadlet);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1212
-	quadlet = htonl (quadlet);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1213
-	guid += quadlet;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1214
+    fd = solaris_get_fd(handle, node, 1);
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1215
+    if (fd < 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1216
+        return -1;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1217
+
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1218
+    if (ioctl(fd, IEC61883_NODE_GET_UID, &guid) != 0)
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1219
+        return -1;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1220
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1221
     return guid;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1222
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1223
@@ -361,3 +362,4 @@
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1224
 
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1225
 	return 0;
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1226
 }
6a1d01ce9198 2007-10-03 Doug Scott <[email protected]>
drdoug007
parents:
diff changeset
  1227
+