Minor cosmetic detail - getopt_long(3) manpage says: (see for example https://www.freebsd.org/cgi/man.cgi?query=getopt_long&apropos=0&sektion=3&manpath=FreeBSD+11-current&arch=default&format=html ) "The last element of the longopts array has to be filled with zeroes." and the example just below is written as: "{ NULL, 0, NULL, 0 }" While this accidentally works out it is confusing to read. The manpage of GNU getopt_long shows "{ 0, 0, 0, 0 }" for this example, which matches the text a lot better.
I believe that since the struct members are pointers in this case, NULL might actually be better.