[GRASS-dev] native WinGRASS and attribute data deadlock, next try
Glynn Clements
glynn at gclements.plus.com
Sun Oct 7 17:04:50 EDT 2007
Glynn Clements wrote:
> My preferred approach would be to change lib/db/dbmi_base to simply
> not use XDR (that isn't anywhere near as much work as it might sound).
I have attached a patch to do this. I haven't committed it yet in case
it breaks anything (and if it breaks anything, it may break a lot of
things).
Could someone familiar with DBMI and vectors test it out?
--
Glynn Clements <glynn at gclements.plus.com>
-------------- next part --------------
Index: include/proto_dbmi.h
===================================================================
RCS file: /grassrepository/grass6/include/proto_dbmi.h,v
retrieving revision 1.28
diff -u -r1.28 proto_dbmi.h
--- include/proto_dbmi.h 27 Jun 2007 16:31:51 -0000 1.28
+++ include/proto_dbmi.h 7 Oct 2007 20:50:35 -0000
@@ -245,19 +245,19 @@
int db__send_column_value P((dbColumn *column ));
int db__send_datetime P((dbDateTime *t ));
int db__send_double P((double d ));
-int db__send_double_array P((double *x , int n ));
+int db__send_double_array P((const double *x , int n ));
int db__send_failure P((void ));
int db__send_float P((float d ));
-int db__send_float_array P((float *x , int n ));
+int db__send_float_array P((const float *x , int n ));
int db__send_handle P((dbHandle *handle ));
int db__send_index P((dbIndex *index ));
int db__send_index_array P((dbIndex *list , int count ));
int db__send_int P((int n ));
-int db__send_int_array P((int *x , int n ));
+int db__send_int_array P((const int *x , int n ));
int db__send_procedure_not_implemented P((int n ));
int db__send_procedure_ok P((int n ));
int db__send_short P((int n ));
-int db__send_short_array P((short *x , int n ));
+int db__send_short_array P((const short *x , int n ));
int db__send_string P((dbString *x ));
int db__send_string_array P((dbString *a , int count ));
int db__send_success P((void ));
Index: lib/db/dbmi_base/xdr.c
===================================================================
RCS file: /grassrepository/grass6/lib/db/dbmi_base/xdr.c,v
retrieving revision 1.5
diff -u -r1.5 xdr.c
--- lib/db/dbmi_base/xdr.c 26 Apr 2007 16:44:44 -0000 1.5
+++ lib/db/dbmi_base/xdr.c 7 Oct 2007 20:50:35 -0000
@@ -15,47 +15,84 @@
*****************************************************************************/
#include "xdr.h"
+#ifdef __MINGW32__
+#define USE_STDIO 0
+#define USE_READN 1
+#else
+#define USE_STDIO 1
+#define USE_READN 0
+#endif
+
+#ifndef USE_STDIO
+#include <unistd.h>
+#endif
+
static FILE *_send, *_recv;
-void
-db__set_protocol_fds (FILE *send, FILE *recv)
-{
- _send = send;
- _recv = recv;
-}
+#if USE_READN
-int
-xdr_begin_send(XDR *xdrs)
+static ssize_t readn(int fd, void *buf, size_t count)
{
- xdrstdio_create (xdrs, _send, XDR_ENCODE);
+ ssize_t total = 0;
+
+ while (total < count)
+ {
+ ssize_t n = read(fd, (char *) buf + total, count - total)
+ if (n < 0)
+ return n;
+ if (n == 0)
+ break;
+ total += n;
+ }
- return 0;
+ return total;
}
-int
-xdr_begin_recv(XDR *xdrs)
+static ssize_t writen(int fd, const void *buf, size_t count)
{
- xdrstdio_create (xdrs, _recv, XDR_DECODE);
+ ssize_t total = 0;
- return 0;
+ while (total < count)
+ {
+ ssize_t n = write(fd, (const char *) buf + total, count - total)
+ if (n < 0)
+ return n;
+ if (n == 0)
+ break;
+ total += n;
+ }
+
+ return total;
}
-int
-xdr_end_send(XDR *xdrs)
-{
- fflush(_send);
- xdr_destroy (xdrs);
+#endif
- return 0;
+void
+db__set_protocol_fds (FILE *send, FILE *recv)
+{
+ _send = send;
+ _recv = recv;
}
-int
-xdr_end_recv(XDR *xdrs)
+int db__send(const void *buf, size_t size)
{
- xdr_destroy (xdrs);
-
- return 0;
+#if USE_STDIO
+ return fwrite(buf, 1, size, _send) == size;
+#elif USE_READN
+ return writen(fileno(_send), buf, size) == size;
+#else
+ return write(fileno(_send), buf, size) == size;
+#endif
}
-
+int db__recv(void *buf, size_t size)
+{
+#if USE_STDIO
+ return fread(buf, 1, size, _recv) == size;
+#elif USE_READN
+ return readn(fileno(_recv), buf, size) == size;
+#else
+ return read(fileno(_recv), buf, size) == size;
+#endif
+}
Index: lib/db/dbmi_base/xdr.h
===================================================================
RCS file: /grassrepository/grass6/lib/db/dbmi_base/xdr.h,v
retrieving revision 1.5
diff -u -r1.5 xdr.h
--- lib/db/dbmi_base/xdr.h 9 Feb 2006 03:08:54 -0000 1.5
+++ lib/db/dbmi_base/xdr.h 7 Oct 2007 20:50:35 -0000
@@ -1,13 +1,6 @@
-#ifdef __MINGW32__
-#include <rpc/types.h>
-#include <rpc/xdr.h>
-#else
-#include <rpc/rpc.h>
-#endif
-
+#include <stdio.h>
#include <grass/dbmi.h>
-int xdr_begin_send(XDR *xdrs);
-int xdr_begin_recv(XDR *xdrs);
-int xdr_end_send(XDR *xdrs);
-int xdr_end_recv(XDR *xdrs);
+extern int db__send(const void *, size_t);
+extern int db__recv(void *, size_t);
+
Index: lib/db/dbmi_base/xdrchar.c
===================================================================
RCS file: /grassrepository/grass6/lib/db/dbmi_base/xdrchar.c,v
retrieving revision 1.2
diff -u -r1.2 xdrchar.c
--- lib/db/dbmi_base/xdrchar.c 5 Oct 2006 06:13:28 -0000 1.2
+++ lib/db/dbmi_base/xdrchar.c 7 Oct 2007 20:50:35 -0000
@@ -4,17 +4,11 @@
int
db__send_char(int d)
{
- XDR xdrs;
- int stat;
- char c;
+ int stat = DB_OK;
+ char c = (char) d;
- stat = DB_OK;
- c = d;
-
- xdr_begin_send (&xdrs);
- if(!xdr_char (&xdrs, &c))
+ if (!db__send(&c, sizeof(c)))
stat = DB_PROTOCOL_ERR;
- xdr_end_send (&xdrs);
if (stat == DB_PROTOCOL_ERR)
db_protocol_error();
@@ -26,14 +20,10 @@
int
db__recv_char (char *d)
{
- XDR xdrs;
- int stat;
+ int stat = DB_OK;
- stat = DB_OK;
- xdr_begin_recv (&xdrs);
- if(!xdr_char (&xdrs, d))
+ if (!db__recv(d, sizeof(*d)))
stat = DB_PROTOCOL_ERR;
- xdr_end_recv (&xdrs);
if (stat == DB_PROTOCOL_ERR)
db_protocol_error();
Index: lib/db/dbmi_base/xdrdouble.c
===================================================================
RCS file: /grassrepository/grass6/lib/db/dbmi_base/xdrdouble.c,v
retrieving revision 1.2
diff -u -r1.2 xdrdouble.c
--- lib/db/dbmi_base/xdrdouble.c 5 Oct 2006 06:13:28 -0000 1.2
+++ lib/db/dbmi_base/xdrdouble.c 7 Oct 2007 20:50:35 -0000
@@ -1,20 +1,13 @@
-#include <stdlib.h>
#include "xdr.h"
int
-db__send_double(d)
- double d;
+db__send_double(double d)
{
- XDR xdrs;
- int stat;
+ int stat = DB_OK;
- stat = DB_OK;
-
- xdr_begin_send (&xdrs);
- if(!xdr_double (&xdrs, &d))
+ if (!db__send(&d, sizeof(d)))
stat = DB_PROTOCOL_ERR;
- xdr_end_send (&xdrs);
if (stat == DB_PROTOCOL_ERR)
db_protocol_error();
@@ -25,14 +18,10 @@
int
db__recv_double (double *d)
{
- XDR xdrs;
- int stat;
+ int stat = DB_OK;
- stat = DB_OK;
- xdr_begin_recv (&xdrs);
- if(!xdr_double (&xdrs, d))
+ if (!db__recv(d, sizeof(*d)))
stat = DB_PROTOCOL_ERR;
- xdr_end_recv (&xdrs);
if (stat == DB_PROTOCOL_ERR)
db_protocol_error();
@@ -42,27 +31,15 @@
int
-db__send_double_array (double *x, int n)
+db__send_double_array (const double *x, int n)
{
- XDR xdrs;
- int i;
- int stat;
-
- stat = DB_OK;
+ int stat = DB_OK;
- xdr_begin_send (&xdrs);
-
- if(!xdr_int (&xdrs, &n))
+ if (!db__send(&n, sizeof(n)))
stat = DB_PROTOCOL_ERR;
- for (i = 0; stat == DB_OK && i < n; i++)
- {
- if(!xdr_double (&xdrs, x))
- stat = DB_PROTOCOL_ERR;
- x++;
- }
-
- xdr_end_send (&xdrs);
+ if (!db__send(x, n * sizeof(*x)))
+ stat = DB_PROTOCOL_ERR;
if (stat == DB_PROTOCOL_ERR)
db_protocol_error();
@@ -75,50 +52,22 @@
int
db__recv_double_array (double **x, int *n)
{
- XDR xdrs;
- int i, count, stat;
- double y, *a;
-
- *x = NULL;
- *n = 0;
-
- stat = DB_OK;
- xdr_begin_recv (&xdrs);
- if (xdr_int (&xdrs, &count))
- {
- if (count <= 0)
- stat = DB_PROTOCOL_ERR;
- a = (double *)db_calloc (count, sizeof (double));
- if (a == NULL && stat == DB_OK)
- stat = DB_MEMORY_ERR;
-
- for (i = 0; i < count; i++)
- {
- if (!xdr_double (&xdrs, &y))
- {
- stat = DB_PROTOCOL_ERR;
- break;
- }
- if (a) a[i] = y;
- }
- if (stat != DB_OK)
- {
- if (a != NULL) free(a);
- a = NULL;
- }
- }
- else
- stat = DB_PROTOCOL_ERR;
-
- if (stat == DB_OK)
- {
- *x = a;
- *n = count;
- }
- else if (stat == DB_PROTOCOL_ERR)
- db_protocol_error();
+ int stat = DB_OK;
+ int count = 0;
+ double *a = NULL;
+
+ if (!db__recv(&count, sizeof(count)))
+ stat = DB_PROTOCOL_ERR;
+
+ *n = count;
- xdr_end_recv (&xdrs);
+ *x = a = (double *) db_calloc(count, sizeof(*a));
+
+ if (!db__recv(a, count * sizeof(*a)))
+ stat = DB_PROTOCOL_ERR;
+
+ if (stat == DB_PROTOCOL_ERR)
+ db_protocol_error();
return stat;
}
Index: lib/db/dbmi_base/xdrfloat.c
===================================================================
RCS file: /grassrepository/grass6/lib/db/dbmi_base/xdrfloat.c,v
retrieving revision 1.1
diff -u -r1.1 xdrfloat.c
--- lib/db/dbmi_base/xdrfloat.c 22 May 2003 13:58:00 -0000 1.1
+++ lib/db/dbmi_base/xdrfloat.c 7 Oct 2007 20:50:35 -0000
@@ -1,113 +1,74 @@
-#include <stdlib.h>
#include "xdr.h"
-int db__send_float(float d)
-{
- XDR xdrs;
- int stat;
- stat = DB_OK;
+int
+db__send_float(float d)
+{
+ int stat = DB_OK;
- xdr_begin_send (&xdrs);
- if(!xdr_float (&xdrs, &d))
+ if (!db__send(&d, sizeof(d)))
stat = DB_PROTOCOL_ERR;
- xdr_end_send (&xdrs);
if (stat == DB_PROTOCOL_ERR)
db_protocol_error();
+
return stat;
}
-int db__recv_float (float *d)
+int
+db__recv_float (float *d)
{
- XDR xdrs;
- int stat;
+ int stat = DB_OK;
- stat = DB_OK;
- xdr_begin_recv (&xdrs);
- if(!xdr_float (&xdrs, d))
+ if (!db__recv(d, sizeof(*d)))
stat = DB_PROTOCOL_ERR;
- xdr_end_recv (&xdrs);
if (stat == DB_PROTOCOL_ERR)
db_protocol_error();
+
return stat;
}
-int db__send_float_array (float *x, int n)
-{
- XDR xdrs;
- int i;
- int stat;
-
- stat = DB_OK;
- xdr_begin_send (&xdrs);
+int
+db__send_float_array (const float *x, int n)
+{
+ int stat = DB_OK;
- if(!xdr_int (&xdrs, &n))
+ if (!db__send(&n, sizeof(n)))
stat = DB_PROTOCOL_ERR;
- for (i = 0; stat == DB_OK && i < n; i++)
- {
- if(!xdr_float (&xdrs, x))
- stat = DB_PROTOCOL_ERR;
- x++;
- }
- xdr_end_send (&xdrs);
+ if (!db__send(x, n * sizeof(*x)))
+ stat = DB_PROTOCOL_ERR;
if (stat == DB_PROTOCOL_ERR)
db_protocol_error();
+
return stat;
}
/* returns an allocated array of floats */
/* caller is responsible for free() */
-
-int db__recv_float_array (float **x, int *n)
+int
+db__recv_float_array (float **x, int *n)
{
- XDR xdrs;
- int i, count, stat;
- float y, *a;
-
- *x = NULL;
- *n = 0;
-
- stat = DB_OK;
- xdr_begin_recv (&xdrs);
- if (xdr_int (&xdrs, &count))
- {
- if (count <= 0)
- stat = DB_PROTOCOL_ERR;
- a = (float *)db_calloc (count, sizeof (float));
- if (a == NULL && stat == DB_OK)
- stat = DB_MEMORY_ERR;
-
- for (i = 0; i < count; i++)
- {
- if (!xdr_float (&xdrs, &y))
- {
- stat = DB_PROTOCOL_ERR;
- break;
- }
- if (a) a[i] = y;
- }
- if (stat != DB_OK)
- {
- if (a != NULL) free(a);
- a = NULL;
- }
- }
- else
- stat = DB_PROTOCOL_ERR;
-
- if (stat == DB_OK)
- {
- *x = a;
- *n = count;
- }
- else if (stat == DB_PROTOCOL_ERR)
+ int stat = DB_OK;
+ int count = 0;
+ float *a = NULL;
+
+ if (!db__recv(&count, sizeof(count)))
+ stat = DB_PROTOCOL_ERR;
+
+ *n = count;
+
+ *x = a = (float *) db_calloc(count, sizeof(*a));
+
+ if (!db__recv(a, count * sizeof(*a)))
+ stat = DB_PROTOCOL_ERR;
+
+ if (stat == DB_PROTOCOL_ERR)
db_protocol_error();
- xdr_end_recv (&xdrs);
return stat;
}
+
Index: lib/db/dbmi_base/xdrint.c
===================================================================
RCS file: /grassrepository/grass6/lib/db/dbmi_base/xdrint.c,v
retrieving revision 1.2
diff -u -r1.2 xdrint.c
--- lib/db/dbmi_base/xdrint.c 5 Oct 2006 06:13:28 -0000 1.2
+++ lib/db/dbmi_base/xdrint.c 7 Oct 2007 20:50:35 -0000
@@ -1,37 +1,27 @@
-#include <stdlib.h>
#include "xdr.h"
int
db__send_int(int n)
{
- XDR xdrs;
- int stat;
+ int stat = DB_OK;
- stat = DB_OK;
-
- xdr_begin_send (&xdrs);
- if(!xdr_int (&xdrs, &n))
+ if (!db__send(&n, sizeof(n)))
stat = DB_PROTOCOL_ERR;
- xdr_end_send (&xdrs);
if (stat == DB_PROTOCOL_ERR)
db_protocol_error();
+
return stat;
}
int
db__recv_int (int *n)
{
- XDR xdrs;
- int stat;
+ int stat = DB_OK;
- stat = DB_OK;
-
- xdr_begin_recv (&xdrs);
- if(!xdr_int (&xdrs, n))
+ if (!db__recv(n, sizeof(*n)))
stat = DB_PROTOCOL_ERR;
- xdr_end_recv (&xdrs);
if (stat == DB_PROTOCOL_ERR)
db_protocol_error();
@@ -40,28 +30,19 @@
}
int
-db__send_int_array (int *x, int n)
+db__send_int_array (const int *x, int n)
{
- XDR xdrs;
- int i;
- int stat;
-
- stat = DB_OK;
-
- xdr_begin_send (&xdrs);
- if(!xdr_int (&xdrs, &n))
- stat = DB_PROTOCOL_ERR;
- for (i = 0; stat == DB_OK && i < n; i++)
- {
- if(!xdr_int (&xdrs, x))
- stat = DB_PROTOCOL_ERR;
- x++;
- }
+ int stat = DB_OK;
+
+ if (!db__send(&n, sizeof(n)))
+ stat = DB_PROTOCOL_ERR;
- xdr_end_send (&xdrs);
+ if (!db__send(x, n * sizeof(*x)))
+ stat = DB_PROTOCOL_ERR;
if (stat == DB_PROTOCOL_ERR)
db_protocol_error();
+
return stat;
}
@@ -70,51 +51,22 @@
int
db__recv_int_array (int **x, int *n)
{
- XDR xdrs;
- int i, count, stat;
- int y, *a;
-
- *x = NULL;
- *n = 0;
-
- stat = DB_OK;
- xdr_begin_recv (&xdrs);
- if (xdr_int (&xdrs, &count))
- {
- if (count <= 0)
- stat = DB_PROTOCOL_ERR;
-
- a = (int *)db_calloc (count, sizeof (int));
- if (a == NULL && stat == DB_OK)
- stat = DB_MEMORY_ERR;
-
- for (i = 0; i < count; i++)
- {
- if (!xdr_int (&xdrs, &y))
- {
- stat = DB_PROTOCOL_ERR;
- break;
- }
- if (a) a[i] = y;
- }
- if (stat != DB_OK)
- {
- if (a != NULL) free(a);
- a = NULL;
- }
- }
- else
- stat = DB_PROTOCOL_ERR;
-
- if (stat == DB_OK)
- {
- *x = a;
- *n = count;
- }
- else if (stat == DB_PROTOCOL_ERR)
- db_protocol_error();
+ int stat = DB_OK;
+ int count = 0;
+ int *a = NULL;
- xdr_end_recv (&xdrs);
+ if (!db__recv(&count, sizeof(count)))
+ stat = DB_PROTOCOL_ERR;
+
+ *n = count;
+
+ *x = a = (int *) db_calloc(count, sizeof(*a));
+
+ if (!db__recv(a, count * sizeof(*a)))
+ stat = DB_PROTOCOL_ERR;
+
+ if (stat == DB_PROTOCOL_ERR)
+ db_protocol_error();
return stat;
}
Index: lib/db/dbmi_base/xdrprocedure.c
===================================================================
RCS file: /grassrepository/grass6/lib/db/dbmi_base/xdrprocedure.c,v
retrieving revision 1.2
diff -u -r1.2 xdrprocedure.c
--- lib/db/dbmi_base/xdrprocedure.c 5 Oct 2006 06:13:28 -0000 1.2
+++ lib/db/dbmi_base/xdrprocedure.c 7 Oct 2007 20:50:35 -0000
@@ -35,15 +35,10 @@
int
db__recv_procnum (int *n)
{
- XDR xdrs;
- int stat;
+ int stat = DB_OK;
- stat = DB_OK;
-
- xdr_begin_recv (&xdrs);
- if(!xdr_int (&xdrs, n))
+ if (!db__recv(n, sizeof(*n)))
stat = DB_EOF;
- xdr_end_recv (&xdrs);
return stat;
}
Index: lib/db/dbmi_base/xdrshort.c
===================================================================
RCS file: /grassrepository/grass6/lib/db/dbmi_base/xdrshort.c,v
retrieving revision 1.2
diff -u -r1.2 xdrshort.c
--- lib/db/dbmi_base/xdrshort.c 5 Oct 2006 06:13:28 -0000 1.2
+++ lib/db/dbmi_base/xdrshort.c 7 Oct 2007 20:50:35 -0000
@@ -5,18 +5,11 @@
int
db__send_short(int n)
{
- XDR xdrs;
- int stat;
- short h;
+ int stat = DB_OK;
+ short h = (short) n;
- h = n;
-
- stat = DB_OK;
-
- xdr_begin_send (&xdrs);
- if(!xdr_short (&xdrs, &h))
+ if (!db__send(&h, sizeof(h)))
stat = DB_PROTOCOL_ERR;
- xdr_end_send (&xdrs);
if (stat == DB_PROTOCOL_ERR)
db_protocol_error();
@@ -27,15 +20,10 @@
int
db__recv_short (short *n)
{
- XDR xdrs;
- int stat;
+ int stat = DB_OK;
- stat = DB_OK;
-
- xdr_begin_recv (&xdrs);
- if(!xdr_short (&xdrs, n))
+ if (!db__recv(n, sizeof(*n)))
stat = DB_PROTOCOL_ERR;
- xdr_end_recv (&xdrs);
if (stat == DB_PROTOCOL_ERR)
db_protocol_error();
@@ -44,25 +32,15 @@
}
int
-db__send_short_array (short *x, int n)
+db__send_short_array (const short *x, int n)
{
- XDR xdrs;
- int i;
- int stat;
-
- stat = DB_OK;
-
- xdr_begin_send (&xdrs);
- if(!xdr_int (&xdrs, &n))
- stat = DB_PROTOCOL_ERR;
- for (i = 0; stat == DB_OK && i < n; i++)
- {
- if(!xdr_short (&xdrs, x))
- stat = DB_PROTOCOL_ERR;
- x++;
- }
+ int stat = DB_OK;
+
+ if (!db__send(&n, sizeof(n)))
+ stat = DB_PROTOCOL_ERR;
- xdr_end_send (&xdrs);
+ if (!db__send(x, n * sizeof(*x)))
+ stat = DB_PROTOCOL_ERR;
if (stat == DB_PROTOCOL_ERR)
db_protocol_error();
@@ -70,56 +48,28 @@
return stat;
}
-/* returns an allocated array of shorts */
+/* returns an allocated array of ints */
/* caller is responsible for free() */
int
db__recv_short_array (short **x, int *n)
{
- XDR xdrs;
- int i, count, stat;
- short y, *a;
-
- *x = NULL;
- *n = 0;
-
- stat = DB_OK;
- xdr_begin_recv (&xdrs);
- if (xdr_int (&xdrs, &count))
- {
- if (count <= 0)
- stat = DB_PROTOCOL_ERR;
-
- a = (short *)db_calloc (count, sizeof (short));
- if (a == NULL && stat == DB_OK)
- stat = DB_MEMORY_ERR;
-
- for (i = 0; i < count; i++)
- {
- if (!xdr_short (&xdrs, &y))
- {
- stat = DB_PROTOCOL_ERR;
- break;
- }
- if (a) a[i] = y;
- }
- if (stat != DB_OK)
- {
- if (a != NULL) free(a);
- a = NULL;
- }
- }
- else
- stat = DB_PROTOCOL_ERR;
-
- if (stat == DB_OK)
- {
- *x = a;
- *n = count;
- }
- else if (stat == DB_PROTOCOL_ERR)
- db_protocol_error();
+ int stat = DB_OK;
+ int count = 0;
+ short *a = NULL;
+
+ if (!db__recv(&count, sizeof(count)))
+ stat = DB_PROTOCOL_ERR;
+
+ *n = count;
+
+ *x = a = (short *) db_calloc(count, sizeof(*a));
+
+ if (!db__recv(a, count * sizeof(*a)))
+ stat = DB_PROTOCOL_ERR;
- xdr_end_recv (&xdrs);
+ if (stat == DB_PROTOCOL_ERR)
+ db_protocol_error();
return stat;
}
+
Index: lib/db/dbmi_base/xdrstring.c
===================================================================
RCS file: /grassrepository/grass6/lib/db/dbmi_base/xdrstring.c,v
retrieving revision 1.2
diff -u -r1.2 xdrstring.c
--- lib/db/dbmi_base/xdrstring.c 5 Oct 2006 06:13:28 -0000 1.2
+++ lib/db/dbmi_base/xdrstring.c 7 Oct 2007 20:50:35 -0000
@@ -1,5 +1,4 @@
#include <string.h>
-#include <stdlib.h>
#include "xdr.h"
@@ -57,24 +56,18 @@
int
db__send_string(dbString *x)
{
- XDR xdrs;
- int len;
- int stat;
- char *s;
-
+ int stat = DB_OK;
+ const char *s = db_get_string(x);
+ int len = s ? strlen(s) + 1 : 1;
- stat = DB_OK;
+ if (!s)
+ s = ""; /* don't send a NULL string */
- s = db_get_string (x);
- if (s == NULL) s = ""; /* can't send a NULL string */
- len = strlen(s)+1;
-
- xdr_begin_send (&xdrs);
- if(!xdr_int (&xdrs, &len))
+ if (!db__send(&len, sizeof(len)))
stat = DB_PROTOCOL_ERR;
- else if(!xdr_string (&xdrs, &s, len))
+
+ if (!db__send(s, len))
stat = DB_PROTOCOL_ERR;
- xdr_end_send (&xdrs);
if (stat == DB_PROTOCOL_ERR)
db_protocol_error();
@@ -94,27 +87,24 @@
int
db__recv_string(dbString *x)
{
- XDR xdrs;
+ int stat = DB_OK;
int len;
- int stat;
char *s;
- stat = DB_OK;
- xdr_begin_recv (&xdrs);
- if(!xdr_int (&xdrs, &len) || len <= 0) /* len will include the null byte */
- {
+ if (!db__recv(&len, sizeof(len)))
+ stat = DB_PROTOCOL_ERR;
+
+ if (len <= 0) /* len will include the null byte */
+ stat = DB_PROTOCOL_ERR;
+
+ if (db_enlarge_string(x, len) != DB_OK)
stat = DB_PROTOCOL_ERR;
- }
- else
- {
- stat = db_enlarge_string (x, len);
- }
s = db_get_string(x);
- if(stat == DB_OK && !xdr_string (&xdrs, &s, len))
+
+ if (!db__recv(s, len))
stat = DB_PROTOCOL_ERR;
- xdr_end_recv (&xdrs);
if (stat == DB_PROTOCOL_ERR)
db_protocol_error();
More information about the grass-dev
mailing list