Yep.  That is, in fact, how I decide what to do with three-pass scanners
in the UMAX driver -- I try to mmap the output, and if it doesn't work,
I malloc an area and write the whole thing out afterwards.  The striping
code is exactly the same, because I use the same variable to hold the
malloced area as the mmaped area.
>Seriously though: I now think that using a temporary file is not such
>a bad idea.  I think pipes could be supported easily as well: if a
>dummy lseek() fails, then a tmpfile(3) could be used as a temporary
>buffer.
Like I say, that's not even necessary.  Just mmap it and see if it
fails.  Here's sample code munged from the UMAX driver:
  write_after = 0;
  lseek(ofd, mmap_size, SEEK_SET);
  ftruncate(ofd, mmap_size);
  arena = mmap(NULL, mmap_size, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED,
               ofd, 0);
  if ((! arena) || arena == -1) {
    if (verbose) {
      fprintf(stderr, "mmap failed, errno=%d: %s\n", errno, strerror(errno));
    }
    arena = malloc(mmap_size);
    write_after = 1;
  }
  ....
  /* note that image_size may be different than page-aligned size */
  if (write_after) {
    write(ofd, arena, image_size);
    free(arena);
  } else {
    munmap(us->arena, mmap_size);
    /* will always smaller, so no need to lseek first */
    ftruncate(ofd, image_size);
  }
With that kind of code, the striping code shouldn't need any changes at all.
michaelkjohnson
"Ever wonder why the SAME PEOPLE make up ALL the conspiracy theories?"
-- Source code, list archive, and docs: http://www.azstarnet.com/~axplinux/sane/ To unsubscribe: mail -s unsubscribe sane-devel-request@listserv.azstarnet.com