int do_test() { DSK_GEOMETRY dg; DSK_PDRIVER dr; dsk_err_t e; char buf[512]; e = dsk_open(&dr, "/dev/fd0", NULL, NULL); if (!e) e = dsk_getgeom(dr, &dg); if (!e) e = dsk_pread(dr, &dg, buf, 0, 1, 1); if (!e) e = dsk_close(&dr); if (e) { fprintf(stderr, "%s\n", dsk_strerror(e)); return 1; } else { int n; for (n = 0; n < 512; n++) { if (buf[n] >= ' ' && buf[n] <= '~') putchar(buf[n]); else putchar('.'); if ((n % 32) == 31) putchar('\n'); } } return 0; }
int libgdos_readsector( libgdos_disk *disk, uint8_t *buffer, int track, int sector ) { int error; error = dsk_pread( disk->driver, &disk->geom, buffer, track & 0x7f, !!( track & 0x80 ), sector ); return error != DSK_ERR_OK; }
STDMETHODIMP CDisk::pread(IGeometry *g, long cylinder, short head, short sector, VARIANT *var) { DSK_GEOMETRY geom; HRESULT hr; dsk_err_t err; g_to_dg(g, &geom); unsigned char *tmpbuf = (unsigned char *)dsk_malloc(geom.dg_secsize); if (!tmpbuf) return MapError(DSK_ERR_NOMEM); err = dsk_pread(m_driver, &geom, tmpbuf, cylinder, head, sector); hr = PutBuffer(tmpbuf, var, geom.dg_secsize, err); dsk_free(tmpbuf); return hr; }
int do_swapboot(int argc, char *outfile, char *outtyp, char *outcomp, int forcehead) { DSK_PDRIVER outdr = NULL; dsk_err_t e; DSK_GEOMETRY dg; dsk_reportfunc_set(report, report_end); e = dsk_open(&outdr, outfile, outtyp, outcomp); if (!e) e = dsk_set_retry(outdr, retries); if (forcehead >= 0 && !e) e = dsk_set_forcehead(outdr, forcehead); if (!e) { if (format == -1) e = dsk_getgeom(outdr, &dg); else e = dg_stdformat(&dg, format, NULL, NULL); } if (!e) { if (dg.dg_secsize != 512) { fprintf(stderr, "%s: Sector size is not 512 bytes", outfile); dsk_close(&outdr); return 1; } e = dsk_pread(outdr, &dg, buffer, 0, 0, 1); } if (!e) { if (transform(md, buffer, outfile, 1)) { dsk_close(&outdr); return 1; } e = dsk_pwrite(outdr, &dg, buffer, 0, 0, 1); } if (outdr) dsk_close(&outdr); if (e) { fprintf(stderr, "%s: %s\n", outfile, dsk_strerror(e)); return 1; } return 0; }
/* Decode an RPC packet and execute it. * If nRefCount is nonzero, it is increased each time a dsk_open or dsk_creat * succeeds, and decreased when a dsk_close succeeds. This allows a server * program to terminate automatically when the reference count reaches 0. * * The only RPC codes that are currently obeyed are those sent by drvwin32.c * through rpccli.c */ LDPUBLIC32 dsk_err_t LDPUBLIC16 dsk_rpc_server(unsigned char *input, int inp_len, unsigned char *output, int *out_len, int *nRefCount) { dsk_err_t err, err2; int16 function; DSK_DRIVER *pDriver; DSK_GEOMETRY geom; DSK_FORMAT fmt, *pfmt; int32 nd, int1, int2, int3, int4, int5, int6, int7; int16 filler; char *str1, *str2, *str3; dsk_psect_t rcount; DSK_FORMAT *trkids; unsigned int nDriver, n; unsigned char secbuf[8192], *pbuf; unsigned char status; int deleted, value; int16 props[sizeof(DRV_CLASS)]; err = dsk_unpack_i16(&input, &inp_len, &function); if (err) return err; switch(function) { case RPC_DSK_OPEN: err = dsk_unpack_string(&input, &inp_len, &str1); if (err) return err; err = dsk_unpack_string(&input, &inp_len, &str2); if (err) return err; err = dsk_unpack_string(&input, &inp_len, &str3); if (err) return err; err2= dsk_open(&pDriver, str1, str2, str3); err = dsk_map_dtoi(pDriver, &nDriver); if (err) return err; err = dsk_pack_err (&output, out_len, err2); if (err) return err; err = dsk_pack_i32 (&output, out_len, nDriver); if (err) return err; if (nRefCount && err2 == DSK_ERR_OK) ++(*nRefCount); return DSK_ERR_OK; case RPC_DSK_CREAT: err = dsk_unpack_string(&input, &inp_len, &str1); if (err) return err; err = dsk_unpack_string(&input, &inp_len, &str2); if (err) return err; err = dsk_unpack_string(&input, &inp_len, &str3); if (err) return err; err2= dsk_creat(&pDriver, str1, str2, str3); err = dsk_map_dtoi(pDriver, &nDriver); if (err) return err; err = dsk_pack_err (&output, out_len, err2); if (err) return err; err = dsk_pack_i32 (&output, out_len, nDriver); if (err) return err; if (nRefCount && err2 == DSK_ERR_OK) ++(*nRefCount); return DSK_ERR_OK; case RPC_DSK_CLOSE: err = dsk_unpack_i32(&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; err2= dsk_close(&pDriver); err = dsk_pack_err(&output, out_len, err2); if (err) return err; if (nRefCount) --(*nRefCount); return DSK_ERR_OK; case RPC_DSK_PREAD: err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_unpack_geom(&input, &inp_len, &geom); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int1); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int2); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int3); if (err) return err; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; err2= dsk_pread(pDriver, &geom, secbuf, (dsk_pcyl_t)int1, (dsk_phead_t)int2, (dsk_psect_t)int3); err = dsk_pack_err(&output, out_len, err2); if (err) return err; err = dsk_pack_bytes(&output, out_len, secbuf, geom.dg_secsize); if (err) return err; return DSK_ERR_OK; case RPC_DSK_PWRITE: err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_unpack_geom(&input, &inp_len, &geom); if (err) return err; err = dsk_unpack_bytes(&input, &inp_len, &pbuf); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int1); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int2); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int3); if (err) return err; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; err2= dsk_pwrite(pDriver, &geom, pbuf, (dsk_pcyl_t)int1, (dsk_phead_t)int2, (dsk_psect_t)int3); err = dsk_pack_err(&output, out_len, err2); if (err) return err; return DSK_ERR_OK; case RPC_DSK_PFORMAT: pfmt = (DSK_FORMAT *)secbuf; err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_unpack_geom(&input, &inp_len, &geom); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int1); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int2); if (err) return err; for (n = 0; n < geom.dg_sectors; n++) { err = dsk_unpack_format(&input, &inp_len, &pfmt[n]); if (err) return err; } err = dsk_unpack_i16 (&input, &inp_len, &filler); if (err) return err; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; err2= dsk_pformat(pDriver, &geom, (dsk_pcyl_t)int1, (dsk_phead_t)int2, pfmt, (unsigned char)filler); err = dsk_pack_err(&output, out_len, err2); if (err) return err; err = dsk_pack_geom(&output, out_len, &geom); if (err) return err; return DSK_ERR_OK; case RPC_DSK_PSECID: err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_unpack_geom(&input, &inp_len, &geom); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int1); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int2); if (err) return err; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; err2= dsk_psecid(pDriver, &geom, (dsk_pcyl_t)int1, (dsk_phead_t)int2, &fmt); err = dsk_pack_err(&output, out_len, err2); if (err) return err; err = dsk_pack_format(&output, out_len, &fmt); if (err) return err; return DSK_ERR_OK; case RPC_DSK_DRIVE_STATUS: err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_unpack_geom(&input, &inp_len, &geom); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int1); if (err) return err; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; err2= dsk_drive_status(pDriver, &geom, (dsk_phead_t)int1, &status); err = dsk_pack_err(&output, out_len, err2); if (err) return err; err = dsk_pack_i16(&output, out_len, status); if (err) return err; return DSK_ERR_OK; case RPC_DSK_GETGEOM: err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; err2= dsk_getgeom(pDriver, &geom); err = dsk_pack_err(&output, out_len, err2); if (err) return err; err = dsk_pack_geom(&output, out_len, &geom); if (err) return err; return DSK_ERR_OK; case RPC_DSK_PSEEK: err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_unpack_geom(&input, &inp_len, &geom); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int1); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int2); if (err) return err; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; err2= dsk_pseek(pDriver, &geom, (dsk_pcyl_t)int1, (dsk_phead_t)int2); err = dsk_pack_err(&output, out_len, err2); if (err) return err; return DSK_ERR_OK; case RPC_DSK_XREAD: err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_unpack_geom(&input, &inp_len, &geom); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int1); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int2); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int3); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int4); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int5); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int6); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int7); if (err) return err; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; deleted = int7; err2= dsk_xread(pDriver, &geom, secbuf, (dsk_pcyl_t)int1, (dsk_phead_t)int2, (dsk_pcyl_t)int3, (dsk_phead_t)int4, (dsk_psect_t)int5, (size_t)int6, &deleted); err = dsk_pack_err(&output, out_len, err2); if (err) return err; err = dsk_pack_bytes(&output, out_len, secbuf, int6); if (err) return err; err = dsk_pack_i32(&output, out_len, deleted); return DSK_ERR_OK; case RPC_DSK_XWRITE: err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_unpack_geom(&input, &inp_len, &geom); if (err) return err; err = dsk_unpack_bytes(&input, &inp_len, &pbuf); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int1); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int2); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int3); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int4); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int5); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int6); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int7); if (err) return err; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; err2= dsk_xwrite(pDriver, &geom, pbuf, (dsk_pcyl_t)int1, (dsk_phead_t)int2, (dsk_pcyl_t)int3, (dsk_phead_t)int4, (dsk_psect_t)int5, (size_t)int6, (int)int7); err = dsk_pack_err(&output, out_len, err2); if (err) return err; return DSK_ERR_OK; case RPC_DSK_TRACKIDS: err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_unpack_geom(&input, &inp_len, &geom); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int1); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int2); if (err) return err; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; err2 = dsk_ptrackids(pDriver, &geom, int1, int2, &rcount, &trkids); if (err2 || !trkids) rcount = 0; err = dsk_pack_err(&output, out_len, err2); if (err) return err; err = dsk_pack_i32(&output, out_len, rcount); if (err) return err; for (n = 0; n < rcount; n++) { err = dsk_pack_format(&output, out_len, &trkids[n]); if (err) return err; } if (trkids) dsk_free(trkids); return DSK_ERR_OK; case RPC_DSK_PTREAD: err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_unpack_geom(&input, &inp_len, &geom); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int1); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int2); if (err) return err; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; err2= dsk_ptread(pDriver, &geom, secbuf, (dsk_pcyl_t)int1, (dsk_phead_t)int2); err = dsk_pack_err(&output, out_len, err2); if (err) return err; err = dsk_pack_bytes(&output, out_len, secbuf, geom.dg_secsize * geom.dg_sectors); if (err) return err; return DSK_ERR_OK; case RPC_DSK_XTREAD: err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_unpack_geom(&input, &inp_len, &geom); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int1); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int2); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int3); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int4); if (err) return err; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; err2= dsk_xtread(pDriver, &geom, secbuf, (dsk_pcyl_t)int1, (dsk_phead_t)int2, (dsk_pcyl_t)int3, (dsk_phead_t)int4); err = dsk_pack_err(&output, out_len, err2); if (err) return err; err = dsk_pack_bytes(&output, out_len, secbuf, geom.dg_secsize * geom.dg_sectors); if (err) return err; return DSK_ERR_OK; case RPC_DSK_OPTION_ENUM: err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_unpack_i32 (&input, &inp_len, &int1); if (err) return err; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; err2= dsk_option_enum(pDriver, int1, &str1); err = dsk_pack_err(&output, out_len, err2); if (err) return err; err = dsk_pack_string(&output, out_len, str1); if (err) return err; return DSK_ERR_OK; case RPC_DSK_OPTION_SET: err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_unpack_string(&input, &inp_len, &str1); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int1); if (err) return err; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; err2= dsk_set_option(pDriver, str1, int1); err = dsk_pack_err(&output, out_len, err2); if (err) return err; return DSK_ERR_OK; case RPC_DSK_OPTION_GET: err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_unpack_string(&input, &inp_len, &str1); if (err) return err; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; err2= dsk_get_option(pDriver, str1, &value); err = dsk_pack_err(&output, out_len, err2); if (err) return err; err = dsk_pack_i32 (&output, out_len, value); if (err) return err; return DSK_ERR_OK; case RPC_DSK_GETCOMMENT: err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; err2= dsk_get_comment(pDriver, &str1); err = dsk_pack_err(&output, out_len, err2); if (err) return err; err = dsk_pack_string(&output, out_len, str1); if (err) return err; return DSK_ERR_OK; case RPC_DSK_SETCOMMENT: err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; err = dsk_unpack_string(&input, &inp_len, &str1); if (err) return err; err2= dsk_set_comment(pDriver, str1); err = dsk_pack_err(&output, out_len, err2); if (err) return err; return DSK_ERR_OK; case RPC_DSK_RTREAD: err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_unpack_geom(&input, &inp_len, &geom); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int1); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int2); if (err) return err; err = dsk_unpack_i32 (&input, &inp_len, &int3); if (err) return err; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; err2= dsk_rtread(pDriver, &geom, secbuf, (dsk_pcyl_t)int1, (dsk_phead_t)int2, int3); err = dsk_pack_err(&output, out_len, err2); if (err) return err; /* XXX This is a completely arbitrary buffer size */ err = dsk_pack_i32(&output, out_len, geom.dg_secsize * geom.dg_sectors); if (err) return err; err = dsk_pack_bytes(&output, out_len, secbuf, geom.dg_secsize * geom.dg_sectors); if (err) return err; return DSK_ERR_OK; /* Return a list of implemented functions */ case RPC_DSK_PROPERTIES: err = dsk_unpack_i32 (&input, &inp_len, &nd); if (err) return err; nDriver = (unsigned int)nd; err = dsk_map_itod(nDriver, &pDriver); if (err) return err; int1 = 0; /* Count of implemented functions */ #define PROPCHECK(func, rid) if (pDriver->dr_class->func) props[int1++] = rid; PROPCHECK(dc_open, RPC_DSK_OPEN) PROPCHECK(dc_creat, RPC_DSK_CREAT) PROPCHECK(dc_close, RPC_DSK_CLOSE) PROPCHECK(dc_read, RPC_DSK_PREAD) PROPCHECK(dc_write, RPC_DSK_PWRITE) PROPCHECK(dc_format, RPC_DSK_PFORMAT) PROPCHECK(dc_secid, RPC_DSK_PSECID) PROPCHECK(dc_getgeom, RPC_DSK_GETGEOM) PROPCHECK(dc_xseek, RPC_DSK_PSEEK) PROPCHECK(dc_status, RPC_DSK_DRIVE_STATUS) PROPCHECK(dc_xread, RPC_DSK_XREAD) PROPCHECK(dc_xwrite, RPC_DSK_XWRITE) PROPCHECK(dc_tread, RPC_DSK_PTREAD) PROPCHECK(dc_xtread, RPC_DSK_XTREAD) PROPCHECK(dc_option_enum, RPC_DSK_OPTION_ENUM) PROPCHECK(dc_option_get, RPC_DSK_OPTION_GET) PROPCHECK(dc_option_set, RPC_DSK_OPTION_SET) PROPCHECK(dc_trackids, RPC_DSK_TRACKIDS) PROPCHECK(dc_rtread, RPC_DSK_RTREAD) #undef PROPCHECK props[int1++] = RPC_DSK_PROPERTIES; err = dsk_pack_err(&output, out_len, DSK_ERR_OK); if (err) return err; err = dsk_pack_i16(&output, out_len, (unsigned short)int1); if (err) return err; for (int2 = 0; int2 < int1; int2++) { err = dsk_pack_i16(&output, out_len, props[int2]); if (err) return err; } err = dsk_pack_string(&output, out_len, pDriver->dr_class->dc_description); if (err) return err; return DSK_ERR_OK; /* Unsupported function. Return DSK_ERR_UNKRPC */ default: err2 = dsk_pack_err(&output, out_len, DSK_ERR_UNKRPC); return DSK_ERR_OK; } }
LDPUBLIC32 dsk_err_t LDPUBLIC16 dsk_ptrackids(DSK_PDRIVER self, const DSK_GEOMETRY *geom, dsk_pcyl_t cylinder, dsk_phead_t head, dsk_psect_t *count, DSK_FORMAT **results) { dsk_err_t err; DRV_CLASS *dc; DSK_FORMAT fmt; DSK_GEOMETRY gtemp; if (!self || !geom || !self->dr_class || !count || !results) return DSK_ERR_BADPTR; dc = self->dr_class; if (dc->dc_trackids) { err = (dc->dc_trackids)(self,geom,cylinder,head,count,results); if (err != DSK_ERR_NOTIMPL) return err; } if (dc->dc_secid) { /* The driver doesn't provide a 'bulk' sector ID function, but we can * try to get at it one sector at a time. */ /* This is a big buffer and may need to be made static for DOS versions */ DSK_FORMAT headers[256]; unsigned char found[256]; int lcount = 0; dsk_psect_t sector = 0; memcpy(>emp, geom, sizeof(gtemp)); /* Start by forcing a read error. We set sector size to 256 * i) because with any luck, the floppy we're scanning won't have 256-byte * sectors. * ii) because the buffer we're using is only 256 bytes long. */ gtemp.dg_secsize = 256; do { err = dsk_pread(self,>emp,found,cylinder,head, sector++); } while (err == DSK_ERR_OK); /* After the read error, we should be right after the index hole. So read * off the sector IDs in order. But in case we miss one, go around a few * times. */ memset(found, 0, sizeof(found)); for (;;) { err = (dc->dc_secid)(self,geom,cylinder,head,&fmt); if (err) return err; if (!found[fmt.fmt_sector & 0xFF]) { memcpy(&headers[lcount], &fmt, sizeof(fmt)); ++lcount; } found[fmt.fmt_sector & 0xFF]++; if (found[fmt.fmt_sector] > PASSES) break; } if (!lcount) return DSK_ERR_NOADDR; /* Track blank */ *count = lcount; *results = dsk_malloc( lcount * sizeof(DSK_FORMAT) ); if (!(*results)) return DSK_ERR_NOMEM; memcpy(*results, headers, lcount * sizeof(DSK_FORMAT)) ; return DSK_ERR_OK; } return DSK_ERR_NOTIMPL; }