raw-posix: add a raw_open_common helper
[qemu] / block / raw-posix.c
1 /*
2  * Block driver for RAW files (posix)
3  *
4  * Copyright (c) 2006 Fabrice Bellard
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 #include "qemu-common.h"
25 #include "qemu-timer.h"
26 #include "qemu-char.h"
27 #include "block_int.h"
28 #include "module.h"
29 #ifdef CONFIG_AIO
30 #include "posix-aio-compat.h"
31 #endif
32
33 #ifdef CONFIG_COCOA
34 #include <paths.h>
35 #include <sys/param.h>
36 #include <IOKit/IOKitLib.h>
37 #include <IOKit/IOBSD.h>
38 #include <IOKit/storage/IOMediaBSDClient.h>
39 #include <IOKit/storage/IOMedia.h>
40 #include <IOKit/storage/IOCDMedia.h>
41 //#include <IOKit/storage/IOCDTypes.h>
42 #include <CoreFoundation/CoreFoundation.h>
43 #endif
44
45 #ifdef __sun__
46 #define _POSIX_PTHREAD_SEMANTICS 1
47 #include <signal.h>
48 #include <sys/dkio.h>
49 #endif
50 #ifdef __linux__
51 #include <sys/ioctl.h>
52 #include <linux/cdrom.h>
53 #include <linux/fd.h>
54 #endif
55 #ifdef __FreeBSD__
56 #include <signal.h>
57 #include <sys/disk.h>
58 #include <sys/cdio.h>
59 #endif
60
61 #ifdef __OpenBSD__
62 #include <sys/ioctl.h>
63 #include <sys/disklabel.h>
64 #include <sys/dkio.h>
65 #endif
66
67 #ifdef __DragonFly__
68 #include <sys/ioctl.h>
69 #include <sys/diskslice.h>
70 #endif
71
72 //#define DEBUG_FLOPPY
73
74 //#define DEBUG_BLOCK
75 #if defined(DEBUG_BLOCK)
76 #define DEBUG_BLOCK_PRINT(formatCstr, ...) do { if (qemu_log_enabled()) \
77     { qemu_log(formatCstr, ## __VA_ARGS__); qemu_log_flush(); } } while (0)
78 #else
79 #define DEBUG_BLOCK_PRINT(formatCstr, ...)
80 #endif
81
82 /* OS X does not have O_DSYNC */
83 #ifndef O_DSYNC
84 #define O_DSYNC O_SYNC
85 #endif
86
87 /* Approximate O_DIRECT with O_DSYNC if O_DIRECT isn't available */
88 #ifndef O_DIRECT
89 #define O_DIRECT O_DSYNC
90 #endif
91
92 #define FTYPE_FILE   0
93 #define FTYPE_CD     1
94 #define FTYPE_FD     2
95
96 #define ALIGNED_BUFFER_SIZE (32 * 512)
97
98 /* if the FD is not accessed during that time (in ms), we try to
99    reopen it to see if the disk has been changed */
100 #define FD_OPEN_TIMEOUT 1000
101
102 typedef struct BDRVRawState {
103     int fd;
104     int type;
105     unsigned int lseek_err_cnt;
106     int open_flags;
107 #if defined(__linux__)
108     /* linux floppy specific */
109     int64_t fd_open_time;
110     int64_t fd_error_time;
111     int fd_got_error;
112     int fd_media_changed;
113 #endif
114     uint8_t* aligned_buf;
115 } BDRVRawState;
116
117 static int posix_aio_init(void);
118
119 static int fd_open(BlockDriverState *bs);
120
121 #if defined(__FreeBSD__)
122 static int cd_open(BlockDriverState *bs);
123 #endif
124
125 static int raw_is_inserted(BlockDriverState *bs);
126
127 static int raw_open_common(BlockDriverState *bs, const char *filename,
128         int flags)
129 {
130     BDRVRawState *s = bs->opaque;
131     int fd, ret;
132
133     posix_aio_init();
134
135     s->lseek_err_cnt = 0;
136
137     s->open_flags |= O_BINARY;
138     if ((flags & BDRV_O_ACCESS) == O_RDWR) {
139         s->open_flags |= O_RDWR;
140     } else {
141         s->open_flags |= O_RDONLY;
142         bs->read_only = 1;
143     }
144
145     /* Use O_DSYNC for write-through caching, no flags for write-back caching,
146      * and O_DIRECT for no caching. */
147     if ((flags & BDRV_O_NOCACHE))
148         s->open_flags |= O_DIRECT;
149     else if (!(flags & BDRV_O_CACHE_WB))
150         s->open_flags |= O_DSYNC;
151
152     s->fd = -1;
153     fd = open(filename, s->open_flags, 0644);
154     if (fd < 0) {
155         ret = -errno;
156         if (ret == -EROFS)
157             ret = -EACCES;
158         return ret;
159     }
160     s->fd = fd;
161     s->aligned_buf = NULL;
162     if ((flags & BDRV_O_NOCACHE)) {
163         s->aligned_buf = qemu_blockalign(bs, ALIGNED_BUFFER_SIZE);
164         if (s->aligned_buf == NULL) {
165             ret = -errno;
166             close(fd);
167             return ret;
168         }
169     }
170     return 0;
171 }
172
173 static int raw_open(BlockDriverState *bs, const char *filename, int flags)
174 {
175     BDRVRawState *s = bs->opaque;
176
177     s->type = FTYPE_FILE;
178     if (flags & BDRV_O_CREAT)
179         s->open_flags |= O_CREAT | O_TRUNC;
180
181     return raw_open_common(bs, filename, flags);
182 }
183
184 /* XXX: use host sector size if necessary with:
185 #ifdef DIOCGSECTORSIZE
186         {
187             unsigned int sectorsize = 512;
188             if (!ioctl(fd, DIOCGSECTORSIZE, &sectorsize) &&
189                 sectorsize > bufsize)
190                 bufsize = sectorsize;
191         }
192 #endif
193 #ifdef CONFIG_COCOA
194         u_int32_t   blockSize = 512;
195         if ( !ioctl( fd, DKIOCGETBLOCKSIZE, &blockSize ) && blockSize > bufsize) {
196             bufsize = blockSize;
197         }
198 #endif
199 */
200
201 /*
202  * offset and count are in bytes, but must be multiples of 512 for files
203  * opened with O_DIRECT. buf must be aligned to 512 bytes then.
204  *
205  * This function may be called without alignment if the caller ensures
206  * that O_DIRECT is not in effect.
207  */
208 static int raw_pread_aligned(BlockDriverState *bs, int64_t offset,
209                      uint8_t *buf, int count)
210 {
211     BDRVRawState *s = bs->opaque;
212     int ret;
213
214     ret = fd_open(bs);
215     if (ret < 0)
216         return ret;
217
218     if (offset >= 0 && lseek(s->fd, offset, SEEK_SET) == (off_t)-1) {
219         ++(s->lseek_err_cnt);
220         if(s->lseek_err_cnt <= 10) {
221             DEBUG_BLOCK_PRINT("raw_pread(%d:%s, %" PRId64 ", %p, %d) [%" PRId64
222                               "] lseek failed : %d = %s\n",
223                               s->fd, bs->filename, offset, buf, count,
224                               bs->total_sectors, errno, strerror(errno));
225         }
226         return -1;
227     }
228     s->lseek_err_cnt=0;
229
230     ret = read(s->fd, buf, count);
231     if (ret == count)
232         goto label__raw_read__success;
233
234     DEBUG_BLOCK_PRINT("raw_pread(%d:%s, %" PRId64 ", %p, %d) [%" PRId64
235                       "] read failed %d : %d = %s\n",
236                       s->fd, bs->filename, offset, buf, count,
237                       bs->total_sectors, ret, errno, strerror(errno));
238
239     /* Try harder for CDrom. */
240     if (bs->type == BDRV_TYPE_CDROM) {
241         lseek(s->fd, offset, SEEK_SET);
242         ret = read(s->fd, buf, count);
243         if (ret == count)
244             goto label__raw_read__success;
245         lseek(s->fd, offset, SEEK_SET);
246         ret = read(s->fd, buf, count);
247         if (ret == count)
248             goto label__raw_read__success;
249
250         DEBUG_BLOCK_PRINT("raw_pread(%d:%s, %" PRId64 ", %p, %d) [%" PRId64
251                           "] retry read failed %d : %d = %s\n",
252                           s->fd, bs->filename, offset, buf, count,
253                           bs->total_sectors, ret, errno, strerror(errno));
254     }
255
256 label__raw_read__success:
257
258     return  (ret < 0) ? -errno : ret;
259 }
260
261 /*
262  * offset and count are in bytes, but must be multiples of 512 for files
263  * opened with O_DIRECT. buf must be aligned to 512 bytes then.
264  *
265  * This function may be called without alignment if the caller ensures
266  * that O_DIRECT is not in effect.
267  */
268 static int raw_pwrite_aligned(BlockDriverState *bs, int64_t offset,
269                       const uint8_t *buf, int count)
270 {
271     BDRVRawState *s = bs->opaque;
272     int ret;
273
274     ret = fd_open(bs);
275     if (ret < 0)
276         return -errno;
277
278     if (offset >= 0 && lseek(s->fd, offset, SEEK_SET) == (off_t)-1) {
279         ++(s->lseek_err_cnt);
280         if(s->lseek_err_cnt) {
281             DEBUG_BLOCK_PRINT("raw_pwrite(%d:%s, %" PRId64 ", %p, %d) [%"
282                               PRId64 "] lseek failed : %d = %s\n",
283                               s->fd, bs->filename, offset, buf, count,
284                               bs->total_sectors, errno, strerror(errno));
285         }
286         return -EIO;
287     }
288     s->lseek_err_cnt = 0;
289
290     ret = write(s->fd, buf, count);
291     if (ret == count)
292         goto label__raw_write__success;
293
294     DEBUG_BLOCK_PRINT("raw_pwrite(%d:%s, %" PRId64 ", %p, %d) [%" PRId64
295                       "] write failed %d : %d = %s\n",
296                       s->fd, bs->filename, offset, buf, count,
297                       bs->total_sectors, ret, errno, strerror(errno));
298
299 label__raw_write__success:
300
301     return  (ret < 0) ? -errno : ret;
302 }
303
304
305 /*
306  * offset and count are in bytes and possibly not aligned. For files opened
307  * with O_DIRECT, necessary alignments are ensured before calling
308  * raw_pread_aligned to do the actual read.
309  */
310 static int raw_pread(BlockDriverState *bs, int64_t offset,
311                      uint8_t *buf, int count)
312 {
313     BDRVRawState *s = bs->opaque;
314     int size, ret, shift, sum;
315
316     sum = 0;
317
318     if (s->aligned_buf != NULL)  {
319
320         if (offset & 0x1ff) {
321             /* align offset on a 512 bytes boundary */
322
323             shift = offset & 0x1ff;
324             size = (shift + count + 0x1ff) & ~0x1ff;
325             if (size > ALIGNED_BUFFER_SIZE)
326                 size = ALIGNED_BUFFER_SIZE;
327             ret = raw_pread_aligned(bs, offset - shift, s->aligned_buf, size);
328             if (ret < 0)
329                 return ret;
330
331             size = 512 - shift;
332             if (size > count)
333                 size = count;
334             memcpy(buf, s->aligned_buf + shift, size);
335
336             buf += size;
337             offset += size;
338             count -= size;
339             sum += size;
340
341             if (count == 0)
342                 return sum;
343         }
344         if (count & 0x1ff || (uintptr_t) buf & 0x1ff) {
345
346             /* read on aligned buffer */
347
348             while (count) {
349
350                 size = (count + 0x1ff) & ~0x1ff;
351                 if (size > ALIGNED_BUFFER_SIZE)
352                     size = ALIGNED_BUFFER_SIZE;
353
354                 ret = raw_pread_aligned(bs, offset, s->aligned_buf, size);
355                 if (ret < 0)
356                     return ret;
357
358                 size = ret;
359                 if (size > count)
360                     size = count;
361
362                 memcpy(buf, s->aligned_buf, size);
363
364                 buf += size;
365                 offset += size;
366                 count -= size;
367                 sum += size;
368             }
369
370             return sum;
371         }
372     }
373
374     return raw_pread_aligned(bs, offset, buf, count) + sum;
375 }
376
377 static int raw_read(BlockDriverState *bs, int64_t sector_num,
378                     uint8_t *buf, int nb_sectors)
379 {
380     int ret;
381
382     ret = raw_pread(bs, sector_num * 512, buf, nb_sectors * 512);
383     if (ret == (nb_sectors * 512))
384         ret = 0;
385     return ret;
386 }
387
388 /*
389  * offset and count are in bytes and possibly not aligned. For files opened
390  * with O_DIRECT, necessary alignments are ensured before calling
391  * raw_pwrite_aligned to do the actual write.
392  */
393 static int raw_pwrite(BlockDriverState *bs, int64_t offset,
394                       const uint8_t *buf, int count)
395 {
396     BDRVRawState *s = bs->opaque;
397     int size, ret, shift, sum;
398
399     sum = 0;
400
401     if (s->aligned_buf != NULL) {
402
403         if (offset & 0x1ff) {
404             /* align offset on a 512 bytes boundary */
405             shift = offset & 0x1ff;
406             ret = raw_pread_aligned(bs, offset - shift, s->aligned_buf, 512);
407             if (ret < 0)
408                 return ret;
409
410             size = 512 - shift;
411             if (size > count)
412                 size = count;
413             memcpy(s->aligned_buf + shift, buf, size);
414
415             ret = raw_pwrite_aligned(bs, offset - shift, s->aligned_buf, 512);
416             if (ret < 0)
417                 return ret;
418
419             buf += size;
420             offset += size;
421             count -= size;
422             sum += size;
423
424             if (count == 0)
425                 return sum;
426         }
427         if (count & 0x1ff || (uintptr_t) buf & 0x1ff) {
428
429             while ((size = (count & ~0x1ff)) != 0) {
430
431                 if (size > ALIGNED_BUFFER_SIZE)
432                     size = ALIGNED_BUFFER_SIZE;
433
434                 memcpy(s->aligned_buf, buf, size);
435
436                 ret = raw_pwrite_aligned(bs, offset, s->aligned_buf, size);
437                 if (ret < 0)
438                     return ret;
439
440                 buf += ret;
441                 offset += ret;
442                 count -= ret;
443                 sum += ret;
444             }
445             /* here, count < 512 because (count & ~0x1ff) == 0 */
446             if (count) {
447                 ret = raw_pread_aligned(bs, offset, s->aligned_buf, 512);
448                 if (ret < 0)
449                     return ret;
450                  memcpy(s->aligned_buf, buf, count);
451
452                  ret = raw_pwrite_aligned(bs, offset, s->aligned_buf, 512);
453                  if (ret < 0)
454                      return ret;
455                  if (count < ret)
456                      ret = count;
457
458                  sum += ret;
459             }
460             return sum;
461         }
462     }
463     return raw_pwrite_aligned(bs, offset, buf, count) + sum;
464 }
465
466 static int raw_write(BlockDriverState *bs, int64_t sector_num,
467                      const uint8_t *buf, int nb_sectors)
468 {
469     int ret;
470     ret = raw_pwrite(bs, sector_num * 512, buf, nb_sectors * 512);
471     if (ret == (nb_sectors * 512))
472         ret = 0;
473     return ret;
474 }
475
476 #ifdef CONFIG_AIO
477 /***********************************************************/
478 /* Unix AIO using POSIX AIO */
479
480 typedef struct RawAIOCB {
481     BlockDriverAIOCB common;
482     struct qemu_paiocb aiocb;
483     struct RawAIOCB *next;
484     int ret;
485 } RawAIOCB;
486
487 typedef struct PosixAioState
488 {
489     int rfd, wfd;
490     RawAIOCB *first_aio;
491 } PosixAioState;
492
493 static void posix_aio_read(void *opaque)
494 {
495     PosixAioState *s = opaque;
496     RawAIOCB *acb, **pacb;
497     int ret;
498     ssize_t len;
499
500     /* read all bytes from signal pipe */
501     for (;;) {
502         char bytes[16];
503
504         len = read(s->rfd, bytes, sizeof(bytes));
505         if (len == -1 && errno == EINTR)
506             continue; /* try again */
507         if (len == sizeof(bytes))
508             continue; /* more to read */
509         break;
510     }
511
512     for(;;) {
513         pacb = &s->first_aio;
514         for(;;) {
515             acb = *pacb;
516             if (!acb)
517                 goto the_end;
518             ret = qemu_paio_error(&acb->aiocb);
519             if (ret == ECANCELED) {
520                 /* remove the request */
521                 *pacb = acb->next;
522                 qemu_aio_release(acb);
523             } else if (ret != EINPROGRESS) {
524                 /* end of aio */
525                 if (ret == 0) {
526                     ret = qemu_paio_return(&acb->aiocb);
527                     if (ret == acb->aiocb.aio_nbytes)
528                         ret = 0;
529                     else
530                         ret = -EINVAL;
531                 } else {
532                     ret = -ret;
533                 }
534                 /* remove the request */
535                 *pacb = acb->next;
536                 /* call the callback */
537                 acb->common.cb(acb->common.opaque, ret);
538                 qemu_aio_release(acb);
539                 break;
540             } else {
541                 pacb = &acb->next;
542             }
543         }
544     }
545  the_end: ;
546 }
547
548 static int posix_aio_flush(void *opaque)
549 {
550     PosixAioState *s = opaque;
551     return !!s->first_aio;
552 }
553
554 static PosixAioState *posix_aio_state;
555
556 static void aio_signal_handler(int signum)
557 {
558     if (posix_aio_state) {
559         char byte = 0;
560
561         write(posix_aio_state->wfd, &byte, sizeof(byte));
562     }
563
564     qemu_service_io();
565 }
566
567 static int posix_aio_init(void)
568 {
569     struct sigaction act;
570     PosixAioState *s;
571     int fds[2];
572     struct qemu_paioinit ai;
573   
574     if (posix_aio_state)
575         return 0;
576
577     s = qemu_malloc(sizeof(PosixAioState));
578
579     sigfillset(&act.sa_mask);
580     act.sa_flags = 0; /* do not restart syscalls to interrupt select() */
581     act.sa_handler = aio_signal_handler;
582     sigaction(SIGUSR2, &act, NULL);
583
584     s->first_aio = NULL;
585     if (pipe(fds) == -1) {
586         fprintf(stderr, "failed to create pipe\n");
587         return -errno;
588     }
589
590     s->rfd = fds[0];
591     s->wfd = fds[1];
592
593     fcntl(s->rfd, F_SETFL, O_NONBLOCK);
594     fcntl(s->wfd, F_SETFL, O_NONBLOCK);
595
596     qemu_aio_set_fd_handler(s->rfd, posix_aio_read, NULL, posix_aio_flush, s);
597
598     memset(&ai, 0, sizeof(ai));
599     ai.aio_threads = 64;
600     ai.aio_num = 64;
601     qemu_paio_init(&ai);
602
603     posix_aio_state = s;
604
605     return 0;
606 }
607
608 static void raw_aio_remove(RawAIOCB *acb)
609 {
610     RawAIOCB **pacb;
611
612     /* remove the callback from the queue */
613     pacb = &posix_aio_state->first_aio;
614     for(;;) {
615         if (*pacb == NULL) {
616             fprintf(stderr, "raw_aio_remove: aio request not found!\n");
617             break;
618         } else if (*pacb == acb) {
619             *pacb = acb->next;
620             qemu_aio_release(acb);
621             break;
622         }
623         pacb = &(*pacb)->next;
624     }
625 }
626
627 static void raw_aio_cancel(BlockDriverAIOCB *blockacb)
628 {
629     int ret;
630     RawAIOCB *acb = (RawAIOCB *)blockacb;
631
632     ret = qemu_paio_cancel(acb->aiocb.aio_fildes, &acb->aiocb);
633     if (ret == QEMU_PAIO_NOTCANCELED) {
634         /* fail safe: if the aio could not be canceled, we wait for
635            it */
636         while (qemu_paio_error(&acb->aiocb) == EINPROGRESS);
637     }
638
639     raw_aio_remove(acb);
640 }
641
642 static AIOPool raw_aio_pool = {
643     .aiocb_size         = sizeof(RawAIOCB),
644     .cancel             = raw_aio_cancel,
645 };
646
647 static RawAIOCB *raw_aio_setup(BlockDriverState *bs, int64_t sector_num,
648         QEMUIOVector *qiov, int nb_sectors,
649         BlockDriverCompletionFunc *cb, void *opaque)
650 {
651     BDRVRawState *s = bs->opaque;
652     RawAIOCB *acb;
653
654     if (fd_open(bs) < 0)
655         return NULL;
656
657     acb = qemu_aio_get(&raw_aio_pool, bs, cb, opaque);
658     if (!acb)
659         return NULL;
660     acb->aiocb.aio_fildes = s->fd;
661     acb->aiocb.ev_signo = SIGUSR2;
662     acb->aiocb.aio_iov = qiov->iov;
663     acb->aiocb.aio_niov = qiov->niov;
664     acb->aiocb.aio_nbytes = nb_sectors * 512;
665     acb->aiocb.aio_offset = sector_num * 512;
666     acb->aiocb.aio_flags = 0;
667
668     /*
669      * If O_DIRECT is used the buffer needs to be aligned on a sector
670      * boundary. Tell the low level code to ensure that in case it's
671      * not done yet.
672      */
673     if (s->aligned_buf)
674         acb->aiocb.aio_flags |= QEMU_AIO_SECTOR_ALIGNED;
675
676     acb->next = posix_aio_state->first_aio;
677     posix_aio_state->first_aio = acb;
678     return acb;
679 }
680
681 static BlockDriverAIOCB *raw_aio_readv(BlockDriverState *bs,
682         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
683         BlockDriverCompletionFunc *cb, void *opaque)
684 {
685     RawAIOCB *acb;
686
687     acb = raw_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque);
688     if (!acb)
689         return NULL;
690     if (qemu_paio_read(&acb->aiocb) < 0) {
691         raw_aio_remove(acb);
692         return NULL;
693     }
694     return &acb->common;
695 }
696
697 static BlockDriverAIOCB *raw_aio_writev(BlockDriverState *bs,
698         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
699         BlockDriverCompletionFunc *cb, void *opaque)
700 {
701     RawAIOCB *acb;
702
703     acb = raw_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque);
704     if (!acb)
705         return NULL;
706     if (qemu_paio_write(&acb->aiocb) < 0) {
707         raw_aio_remove(acb);
708         return NULL;
709     }
710     return &acb->common;
711 }
712 #else /* CONFIG_AIO */
713 static int posix_aio_init(void)
714 {
715     return 0;
716 }
717 #endif /* CONFIG_AIO */
718
719
720 static void raw_close(BlockDriverState *bs)
721 {
722     BDRVRawState *s = bs->opaque;
723     if (s->fd >= 0) {
724         close(s->fd);
725         s->fd = -1;
726         if (s->aligned_buf != NULL)
727             qemu_free(s->aligned_buf);
728     }
729 }
730
731 static int raw_truncate(BlockDriverState *bs, int64_t offset)
732 {
733     BDRVRawState *s = bs->opaque;
734     if (s->type != FTYPE_FILE)
735         return -ENOTSUP;
736     if (ftruncate(s->fd, offset) < 0)
737         return -errno;
738     return 0;
739 }
740
741 #ifdef __OpenBSD__
742 static int64_t raw_getlength(BlockDriverState *bs)
743 {
744     BDRVRawState *s = bs->opaque;
745     int fd = s->fd;
746     struct stat st;
747
748     if (fstat(fd, &st))
749         return -1;
750     if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) {
751         struct disklabel dl;
752
753         if (ioctl(fd, DIOCGDINFO, &dl))
754             return -1;
755         return (uint64_t)dl.d_secsize *
756             dl.d_partitions[DISKPART(st.st_rdev)].p_size;
757     } else
758         return st.st_size;
759 }
760 #else /* !__OpenBSD__ */
761 static int64_t  raw_getlength(BlockDriverState *bs)
762 {
763     BDRVRawState *s = bs->opaque;
764     int fd = s->fd;
765     int64_t size;
766 #ifdef HOST_BSD
767     struct stat sb;
768 #ifdef __FreeBSD__
769     int reopened = 0;
770 #endif
771 #endif
772 #ifdef __sun__
773     struct dk_minfo minfo;
774     int rv;
775 #endif
776     int ret;
777
778     ret = fd_open(bs);
779     if (ret < 0)
780         return ret;
781
782 #ifdef HOST_BSD
783 #ifdef __FreeBSD__
784 again:
785 #endif
786     if (!fstat(fd, &sb) && (S_IFCHR & sb.st_mode)) {
787 #ifdef DIOCGMEDIASIZE
788         if (ioctl(fd, DIOCGMEDIASIZE, (off_t *)&size))
789 #elif defined(DIOCGPART)
790         {
791                 struct partinfo pi;
792                 if (ioctl(fd, DIOCGPART, &pi) == 0)
793                         size = pi.media_size;
794                 else
795                         size = 0;
796         }
797         if (size == 0)
798 #endif
799 #ifdef CONFIG_COCOA
800         size = LONG_LONG_MAX;
801 #else
802         size = lseek(fd, 0LL, SEEK_END);
803 #endif
804 #ifdef __FreeBSD__
805         switch(s->type) {
806         case FTYPE_CD:
807             /* XXX FreeBSD acd returns UINT_MAX sectors for an empty drive */
808             if (size == 2048LL * (unsigned)-1)
809                 size = 0;
810             /* XXX no disc?  maybe we need to reopen... */
811             if (size <= 0 && !reopened && cd_open(bs) >= 0) {
812                 reopened = 1;
813                 goto again;
814             }
815         }
816 #endif
817     } else
818 #endif
819 #ifdef __sun__
820     /*
821      * use the DKIOCGMEDIAINFO ioctl to read the size.
822      */
823     rv = ioctl ( fd, DKIOCGMEDIAINFO, &minfo );
824     if ( rv != -1 ) {
825         size = minfo.dki_lbsize * minfo.dki_capacity;
826     } else /* there are reports that lseek on some devices
827               fails, but irc discussion said that contingency
828               on contingency was overkill */
829 #endif
830     {
831         size = lseek(fd, 0, SEEK_END);
832     }
833     return size;
834 }
835 #endif
836
837 static int raw_create(const char *filename, QEMUOptionParameter *options)
838 {
839     int fd;
840     int64_t total_size = 0;
841
842     /* Read out options */
843     while (options && options->name) {
844         if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
845             total_size = options->value.n / 512;
846         }
847         options++;
848     }
849
850     fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,
851               0644);
852     if (fd < 0)
853         return -EIO;
854     ftruncate(fd, total_size * 512);
855     close(fd);
856     return 0;
857 }
858
859 static void raw_flush(BlockDriverState *bs)
860 {
861     BDRVRawState *s = bs->opaque;
862     fsync(s->fd);
863 }
864
865
866 static QEMUOptionParameter raw_create_options[] = {
867     {
868         .name = BLOCK_OPT_SIZE,
869         .type = OPT_SIZE,
870         .help = "Virtual disk size"
871     },
872     { NULL }
873 };
874
875 static BlockDriver bdrv_raw = {
876     .format_name = "raw",
877     .instance_size = sizeof(BDRVRawState),
878     .bdrv_probe = NULL, /* no probe for protocols */
879     .bdrv_open = raw_open,
880     .bdrv_read = raw_read,
881     .bdrv_write = raw_write,
882     .bdrv_close = raw_close,
883     .bdrv_create = raw_create,
884     .bdrv_flush = raw_flush,
885
886 #ifdef CONFIG_AIO
887     .bdrv_aio_readv = raw_aio_readv,
888     .bdrv_aio_writev = raw_aio_writev,
889 #endif
890
891     .bdrv_truncate = raw_truncate,
892     .bdrv_getlength = raw_getlength,
893
894     .create_options = raw_create_options,
895 };
896
897 /***********************************************/
898 /* host device */
899
900 #ifdef CONFIG_COCOA
901 static kern_return_t FindEjectableCDMedia( io_iterator_t *mediaIterator );
902 static kern_return_t GetBSDPath( io_iterator_t mediaIterator, char *bsdPath, CFIndex maxPathSize );
903
904 kern_return_t FindEjectableCDMedia( io_iterator_t *mediaIterator )
905 {
906     kern_return_t       kernResult;
907     mach_port_t     masterPort;
908     CFMutableDictionaryRef  classesToMatch;
909
910     kernResult = IOMasterPort( MACH_PORT_NULL, &masterPort );
911     if ( KERN_SUCCESS != kernResult ) {
912         printf( "IOMasterPort returned %d\n", kernResult );
913     }
914
915     classesToMatch = IOServiceMatching( kIOCDMediaClass );
916     if ( classesToMatch == NULL ) {
917         printf( "IOServiceMatching returned a NULL dictionary.\n" );
918     } else {
919     CFDictionarySetValue( classesToMatch, CFSTR( kIOMediaEjectableKey ), kCFBooleanTrue );
920     }
921     kernResult = IOServiceGetMatchingServices( masterPort, classesToMatch, mediaIterator );
922     if ( KERN_SUCCESS != kernResult )
923     {
924         printf( "IOServiceGetMatchingServices returned %d\n", kernResult );
925     }
926
927     return kernResult;
928 }
929
930 kern_return_t GetBSDPath( io_iterator_t mediaIterator, char *bsdPath, CFIndex maxPathSize )
931 {
932     io_object_t     nextMedia;
933     kern_return_t   kernResult = KERN_FAILURE;
934     *bsdPath = '\0';
935     nextMedia = IOIteratorNext( mediaIterator );
936     if ( nextMedia )
937     {
938         CFTypeRef   bsdPathAsCFString;
939     bsdPathAsCFString = IORegistryEntryCreateCFProperty( nextMedia, CFSTR( kIOBSDNameKey ), kCFAllocatorDefault, 0 );
940         if ( bsdPathAsCFString ) {
941             size_t devPathLength;
942             strcpy( bsdPath, _PATH_DEV );
943             strcat( bsdPath, "r" );
944             devPathLength = strlen( bsdPath );
945             if ( CFStringGetCString( bsdPathAsCFString, bsdPath + devPathLength, maxPathSize - devPathLength, kCFStringEncodingASCII ) ) {
946                 kernResult = KERN_SUCCESS;
947             }
948             CFRelease( bsdPathAsCFString );
949         }
950         IOObjectRelease( nextMedia );
951     }
952
953     return kernResult;
954 }
955
956 #endif
957
958 static int hdev_open(BlockDriverState *bs, const char *filename, int flags)
959 {
960     BDRVRawState *s = bs->opaque;
961     int ret;
962
963 #ifdef CONFIG_COCOA
964     if (strstart(filename, "/dev/cdrom", NULL)) {
965         kern_return_t kernResult;
966         io_iterator_t mediaIterator;
967         char bsdPath[ MAXPATHLEN ];
968         int fd;
969
970         kernResult = FindEjectableCDMedia( &mediaIterator );
971         kernResult = GetBSDPath( mediaIterator, bsdPath, sizeof( bsdPath ) );
972
973         if ( bsdPath[ 0 ] != '\0' ) {
974             strcat(bsdPath,"s0");
975             /* some CDs don't have a partition 0 */
976             fd = open(bsdPath, O_RDONLY | O_BINARY | O_LARGEFILE);
977             if (fd < 0) {
978                 bsdPath[strlen(bsdPath)-1] = '1';
979             } else {
980                 close(fd);
981             }
982             filename = bsdPath;
983         }
984
985         if ( mediaIterator )
986             IOObjectRelease( mediaIterator );
987     }
988 #endif
989
990     s->type = FTYPE_FILE;
991 #if defined(__linux__)
992     if (strstart(filename, "/dev/cd", NULL)) {
993         /* open will not fail even if no CD is inserted */
994         s->open_flags |= O_NONBLOCK;
995         s->type = FTYPE_CD;
996     } else if (strstart(filename, "/dev/fd", NULL)) {
997         s->type = FTYPE_FD;
998         /* open will not fail even if no floppy is inserted */
999         s->open_flags |= O_NONBLOCK;
1000 #ifdef CONFIG_AIO
1001     } else if (strstart(filename, "/dev/sg", NULL)) {
1002         bs->sg = 1;
1003 #endif
1004     }
1005 #endif
1006 #if defined(__FreeBSD__)
1007     if (strstart(filename, "/dev/cd", NULL) ||
1008         strstart(filename, "/dev/acd", NULL)) {
1009         s->type = FTYPE_CD;
1010     }
1011 #endif
1012
1013     ret = raw_open_common(bs, filename, flags);
1014     if (ret)
1015         return ret;
1016
1017 #if defined(__FreeBSD__)
1018     /* make sure the door isnt locked at this time */
1019     if (s->type == FTYPE_CD)
1020         ioctl (s->fd, CDIOCALLOW);
1021 #endif
1022 #if defined(__linux__)
1023     /* close fd so that we can reopen it as needed */
1024     if (s->type == FTYPE_FD) {
1025         close(s->fd);
1026         s->fd = -1;
1027         s->fd_media_changed = 1;
1028     }
1029 #endif
1030     return 0;
1031 }
1032
1033 #if defined(__linux__)
1034 /* Note: we do not have a reliable method to detect if the floppy is
1035    present. The current method is to try to open the floppy at every
1036    I/O and to keep it opened during a few hundreds of ms. */
1037 static int fd_open(BlockDriverState *bs)
1038 {
1039     BDRVRawState *s = bs->opaque;
1040     int last_media_present;
1041
1042     if (s->type != FTYPE_FD)
1043         return 0;
1044     last_media_present = (s->fd >= 0);
1045     if (s->fd >= 0 &&
1046         (qemu_get_clock(rt_clock) - s->fd_open_time) >= FD_OPEN_TIMEOUT) {
1047         close(s->fd);
1048         s->fd = -1;
1049 #ifdef DEBUG_FLOPPY
1050         printf("Floppy closed\n");
1051 #endif
1052     }
1053     if (s->fd < 0) {
1054         if (s->fd_got_error &&
1055             (qemu_get_clock(rt_clock) - s->fd_error_time) < FD_OPEN_TIMEOUT) {
1056 #ifdef DEBUG_FLOPPY
1057             printf("No floppy (open delayed)\n");
1058 #endif
1059             return -EIO;
1060         }
1061         s->fd = open(bs->filename, s->open_flags & ~O_NONBLOCK);
1062         if (s->fd < 0) {
1063             s->fd_error_time = qemu_get_clock(rt_clock);
1064             s->fd_got_error = 1;
1065             if (last_media_present)
1066                 s->fd_media_changed = 1;
1067 #ifdef DEBUG_FLOPPY
1068             printf("No floppy\n");
1069 #endif
1070             return -EIO;
1071         }
1072 #ifdef DEBUG_FLOPPY
1073         printf("Floppy opened\n");
1074 #endif
1075     }
1076     if (!last_media_present)
1077         s->fd_media_changed = 1;
1078     s->fd_open_time = qemu_get_clock(rt_clock);
1079     s->fd_got_error = 0;
1080     return 0;
1081 }
1082
1083 static int raw_is_inserted(BlockDriverState *bs)
1084 {
1085     BDRVRawState *s = bs->opaque;
1086     int ret;
1087
1088     switch(s->type) {
1089     case FTYPE_CD:
1090         ret = ioctl(s->fd, CDROM_DRIVE_STATUS, CDSL_CURRENT);
1091         if (ret == CDS_DISC_OK)
1092             return 1;
1093         else
1094             return 0;
1095         break;
1096     case FTYPE_FD:
1097         ret = fd_open(bs);
1098         return (ret >= 0);
1099     default:
1100         return 1;
1101     }
1102 }
1103
1104 /* currently only used by fdc.c, but a CD version would be good too */
1105 static int raw_media_changed(BlockDriverState *bs)
1106 {
1107     BDRVRawState *s = bs->opaque;
1108
1109     switch(s->type) {
1110     case FTYPE_FD:
1111         {
1112             int ret;
1113             /* XXX: we do not have a true media changed indication. It
1114                does not work if the floppy is changed without trying
1115                to read it */
1116             fd_open(bs);
1117             ret = s->fd_media_changed;
1118             s->fd_media_changed = 0;
1119 #ifdef DEBUG_FLOPPY
1120             printf("Floppy changed=%d\n", ret);
1121 #endif
1122             return ret;
1123         }
1124     default:
1125         return -ENOTSUP;
1126     }
1127 }
1128
1129 static int raw_eject(BlockDriverState *bs, int eject_flag)
1130 {
1131     BDRVRawState *s = bs->opaque;
1132
1133     switch(s->type) {
1134     case FTYPE_CD:
1135         if (eject_flag) {
1136             if (ioctl (s->fd, CDROMEJECT, NULL) < 0)
1137                 perror("CDROMEJECT");
1138         } else {
1139             if (ioctl (s->fd, CDROMCLOSETRAY, NULL) < 0)
1140                 perror("CDROMEJECT");
1141         }
1142         break;
1143     case FTYPE_FD:
1144         {
1145             int fd;
1146             if (s->fd >= 0) {
1147                 close(s->fd);
1148                 s->fd = -1;
1149             }
1150             fd = open(bs->filename, s->open_flags | O_NONBLOCK);
1151             if (fd >= 0) {
1152                 if (ioctl(fd, FDEJECT, 0) < 0)
1153                     perror("FDEJECT");
1154                 close(fd);
1155             }
1156         }
1157         break;
1158     default:
1159         return -ENOTSUP;
1160     }
1161     return 0;
1162 }
1163
1164 static int raw_set_locked(BlockDriverState *bs, int locked)
1165 {
1166     BDRVRawState *s = bs->opaque;
1167
1168     switch(s->type) {
1169     case FTYPE_CD:
1170         if (ioctl (s->fd, CDROM_LOCKDOOR, locked) < 0) {
1171             /* Note: an error can happen if the distribution automatically
1172                mounts the CD-ROM */
1173             //        perror("CDROM_LOCKDOOR");
1174         }
1175         break;
1176     default:
1177         return -ENOTSUP;
1178     }
1179     return 0;
1180 }
1181
1182 static int raw_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
1183 {
1184     BDRVRawState *s = bs->opaque;
1185
1186     return ioctl(s->fd, req, buf);
1187 }
1188
1189 #ifdef CONFIG_AIO
1190 static BlockDriverAIOCB *raw_aio_ioctl(BlockDriverState *bs,
1191         unsigned long int req, void *buf,
1192         BlockDriverCompletionFunc *cb, void *opaque)
1193 {
1194     BDRVRawState *s = bs->opaque;
1195     RawAIOCB *acb;
1196
1197     if (fd_open(bs) < 0)
1198         return NULL;
1199
1200     acb = qemu_aio_get(&raw_aio_pool, bs, cb, opaque);
1201     if (!acb)
1202         return NULL;
1203     acb->aiocb.aio_fildes = s->fd;
1204     acb->aiocb.ev_signo = SIGUSR2;
1205     acb->aiocb.aio_offset = 0;
1206     acb->aiocb.aio_flags = 0;
1207
1208     acb->next = posix_aio_state->first_aio;
1209     posix_aio_state->first_aio = acb;
1210
1211     acb->aiocb.aio_ioctl_buf = buf;
1212     acb->aiocb.aio_ioctl_cmd = req;
1213     if (qemu_paio_ioctl(&acb->aiocb) < 0) {
1214         raw_aio_remove(acb);
1215         return NULL;
1216     }
1217
1218     return &acb->common;
1219 }
1220 #endif
1221
1222 #elif defined(__FreeBSD__)
1223
1224 static int fd_open(BlockDriverState *bs)
1225 {
1226     BDRVRawState *s = bs->opaque;
1227
1228     /* this is just to ensure s->fd is sane (its called by io ops) */
1229     if (s->fd >= 0)
1230         return 0;
1231     return -EIO;
1232 }
1233
1234 static int cd_open(BlockDriverState *bs)
1235 {
1236 #if defined(__FreeBSD__)
1237     BDRVRawState *s = bs->opaque;
1238     int fd;
1239
1240     switch(s->type) {
1241     case FTYPE_CD:
1242         /* XXX force reread of possibly changed/newly loaded disc,
1243          * FreeBSD seems to not notice sometimes... */
1244         if (s->fd >= 0)
1245             close (s->fd);
1246         fd = open(bs->filename, s->open_flags, 0644);
1247         if (fd < 0) {
1248             s->fd = -1;
1249             return -EIO;
1250         }
1251         s->fd = fd;
1252         /* make sure the door isnt locked at this time */
1253         ioctl (s->fd, CDIOCALLOW);
1254     }
1255 #endif
1256     return 0;
1257 }
1258
1259 static int raw_is_inserted(BlockDriverState *bs)
1260 {
1261     BDRVRawState *s = bs->opaque;
1262
1263     switch(s->type) {
1264     case FTYPE_CD:
1265         return (raw_getlength(bs) > 0);
1266     case FTYPE_FD:
1267         /* XXX handle this */
1268         /* FALLTHRU */
1269     default:
1270         return 1;
1271     }
1272 }
1273
1274 static int raw_media_changed(BlockDriverState *bs)
1275 {
1276     return -ENOTSUP;
1277 }
1278
1279 static int raw_eject(BlockDriverState *bs, int eject_flag)
1280 {
1281     BDRVRawState *s = bs->opaque;
1282
1283     switch(s->type) {
1284     case FTYPE_CD:
1285         if (s->fd < 0)
1286             return -ENOTSUP;
1287         (void) ioctl (s->fd, CDIOCALLOW);
1288         if (eject_flag) {
1289             if (ioctl (s->fd, CDIOCEJECT) < 0)
1290                 perror("CDIOCEJECT");
1291         } else {
1292             if (ioctl (s->fd, CDIOCCLOSE) < 0)
1293                 perror("CDIOCCLOSE");
1294         }
1295         if (cd_open(bs) < 0)
1296             return -ENOTSUP;
1297         break;
1298     case FTYPE_FD:
1299         /* XXX handle this */
1300         /* FALLTHRU */
1301     default:
1302         return -ENOTSUP;
1303     }
1304     return 0;
1305 }
1306
1307 static int raw_set_locked(BlockDriverState *bs, int locked)
1308 {
1309     BDRVRawState *s = bs->opaque;
1310
1311     switch(s->type) {
1312     case FTYPE_CD:
1313         if (s->fd < 0)
1314             return -ENOTSUP;
1315         if (ioctl (s->fd, (locked ? CDIOCPREVENT : CDIOCALLOW)) < 0) {
1316             /* Note: an error can happen if the distribution automatically
1317                mounts the CD-ROM */
1318             //        perror("CDROM_LOCKDOOR");
1319         }
1320         break;
1321     default:
1322         return -ENOTSUP;
1323     }
1324     return 0;
1325 }
1326
1327 static int raw_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
1328 {
1329     return -ENOTSUP;
1330 }
1331 #else /* !linux && !FreeBSD */
1332
1333 static int fd_open(BlockDriverState *bs)
1334 {
1335     return 0;
1336 }
1337
1338 static int raw_is_inserted(BlockDriverState *bs)
1339 {
1340     return 1;
1341 }
1342
1343 static int raw_media_changed(BlockDriverState *bs)
1344 {
1345     return -ENOTSUP;
1346 }
1347
1348 static int raw_eject(BlockDriverState *bs, int eject_flag)
1349 {
1350     return -ENOTSUP;
1351 }
1352
1353 static int raw_set_locked(BlockDriverState *bs, int locked)
1354 {
1355     return -ENOTSUP;
1356 }
1357
1358 static int raw_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
1359 {
1360     return -ENOTSUP;
1361 }
1362
1363 static BlockDriverAIOCB *raw_aio_ioctl(BlockDriverState *bs,
1364         unsigned long int req, void *buf,
1365         BlockDriverCompletionFunc *cb, void *opaque)
1366 {
1367     return NULL;
1368 }
1369 #endif /* !linux && !FreeBSD */
1370
1371 static int hdev_create(const char *filename, QEMUOptionParameter *options)
1372 {
1373     int fd;
1374     int ret = 0;
1375     struct stat stat_buf;
1376     int64_t total_size = 0;
1377
1378     /* Read out options */
1379     while (options && options->name) {
1380         if (!strcmp(options->name, "size")) {
1381             total_size = options->value.n / 512;
1382         }
1383         options++;
1384     }
1385
1386     fd = open(filename, O_WRONLY | O_BINARY);
1387     if (fd < 0)
1388         return -EIO;
1389
1390     if (fstat(fd, &stat_buf) < 0)
1391         ret = -EIO;
1392     else if (!S_ISBLK(stat_buf.st_mode) && !S_ISCHR(stat_buf.st_mode))
1393         ret = -EIO;
1394     else if (lseek(fd, 0, SEEK_END) < total_size * 512)
1395         ret = -ENOSPC;
1396
1397     close(fd);
1398     return ret;
1399 }
1400
1401 static BlockDriver bdrv_host_device = {
1402     .format_name        = "host_device",
1403     .instance_size      = sizeof(BDRVRawState),
1404     .bdrv_open          = hdev_open,
1405     .bdrv_close         = raw_close,
1406     .bdrv_create        = hdev_create,
1407     .bdrv_flush         = raw_flush,
1408
1409 #ifdef CONFIG_AIO
1410     .bdrv_aio_readv     = raw_aio_readv,
1411     .bdrv_aio_writev    = raw_aio_writev,
1412 #endif
1413
1414     .bdrv_read          = raw_read,
1415     .bdrv_write         = raw_write,
1416     .bdrv_getlength     = raw_getlength,
1417
1418     /* removable device support */
1419     .bdrv_is_inserted   = raw_is_inserted,
1420     .bdrv_media_changed = raw_media_changed,
1421     .bdrv_eject         = raw_eject,
1422     .bdrv_set_locked    = raw_set_locked,
1423     /* generic scsi device */
1424     .bdrv_ioctl         = raw_ioctl,
1425 #ifdef CONFIG_AIO
1426     .bdrv_aio_ioctl     = raw_aio_ioctl,
1427 #endif
1428 };
1429
1430 static void bdrv_raw_init(void)
1431 {
1432     bdrv_register(&bdrv_raw);
1433     bdrv_register(&bdrv_host_device);
1434 }
1435
1436 block_init(bdrv_raw_init);