{
&simple_object_elf_functions,
&simple_object_mach_o_functions,
- &simple_object_coff_functions
+ &simple_object_coff_functions,
+ &simple_object_xcoff_functions
};
/* Read data from a file using the simple_object error reporting
unsigned char *buffer, size_t size,
const char **errmsg, int *err)
{
- ssize_t got;
-
if (lseek (descriptor, offset, SEEK_SET) < 0)
{
*errmsg = "lseek";
return 0;
}
- got = read (descriptor, buffer, size);
- if (got < 0)
+ do
{
- *errmsg = "read";
- *err = errno;
- return 0;
+ ssize_t got = read (descriptor, buffer, size);
+ if (got == 0)
+ break;
+ else if (got > 0)
+ {
+ buffer += got;
+ size -= got;
+ }
+ else if (errno != EINTR)
+ {
+ *errmsg = "read";
+ *err = errno;
+ return 0;
+ }
}
+ while (size > 0);
- if ((size_t) got < size)
+ if (size > 0)
{
*errmsg = "file too short";
*err = 0;
const unsigned char *buffer, size_t size,
const char **errmsg, int *err)
{
- ssize_t wrote;
-
if (lseek (descriptor, offset, SEEK_SET) < 0)
{
*errmsg = "lseek";
return 0;
}
- wrote = write (descriptor, buffer, size);
- if (wrote < 0)
+ do
{
- *errmsg = "write";
- *err = errno;
- return 0;
+ ssize_t wrote = write (descriptor, buffer, size);
+ if (wrote == 0)
+ break;
+ else if (wrote > 0)
+ {
+ buffer += wrote;
+ size -= wrote;
+ }
+ else if (errno != EINTR)
+ {
+ *errmsg = "write";
+ *err = errno;
+ return 0;
+ }
}
+ while (size > 0);
- if ((size_t) wrote < size)
+ if (size > 0)
{
*errmsg = "short write";
*err = 0;
XDELETE (sobj);
}
-/* Compare attributes. */
+/* Merge attributes. */
const char *
-simple_object_attributes_compare (simple_object_attributes *attrs1,
- simple_object_attributes *attrs2,
- int *err)
+simple_object_attributes_merge (simple_object_attributes *to,
+ simple_object_attributes *from,
+ int *err)
{
- if (attrs1->functions != attrs2->functions)
+ if (to->functions != from->functions)
{
*err = 0;
return "different object file format";
}
- return attrs1->functions->attributes_compare (attrs1->data, attrs2->data,
- err);
+ return to->functions->attributes_merge (to->data, from->data, err);
}
/* Release an attributes structure. */