todo: getopt_long