+
+#ifdef DUMP_MACOSX
+int
+CreateAppleDoubleFileRes(char *oFile, FndrFileInfo *finderinfo, mode_t mode, int flags,
+ struct timeval *timep, u_int32_t uid, u_int32_t gid)
+{
+ int err = 0;
+ int fdout;
+ char *p;
+ char *pp;
+ ASDHeaderPtr hp;
+ ASDEntryPtr ep;
+ long thesize;
+ long n;
+
+
+ n = 1; /* number of entries in double file ._ only finderinfo */
+ /*
+ no data fork
+ n++;
+ currently no resource fork
+ n++;
+ */
+
+ thesize = sizeof(ASDHeader) + (n * sizeof(ASDEntry)) + INFOLEN;
+ if ((pp = p = (char *)malloc(thesize)) == NULL) {
+ err = errno;
+ return err;
+ }
+
+ hp = (ASDHeaderPtr)p;
+ p += sizeof(ASDHeader);
+ ep = (ASDEntryPtr)p;
+ p += sizeof(ASDEntry) * n;
+
+ hp->magic = ADOUBLE_MAGIC;
+ hp->version = ASD_VERSION2;
+
+ bzero(&hp->filler, sizeof(hp->filler));
+ hp->entries = (short)n;
+
+ ep->entryID = EntryFinderInfo;
+ ep->offset = p - pp - CORRECT;
+ ep->len = INFOLEN; /* sizeof(MacFInfo) + sizeof(FXInfo); */
+ bzero(p, ep->len);
+ bcopy(finderinfo, p, sizeof(FndrFileInfo));
+ p += ep->len;
+ ep++;
+
+ if ((fdout = open(oFile, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0) {
+ err = errno;
+ free(pp);
+ return err;
+ }
+
+ /* write the ASDHeader */
+ if (write(fdout, pp, sizeof(ASDHeader) - CORRECT) == -1) {
+ err = errno;
+ close(fdout);
+ free(pp);
+ unlink(oFile);
+ return err;
+ }
+ /* write the ASDEntries */
+ if (write(fdout, pp + sizeof(ASDHeader), thesize - sizeof(ASDHeader)) == -1) {
+ err = errno;
+ close(fdout);
+ free(pp);
+ unlink(oFile);
+ return err;
+ }
+
+ (void)fchown(fdout, uid, gid);
+ (void)fchmod(fdout, mode);
+ close(fdout);
+ (void)fsetflags(oFile, flags);
+ utimes(oFile, timep);
+ free(pp);
+ return err;
+}
+#endif /* DUMP_MACOSX */