New option -device_links
This commit is contained in:
@ -1119,9 +1119,92 @@ ex:;
|
||||
}
|
||||
|
||||
|
||||
/* @param link_adr must point to NULL or to allocated memory that may be freed
|
||||
*/
|
||||
int Xorriso_lookup_device_link(struct XorrisO *xorriso, char *dev_adr,
|
||||
char **link_adr, int flag)
|
||||
{
|
||||
struct DirseQ *dirseq= NULL;
|
||||
struct stat link_stbuf;
|
||||
char *adr= NULL, *namept, *sys_adr= NULL;
|
||||
int ret, name_rank, found_rank= 0x7fffffff;
|
||||
static char ranks[][8] = {"cdrw", "dvdrw", "cdrom", "dvd", "cd", ""};
|
||||
|
||||
adr= calloc(SfileadrL + 5, 1);
|
||||
sys_adr= calloc(BURN_DRIVE_ADR_LEN, 1);
|
||||
if(adr == NULL || sys_adr == NULL) {
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
namept= adr + 5;
|
||||
|
||||
/* Search for candidates in /dev */
|
||||
ret= Dirseq_new(&dirseq, "/dev", 1);
|
||||
if(ret<0) {
|
||||
sprintf(xorriso->info_text, "Cannot obtain disk directory iterator");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
strcpy(adr, "/dev/");
|
||||
while(1) {
|
||||
ret= Dirseq_next_adr(dirseq, namept, 0);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
if(ret == 0)
|
||||
break;
|
||||
|
||||
if(lstat(adr, &link_stbuf) == -1)
|
||||
{ret= 0; goto ex;}
|
||||
if((link_stbuf.st_mode & S_IFMT) != S_IFLNK)
|
||||
continue;
|
||||
|
||||
/* Determine rank and omit uninteresting ones */
|
||||
for(name_rank= 0; ranks[name_rank][0]; name_rank++)
|
||||
if(strncmp(namept, ranks[name_rank], strlen(ranks[name_rank])) == 0)
|
||||
break;
|
||||
if(ranks[name_rank][0] == 0 ||
|
||||
name_rank >= found_rank) /* we look for lowest rank */
|
||||
continue;
|
||||
|
||||
/* Does name point to the same device as dev_adr ? */
|
||||
ret= burn_drive_convert_fs_adr(adr, sys_adr);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
if(ret == 0)
|
||||
continue;
|
||||
if(strcmp(dev_adr, sys_adr) == 0) {
|
||||
if(*link_adr != NULL)
|
||||
free(*link_adr);
|
||||
*link_adr= strdup(adr);
|
||||
if(*link_adr == NULL) {
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
found_rank= name_rank;
|
||||
if(found_rank == 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
ret= 2;
|
||||
if(found_rank < 0x7fffffff)
|
||||
ret= 1;
|
||||
ex:;
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(dirseq != NULL)
|
||||
Dirseq_destroy(&dirseq, 0);
|
||||
if(adr != NULL)
|
||||
free(adr);
|
||||
if(sys_adr != NULL)
|
||||
free(sys_adr);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= try to find 'meaningful' links for enumerated devices
|
||||
*/
|
||||
int Xorriso_show_devices(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
char *adr= NULL;
|
||||
char *adr= NULL, *link_adr= NULL, *adrpt;
|
||||
int i, j, max_dev_len= 1, pad, ret;
|
||||
struct burn_drive_info *drive_list= NULL;
|
||||
unsigned int drive_count;
|
||||
@ -1158,8 +1241,16 @@ int Xorriso_show_devices(struct XorrisO *xorriso, int flag)
|
||||
if(burn_drive_get_adr(&(drive_list[i]), adr)<=0)
|
||||
strcpy(adr, "-get_adr_failed-");
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if((int) strlen(adr) > max_dev_len)
|
||||
max_dev_len= strlen(adr);
|
||||
adrpt= adr;
|
||||
if(flag & 1) {
|
||||
ret= Xorriso_lookup_device_link(xorriso, adr, &link_adr, 0);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
if(ret == 1)
|
||||
adrpt= link_adr;
|
||||
}
|
||||
if((int) strlen(adrpt) > max_dev_len)
|
||||
max_dev_len= strlen(adrpt);
|
||||
}
|
||||
for(i= 0; i < (int) drive_count && !(xorriso->request_to_abort); i++) {
|
||||
if(burn_drive_get_adr(&(drive_list[i]), adr)<=0)
|
||||
@ -1176,8 +1267,16 @@ int Xorriso_show_devices(struct XorrisO *xorriso, int flag)
|
||||
if(stbuf.st_mode&S_IROTH) perms[4]= 'r';
|
||||
if(stbuf.st_mode&S_IWOTH) perms[5]= 'w';
|
||||
}
|
||||
sprintf(respt, "%d -dev '%s' ", i, adr);
|
||||
pad= max_dev_len-strlen(adr);
|
||||
adrpt= adr;
|
||||
if(flag & 1) {
|
||||
ret= Xorriso_lookup_device_link(xorriso, adr, &link_adr, 0);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
if(ret == 1)
|
||||
adrpt= link_adr;
|
||||
}
|
||||
sprintf(respt, "%d -dev '%s' ", i, adrpt);
|
||||
pad= max_dev_len-strlen(adrpt);
|
||||
if(pad>0)
|
||||
for(j= 0; j<pad; j++)
|
||||
strcat(respt, " ");
|
||||
@ -1189,9 +1288,9 @@ int Xorriso_show_devices(struct XorrisO *xorriso, int flag)
|
||||
Xorriso_info(xorriso,0);
|
||||
|
||||
burn_drive_info_free(drive_list);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
ret= 1;
|
||||
ex:;
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
Xorriso_free_meM(adr);
|
||||
return(ret);
|
||||
}
|
||||
|
Reference in New Issue
Block a user