Reacted on changed media profile of stdio-drives

This commit is contained in:
Thomas Schmitt 2007-09-07 12:38:20 +00:00
parent 7d563ef83d
commit 0baf72ddeb
5 changed files with 65 additions and 25 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2007.09.07.102728" #define Cdrskin_timestamP "2007.09.07.123748"

View File

@ -130,8 +130,13 @@ static void remove_worker(pthread_t th)
static void *scan_worker_func(struct w_list *w) static void *scan_worker_func(struct w_list *w)
{ {
burn_drive_scan_sync(w->u.scan.drives, w->u.scan.n_drives); int ret;
w->u.scan.done = 1;
ret = burn_drive_scan_sync(w->u.scan.drives, w->u.scan.n_drives);
if (ret <= 0)
w->u.scan.done = -1;
else
w->u.scan.done = 1;
return NULL; return NULL;
} }
@ -165,7 +170,7 @@ drive_is_active:;
return -1; return -1;
} }
if (!workers) { if (workers == NULL) {
/* start it */ /* start it */
/* ts A61007 : test moved up from burn_drive_scan_sync() /* ts A61007 : test moved up from burn_drive_scan_sync()

View File

@ -803,13 +803,24 @@ int burn_drive_scan_sync(struct burn_drive_info *drives[],
/* ts A61115 : formerly sg_enumerate(); ata_enumerate(); */ /* ts A61115 : formerly sg_enumerate(); ata_enumerate(); */
scsi_enumerate_drives(); scsi_enumerate_drives();
count = burn_drive_count();
if (count)
*drives =
malloc(sizeof(struct burn_drive_info) * count);
else
*drives = NULL;
*n_drives = scanned = found = num_scanned = 0; *n_drives = scanned = found = num_scanned = 0;
count = burn_drive_count();
if (count) {
/* ts A70907 :
Extra array element marks end of array. */
*drives = calloc(count + 1,
sizeof(struct burn_drive_info));
if (*drives == NULL) {
libdax_msgs_submit(libdax_messenger, -1,
0x00000003,
LIBDAX_MSGS_SEV_FATAL,
LIBDAX_MSGS_PRIO_HIGH,
"Out of virtual memory", 0, 0);
return -1;
} else
(*drives)[count].drive = NULL; /* end mark */
} else
*drives = NULL;
} }
for (i = 0; i < count; ++i) { for (i = 0; i < count; ++i) {
@ -864,32 +875,44 @@ int burn_drive_forget(struct burn_drive *d, int force)
/* API call */ /* API call */
int burn_drive_info_forget(struct burn_drive_info *info, int force) int burn_drive_info_forget(struct burn_drive_info *info, int force)
{ {
return burn_drive_forget(info->drive, force); return burn_drive_forget(info->drive, force);
} }
void burn_drive_info_free(struct burn_drive_info drive_infos[]) void burn_drive_info_free(struct burn_drive_info drive_infos[])
{ {
int i;
/* ts A60904 : ticket 62, contribution by elmom */ /* ts A60904 : ticket 62, contribution by elmom */
/* clarifying the meaning and the identity of the victim */ /* clarifying the meaning and the identity of the victim */
/* ts A60904 : This looks a bit weird. if(drive_infos == NULL)
return;
#ifndef Libburn_free_all_drives_on_infO
/* ts A70907 : Solution for wrong behavior below */
for (i = 0; drive_infos[i].drive != NULL; i++)
return burn_drive_free(drive_infos[i].drive);
#endif
/* ts A60904 : This looks a bit weird. [ts A70907 : not any more]
burn_drive_info is not the manager of burn_drive but only its burn_drive_info is not the manager of burn_drive but only its
spokesperson. To my knowlege drive_infos from burn_drive_scan() spokesperson. To my knowlege drive_infos from burn_drive_scan()
are not memorized globally. */ are not memorized globally. */
if(drive_infos != NULL) free((void *) drive_infos);
free((void *) drive_infos);
/* >>> ts A70903 : THIS IS WRONG ! #ifdef Libburn_free_all_drives_on_infO
It contradicts the API and endangers multi drive usage. /* ts A70903 : THIS IS WRONG ! (disabled now)
It endangers multi drive usage.
This call is not entitled to delete all drives, only the This call is not entitled to delete all drives, only the
ones of the array. ones of the array which it recieves a parmeter.
Problem: it is unclear how many items are listed in drive_infos Problem: It was unclear how many items are listed in drive_infos
Solution: add a dummy element to any burn_drive_info array with Solution: Added a end marker element to any burn_drive_info array
drive == NULL The mark can be recognized by having drive == NULL
*/ */
burn_drive_free_all(); burn_drive_free_all();
#endif
} }
@ -1060,13 +1083,14 @@ int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
} }
if (d->drive_role == 2) { if (d->drive_role == 2) {
d->status = BURN_DISC_BLANK; d->status = BURN_DISC_BLANK;
d->current_profile = 0; /* MMC reserved */ d->current_profile = 0xffff; /* MMC for non-compliant drive */
strcpy(d->current_profile_text,"stdio file"); strcpy(d->current_profile_text,"stdio file");
d->current_is_cd_profile = 0; d->current_is_cd_profile = 0;
d->current_is_supported_profile = 1; d->current_is_supported_profile = 1;
d->block_types[BURN_WRITE_TAO] = BURN_BLOCK_MODE1; d->block_types[BURN_WRITE_TAO] = BURN_BLOCK_MODE1;
d->block_types[BURN_WRITE_SAO] = BURN_BLOCK_MODE1; d->block_types[BURN_WRITE_SAO] = BURN_BLOCK_MODE1;
} } else
d->current_profile = 0; /* Drives return this if empty */
*drive_infos = calloc(2, sizeof(struct burn_drive_info)); *drive_infos = calloc(2, sizeof(struct burn_drive_info));
if (*drive_infos == NULL) if (*drive_infos == NULL)
@ -1165,7 +1189,7 @@ int burn_drive_d_get_adr(struct burn_drive *d, char adr[])
return 1; return 1;
} }
/* ts A60823 - A60923 */ /* ts A60823 - A60923 */ /* A70906 : Now legacy API call */
/** Inquire the persistent address of the given drive. */ /** Inquire the persistent address of the given drive. */
int burn_drive_get_adr(struct burn_drive_info *drive_info, char adr[]) int burn_drive_get_adr(struct burn_drive_info *drive_info, char adr[])
{ {

View File

@ -626,6 +626,12 @@ void burn_allow_untested_profiles(int yes);
way to open one drive and to leave all others untouched. It bundles way to open one drive and to leave all others untouched. It bundles
the following API calls to form a non-obtrusive way to use libburn: the following API calls to form a non-obtrusive way to use libburn:
burn_drive_add_whitelist() , burn_drive_scan() , burn_drive_grab() burn_drive_add_whitelist() , burn_drive_scan() , burn_drive_grab()
<<< Restriction in progress of being removed:
To avoid memory leaks or dangling pointers one MUST shutdown all
burn_drive_info arrays by burn_drive_info_free() before calling
burn_drive_scan() a second time.
You are *strongly urged* to use this call whenever you know the drive You are *strongly urged* to use this call whenever you know the drive
address in advance. address in advance.
If not, then you have to use directly above calls. In that case, you are If not, then you have to use directly above calls. In that case, you are
@ -670,8 +676,12 @@ void burn_drive_clear_whitelist(void);
/** Scan for drives. This function MUST be called until it returns nonzero. /** Scan for drives. This function MUST be called until it returns nonzero.
No drives may be in use when this is called. No drives may be in use when this is called.
All drive pointers are invalidated by using this function. Do NOT store All pointers to struct burn_drive and all struct burn_drive_info arrays
drive pointers across calls to this function or death AND pain will ensue. are invalidated by using this function. Do NOT store drive pointers across
calls to this function !
To avoid memory leaks or dangling pointers one MUST shutdown all
burn_drive_info arrays by burn_drive_info_free() before calling
bunr_drive_scan() a second time.
After this call all drives depicted by the returned array are subject After this call all drives depicted by the returned array are subject
to eventual (O_EXCL) locking. See burn_preset_device_open(). This state to eventual (O_EXCL) locking. See burn_preset_device_open(). This state
ends either with burn_drive_info_forget() or with burn_drive_release(). ends either with burn_drive_info_forget() or with burn_drive_release().

View File

@ -284,6 +284,7 @@ Range "libdax_msgs" : 0x00000000 to 0x0000ffff
0x00000000 (ALL,ZERO) = Initial setting in new libdax_msgs_item 0x00000000 (ALL,ZERO) = Initial setting in new libdax_msgs_item
0x00000001 (DEBUG,ZERO) = Test error message 0x00000001 (DEBUG,ZERO) = Test error message
0x00000002 (DEBUG,ZERO) = Debugging message 0x00000002 (DEBUG,ZERO) = Debugging message
0x00000003 (FATAL,HIGH) = Out of virtual memory
------------------------------------------------------------------------------ ------------------------------------------------------------------------------