static int show_sysfs_attribs(struct rc_device *rc_dev) { static struct sysfs_names *names, *cur; int fd; names = find_device(NULL); if (!names) return -1; for (cur = names; cur->next; cur = cur->next) { if (cur->name) { if (get_attribs(rc_dev, cur->name)) return -1; fprintf(stderr, "Found %s (%s) with:\n", rc_dev->sysfs_name, rc_dev->input_name); fprintf(stderr, "\tDriver %s, table %s\n", rc_dev->drv_name, rc_dev->keytable_name); fprintf(stderr, "\tSupported protocols: "); show_proto(rc_dev->supported); fprintf(stderr, "\n\t"); display_proto(rc_dev); fd = open(rc_dev->input_name, O_RDONLY); if (fd > 0) { device_info(fd, "\t"); show_evdev_attribs(fd); close(fd); } else { printf("\tExtra capabilities: <access denied>\n"); } } } return 0; }
static void display_proto(struct rc_device *rc_dev) { if (rc_dev->type == HARDWARE_DECODER) fprintf(stderr, "Current protocols: "); else fprintf(stderr, "Enabled protocols: "); show_proto(rc_dev->current); fprintf(stderr, "\n"); }
int main(int argc, char *argv[]) { int dev_from_class = 0, write_cnt; int fd; static struct sysfs_names *names; struct rc_device rc_dev; argp_parse(&argp, argc, argv, 0, 0, 0); /* Just list all devices */ if (!clear && !readtable && !keys.next && !ch_proto && !cfg.next && !test && !delay && !period) { if (devicename) { fd = open(devicename, O_RDONLY); if (fd < 0) { perror("Can't open device"); return -1; } device_info(fd, ""); close(fd); return 0; } if (show_sysfs_attribs(&rc_dev)) return -1; return 0; } if (cfg.next && (clear || keys.next || ch_proto || devicename)) { fprintf (stderr, "Auto-mode can be used only with --read, --debug and --sysdev options\n"); return -1; } if (!devicename) { names = find_device(devclass); if (!names) return -1; rc_dev.sysfs_name = names->name; if (get_attribs(&rc_dev, names->name)) { free_names(names); return -1; } names->name = NULL; free_names(names); devicename = rc_dev.input_name; dev_from_class++; } if (cfg.next) { struct cfgfile *cur; char *fname, *name; int rc; for (cur = &cfg; cur->next; cur = cur->next) { if ((!rc_dev.drv_name || strcasecmp(cur->driver, rc_dev.drv_name)) && strcasecmp(cur->driver, "*")) continue; if ((!rc_dev.keytable_name || strcasecmp(cur->table, rc_dev.keytable_name)) && strcasecmp(cur->table, "*")) continue; break; } if (!cur->next) { if (debug) fprintf(stderr, "Table for %s, %s not found. Keep as-is\n", rc_dev.drv_name, rc_dev.keytable_name); return 0; } if (debug) fprintf(stderr, "Table for %s, %s is on %s file.\n", rc_dev.drv_name, rc_dev.keytable_name, cur->fname); if (cur->fname[0] == '/' || ((cur->fname[0] == '.') && strchr(cur->fname, '/'))) { fname = cur->fname; rc = parse_keyfile(fname, &name); if (rc < 0) { fprintf(stderr, "Can't load %s table\n", fname); return -1; } } else { fname = malloc(strlen(cur->fname) + strlen(IR_KEYTABLE_USER_DIR) + 2); strcpy(fname, IR_KEYTABLE_USER_DIR); strcat(fname, "/"); strcat(fname, cur->fname); rc = parse_keyfile(fname, &name); if (rc != 0) { fname = malloc(strlen(cur->fname) + strlen(IR_KEYTABLE_SYSTEM_DIR) + 2); strcpy(fname, IR_KEYTABLE_SYSTEM_DIR); strcat(fname, "/"); strcat(fname, cur->fname); rc = parse_keyfile(fname, &name); } if (rc != 0) { fprintf(stderr, "Can't load %s table from %s or %s\n", cur->fname, IR_KEYTABLE_USER_DIR, IR_KEYTABLE_SYSTEM_DIR); return -1; } } if (!keys.next) { fprintf(stderr, "Empty table %s\n", fname); return -1; } clear = 1; } if (debug) fprintf(stderr, "Opening %s\n", devicename); fd = open(devicename, O_RDONLY); if (fd < 0) { perror(devicename); return -1; } if (dev_from_class) free(devicename); if (get_input_protocol_version(fd)) return -1; /* * First step: clear, if --clear is specified */ if (clear) { clear_table(fd); fprintf(stderr, "Old keytable cleared\n"); } /* * Second step: stores key tables from file or from commandline */ write_cnt = add_keys(fd); if (write_cnt) fprintf(stderr, "Wrote %d keycode(s) to driver\n", write_cnt); /* * Third step: change protocol */ if (ch_proto) { rc_dev.current = ch_proto; if (set_proto(&rc_dev)) fprintf(stderr, "Couldn't change the IR protocols\n"); else { fprintf(stderr, "Protocols changed to "); show_proto(rc_dev.current); fprintf(stderr, "\n"); } } /* * Fourth step: display current keytable */ if (readtable) display_table(&rc_dev, fd); /* * Fiveth step: change repeat rate/delay */ if (delay || period) { unsigned int new_delay, new_period; get_rate(fd, &new_delay, &new_period); if (delay) new_delay = delay; if (period) new_period = period; set_rate(fd, new_delay, new_period); } if (test) test_event(fd); return 0; }
Errcode do_lookup_dialog(Popot *nameptrs, char **protoptrs, int namecount) /***************************************************************************** * drive the display of and interaction with a function list. ****************************************************************************/ { Errcode err; Boolean ctinue; int choice; int lastpos = 0; char choicestr[MAX_MAXSTRLEN]; Popot ppt_choicestr = array2ppt(choicestr); Popot ppt_nameptrs = ptr2ppt(nameptrs, sizeof(Popot)*namecount); Popot ppt_choice = var2ppt(choice); Popot ppt_lastpos = var2ppt(lastpos); Popot ppt_prompt = str2ppt("Select Library Function to Look Up:"); /* * dialog loop... * - show the list of functions * - if the user picks CANCEL, exit the loop. * - if the user selects a function from the list, call the * format-and-display routine. * - if the user types in a string which is not in the list, call the * sublist dialog routine. */ for (;;) { /* * start with a clean type-in string; display the list... */ choicestr[0] = '\0'; ctinue = poeQlist(ppt_choicestr, ppt_choice, ppt_nameptrs, namecount, ppt_lastpos, ppt_prompt); /* * if a builtin_error occurred, return it to our caller. if the user * picked CANCEL, exit the loop. */ if (builtin_err != Success) return builtin_err; if (!ctinue) break; /* * if a list item was selected, format and display it, else go build * and display a sublist based on the string the user typed in. * * (if we get a non-match indicated by choice < 0, but we didn't * get a CANCEL status from the Qlist call, we must have a case * where the user typed in something not in the list and hit ENTER.) * * if we got a non-match, and the type-in string is empty, the user * just hit ENTER without typing anything. in this case, treat it * like a CANCEL. * * we check builtin_err upon return from the display or sublist * dialogs, and bail out if necessary. */ if (choice >= 0) { show_proto(protoptrs[choice]); break; } else { if (choicestr[0] == '\0') break; if (Success != (err = do_sublist_dialog(nameptrs, protoptrs, namecount, choicestr))) return err; } if (builtin_err != Success) return builtin_err; } return Success; }
int main(int argc, char *argv[]) { int dev_from_class = 0, write_cnt; int fd; static struct sysfs_names *names; struct rc_device rc_dev; argp_parse(&argp, argc, argv, 0, 0, 0); /* Just list all devices */ if (!clear && !read && !keys.next && !ch_proto && !cfg.next) { static struct sysfs_names *names, *cur; names = find_device(NULL); if (!names) return -1; for (cur = names; cur->next; cur = cur->next) { if (cur->name) { if (get_attribs(&rc_dev, cur->name)) return -1; fprintf(stderr, "Found %s (%s) with:\n", rc_dev.sysfs_name, rc_dev.input_name); fprintf(stderr, "\tDriver %s, %s decoder, table %s\n", rc_dev.drv_name, (rc_dev.type == SOFTWARE_DECODER) ? "raw software" : "hardware", rc_dev.keytable_name); fprintf(stderr, "\tSupported protocols: "); show_proto(rc_dev.supported); fprintf(stderr, "\t"); display_proto(&rc_dev); } } return 0; } if (cfg.next && (clear || keys.next || ch_proto || devname)) { fprintf (stderr, "Auto-mode can be used only with --read, --debug and --sysdev options\n"); return -1; } if (!devname) { names = find_device(devclass); if (!names) return -1; rc_dev.sysfs_name = names->name; if (get_attribs(&rc_dev, names->name)) { free_names(names); return -1; } names->name = NULL; free_names(names); devname = rc_dev.input_name; dev_from_class++; } if (cfg.next) { struct cfgfile *cur; char *fname, *name; int rc; for (cur = &cfg; cur->next; cur = cur->next) { if (strcasecmp(cur->driver, rc_dev.drv_name) && strcasecmp(cur->driver, "*")) continue; if (strcasecmp(cur->table, rc_dev.keytable_name) && strcasecmp(cur->table, "*")) continue; break; } if (!cur->next) { if (debug) fprintf(stderr, "Table for %s, %s not found. Keep as-is\n", rc_dev.drv_name, rc_dev.keytable_name); return 0; } if (debug) fprintf(stderr, "Table for %s, %s is on %s file.\n", rc_dev.drv_name, rc_dev.keytable_name, cur->fname); if (cur->fname[0] == '/' || ((cur->fname[0] == '.') && strchr(cur->fname, '/'))) { fname = cur->fname; } else { fname = malloc(strlen(cur->fname) + strlen(CFGDIR) + 2); strcpy(fname, CFGDIR); strcat(fname, "/"); strcat(fname, cur->fname); } rc = parse_keyfile(fname, &name); if (rc < 0 || !keys.next) { fprintf(stderr, "Can't load %s table or empty table\n", fname); return -1; } clear = 1; } if (debug) fprintf(stderr, "Opening %s\n", devname); fd = open(devname, O_RDONLY); if (fd < 0) { perror(devname); return -1; } if (dev_from_class) free(devname); /* * First step: clear, if --clear is specified */ if (clear) { clear_table(fd); fprintf(stderr, "Old keytable cleared\n"); } /* * Second step: stores key tables from file or from commandline */ write_cnt = add_keys(fd); if (write_cnt) fprintf(stderr, "Wrote %d keycode(s) to driver\n", write_cnt); /* * Third step: change protocol */ if (ch_proto) { rc_dev.current = ch_proto; if (set_proto(&rc_dev)) fprintf(stderr, "Couldn't change the IR protocols\n"); else { fprintf(stderr, "Protocols changed to "); show_proto(rc_dev.current); fprintf(stderr, "\n"); } } /* * Fourth step: display current keytable */ if (read) display_table(&rc_dev, fd); return 0; }