00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef lint
00034 static char copyright[] =
00035 "@(#) Copyright (c) 2002-2004\n\
00036 Netherlands Forensic Institute. All rights reserved.\n";
00037 #endif
00038
00039
00040 #ifdef HAVE_CONFIG_H
00041 #include "config.h"
00042 #endif
00043
00044 #include <stdlib.h>
00045
00046 #include "rdd.h"
00047 #include "reader.h"
00048
00049 int
00050 rdd_new_reader(RDD_READER **self, RDD_READ_OPS *ops, unsigned statesize)
00051 {
00052 RDD_READER *r = 0;
00053
00054 if (self == 0 || ops == 0) return RDD_BADARG;
00055
00056 if ((r = calloc(1, sizeof(RDD_READER))) == 0) {
00057 return RDD_NOMEM;
00058 }
00059 if ((r->state = calloc(1, statesize)) == 0) {
00060 free(r);
00061 return RDD_NOMEM;
00062 }
00063
00064 r->ops = ops;
00065
00066 *self = r;
00067 return RDD_OK;
00068 }
00069
00070 int
00071 rdd_reader_read(RDD_READER *r, unsigned char *buf, unsigned nbyte,
00072 unsigned *nread)
00073 {
00074 return (*(r->ops->read))(r, buf, nbyte, nread);
00075 }
00076
00077 int
00078 rdd_reader_tell(RDD_READER *r, rdd_count_t *pos)
00079 {
00080 return (*(r->ops->tell))(r, pos);
00081 }
00082
00083 int
00084 rdd_reader_seek(RDD_READER *r, rdd_count_t pos)
00085 {
00086 return (*(r->ops->seek))(r, pos);
00087 }
00088
00089 int
00090 rdd_reader_skip(RDD_READER *r, rdd_count_t skip)
00091 {
00092 rdd_count_t pos;
00093 int rc;
00094
00095 if ((rc = rdd_reader_tell(r, &pos)) != RDD_OK) {
00096 return rc;
00097 }
00098
00099 if ((rc = rdd_reader_seek(r, pos + skip)) != RDD_OK) {
00100 return rc;
00101 }
00102
00103 return RDD_OK;
00104 }
00105
00106 int
00107 rdd_reader_close(RDD_READER *r, int recurse)
00108 {
00109 int rc;
00110
00111 rc = (*(r->ops->close))(r, recurse);
00112 if (rc != RDD_OK) {
00113 return rc;
00114 }
00115
00116 free(r->state);
00117 r->state = 0;
00118 free(r);
00119 return RDD_OK;
00120 }