@ @ requires \valid(disk_car); @ requires valid_disk(disk_car); @ requires disk_car->sector_size > 0; @ requires disk_car->offset < 0x2000000000000; @ requires 0 < count < 0x2000000000000; @ requires offset < 0x2000000000000; @ requires \valid_read((char *)buf + (0 .. count-1)); @*/
| 1554 | @ requires \valid_read((char *)buf + (0 .. count-1)); |
| 1555 | @*/ |
| 1556 | static int file_pwrite_aux(disk_t *disk_car, const void *buf, const unsigned int count, const uint64_t offset) |
| 1557 | { |
| 1558 | int fd=((struct info_file_struct *)disk_car->data)->handle; |
| 1559 | long int ret; |
| 1560 | #if defined(HAVE_PWRITE) && !defined(__CYGWIN__) |
| 1561 | ret=pwrite(fd,buf,count,offset); |
| 1562 | if(ret<0 && errno == ENOSYS) |
| 1563 | #endif |
| 1564 | { |
| 1565 | #ifdef __MINGW32__ |
| 1566 | if(_lseeki64(fd,offset,SEEK_SET)==-1) |
| 1567 | { |
| 1568 | log_error("file_pwrite(%d,%u,buffer,%lu(%u/%u/%u)) seek err %s\n", fd, |
| 1569 | (unsigned)(count/disk_car->sector_size), |
| 1570 | (long unsigned)(offset/disk_car->sector_size), |
| 1571 | offset2cylinder(disk_car,offset),offset2head(disk_car,offset),offset2sector(disk_car,offset),strerror(errno)); |
| 1572 | return -1; |
| 1573 | } |
| 1574 | #else |
| 1575 | if(lseek(fd,offset,SEEK_SET)==-1) |
| 1576 | { |
| 1577 | log_error("file_pwrite(%d,%u,buffer,%lu(%u/%u/%u)) seek err %s\n", fd,(unsigned)(count/disk_car->sector_size),(long unsigned)(offset/disk_car->sector_size), |
| 1578 | offset2cylinder(disk_car,offset),offset2head(disk_car,offset),offset2sector(disk_car,offset),strerror(errno)); |
| 1579 | return -1; |
| 1580 | } |
| 1581 | #endif |
| 1582 | ret=write(fd, buf, count); |
| 1583 | } |
| 1584 | disk_car->write_used=1; |
| 1585 | if(ret!=count) |
| 1586 | { |
| 1587 | log_error("file_pwrite(%d,%u,buffer,%lu(%u/%u/%u)) write err %s\n", fd,(unsigned)(count/disk_car->sector_size),(long unsigned)(offset/disk_car->sector_size), |
| 1588 | offset2cylinder(disk_car,offset),offset2head(disk_car,offset),offset2sector(disk_car,offset),(ret<0?strerror(errno):"File truncated")); |
| 1589 | return -1; |
| 1590 | } |
| 1591 | return ret; |
| 1592 | } |
| 1593 | |
| 1594 | /*@ |
| 1595 | @ requires \valid(disk_car); |
nothing calls this directly
no test coverage detected