- ad->ad_df.adf_off += cc;
- } else {
- if ( end ) {
- off = ad->ad_eid[ eid ].ade_len - off;
- }
- cc = ad->ad_eid[eid].ade_off + off;
-
-#ifdef USE_MMAPPED_HEADERS
- if (eid != ADEID_RFORK) {
- memcpy(ad->ad_data + cc, buf, buflen);
- cc = buflen;
- goto ad_write_done;
- }
+ r_off = ad_getentryoff(ad, eid) + off;
+ cc = adf_pwrite(&ad->ad_hf, buf, buflen, r_off);
+
+ /* sync up our internal buffer FIXME always false? */
+ if (r_off < ad_getentryoff(ad, ADEID_RFORK)) {
+ memcpy(ad->ad_data + r_off, buf, MIN(sizeof(ad->ad_data) -r_off, cc));
+ }
+ if ( ad->ad_rlen < r_off + cc ) {
+ ad->ad_rlen = r_off + cc;
+ }
+ }
+ else {
+ return -1; /* we don't know how to write if it's not a ressource or data fork */
+ }
+ return( cc );
+}
+
+/*
+ * the caller set the locks
+ * ftruncate is undefined when the file length is smaller than 'size'
+ */
+int sys_ftruncate(int fd, off_t length)
+{
+
+#ifndef HAVE_PWRITE
+off_t curpos;