Christian Franke wrote: > Corinna Vinschen wrote: >> On Nov 20 10:40, Corinna Vinschen wrote: >>> Hi Christian, >>> >>> This puzzles me: >>> >>> On Nov 17 21:25, Christian Franke wrote: >>>> @@ -610,7 +607,7 @@ get_by_id_table (by_id_entry * &table, >>>> fhandler_dev_disk::dev_disk_location loc) >>>>     if (!table) >>>>       return (errno_set ? -1 : 0); >>>>   -  /* Sort by name and remove duplicates. */ >>>> +  /* Sort by name and mark duplicates. */ >>>>     qsort (table, table_size, sizeof (*table), by_id_compare_name); >>>>     for (unsigned i = 0; i < table_size; i++) >>> by_id_compare_name only compars the actual names... >>> >>>>       { >>>> @@ -619,12 +616,13 @@ get_by_id_table (by_id_entry * &table, >>>> fhandler_dev_disk::dev_disk_location loc) >>>>       j++; >>>>         if (j == i + 1) >>>>       continue; >>>> -      /* Duplicate(s) found, remove all entries with this name. */ >>>> -      debug_printf ("removing duplicates %d-%d: '%s'", i, j - 1, >>>> table[i].name); >>>> -      if (j < table_size) >>>> -    memmove (table + i, table + j, (table_size - j) * sizeof >>>> (*table)); >>>> -      table_size -= j - i; >>>> -      i--; >>>> +      /* Duplicate(s) found, append "#N" to all entries. This never >>> ...but the names are identical.  So the *order* within the identically >>> named entries depends on qsort's reshuffling of table >>> entries.  Which in turn depends on outside factors like number of table >>> entries and the ultimate position of the identical entries within the >>> ordered table. >>> >>> Having said that, I don't see how adding ordinals to the names can be >>> unambiguous.  AFAICS, the numbers may change by just adding another >>> disk (USB Stick) to the system... >> Oops, that's not exactly what I was trying to say, sorry. >> >> The problem is not adding ordinals to the name, AFAICS, the problem is >> that the sorting function by_id_compare_name is not up to the task to >> make sure the order is unambiguous within the entries of identical name. > > That's correct, thanks for catching. qsort is not a stable sort. > Changing drives outside the duplicate range may also change the order > within the range. Could be fixed by a lexicographic compare of {name, > drive, part}. > Attached.