On 8/25/20 3:32 PM, Eric Blake wrote:
>> -      keys[optind] = strndup (argv[optind], n);
>> -      if (keys[optind] == NULL) {
>> -        perror ("strndup");
>> +      CLEANUP_FREE char *key = strndup (argv[optind], n);
>> +      const char *safekey = nbdkit_string_intern (key);
>> +      if (safekey == NULL)
>>           exit (EXIT_FAILURE);
>
> It seems it might also be nice to have a "strndup" version of the
> intern function.
 
 Or even a memdup.  Yeah, those are possibilities as well.  Doing all 
 three (strdup, strndup, memdup) up front isn't hard.  If API 
 proliferation is a problem, you can combine strdup and strndup by 
 accepting -1 as a length to mean stop at NUL termination; but I'm less 
 worried about API proliferation and more about ease-of-use. 
Time for some name bike-shedding.  How about:
nbdkit_strdup_intern (const char *)
nbdkit_strndup_intern (const char *s, size_t)
and if we need something that permits embedded NUL (right now I don't 
have such a use) we could add
nbdkit_memdup_intern (const void *s, size_t)
-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  
qemu.org | 
libvirt.org