/[pearpc]/src/io/prom/fs/hfs/os.cc
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /src/io/prom/fs/hfs/os.cc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (hide annotations)
Wed Sep 5 17:11:21 2007 UTC (16 years, 8 months ago) by dpavlin
File size: 5406 byte(s)
import upstream CVS
1 dpavlin 1 /*
2     * libhfs - library for reading and writing Macintosh HFS volumes
3     * Copyright (C) 1996-1998 Robert Leslie
4     * Modified for use with PearPC (c) 2004 Stefan Weyergraf
5     *
6     * This program is free software; you can redistribute it and/or modify
7     * it under the terms of the GNU General Public License as published by
8     * the Free Software Foundation; either version 2 of the License, or
9     * (at your option) any later version.
10     *
11     * This program is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with this program; if not, write to the Free Software
18     * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19     *
20     */
21    
22     # ifdef HAVE_CONFIG_H
23     # include "config.h"
24     # endif
25    
26     //# ifdef HAVE_FCNTL_H
27     # if 1
28     # include <fcntl.h>
29     # else
30     int open(const char *, int, ...);
31     int fcntl(int, int, ...);
32     # endif
33    
34     //# ifdef HAVE_UNISTD_H
35     # if 1
36     # include <unistd.h>
37     # else
38     int close(int);
39     off_t lseek(int, off_t, int);
40     ssize_t read(int, void *, size_t);
41     ssize_t write(int, const char *, size_t);
42     int stat(const char *, struct stat *);
43     int fstat(int, struct stat *);
44     # endif
45    
46     # include <errno.h>
47     # include <sys/stat.h>
48    
49     extern "C" {
50     # include "libhfs.h"
51     # include "os.h"
52     }
53    
54     #include "../hfsglue.h"
55     #include "tools/except.h"
56    
57     /*
58     * NAME: os->open()
59     * DESCRIPTION: open and lock a new descriptor from the given path and mode
60     */
61     #if 0
62     int os_open(void **priv, const char *path, int mode)
63     {
64     int fd;
65     struct flock lock;
66    
67     switch (mode)
68     {
69     case HFS_MODE_RDONLY:
70     mode = O_RDONLY;
71     break;
72    
73     case HFS_MODE_RDWR:
74     default:
75     mode = O_RDWR;
76     break;
77     }
78    
79     fd = open(path, mode);
80     if (fd == -1)
81     ERROR(errno, "error opening medium");
82    
83     /* lock descriptor against concurrent access */
84    
85     lock.l_type = (mode == O_RDONLY) ? F_RDLCK : F_WRLCK;
86     lock.l_start = 0;
87     lock.l_whence = SEEK_SET;
88     lock.l_len = 0;
89    
90     if (fcntl(fd, F_SETLK, &lock) == -1 &&
91     (errno == EACCES || errno == EAGAIN))
92     ERROR(EAGAIN, "unable to obtain lock for medium");
93    
94     *priv = (void *) fd;
95    
96     return 0;
97    
98     fail:
99     if (fd != -1)
100     close(fd);
101    
102     return -1;
103     }
104     #endif
105    
106     int hfs_os_open(void **priv, const void *devicehandle, int mode)
107     {
108     hfs_devicehandle_s *dh = (hfs_devicehandle_s *)devicehandle;
109     *priv = dh;
110     return 0;
111     }
112    
113     /*
114     * NAME: os->close()
115     * DESCRIPTION: close an open descriptor
116     */
117     int hfs_os_close(void **priv)
118     {
119     #if 0
120     int fd = (int) *priv;
121    
122     *priv = (void *) -1;
123    
124     if (close(fd) == -1)
125     ERROR(errno, "error closing medium");
126    
127     return 0;
128    
129     fail:
130     return -1;
131     #endif
132     return 0;
133     }
134    
135     /*
136     * NAME: os->same()
137     * DESCRIPTION: return 1 iff path is same as the open descriptor
138     */
139     #if 0
140     int os_same(void **priv, const char *path)
141     {
142     int fd = (int) *priv;
143     struct stat fdev, dev;
144    
145     if (fstat(fd, &fdev) == -1 ||
146     stat(path, &dev) == -1)
147     ERROR(errno, "can't get path information");
148    
149     return fdev.st_dev == dev.st_dev &&
150     fdev.st_ino == dev.st_ino;
151    
152     fail:
153     return -1;
154     }
155     #endif
156    
157     int hfs_os_same(void **priv, const void *devicehandle)
158     {
159     return 0;
160     }
161    
162     /*
163     * NAME: os->seek()
164     * DESCRIPTION: set a descriptor's seek pointer (offset in blocks)
165     */
166     #if 0
167     unsigned long os_seek(void **priv, unsigned long offset)
168     {
169     int fd = (int) *priv;
170     off_t result;
171    
172     /* offset == -1 special; seek to last block of device */
173    
174     if (offset == (unsigned long) -1)
175     result = lseek(fd, 0, SEEK_END);
176     else
177     result = lseek(fd, offset << HFS_BLOCKSZ_BITS, SEEK_SET);
178    
179     if (result == -1)
180     ERROR(errno, "error seeking medium");
181    
182     return (unsigned long) result >> HFS_BLOCKSZ_BITS;
183    
184     fail:
185     return -1;
186     }
187     #endif
188    
189     unsigned long hfs_os_seek(void **priv, unsigned long offset)
190     {
191     hfs_devicehandle_s *dh = (hfs_devicehandle_s *)*priv;
192     try {
193     FileOfs s = dh->mStart + (offset << HFS_BLOCKSZ_BITS);
194     dh->mDevice->seek(s);
195     } catch (const IOException &x) {
196     return (unsigned long)-1;
197     }
198     /* FileOfs t = dh->mDevice->tell();*/
199     long result = (dh->mDevice->tell()-dh->mStart) >> HFS_BLOCKSZ_BITS;
200     return result;
201     }
202    
203     /*
204     * NAME: os->read()
205     * DESCRIPTION: read blocks from an open descriptor
206     */
207     #if 0
208     unsigned long os_read(void **priv, void *buf, unsigned long len)
209     {
210     int fd = (int) *priv;
211     ssize_t result;
212    
213     result = read(fd, buf, len << HFS_BLOCKSZ_BITS);
214    
215     if (result == -1)
216     ERROR(errno, "error reading from medium");
217    
218     return (unsigned long) result >> HFS_BLOCKSZ_BITS;
219    
220     fail:
221     return -1;
222     }
223     #endif
224    
225     unsigned long hfs_os_read(void **priv, void *buf, unsigned long len)
226     {
227     hfs_devicehandle_s *dh = (hfs_devicehandle_s *)*priv;
228     return dh->mDevice->read(buf, len << HFS_BLOCKSZ_BITS) >> HFS_BLOCKSZ_BITS;
229     }
230    
231     /*
232     * NAME: os->write()
233     * DESCRIPTION: write blocks to an open descriptor
234     */
235     #if 0
236     unsigned long os_write(void **priv, const void *buf, unsigned long len)
237     {
238     int fd = (int) *priv;
239     ssize_t result;
240    
241     result = write(fd, buf, len << HFS_BLOCKSZ_BITS);
242    
243     if (result == -1)
244     ERROR(errno, "error writing to medium");
245    
246     return (unsigned long) result >> HFS_BLOCKSZ_BITS;
247    
248     fail:
249     return -1;
250     }
251     #endif
252    
253     unsigned long hfs_os_write(void **priv, const void *buf, unsigned long len)
254     {
255     hfs_devicehandle_s *dh = (hfs_devicehandle_s *)*priv;
256     return dh->mDevice->write(buf, len << HFS_BLOCKSZ_BITS) >> HFS_BLOCKSZ_BITS;
257     }

  ViewVC Help
Powered by ViewVC 1.1.26