So ... I was getting a lay-of-the-land and reading code. Tar's options are intensely complex, so your own version of getopt is cool... but.
For struct bsdtar_option, in the equivalent field, you have either a literal character or a enumerated constant. The enumerated constants start at one and I count 56 of them. That overlaps printable charcters --- even the numbers --- s.t., if I read this correctly, you couldn't have an argument of -0 (among others) as it would conflict with OPOTION_STRIP_COMPONENTS if I count lines correctly.
I would propose starting the enum at either 128 (unprintable characters) or 256 (not a character) or 65536 (not even a wide character). _or_ -255 (since It's clearly a signed integer). I haven't read forward to how it's used (other than the case statement in main and probably the printing of usage) ... but this would open up some single character options and prevent expanding the command line from encroaching on used characters (only 9 more to go by my count, before you get to -a).