Index: ipodio-posix.c =================================================================== --- ipodio-posix.c (revision 18355) +++ ipodio-posix.c (working copy) @@ -50,9 +50,13 @@ } } -#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) \ +#elif defined(__FreeBSD__) || defined(__NetBSD__) \ || defined(__bsdi__) || defined(__DragonFly__) #include + +#elif defined(__OpenBSD__) +#include +#include #define IPOD_SECTORSIZE_IOCTL DIOCGSECTORSIZE /* TODO: Implement this function for BSD */ @@ -105,22 +109,24 @@ int ipod_open(struct ipod_t* ipod, int silent) { - ipod->dh=open(ipod->diskname,O_RDONLY); + ipod->dh = open(ipod->diskname, O_RDONLY); if (ipod->dh < 0) { if (!silent) perror(ipod->diskname); if(errno == EACCES) return -2; else return -1; } - /* Read information about the disk */ + struct disklabel geometry; - if(ioctl(ipod->dh,IPOD_SECTORSIZE_IOCTL,&ipod->sector_size) < 0) { - ipod->sector_size=512; - if (!silent) { - fprintf(stderr,"[ERR] ioctl() call to get sector size failed, defaulting to %d\n" + if(ioctl(ipod->dh, DIOCGPDINFO, &geometry) == -1 && + ioctl(ipod->dh, DIOCGDINFO, &geometry) == -1 ) { + ipod->sector_size = 512; + if (!silent) fprintf(stderr,"[ERR] ioctl() call to get sector size failed, defaulting to %d\n" ,ipod->sector_size); - } } + else { + ipod->sector_size = geometry.d_secsize; + } get_geometry(ipod);