/* This file contains system-specific functions for MS-DOS. * The program pfdisk.c calls these routines. */ #include #include #include #include #include #define extern #include "sysdep.h" #undef extern int usage(prog) /* print a usage message */ char *prog; /* program name */ { fprintf(stderr,"Usage: %s \n", prog); fprintf(stderr,"\twhere is a digit [0-9]\n"); } void getGeometry(name, c, h, s) char *name; /* device name */ unsigned *c,*h,*s; /* cyls, heads, sectors */ { int dev; /* hard disk number */ union REGS regs; struct SREGS sregs; if (name[0] < '0' || name[0] > '9' || name[1] != 0 ) { fprintf(stderr,"%s: device name must be a digit\n", name); return; } dev = (name[0] - '0'); regs.h.ah = 8; /* get param. */ regs.h.dl = dev | 0x80; int86x(0x13,®s,®s,&sregs); /* Are that many drives responding? */ if (regs.h.dl <= dev ) { fprintf(stderr,"%s: drive not found\n", name); return; } if (regs.x.cflag) { fprintf(stderr,"%s: can't get disk parameters\n", name); return; } *c = ((((int) regs.h.cl << 2) & 0x300) | regs.h.ch) + 1; *h = regs.h.dh + 1; *s = regs.h.cl & 0x3F; } int getFile(name, buf, len) /* read file into buffer */ char *name, *buf; int len; { /* (open, read, close) */ int devfd, retval; devfd = open(name, O_RDONLY|O_BINARY, 0); if (devfd < 0) { fprintf(stderr,"%s: can't open for reading\n", name); return(devfd); } retval = read(devfd, buf, len); if (retval < 0) fprintf(stderr,"%s: read failed\n", name); close(devfd); return(retval); } int putFile(name, buf, len) /* write buffer to file */ char *name, *buf; int len; { /* (open, write, close) */ int devfd, retval; devfd = open(name, O_WRONLY|O_CREAT|O_BINARY, S_IREAD|S_IWRITE ); /* stupid DOS... */ if (devfd < 0) { fprintf(stderr,"%s: can't open for writing\n", name); return(devfd); } retval = write(devfd, buf, len); if (retval < 0) fprintf(stderr,"%s: write failed\n", name); close(devfd); return(retval); } int getBBlk(name, buf) /* read boot block into buffer */ char *name, *buf; { /* BIOS absolute disk read */ int dev; union REGS regs; struct SREGS sregs; if (name[0] < '0' || name[0] > '9' || name[1] != 0 ) { fprintf(stderr,"%s: device name must be a digit\n",name); return(-1); } dev = (name[0] - '0'); segread(&sregs); /* get ds */ sregs.es = sregs.ds; /* buffer address */ regs.x.bx = (int) buf; regs.h.ah = 2; /* read */ regs.h.al = 1; /* sector count */ regs.h.ch = 0; /* track */ regs.h.cl = 1; /* start sector */ regs.h.dh = 0; /* head */ regs.h.dl = dev|0x80; /* drive */ int86x(0x13,®s,®s,&sregs); if (regs.x.cflag) { fprintf(stderr,"%s: read failed\n", name); return(-1); } return(SECSIZE); } int putBBlk(name, buf) /* write buffer to boot block */ char *name, *buf; { /* BIOS absolute disk write */ int dev; union REGS regs; struct SREGS sregs; if (name[0] < '0' || name[0] > '9' || name[1] != 0 ) { fprintf(stderr,"%s: device name must be a digit\n", name); return(-1); } dev = (name[0] - '0'); segread(&sregs); /* get ds */ sregs.es = sregs.ds; /* buffer address */ regs.x.bx = (int) buf; regs.h.ah = 3; /* write */ regs.h.al = 1; /* sector count */ regs.h.ch = 0; /* track */ regs.h.cl = 1; /* start sector */ regs.h.dh = 0; /* head */ regs.h.dl = dev|0x80; /* drive */ int86x(0x13,®s,®s,&sregs); if (regs.x.cflag) { fprintf(stderr,"%s: write failed\n",name); return(-1); } return(SECSIZE); }