Ticket #3780: unistd_macosx.diff

File unistd_macosx.diff, 1.8 KB (added by VinDuv, 15 years ago)

unistd.cpp patch for Darwin/Mac OS X

  • src/tools/fs_shell/unistd.cpp

     
    260260                } else
    261261                    error = errno;
    262262            }
     263            #elif HAIKU_HOST_PLATFORM_DARWIN
     264            {
     265                // Darwin does not seems to provide a way to access disk geometry directly
     266
     267                struct stat status;
     268
     269                if (fstat(fd, &status) == 0) {
     270                    // Do nothing for a regular file
     271                    if (S_ISREG(status.st_mode))
     272                        break;
     273
     274                    off_t mediaSize;
     275
     276                    if (ioctl(fd, DKIOCGETBLOCKCOUNT, &mediaSize) != 0) {
     277                        error = errno;
     278                        break;
     279                    }
     280
     281                    geometry->head_count = 4;
     282                    geometry->sectors_per_track = 63;
     283                    geometry->cylinder_count = (mediaSize / geometry->head_count / geometry->sectors_per_track);
     284                   
     285                    while (geometry->cylinder_count > 1024 && geometry->head_count < 256) {
     286                        geometry->head_count *= 2;
     287                        geometry->cylinder_count /= 2;
     288                    }
     289                   
     290                    if (geometry->head_count == 256) {
     291                        geometry->head_count = 255;
     292                        geometry->cylinder_count = (mediaSize / geometry->head_count / geometry->sectors_per_track);
     293                    }
     294                   
     295                    if (ioctl(fd, DKIOCGETBLOCKSIZE, &geometry->bytes_per_sector) != 0) {
     296                        error = errno;
     297                        break;
     298                    }
     299
     300                    uint32_t isWritable;
     301                    if (ioctl(fd, DKIOCISWRITABLE, &isWritable) != 0) {
     302                        error = errno;
     303                        break;
     304                    }                   
     305
     306                    geometry->read_only = !isWritable;
     307                   
     308                    // TODO: Get the real values...
     309                    geometry->device_type = FSSH_B_DISK;
     310                    geometry->removable = false;
     311                    geometry->write_once = false;
     312                   
     313                    error = B_OK;
     314                } else
     315                    error = errno;
     316            }
    263317            #else
    264318                // Not implemented for this platform, i.e. we won't be able to
    265319                // deal with disk devices.