// ----------------------------------------------------------------------- void dev_flop5_destroy(void *dev) { if (!dev) return; struct dev_flop5 *flop5 = (struct dev_flop5 *) dev; e4i_close(flop5->image); free(dev); }
// ----------------------------------------------------------------------- void cmem_m9425_shutdown(struct cmem_unit_proto_t *unit) { if (unit) { for (int i=0 ; i<=1 ; i++) { e4i_close(UNIT->disk[i]); UNIT->disk[i] = NULL; } free(UNIT); } }
// ----------------------------------------------------------------------- struct e4i_t * e4i_open(char *img_name) { int res; e4i_err = E4I_E_OK; struct e4i_t *e = calloc(1, sizeof(struct e4i_t)); if (!e) { e4i_err = E4I_E_ALLOC; return NULL; } // open image e->image = fopen(img_name, "r+"); if (!e->image) { e4i_err = E4I_E_OPEN; e4i_close(e); return NULL; } // read header res = __e4i_header_read(e); if (res != E4I_E_OK) { e4i_err = res; e4i_close(e); return NULL; } // check header sanity res = __e4i_header_check(e); if (res != E4I_E_OK) { e4i_err = res; e4i_close(e); return NULL; } e->cur_pos = 0; e->img_name = strdup(img_name); return e; }
// ----------------------------------------------------------------------- struct e4i_t * __e4i_create(char *img_name, uint16_t id_size, uint16_t block_size, uint16_t cylinders, uint8_t heads, uint8_t spt, uint32_t blocks, uint32_t flags) { e4i_err = E4I_E_OK; // we don't destroy images struct stat st; if (stat(img_name, &st) == 0) { e4i_err = E4I_E_EXISTS; return NULL; } struct e4i_t *e = calloc(1, sizeof(struct e4i_t)); if (!e) { e4i_err = E4I_E_ALLOC; return NULL; } // create image file e->image = fopen(img_name, "w+"); if (!e->image) { free(e); e4i_err = E4I_E_OPEN; return NULL; } // fill header data strncpy(e->magic, E4I_MAGIC, 4); e->v_major = E4I_IMAGE_V_MAJOR; e->v_minor = E4I_IMAGE_V_MINOR; e->flags = flags; e->cylinders = cylinders; e->heads = heads; e->spt = spt; e->blocks = blocks; e->id_size = id_size; e->block_size = block_size; e->cur_pos = 0; e->img_name = strdup(img_name); int res; // write header res = __e4i_header_write(e); if (res != E4I_E_OK) { e4i_close(e); e4i_err = res; return NULL; } return e; }