static int add_fd(os_handler_t *handler, int fd, os_data_ready_t data_ready, void *cb_data, os_fd_data_freed_t freed, os_hnd_fd_id_t **id) { os_hnd_fd_id_t *fd_data; int rv; pt_os_hnd_data_t *info = handler->internal_data; selector_t *posix_sel = info->sel; fd_data = malloc(sizeof(*fd_data)); if (!fd_data) return ENOMEM; fd_data->fd = fd; fd_data->cb_data = cb_data; fd_data->data_ready = data_ready; fd_data->handler = handler; fd_data->freed = freed; sel_set_fd_write_handler(posix_sel, fd, SEL_FD_HANDLER_DISABLED); sel_set_fd_except_handler(posix_sel, fd, SEL_FD_HANDLER_DISABLED); rv = sel_set_fd_handlers(posix_sel, fd, fd_data, fd_handler, NULL, NULL, free_fd_data); if (rv) { free(fd_data); return rv; } sel_set_fd_read_handler(posix_sel, fd, SEL_FD_HANDLER_ENABLED); *id = fd_data; return 0; }
int main(int argc, char *argv[]) { int rv; int curr_arg; ipmi_args_t *args; int i; progname = argv[0]; /* Have to initalize this first so the usage help will work, since it needs OpenIPMI initialized. */ /* OS handler allocated first. */ os_hnd = ipmi_posix_get_os_handler(); if (!os_hnd) { fprintf(stderr, "ipmi_smi_setup_con: Unable to allocate os handler\n"); exit(1); } /* Create selector with os handler. */ rv = sel_alloc_selector_nothread(&sel); if (rv) { fprintf(stderr, "Error allocating selector: 0x%x\n", rv); exit(1); } /* The OS handler has to know about the selector. */ ipmi_posix_os_handler_set_sel(os_hnd, sel); /* Initialize the OEM handlers. */ rv = ipmi_init(os_hnd); if (rv) { fprintf(stderr, "Error initializing connections: 0x%x\n", rv); exit(1); } for (i=1; i<argc; i++) { if (argv[i][0] != '-') break; if (strcmp(argv[i], "--") == 0) { i++; break; } else if ((strcmp(argv[i], "-k") == 0) || (strcmp(argv[i], "--command") == 0)) { i++; if (i >= argc) { usage(); exit(1); } cmdstr = argv[i]; interactive = 0; } else if ((strcmp(argv[i], "-v") == 0) || (strcmp(argv[i], "--version") == 0)) { printInfo(); exit(0); } else { usage(); exit(1); } } if (i >= argc) { fprintf(stderr, "Not enough arguments\n"); exit(1); } curr_arg = i; if (strcmp(argv[0], "ipmicmd") == 0) /* Backwards compatible interface */ rv = ipmi_parse_args(&curr_arg, argc, argv, &args); else rv = ipmi_parse_args2(&curr_arg, argc, argv, &args); if (rv) { fprintf(stderr, "Error parsing command arguments, argument %d: %s\n", curr_arg, strerror(rv)); exit(1); } rv = ipmi_args_setup_con(args, os_hnd, sel, &con); if (rv) { fprintf(stderr, "ipmi_ip_setup_con: %s\n", strerror(rv)); exit(1); } if (interactive) { rv = con->add_event_handler(con, event_handler, NULL); if (rv) { fprintf(stderr, "Could not set to get events: %x\n", rv); } sel_set_fd_handlers(sel, 0, NULL, user_input_ready, NULL, NULL, NULL); sel_set_fd_read_handler(sel, 0, SEL_FD_HANDLER_ENABLED); } con->add_con_change_handler(con, con_changed_handler, NULL); rv = con->start_con(con); if (rv) { fprintf(stderr, "Could not start connection: %x\n", rv); exit(1); } if (interactive) printf("=> "); fflush(stdout); while (continue_operation) { rv = os_hnd->perform_one_op(os_hnd, NULL); if (rv) break; } leave(rv); return rv; }