/** Run testcase. */ static int irtestcase(int fd_io, int fd_cmd) { int r; struct lirc_config* config; char code[64]; char* c; if (opt_lircrc != NULL) { if (lirc_readconfig_only(opt_lircrc, &config, NULL) != 0) { fputs("Cannot initiate lircrc decoding\n", stderr); exit(2); } } while (nextcode(fd_io, code, sizeof(code)) == 1) { fputs(code, stdout); if (strstr(code, "__EOF") != NULL) exit(0); fputs(code, code_log); if (opt_lircrc != NULL) { r = lirc_code2char(config, code, &c); while (r == 0 && c != NULL) { printf(" %s\n", c); fprintf(app_log, "%s\n", c); r = lirc_code2char(config, code, &c); } fflush(app_log); } fflush(stdout); fflush(code_log); } return 0; }
int main(int argc, char** argv) { char* configfile; const char* socketfile = NULL; mode_t permission = S_IRUSR | S_IWUSR; int socket; int lircdfd; struct sigaction act; struct sockaddr_un addr; char dir[FILENAME_MAX + 1] = { 0 }; lirc_log_open("lircrcd", 0, LIRC_NOLOG); while (1) { int c; static struct option long_options[] = { { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'v' }, { "permission", required_argument, NULL, 'p' }, { "output", required_argument, NULL, 'o' }, { 0, 0, 0, 0 } }; c = getopt_long(argc, argv, "hvp:o:", long_options, NULL); if (c == -1) break; switch (c) { case 'h': printf("Usage: %s [options] config-file\n", progname); printf("\t -h --help\t\t\tdisplay this message\n"); printf("\t -v --version\t\t\tdisplay version\n"); printf("\t -p --permission=mode\t\tfile permissions for socket\n"); printf("\t -o --output=socket\t\toutput socket filename\n"); return EXIT_SUCCESS; case 'v': printf("%s %s\n", progname, VERSION); return EXIT_SUCCESS; case 'p': if (oatoi(optarg) == -1) { fprintf(stderr, "%s: invalid mode\n", progname); return EXIT_FAILURE; } permission = oatoi(optarg); break; case 'o': socketfile = optarg; break; default: printf("Usage: %s [options] config-file\n", progname); return EXIT_FAILURE; } } if (optind == argc - 1) { configfile = argv[optind]; } else { fprintf(stderr, "%s: invalid argument count\n", progname); return EXIT_FAILURE; } lircdfd = lirc_init("lircrcd", 0); if (lircdfd == -1) return EXIT_FAILURE; /* read config file */ if (lirc_readconfig_only(configfile, &config, NULL) != 0) { lirc_deinit(); return EXIT_FAILURE; } /* open socket */ socket = opensocket(config->lircrc_class, socketfile, permission, &addr); if (socket == -1) { lirc_freeconfig(config); lirc_deinit(); return EXIT_FAILURE; } /* fork */ if (getcwd(dir, sizeof(dir)) == NULL) { lirc_freeconfig(config); lirc_deinit(); perror("getcwd()"); return EXIT_FAILURE; } if (daemon(0, 0) == -1) { perror("daemon() failed"); shutdown(socket, 2); close(socket); lirc_deinit(); lirc_freeconfig(config); return EXIT_FAILURE; } daemonized = 1; openlog(progname, LOG_CONS | LOG_PID, LOG_USER); umask(0); signal(SIGPIPE, SIG_IGN); act.sa_handler = sigterm; sigfillset(&act.sa_mask); act.sa_flags = SA_RESTART; /* don't fiddle with EINTR */ sigaction(SIGTERM, &act, NULL); sigaction(SIGINT, &act, NULL); sigaction(SIGHUP, &act, NULL); log_notice("%s started", progname); loop(socket, lircdfd); closelog(); shutdown(socket, 2); close(socket); if (chdir(dir) == 0) unlink(addr.sun_path); lirc_freeconfig(config); lirc_deinit(); return EXIT_SUCCESS; }