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 #ifndef lint
00032 static char copyright[] =
00033 "@(#) Copyright (c) 2002-2004\n\
00034 Netherlands Forensic Institute. All rights reserved.\n";
00035 #endif
00036
00037 #ifdef HAVE_CONFIG_H
00038 #include "config.h"
00039 #endif
00040
00041 #include <stdlib.h>
00042 #include <string.h>
00043 #include <sys/types.h>
00044 #include <errno.h>
00045 #include <unistd.h>
00046 #include <fcntl.h>
00047
00048 #include "rdd.h"
00049 #include "reader.h"
00050
00051 typedef struct _RDD_CDROMREADER_STATE
00052 {
00053 char *path;
00054 rdd_count_t pos;
00055 } RDD_CDROMREADER_STATE;
00056
00057
00058
00059 static int
00060 rdd_cdrom_read(RDD_READER *self, unsigned char *buf, unsigned nbyte, unsigned *nread);
00061 static int
00062 rdd_cdrom_tell(RDD_READER *self, rdd_count_t *pos);
00063 static int
00064 rdd_cdrom_seek(RDD_READER *self, rdd_count_t pos);
00065 static int
00066 rdd_cdrom_close(RDD_READER *self, int recurse);
00067
00068 static RDD_READ_OPS
00069 fd_read_ops = { rdd_cdrom_read, rdd_cdrom_tell, rdd_cdrom_seek, rdd_cdrom_close };
00070
00071 int
00072 rdd_open_cdrom_reader(RDD_READER **self, const char *path)
00073 {
00074 RDD_READER *r = 0;
00075 RDD_CDROMREADER_STATE *state = 0;
00076 char *devpath = 0;
00077 int rc = RDD_OK;
00078
00079 *self = 0;
00080
00081 if (path == NULL)
00082 {
00083 return RDD_BADARG;
00084 }
00085
00086 rc = rdd_new_reader(&r, &fd_read_ops, sizeof(RDD_CDROMREADER_STATE));
00087 if (rc != RDD_OK)
00088 {
00089 return rc;
00090 }
00091
00092 if ((devpath = malloc(strlen(path) + 1)) == 0)
00093 {
00094
00095
00096 return RDD_NOMEM;
00097 }
00098 strcpy(devpath, path);
00099
00100 state = (RDD_CDROMREADER_STATE *) r->state;
00101 state->path = devpath;
00102 state->pos = 0;
00103
00104 *self = r;
00105 return RDD_OK;
00106 }
00107
00108 static int
00109 rdd_cdrom_read(RDD_READER *self, unsigned char *buf, unsigned nbyte, unsigned *nread)
00110 {
00111 RDD_CDROMREADER_STATE *state = self->state;
00112 unsigned char *next = buf;
00113 off_t offset;
00114 int fd = -1;
00115 int rc = RDD_OK;
00116 int n;
00117
00118 if ((fd = open(state->path, O_RDONLY)) < 0)
00119 {
00120 rc = RDD_EOPEN;
00121 goto error;
00122 }
00123
00124 if ((offset = lseek(fd, (off_t) state->pos, SEEK_SET)) == (off_t) -1)
00125 {
00126 rc = RDD_ESEEK;
00127 goto error;
00128 }
00129
00130 while (nbyte > 0)
00131 {
00132 n = read(fd, next, nbyte);
00133 if (n < 0)
00134 {
00135 #if defined(RDD_SIGNALS)
00136 if (errno == EINTR) continue;
00137 #endif
00138 rc = RDD_EREAD;
00139 goto error;
00140 }
00141 else if (n == 0)
00142 {
00143 break;
00144 }
00145 nbyte -= n;
00146 next += n;
00147 }
00148
00149 (void) close(fd);
00150
00151 *nread = next - buf;
00152 return RDD_OK;
00153
00154 error: if (fd >= 0)
00155 (void) close(fd);
00156 return rc;
00157 }
00158
00159 static int
00160 rdd_cdrom_tell(RDD_READER *self, rdd_count_t *pos)
00161 {
00162 RDD_CDROMREADER_STATE *state = self->state;
00163
00164 *pos = (rdd_count_t) state->pos;
00165 return RDD_OK;
00166 }
00167
00168 static int
00169 rdd_cdrom_seek(RDD_READER *self, rdd_count_t pos)
00170 {
00171 RDD_CDROMREADER_STATE *state = self->state;
00172
00173 state->pos = pos;
00174
00175 return RDD_OK;
00176 }
00177
00178 static int
00179 rdd_cdrom_close(RDD_READER *self, int recurse )
00180 {
00181 return RDD_OK;
00182 }