nhc@cbnewsj.att.com (n.h.chandler) (11/21/90)
Would someone please e-mail me a copy of io.h, or indicate an ftp site and path where it is archived? Thank you. Neville Chandler nhc@cbnewsj.att.com
nhc@cbnewsj.att.com (n.h.chandler) (11/23/90)
Help! I need a copy of "io.h" or a binary of dos2out. Can someone in "Minix-land" help me? Thanks. N. Chandler nhc@cbnewsj.att.com
hall@pnet01.cts.com (Robert R. Hall) (11/24/90)
Ok here is my copy of dos2out.c. I have patched it so it will
convert large programs like elvis and kermit correctly without
printing error messages.
I could find any file labled "io.h". What does it go with?
echo x - dos2out.c
sed '/^X/s///' > dos2out.c << '/'
X/* dos2out - convert ms-dos exe-format to a.out format
X * december '85
X *
X *
X *
X *
X *
X
XDescription of file-structures:
X
X a.out .exe
X------------------------- -------------------------
X| header | | header |
X| | | + |
X+-----------------------+ | relocation |
X| text | | info |
X| + | +-----------------------+
X| data | | |
X+-----------------------+ | |
X| relocation info | | text |
X+-----------------------+ | + |
X| symbol table | | data |
X+-----------------------+ | |
X| string table | | |
X+-----------------------+ +-----------------------+
X
X
X
XFor more information see MS-DOS programmers reference manual
X
X*/
X
X
X
X/* define the a.out header format (short form) */
X
X
X/* define the formatted part of the header of an MS-DOS exe-file */
X
X
X#define D_FMT_SIZE 28 /* size of formatted header part */
X#define IS_EXE 0x5A4D /* valid linker signature; note that
X in a dump it shows as 4D 5A */
X
X
Xtypedef struct d_reloctab { /* DOS relocation table entry */
X unsigned int r_offset; /* offset to symbol in load-module */
X unsigned int r_segment; /* segment relative to zero;
X real segment must now be added */
X};
X
X/* dos formatted part of the header */
Xtypedef struct d_fmt_hdr {
X unsigned int ldsign; /* linker signature, 5A4Dh */
X unsigned int last_page_size; /* size of last page */
X unsigned int nr_of_pages; /* a page is 512 b */
X unsigned int nr_of_relocs; /* nr of relocation items */
X unsigned int hdr_size; /* header-size in *16b */
X unsigned int min_free; /* min free mem required after prog */
X unsigned int max_free; /* max free mem ever needed (FFFFh) */
X unsigned int ss_seg; /* stack-segment; must be relocated */
X unsigned int sp_reg; /* sp value to be loaded */
X unsigned int chksum; /* neg. sum of all words in file */
X unsigned int ip_reg; /* ip value (program entry-point) */
X unsigned int cs_seg; /* offset of code-seg in load-module */
X unsigned int reloc_table; /* start of reloc-table in hdr, 1Bh */
X unsigned int overlay_num; /* overlay number - not used */
X};
X
X#define MAGIC0 0x01 /* magic number, byte 1 */
X#define MAGIC1 0x03 /* and second byte */
X#define A_SEP 0x20 /* seperate I&D flag */
X#define A_EXEC 0x10 /* executable */
X#define A_I8086 0x04 /* Intel 8088/86 cpu */
X#define A_HDR_LEN 32 /* short form of header */
X#define DOS 0xFFFF /* version for a.out is -1 */
X
X
Xtypedef struct a_out_hdr {
X unsigned char a_magic[2]; /* magic number */
X unsigned char a_flags; /* flags for sep I&D etc */
X unsigned char a_cpu; /* cpu-type */
X unsigned char a_hdrlen; /* length of header */
X unsigned char a_unused; /* sic */
X unsigned short a_version; /* version stamp */
X long a_text; /* size of text segment in bytes */
X long a_data; /* size of data-segment in bytes */
X long a_bss; /* size of bss (stack) segment */
X long a_entry; /* program entry-point */
X long a_totb; /* other, eg initial stack-ptr */
X long a_syms; /* symbol-table size */
X /* END OF SHORT FORM */
X};
X
X/* bytes & words left to right? */
X#define A_BLR(cputype) ((cputype&0x01)!=0) /* TRUE if bytes left-to-right */
X#define A_WLR(cputype) ((cputype&0x02)!=0) /* TRUE if words left-to-right */
X
X
X#include <stdio.h>
X#include <fcntl.h>
X#include <sys\types.h>
X#include <sys\stat.h>
X
X
X#define PH_SECTSIZE 512 /* size of a disk-block */
X#define NOT_A_HDR_LEN (PH_SECTSIZE-A_HDR_LEN) /* complement */
X#define FNAME 32 /* length of filename/path +1 */
X
X
Xunsigned char inbuf[PH_SECTSIZE];
Xunsigned char inbuf2[PH_SECTSIZE];
Xunsigned char outbuf[PH_SECTSIZE];
X
Xstruct a_out_hdr *a_ptr= (struct a_out_hdr *)outbuf;
Xstruct d_fmt_hdr *d_ptr= (struct d_fmt_hdr *)inbuf;
X
X
Xmain (argc,argv)
Xint argc;
Xchar *argv[];
X{
X char *dptr, /* pointer to DOS-header */
X *sptr, /* pointer to OUT-header */
X in_name[FNAME], /* input filename */
X out_name[FNAME]; /* output filename */
X register int i;
X int in_cnt, /* # bytes read from input */
X out_cnt, /* # bytes written to output */
X block_cnt, /* # nr of bloks of load-module */
X lastp_cnt, /* # bytes in last block */
X inf, outf, /* filedescriptors */
X print=0, /* switch: print information */
X delete=0, /* delete exe file after processing */
X sym, /* data-relocation symbol offset */
X sym_blk, sym_off; /* load-module block & offset in blk */
X long d_size, /* size of data-segment */
X t_size, /* size of text-segment */
X load_size; /* size of load-module in bytes */
X
X
X/*================================================================
X * process parameters
X *===============================================================*/
X
X
X if (argc<2 || argc>3) {
X printf ("usage: dos2out [-pd] fname[.ext]\n");
X exit (2);
X }
X
X while (--argc)
X switch (argv[argc][0]) {
X case '-': while (*++argv[argc])
X switch (*argv[argc] | 32) {
X case 'p' : print=1; break;
X case 'd' : delete =1; break;
X default :
X printf ("Bad switch %c, ignored\n",*argv[argc]);
X }
X break;
X
X default : /* make filenames */
X dptr=in_name; sptr=out_name;
X while (*argv[argc] && *argv[argc]!='.') {
X *dptr++ = *argv[argc];
X *sptr++ = *argv[argc]++;
X }
X /* is there an extension to the filename? */
X if (*argv[argc]=='.') {
X while (*argv[argc]) *dptr++ = *argv[argc]++;
X *dptr=0;
X }
X else {
X *dptr=0;
X strcat(dptr,".exe");
X }
X *sptr=0;
X strcat(sptr,".out");
X } /* end switch */
X
X /* open & create files */
X if ((inf=open(in_name,O_RDONLY|O_BINARY)) <0) {
X printf ("input file %s not found\n",in_name);
X exit(2);
X }
X
X
X /* get first block and check conditions for conversion */
X if ((in_cnt=read(inf,inbuf,PH_SECTSIZE))!=PH_SECTSIZE) {
X printf ("read %d bytes, should be %d - abort\n",in_cnt,PH_SECTSIZE);
X exit(2);
X }
X if (d_ptr->ldsign!=IS_EXE) {
X printf ("not a valid .exe file - stop\n");
X exit(2);
X }
X if (d_ptr->nr_of_relocs>1) {
X printf ("Too many relocations - stop\n");
X exit(2);
X }
X /* see documentation for explanation of this condition */
X if (d_ptr->nr_of_relocs<1) {
X printf ("Exactly one relocation item required - can't process\n");
X exit(2);
X }
X if (d_ptr->ip_reg) {
X printf ("Warning - program entry point not at zero\n");
X printf ("re-link using 'CRTSO' as first element\n");
X exit(2);
X }
X
X
X /* input file is ok, open output (possibly destroy existing file) */
X if ((outf=open(out_name,O_WRONLY|O_BINARY|O_CREAT|O_TRUNC,S_IWRITE)) <0) {
X printf ("cannot open output %s\n",out_name);
X exit(2);
X }
X
X
X/*========================= PROCESS FILE =============================*/
X
X /* get reloc symbol's position in load-module */
X sym = (int) inbuf[d_ptr->reloc_table+1] << 8;
X sym += (int) inbuf[d_ptr->reloc_table];
X sym_blk = sym / PH_SECTSIZE;
X sym_off = sym % PH_SECTSIZE;
X
X /* get block with relocation symbol */
X while (sym_blk>=0) {
X read(inf,inbuf2,PH_SECTSIZE);
X sym_blk--;
X }
X
X /* get symbol and calculate sizes */
X t_size = inbuf2[sym_off+1] << 8;
X t_size+= inbuf2[sym_off];
X t_size <<= 4;
X load_size = (long)(d_ptr->nr_of_pages-2) * PH_SECTSIZE +
X (long)d_ptr->last_page_size;
X d_size = load_size - t_size;
X
X /* reposition file */
X close (inf);
X inf=open(in_name,O_RDONLY|O_BINARY);
X in_cnt=read(inf,inbuf2,PH_SECTSIZE);
X
X /* make a.out header */
X a_ptr->a_magic[0] = MAGIC0;
X a_ptr->a_magic[1] = MAGIC1;
X a_ptr->a_flags = A_SEP;
X a_ptr->a_cpu = A_I8086;
X a_ptr->a_hdrlen = A_HDR_LEN;
X a_ptr->a_syms = 0;
X a_ptr->a_unused = 0;
X a_ptr->a_version = DOS;
X a_ptr->a_data = d_size;
X a_ptr->a_text = t_size;
X a_ptr->a_bss = (d_ptr->min_free<<4) - d_ptr->sp_reg;
X a_ptr->a_entry = d_ptr->ip_reg;
X a_ptr->a_totb = a_ptr->a_text + a_ptr->a_bss +
X a_ptr->a_data + d_ptr->sp_reg;
X
X if (print) printinfo();
X
X /* void remainder of first block; it holds nothing */
X /* determine nr of blocks to copy and copy them */
X block_cnt = d_ptr->nr_of_pages-1; /* exclude header-block */
X lastp_cnt = d_ptr->last_page_size;
X while (block_cnt--) {
X
X if ((in_cnt=read(inf,inbuf,PH_SECTSIZE))!=PH_SECTSIZE)
X if (block_cnt || (!block_cnt && in_cnt<lastp_cnt)) {
X printf ("read %d bytes, should be %d - abort\n",
X in_cnt,(block_cnt ? PH_SECTSIZE : lastp_cnt));
X exit(2);
X };
X i = (!block_cnt && lastp_cnt<NOT_A_HDR_LEN ?
X lastp_cnt : NOT_A_HDR_LEN);
X dptr = &outbuf[A_HDR_LEN];
X sptr = inbuf;
X while (i--) *dptr++ = *sptr++;
X
X i = (!block_cnt && lastp_cnt<NOT_A_HDR_LEN ?
X lastp_cnt+A_HDR_LEN : PH_SECTSIZE);
X if ((out_cnt=write(outf,outbuf,i)) != i) {
X printf ("wrote %d bytes, should be %d - abort\n",out_cnt,i);
X perror("Output file ERROR: ");
X exit(2);
X }
X
X i = (i<PH_SECTSIZE ? 0 :
X (!block_cnt ? lastp_cnt-NOT_A_HDR_LEN : A_HDR_LEN));
X dptr = outbuf;
X while (i--) *dptr++ = *sptr++;
X }
X
X /* write last block */
X if (out_cnt==PH_SECTSIZE) {
X i = lastp_cnt-NOT_A_HDR_LEN;
X if ((out_cnt=write(outf,outbuf,i)) != i) {
X printf("write error last block: %d, should be %d\n",out_cnt,i);
X exit(2);
X }
X }
X close (outf);
X close (inf);
X if (delete) unlink (in_name);
X printf(" -done-\n");
X exit(0);
X}
X
X
X
Xprintinfo ()
X{
X printf ("\n\nDOS-header:\n");
X printf (" nr of pages: %4xh (%4d dec)\n",
X d_ptr->nr_of_pages, d_ptr->nr_of_pages);
X printf (" bytes in last page: %4xh (%4d dec)\n",
X d_ptr->last_page_size, d_ptr->last_page_size);
X printf (" min. free mem *16: %4xh (%4d dec)\n",
X d_ptr->min_free, d_ptr->min_free);
X printf (" stack-size: %4xh (%4d dec)\n",
X d_ptr->ss_seg, d_ptr->ss_seg);
X printf (" stack-pointer val: %4xh (%4d dec)\n",
X d_ptr->sp_reg, d_ptr->sp_reg);
X printf (" program entry-point: %4xh (%4d dec)\n",
X d_ptr->ip_reg, d_ptr->ip_reg);
X printf (" code-segment val: %4xh (%4d dec)\n",
X d_ptr->cs_seg, d_ptr->cs_seg);
X
X printf ("\n\nOUT-header:\n");
X printf (" text-size: %6lxh (%6ld dec)\n",
X a_ptr->a_text, a_ptr->a_text);
X printf (" data-size: %6lxh (%6ld dec)\n",
X a_ptr->a_data, a_ptr->a_data);
X printf (" bss-size: %6lxh (%6ld dec)\n",
X a_ptr->a_bss, a_ptr->a_bss);
X printf (" entry-point: %6lxh (%6ld dec)\n",
X a_ptr->a_entry, a_ptr->a_entry);
X printf (" totalbytes: %6lxh (%6ld dec)\n\n",
X a_ptr->a_totb, a_ptr->a_totb);
X}
/
UUCP: {hplabs!hp-sdd ucsd nosc}!crash!pnet01!hall
ARPA: crash!pnet01!hall@nosc.mil
INET: hall@pnet01.cts.com