void cli_print_help (void) { cli_print_version(); printf("\n%s\n", cli_info_purpose); printf("\n%s\n", cli_info_usage); printf("\n"); int i = 0; while (cli_info_help[i]) { printf("%s\n", cli_info_help[i++]); } }
int cli_parser (int argc, const char** argv, struct cli_info* args_info) { static struct option longopts[] = { { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'V' }, { "show-plist", no_argument, NULL, 'p' }, { "since-when", required_argument, NULL, 's' }, { "latency", required_argument, NULL, 'l' }, { "no-defer", no_argument, NULL, 'n' }, { "watch-root", no_argument, NULL, 'r' }, { "ignore-self", no_argument, NULL, 'i' }, { "file-events", no_argument, NULL, 'F' }, { "mark-self", no_argument, NULL, 'm' }, { "format", required_argument, NULL, 'f' }, { 0, 0, 0, 0 } }; const char* shortopts = "hVps:l:nriFf:"; int c = -1; while ((c = getopt_long(argc, (char * const*)argv, shortopts, longopts, NULL)) != -1) { switch(c) { case 's': // since-when args_info->since_when_arg = strtoull(optarg, NULL, 0); break; case 'l': // latency args_info->latency_arg = strtod(optarg, NULL); break; case 'n': // no-defer args_info->no_defer_flag = true; break; case 'r': // watch-root args_info->watch_root_flag = true; break; case 'i': // ignore-self args_info->ignore_self_flag = true; break; case 'F': // file-events args_info->file_events_flag = true; break; case 'm': // mark-self args_info->mark_self_flag = true; break; case 'f': // format // XXX: ignored break; case 'V': // version cli_print_version(); exit(EXIT_SUCCESS); case 'p': // show-plist cli_show_plist(); exit(EXIT_SUCCESS); case 'h': // help case '?': // invalid option case ':': // missing argument cli_print_help(); exit((c == 'h') ? EXIT_SUCCESS : EXIT_FAILURE); } } if (optind < argc) { int i = 0; args_info->inputs_num = (unsigned int)(argc - optind); args_info->inputs = (char**)(malloc ((args_info->inputs_num)*sizeof(char*))); while (optind < argc) if (argv[optind++] != argv[0]) { args_info->inputs[i++] = strdup(argv[optind-1]); } } return EXIT_SUCCESS; }
int main(int argc, char **argv) { int rc, nrow, ncol; sqlite *dbname; char *errmsg = NULL, **result = NULL; struct in_addr in_ip; FILE *fp1, *fp2; char line[256]; /* get program name */ progname = cli_get_progname(argv[0]); /* print version information */ cli_print_version(); /* initialize */ cli_dns_init(); /* open configuration database */ if((dbname = sqlite_open(DB_CONF, 0, &errmsg)) == NULL) { cli_print_debug_msg("Error: %s\n", errmsg); exit(3); } /* parse command line */ if(argc < 2) { cli_dns_usage(); cli_dns_exit(1); } if(!strcmp(argv[1], "set") && (argc == 4 || argc == 5) && !strcmp(argv[2], "ip")) { if(cli_check_keyword("<single_ip>", argv[3])) { cli_get_user_msg("public", 1, cli_user_msg); printf(cli_user_msg, argv[3]); printf("\n"); cli_dns_exit(1); } inet_aton(argv[3], &in_ip); strcpy(dns.dnssrv, inet_ntoa(in_ip)); if(argc == 5) { if(cli_check_keyword("<single_ip>", argv[4])) { cli_get_user_msg("public", 1, cli_user_msg); printf(cli_user_msg, argv[4]); printf("\n"); cli_dns_exit(1); } inet_aton(argv[4], &in_ip); strcpy(dns.dnssrv2, inet_ntoa(in_ip)); } if((fp1 = fopen(FILE_RESOLV_CONF, "r")) == NULL) { cli_print_debug_msg("Error: open file \"%s\"\n", FILE_RESOLV_CONF); cli_dns_exit(3); } flock(fileno(fp1), LOCK_EX); if((fp2 = fopen(FILE_RESOLV_CONF_TEMP, "w+")) == NULL) { cli_print_debug_msg("Error: open file \"%s\"\n", FILE_RESOLV_CONF_TEMP); cli_dns_exit(3); } flock(fileno(fp2), LOCK_EX); while(fgets(line, 256, fp1) != NULL) { if(strstr(line, "domain") == line) { fputs(line, fp2); } } if(strlen(dns.dnssrv)) { sprintf(line, "nameserver\t%s\n", dns.dnssrv); fputs(line, fp2); } if(strlen(dns.dnssrv2)) { sprintf(line, "nameserver\t%s\n", dns.dnssrv2); fputs(line, fp2); } flock(fileno(fp1), LOCK_UN); fclose(fp1); flock(fileno(fp2), LOCK_UN); fclose(fp2); remove(FILE_RESOLV_CONF); rename(FILE_RESOLV_CONF_TEMP, FILE_RESOLV_CONF); rc = sqlite_exec_printf(dbname, "update %s set dnssrv = %Q, dnssrv2 = %Q", 0, 0, 0, TABLE_DNS, dns.dnssrv, dns.dnssrv2); if(rc != SQLITE_OK) { cli_dns_exit(3); } if(strlen(dns.dnssrv2)) { fw_log_write(FWLOG_DEV_MNG, LOG_NOTICE, "mod=%s act=set ip=\"%s %s\" result=0", progname, dns.dnssrv, dns.dnssrv2); } else { fw_log_write(FWLOG_DEV_MNG, LOG_NOTICE, "mod=%s act=set ip=%s result=0", progname, dns.dnssrv); } } else if(!strcmp(argv[1], "unset") && argc == 2) { if((fp1 = fopen(FILE_RESOLV_CONF, "w+")) == NULL) { cli_print_debug_msg("Error: open file \"%s\"\n", FILE_RESOLV_CONF); cli_dns_exit(3); } fclose(fp1); rc = sqlite_exec_printf(dbname, "update %s set dnssrv = '', dnssrv2 = ''", 0, 0, 0, TABLE_DNS); if(rc != SQLITE_OK) { cli_dns_exit(3); } fw_log_write(FWLOG_DEV_MNG, LOG_NOTICE, "mod=%s act=unset result=0", progname); } else if(!strcmp(argv[1], "show") && argc == 2) { rc = sqlite_get_table_printf(dbname, "select * from %s", &result, &nrow, &ncol, &errmsg, TABLE_DNS); if(rc != SQLITE_OK) { cli_dns_exit(3); } if(nrow > 0) { if(strlen(result[ncol]) || strlen(result[ncol + 1])) { printf("DNS 1: %s\n", result[ncol]); printf("DNS 2: %s\n", result[ncol + 1]); } else { printf("DNS are not set\n"); } } } else if(!strcmp(argv[1], "startup") && argc == 2) { rc = sqlite_get_table_printf(dbname, "select * from %s", &result, &nrow, &ncol, &errmsg, TABLE_DNS); if(rc != SQLITE_OK) { cli_dns_exit(3); } if(nrow > 0) { strcpy(dns.dnssrv, result[ncol]); strcpy(dns.dnssrv2, result[ncol + 1]); } if(strlen(dns.dnssrv)) { if((fp1 = fopen(FILE_RESOLV_CONF, "r")) == NULL) { cli_print_debug_msg("Error: open file \"%s\"\n", FILE_RESOLV_CONF); cli_dns_exit(3); } flock(fileno(fp1), LOCK_EX); if((fp2 = fopen(FILE_RESOLV_CONF_TEMP, "w+")) == NULL) { cli_print_debug_msg("Error: open file \"%s\"\n", FILE_RESOLV_CONF_TEMP); cli_dns_exit(3); } flock(fileno(fp2), LOCK_EX); while(fgets(line, 256, fp1) != NULL) { if(strstr(line, "domain") == line) { fputs(line, fp2); } } if(strlen(dns.dnssrv)) { sprintf(line, "nameserver\t%s\n", dns.dnssrv); fputs(line, fp2); } if(strlen(dns.dnssrv2)) { sprintf(line, "nameserver\t%s\n", dns.dnssrv2); fputs(line, fp2); } flock(fileno(fp1), LOCK_UN); fclose(fp1); flock(fileno(fp2), LOCK_UN); fclose(fp2); remove(FILE_RESOLV_CONF); rename(FILE_RESOLV_CONF_TEMP, FILE_RESOLV_CONF); } } else { cli_dns_usage(); cli_dns_exit(1); } sqlite_close(dbname); cli_dns_exit(0); exit(0); }