On Feb 2, 2016, at 5:04 PM, Eric Blake wrote: > On 02/02/2016 02:23 PM, Programmingkid wrote: > >>> And why isn't bsd_path usable for that purpose? >> >> After trying it out, I found out why bsd_path isn't usable for that purpose. >> It is because the user might try to use a flash drive as the the cdrom. Say >> a flash drive is set to /dev/disk2s9. If the user issues the monitor command >> "change ide1-cd0 /dev/disk2s9", this will make "if (strcmp(filename, >> "/dev/cdrom") == 0)" false and bsd_path would never be set. bsd_path >> contents would be garbage. >> >> This would lead to this code not printing the unmounting directions: >> >> if (strncmp(filename, "/dev/", 5) == 0) { >> print_unmounting_directions(filename); >> return -1; >> } >> >> It looks keeping filename as an character array is best. > > No, keep filename as a const char * pointer. It's easy to avoid use of > uninitialized memory. Try this: > > const char *filename; > char bsd_path[MAXPATHLEN] = ""; > ... > if (strncmp("/dev/cdrom"...) { > bsd_path = ... > } > ... > if (strncmp("/dev/"...) { > print_unmounting_directions(*bsd_path ? bsd_path : filename);
At first I thought this code looked unusual, but it does work. Is this ok? #if defined(__APPLE__) && defined(__MACH__) /* if a physical device experienced an error while being opened */ if (strncmp((*bsd_path ? bsd_path : filename), "/dev/", 5) == 0) { print_unmounting_directions(*bsd_path ? bsd_path : filename); return -1; } #endif /* defined(__APPLE__) && defined(__MACH__) */