/** Tries to obtain SCSI address parameters. @return 1 is success , 0 is failure */ int sg_obtain_scsi_adr(char *path, int *bus_no, int *host_no, int *channel_no, int *target_no, int *lun_no) { burn_drive_enumerator_t idx; int initialize = 1, ret; char buf[64]; struct periph_match_result* result; while(1) { ret = sg_give_next_adr(&idx, buf, sizeof(buf), initialize); initialize = 0; if (ret <= 0) break; if (strcmp(path, buf) != 0) continue; result = &(idx->ccb.cdm.matches[i].result.periph_result); *bus_no = result->path_id; *host_no = result->path_id; *channel_no = 0; *target_no = result->target_id *lun_no = result->target_lun; sg_give_next_adr(&idx, buf, sizeof(buf), -1); return 1; } sg_give_next_adr(&idx, buf, sizeof(buf), -1); return (0); }
int scsi_enumerate_drives(void) { burn_drive_enumerator_t idx; int ret; char buf[64]; struct periph_match_result* result; ret = sg_init_enumerator(&idx); if (ret <= 0) return 0; while(1) { ret = sg_give_next_adr(&idx, buf, sizeof(buf), 0); if (ret <= 0) break; if (burn_drive_is_banned(buf)) continue; result = &idx->ccb.cdm.matches[idx->i].result.periph_result; enumerate_common(buf, result->path_id, result->path_id, 0, result->target_id, result->target_lun); } sg_destroy_enumerator(&idx); return 1; }
/** Try to obtain SCSI address parameters. @return 1 is success , 0 is failure */ int sg_obtain_scsi_adr(char *path, int *bus_no, int *host_no, int *channel_no, int *target_no, int *lun_no) { burn_drive_enumerator_t idx; int ret; char buf[64]; struct periph_match_result* result; ret = sg_init_enumerator(&idx); if (ret <= 0) return 0; while(1) { ret = sg_give_next_adr(&idx, buf, sizeof(buf), 0); if (ret <= 0) break; if (strcmp(path, buf) == 0) { result = &(idx->ccb.cdm.matches[idx->i].result.periph_result); *bus_no = result->path_id; *host_no = result->path_id; *channel_no = 0; *target_no = result->target_id; *lun_no = result->target_lun; sg_destroy_enumerator(&idx); return 1; } } sg_destroy_enumerator(&idx); return (0); }
/** Tells wether a text is a persistent address as listed by the enumeration functions. */ int sg_is_enumerable_adr(char* adr) { burn_drive_enumerator_t idx; int initialize = 1, ret; char buf[64]; while(1) { ret = sg_give_next_adr(&idx, buf, sizeof(buf), initialize); initialize = 0; if (ret <= 0) break; if (strcmp(adr, buf) == 0) { sg_give_next_adr(&idx, buf, sizeof(buf), -1); return 1; } } sg_give_next_adr(&idx, buf, sizeof(buf), -1); return (0); }
/** Brings all available, not-whitelist-banned, and accessible drives into libburn's list of drives. */ int scsi_enumerate_drives(void) { burn_drive_enumerator_t idx; int initialize = 1, ret; char buf[64]; while(1) { ret = sg_give_next_adr(&idx, buf, sizeof(buf), initialize); initialize = 0; if (ret <= 0) break; if (burn_drive_is_banned(buf)) continue; enumerate_common(buf, idx.result->path_id, idx.result->path_id, 0, idx.result->target_id, idx.result->target_lun); } sg_give_next_adr(&idx, buf, sizeof(buf), -1); return 1; }
int sg_is_enumerable_adr(char* adr) { burn_drive_enumerator_t idx; int ret; char buf[64]; ret = sg_init_enumerator(&idx); if (ret <= 0) return 0; while(1) { ret = sg_give_next_adr(&idx, buf, sizeof(buf), 0); if (ret <= 0) break; if (strcmp(adr, buf) == 0) { sg_destroy_enumerator(&idx); return 1; } } sg_destroy_enumerator(&idx); return (0); }