int intmediaopt(char *ifname, int ifs, int argc, char **argv) { int set, media_current, mediaopt; if (NO_ARG(argv[0])) { set = 0; argc--; argv++; } else set = 1; argv++; argc--; if ((set && (argc != 1)) || (!set && (argc > 1))) { printf("%% mediaopt <option>\n"); printf("%% no mediaopt [option]\n"); return(0); } media_current = init_current_media(ifs, ifname); if (media_current == -1) { if (errno == EINVAL) printf("%% This device does not support " "media commands.\n"); else printf("%% Failed to initialize media: %s\n", strerror(errno)); return(0); } if (argc == 1) mediaopt = get_media_options(IFM_TYPE(media_current), argv[0]); else mediaopt = IFM_OPTIONS(media_current); if (mediaopt == -1) return(0); if (set) media_current |= mediaopt; else media_current &= ~mediaopt; process_media_commands(ifs, ifname, media_current); return(0); }
static void domediaopt(const char *val, int clear, int s) { struct ifmediareq *ifmr; int options; ifmr = ifmedia_getstate(s); options = get_media_options(IFM_TYPE(ifmr->ifm_ulist[0]), val); strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); ifr.ifr_media = ifmr->ifm_current; if (clear) ifr.ifr_media &= ~options; else ifr.ifr_media |= options; ifmr->ifm_current = ifr.ifr_media; callback_register(setifmediacallback, (void *)ifmr); }
static void set_port_mediaopt(struct cfg *cfg, char *argv[]) { etherswitch_port_t p; int ifm_ulist[IFMEDIAREQ_NULISTENTRIES]; int options; bzero(&p, sizeof(p)); p.es_port = cfg->unit; p.es_ifmr.ifm_ulist = ifm_ulist; p.es_ifmr.ifm_count = IFMEDIAREQ_NULISTENTRIES; if (ioctl(cfg->fd, IOETHERSWITCHGETPORT, &p) != 0) err(EX_OSERR, "ioctl(IOETHERSWITCHGETPORT)"); options = get_media_options(IFM_TYPE(ifm_ulist[0]), argv[1]); if (options == -1) errx(EX_USAGE, "invalid media options \"%s\"", argv[1]); if (options & IFM_HDX) { p.es_ifr.ifr_media &= ~IFM_FDX; options &= ~IFM_HDX; } p.es_ifr.ifr_media |= options; if (ioctl(cfg->fd, IOETHERSWITCHSETPORT, &p) != 0) err(EX_OSERR, "ioctl(IOETHERSWITCHSETPORT)"); }