ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/Unix/sys_unix.cpp
(Generate patch)

Comparing BasiliskII/src/Unix/sys_unix.cpp (file contents):
Revision 1.1 by cebix, 1999-10-03T14:16:25Z vs.
Revision 1.15 by cebix, 2002-03-20T19:03:41Z

# Line 1 | Line 1
1   /*
2   *  sys_unix.cpp - System dependent routines, Unix implementation
3   *
4 < *  Basilisk II (C) 1997-1999 Christian Bauer
4 > *  Basilisk II (C) 1997-2002 Christian Bauer
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
# Line 25 | Line 25
25   #include <errno.h>
26  
27   #ifdef __linux__
28 + #include <sys/mount.h>
29   #include <linux/cdrom.h>
30   #include <linux/fd.h>
31   #include <linux/major.h>
# Line 32 | Line 33
33   #include <linux/unistd.h>
34  
35   #ifdef __NR__llseek
36 < _syscall5(int, _llseek, uint, fd, ulong, hi, ulong, lo, loff_t *, res, uint, wh);
36 > _syscall5(int, _llseek, unsigned int, fd, unsigned long, hi, unsigned long, lo, loff_t *, res, unsigned int, wh);
37   #else
38 < static int _llseek(uint fd, ulong hi, ulong lo, loff_t *res, uint wh)
38 > static int _llseek(unsigned int fd, unsigned long hi, unsigned long lo, loff_t *res, unsigned int wh)
39   {
40          if (hi)
41                  return -1;
# Line 46 | Line 47 | static int _llseek(uint fd, ulong hi, ul
47   #endif
48   #endif
49  
50 < #ifdef __FreeBSD__
50 > #if defined(__FreeBSD__) || defined(__NetBSD__)
51   #include <sys/cdio.h>
52   #endif
53  
# Line 119 | Line 120 | void SysMountFirstFloppy(void)
120   void SysAddFloppyPrefs(void)
121   {
122   #if defined(__linux__)
123 <        PrefsAddString("floppy", "/dev/fd0H1440");
124 <        PrefsAddString("floppy", "/dev/fd1H1440");
123 >        PrefsAddString("floppy", "/dev/fd0u1440");
124 >        PrefsAddString("floppy", "/dev/fd1u1440");
125 > #elif defined(__NetBSD__)
126 >        PrefsAddString("floppy", "/dev/fd0a");
127 >        PrefsAddString("floppy", "/dev/fd1a");
128   #else
129          PrefsAddString("floppy", "/dev/fd0");
130          PrefsAddString("floppy", "/dev/fd1");
# Line 142 | Line 146 | void SysAddDiskPrefs(void)
146                  while(fgets(line, 255, f)) {
147                          // Read line
148                          int len = strlen(line);
149 <                        if (len == 0)
149 >                        if (len == 0 || line[0] == '#')
150                                  continue;
151                          line[len-1] = 0;
152  
153                          // Parse line
154                          char *dev, *mnt_point, *fstype;
155 <                        if (sscanf(line, "%s %s %s", &dev, &mnt_point, &fstype) == 3) {
155 >                        if (sscanf(line, "%as %as %as", &dev, &mnt_point, &fstype) == 3) {
156                                  if (strcmp(fstype, "hfs") == 0)
157                                          PrefsAddString("disk", dev);
158                          }
159 +                        free(dev); free(mnt_point); free(fstype);
160                  }
161                  fclose(f);
162          }
# Line 174 | Line 179 | void SysAddCDROMPrefs(void)
179          PrefsAddString("cdrom", "/dev/cdrom");
180   #elif defined(__FreeBSD__)
181          PrefsAddString("cdrom", "/dev/cd0c");
182 + #elif defined(__NetBSD__)
183 +        PrefsAddString("cdrom", "/dev/cd0d");
184   #endif
185   }
186  
# Line 190 | Line 197 | void SysAddSerialPrefs(void)
197   #elif defined(__FreeBSD__)
198          PrefsAddString("seriala", "/dev/cuaa0");
199          PrefsAddString("serialb", "/dev/cuaa1");
200 + #elif defined(__NetBSD__)
201 +        PrefsAddString("seriala", "/dev/tty00");
202 +        PrefsAddString("serialb", "/dev/tty01");
203   #endif
204   }
205  
# Line 214 | Line 224 | static bool is_drive_mounted(const char
224                          // Parse line
225                          if (strncmp(line, dev_name, strlen(dev_name)) == 0) {
226                                  mount_name[0] = 0;
227 <                                char dummy[256];
228 <                                sscanf(line, "%s %s", dummy, mount_name);
227 >                                char *dummy;
228 >                                sscanf(line, "%as %s", &dummy, mount_name);
229 >                                free(dummy);
230                                  fclose(f);
231                                  return true;
232                          }
# Line 234 | Line 245 | static bool is_drive_mounted(const char
245   void *Sys_open(const char *name, bool read_only)
246   {
247          bool is_file = strncmp(name, "/dev/", 5) != 0;
248 < #ifdef __FreeBSD__
248 > #if defined(__FreeBSD__)
249                          // SCSI                             IDE
250          bool is_cdrom = strncmp(name, "/dev/cd", 7) == 0 || strncmp(name, "/dev/acd", 8) == 0;
251   #else
# Line 262 | Line 273 | void *Sys_open(const char *name, bool re
273          }
274  
275          // Open file/device
276 < #ifdef __linux__
276 > #if defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__)
277          int fd = open(name, (read_only ? O_RDONLY : O_RDWR) | (is_cdrom ? O_NONBLOCK : 0));
278   #else
279          int fd = open(name, read_only ? O_RDONLY : O_RDWR);
# Line 284 | Line 295 | void *Sys_open(const char *name, bool re
295                  if (fh->is_file) {
296                          // Detect disk image file layout
297                          loff_t size = 0;
298 < #ifdef __linux__
298 > #if defined(__linux__)
299                          _llseek(fh->fd, 0, 0, &size, SEEK_END);
300   #else
301                          size = lseek(fd, 0, SEEK_END);
# Line 319 | Line 330 | void *Sys_open(const char *name, bool re
330   #else
331                                          fh->cdrom_cap = 0;
332   #endif
333 + #elif defined(__NetBSD__)
334 +                                        fh->is_floppy = ((st.st_rdev >> 16) == 2);
335   #endif
336                                  }
337                          }
# Line 362 | Line 375 | size_t Sys_read(void *arg, void *buffer,
375                  return 0;
376  
377          // Seek to position
378 < #ifdef __linux__
378 > #if defined(__linux__)
379          loff_t pos = offset + fh->start_byte, res;
380          if (_llseek(fh->fd, pos >> 32, pos, &res, SEEK_SET) < 0)
381                  return 0;
# Line 388 | Line 401 | size_t Sys_write(void *arg, void *buffer
401                  return 0;
402  
403          // Seek to position
404 < #ifdef __linux__
404 > #if defined(__linux__)
405          loff_t pos = offset + fh->start_byte, res;
406          if (_llseek(fh->fd, pos >> 32, pos, &res, SEEK_SET) < 0)
407                  return 0;
# Line 415 | Line 428 | loff_t SysGetFileSize(void *arg)
428          if (fh->is_file)
429                  return fh->file_size;
430          else {
431 < #ifdef __linux__
432 <                loff_t pos = 0;
433 <                _llseek(fh->fd, 0, 0, &pos, SEEK_END);
434 <                return pos - fh->start_byte;
431 > #if defined(__linux__)
432 >                long blocks;
433 >                if (ioctl(fh->fd, BLKGETSIZE, &blocks) < 0)
434 >                        return 0;
435 >                D(bug(" BLKGETSIZE returns %d blocks\n", blocks));
436 >                return (loff_t)blocks * 512;
437   #else
438                  return lseek(fh->fd, 0, SEEK_END) - fh->start_byte;
439   #endif
# Line 441 | Line 456 | void SysEject(void *arg)
456                  fsync(fh->fd);
457                  ioctl(fh->fd, FDFLUSH);
458                  ioctl(fh->fd, FDEJECT);
459 +                close(fh->fd);  // Close and reopen so the driver will see the media change
460 +                fh->fd = open(fh->name, fh->read_only ? O_RDONLY : O_RDWR);
461          } else if (fh->is_cdrom) {
462                  ioctl(fh->fd, CDROMEJECT);
463                  close(fh->fd);  // Close and reopen so the driver will see the media change
464                  fh->fd = open(fh->name, O_RDONLY | O_NONBLOCK);
465          }
466 < #elif defined(__FreeBSD__)
466 > #elif defined(__FreeBSD__) || defined(__NetBSD__)
467          if (fh->is_floppy) {
468                  fsync(fh->fd);
452                //ioctl(fh->fd, FDFLUSH);
453                //ioctl(fh->fd, FDEJECT);
469          } else if (fh->is_cdrom) {
470                  ioctl(fh->fd, CDIOCEJECT);
471                  close(fh->fd);  // Close and reopen so the driver will see the media change
# Line 485 | Line 500 | bool SysIsReadOnly(void *arg)
500          if (!fh)
501                  return true;
502  
503 < #ifdef __linux__
503 > #if defined(__linux__)
504          if (fh->is_floppy) {
505                  struct floppy_drive_struct stat;
506                  ioctl(fh->fd, FDGETDRVSTAT, &stat);
# Line 532 | Line 547 | bool SysIsDiskInserted(void *arg)
547          } else if (fh->is_floppy) {
548                  char block[512];
549                  lseek(fh->fd, 0, SEEK_SET);
550 <                return read(fh->fd, block, 512) == 512;
550 >                ssize_t actual = read(fh->fd, block, 512);
551 >                if (actual < 0) {
552 >                        close(fh->fd);  // Close and reopen so the driver will see the media change
553 >                        fh->fd = open(fh->name, fh->read_only ? O_RDONLY : O_RDWR);
554 >                        actual = read(fh->fd, block, 512);
555 >                }
556 >                return actual == 512;
557          } else if (fh->is_cdrom) {
558 + #ifdef CDROM_MEDIA_CHANGED
559 +                if (fh->cdrom_cap & CDC_MEDIA_CHANGED) {
560 +                        // If we don't do this, all attempts to read from a disc fail
561 +                        // once the tray has been opened (altough the TOC reads fine).
562 +                        // Can somebody explain this to me?
563 +                        if (ioctl(fh->fd, CDROM_MEDIA_CHANGED) == 1) {
564 +                                close(fh->fd);
565 +                                fh->fd = open(fh->name, O_RDONLY | O_NONBLOCK);
566 +                        }
567 +                }
568 + #endif
569   #ifdef CDROM_DRIVE_STATUS
570                  if (fh->cdrom_cap & CDC_DRIVE_STATUS) {
571                          return ioctl(fh->fd, CDROM_DRIVE_STATUS, CDSL_CURRENT) == CDS_DISC_OK;
# Line 541 | Line 573 | bool SysIsDiskInserted(void *arg)
573   #endif
574                  cdrom_tochdr header;
575                  return ioctl(fh->fd, CDROMREADTOCHDR, &header) == 0;
576 < #elif defined(__FreeBSD__)
576 > #elif defined(__FreeBSD__) || defined(__NetBSD__)
577          } else if (fh->is_floppy) {
578                  return false;   //!!
579          } else if (fh->is_cdrom) {
# Line 581 | Line 613 | void SysAllowRemoval(void *arg)
613          if (!fh)
614                  return;
615  
616 < #ifdef defined(__linux__) && defined(CDROM_LOCKDOOR)
616 > #if defined(__linux__) && defined(CDROM_LOCKDOOR)
617          if (fh->is_cdrom)
618                  ioctl(fh->fd, CDROM_LOCKDOOR, 0);      
619   #endif
# Line 691 | Line 723 | bool SysCDReadTOC(void *arg, uint8 *toc)
723                  *toc++ = toc_size >> 8;
724                  *toc++ = toc_size & 0xff;
725                  return true;
726 + #elif defined(__NetBSD__)
727 +                uint8 *p = toc + 2;
728 +
729 +                // Header
730 +                struct ioc_toc_header header;
731 +                if (ioctl(fh->fd, CDIOREADTOCHEADER, &header) < 0)
732 +                        return false;
733 +                *p++ = header.starting_track;
734 +                *p++ = header.ending_track;
735 +
736 +                // Tracks (this is nice... :-)
737 +                struct ioc_read_toc_entry entries;
738 +                entries.address_format = CD_MSF_FORMAT;
739 +                entries.starting_track = 1;
740 +                entries.data_len = 800;
741 +                entries.data = (cd_toc_entry *)p;
742 +                if (ioctl(fh->fd, CDIOREADTOCENTRIES, &entries) < 0)
743 +                        return false;
744 +
745 +                // TOC size
746 +                int toc_size = p - toc;
747 +                *toc++ = toc_size >> 8;
748 +                *toc++ = toc_size & 0xff;
749 +                return true;
750 + #else
751 +                return false;
752   #endif
753          } else
754                  return false;
# Line 730 | Line 788 | bool SysCDGetPosition(void *arg, uint8 *
788                  *pos++ = chan.cdsc_reladdr.msf.second;
789                  *pos++ = chan.cdsc_reladdr.msf.frame;
790                  return true;
791 < #elif defined(__FreeBSD__)
791 > #elif defined(__FreeBSD__) || defined(__NetBSD__)
792                  struct ioc_read_subchannel chan;
793                  chan.data_format = CD_MSF_FORMAT;
794                  chan.address_format = CD_MSF_FORMAT;
# Line 754 | Line 812 | bool SysCDGetPosition(void *arg, uint8 *
812                  *pos++ = chan.data->what.position.reladdr.msf.second;
813                  *pos++ = chan.data->what.position.reladdr.msf.frame;
814                  return true;
815 + #else
816 +                return false;
817   #endif
818          } else
819                  return false;
# Line 780 | Line 840 | bool SysCDPlay(void *arg, uint8 start_m,
840                  play.cdmsf_sec1 = end_s;
841                  play.cdmsf_frame1 = end_f;
842                  return ioctl(fh->fd, CDROMPLAYMSF, &play) == 0;
843 < #elif defined(__FreeBSD__)
843 > #elif defined(__FreeBSD__) || defined(__NetBSD__)
844                  struct ioc_play_msf play;
845                  play.start_m = start_m;
846                  play.start_s = start_s;
# Line 789 | Line 849 | bool SysCDPlay(void *arg, uint8 start_m,
849                  play.end_s = end_s;
850                  play.end_f = end_f;
851                  return ioctl(fh->fd, CDIOCPLAYMSF, &play) == 0;
852 + #else
853 +                return false;
854   #endif
855          } else
856                  return false;
# Line 808 | Line 870 | bool SysCDPause(void *arg)
870          if (fh->is_cdrom) {
871   #if defined(__linux__)
872                  return ioctl(fh->fd, CDROMPAUSE) == 0;
873 < #elif defined(__FreeBSD__)
873 > #elif defined(__FreeBSD__) || defined(__NetBSD__)
874                  return ioctl(fh->fd, CDIOCPAUSE) == 0;
875 + #else
876 +                return false;
877   #endif
878          } else
879                  return false;
# Line 829 | Line 893 | bool SysCDResume(void *arg)
893          if (fh->is_cdrom) {
894   #if defined(__linux__)
895                  return ioctl(fh->fd, CDROMRESUME) == 0;
896 < #elif defined(__FreeBSD__)
896 > #elif defined(__FreeBSD__) || defined(__NetBSD__)
897                  return ioctl(fh->fd, CDIOCRESUME) == 0;
898 + #else
899 +                return false;
900   #endif
901          } else
902                  return false;
# Line 850 | Line 916 | bool SysCDStop(void *arg, uint8 lead_out
916          if (fh->is_cdrom) {
917   #if defined(__linux__)
918                  return ioctl(fh->fd, CDROMSTOP) == 0;
919 < #elif defined(__FreeBSD__)
919 > #elif defined(__FreeBSD__) || defined(__NetBSD__)
920                  return ioctl(fh->fd, CDIOCSTOP) == 0;
921 + #else
922 +                return false;
923   #endif
924          } else
925                  return false;
# Line 889 | Line 957 | void SysCDSetVolume(void *arg, uint8 lef
957                  vol.channel0 = vol.channel2 = left;
958                  vol.channel1 = vol.channel3 = right;
959                  ioctl(fh->fd, CDROMVOLCTRL, &vol);
960 < #elif defined(__FreeBSD__)
960 > #elif defined(__FreeBSD__) || defined(__NetBSD__)
961                  struct ioc_vol vol;
962                  vol.vol[0] = vol.vol[2] = left;
963                  vol.vol[1] = vol.vol[3] = right;
# Line 916 | Line 984 | void SysCDGetVolume(void *arg, uint8 &le
984                  ioctl(fh->fd, CDROMVOLREAD, &vol);
985                  left = vol.channel0;
986                  right = vol.channel1;
987 < #elif defined(__FreeBSD__)
987 > #elif defined(__FreeBSD__) || defined(__NetBSD__)
988                  struct ioc_vol vol;
989                  ioctl(fh->fd, CDIOCGETVOL, &vol);
990                  left = vol.vol[0];

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines