#include #include #include #ifdef _SOLARIS_ #define BUF_TYPE void * #else #define BUF_TYPE char * #endif static int read_cb (BUF_TYPE user_data, char *data, int size); static int write_cb (BUF_TYPE user_data, char *data, int size); static int read_cb (BUF_TYPE user_data, char *data, int size) { FILE *f; int count; if (!user_data) return -1; f = (FILE *) user_data; printf (" + caller ask to read (%d) bytes of data\n", size); count = fread (data, 1, size, f); printf (" + read (%d) items\n", count); if (!count) return -1; return count; } static int write_cb (BUF_TYPE user_data, char *data, int size) { FILE *f; int count; if (!user_data) return -1; f = (FILE *) user_data; printf (" + caller ask to write (%d) bytes of data\n", size); count = fwrite (data, 1, size, f); printf (" + wrote (%d) items\n", count); return count; } int main () { XDR xdr; FILE *f; int val; f = fopen ("tata", "w"); if (!f) { perror ("> fopen () failed"); return 2; } xdr.x_ops = NULL; xdr.x_op = XDR_ENCODE; xdrrec_create (&xdr, 0, 0, (void *) f, read_cb, write_cb); if (!xdr.x_ops) return 1; for (val = 3; val < 6; val++) { if (!xdr_int (&xdr, &val)) { fprintf (stderr, "Encode process failed\n"); return 1; } printf ("> encoded value : %d\n", val); } if (!xdrrec_endofrecord (&xdr, TRUE)) { fprintf (stderr, "Failed flushing the XDR stream, trying to read\n"); /* return 3; */ } xdr_destroy (&xdr); fclose (f); /* ----------------------------------------------------------------- */ f = fopen ("tata", "r"); if (!f) { perror ("> fopen () failed"); return 2; } xdr.x_ops = NULL; xdr.x_op = XDR_DECODE; xdrrec_create (&xdr, 0, 0, (void *) f, read_cb, write_cb); if (!xdr.x_ops) exit (1); xdrrec_skiprecord (&xdr); val = -1; while (1) { if (!xdr_int (&xdr, &val)) { if (xdrrec_eof (&xdr)) break; fprintf (stderr, "Decode process failed, skipping record\n"); xdrrec_skiprecord (&xdr); continue; } printf ("> decoded value : %d\n", val); } xdr_destroy (&xdr); fclose (f); return 0; }