home *** CD-ROM | disk | FTP | other *** search
/ ftp.cs.arizona.edu / ftp.cs.arizona.edu.tar / ftp.cs.arizona.edu / icon / historic / v941.tgz / icon.v941src.tar / icon.v941src / src / common / save.c < prev    next >
C/C++ Source or Header  |  2002-01-18  |  1KB  |  68 lines

  1. /*
  2.  * save(s) -- for systems that support ExecImages
  3.  */
  4.  
  5. #include "../h/gsupport.h"
  6.  
  7. #ifdef ExecImages
  8.  
  9. /*
  10.  * save(s) -- for generic BSD systems.
  11.  */
  12.  
  13. #ifdef GenericBSD
  14. #include <a.out.h>
  15. wrtexec(ef)
  16. int ef;
  17. {
  18.    struct exec hdr;
  19.    extern environ, etext;
  20.    int tsize, dsize;
  21.  
  22.    /*
  23.     * Construct the header.  The text and data region sizes must be multiples
  24.     *  of 1024.
  25.     */
  26.  
  27. #ifdef __NetBSD__
  28.    hdr.a_midmag = ZMAGIC;
  29. #else
  30.    hdr.a_magic = ZMAGIC;
  31. #endif
  32.  
  33.    tsize = (int)&etext;
  34.    hdr.a_text = (tsize + 1024) & ~(1024-1);
  35.    dsize = sbrk(0) - (int)&environ;
  36.    hdr.a_data = (dsize + 1024) & ~(1024-1);
  37.    hdr.a_bss = 0;
  38.    hdr.a_syms = 0;
  39.    hdr.a_entry = 0;
  40.    hdr.a_trsize = 0;
  41.    hdr.a_drsize = 0;
  42.  
  43.    /*
  44.     * Write the header.
  45.     */
  46.    write(ef, &hdr, sizeof(hdr));
  47.  
  48.    /*
  49.     * Write the text, starting at N_TXTOFF.
  50.     */
  51.    lseek(ef, N_TXTOFF(hdr), 0);
  52.    write(ef, 0, tsize);
  53.    lseek(ef, hdr.a_text - tsize, 1);
  54.  
  55.    /*
  56.     * Write the data.
  57.     */
  58.    write(ef, &environ, dsize);
  59.    lseek(ef, hdr.a_data - dsize, 1);
  60.    close(ef);
  61.    return hdr.a_data;
  62. }
  63. #endif                    /* GenericBSD */
  64.  
  65. #else                    /* ExecImages */
  66. static char junk;
  67. #endif                    /* ExecImages */
  68.