Пример #1
0
int 
connection_active(char *if_name, int if_type) {
        /*
        *  Returns 1 if the network status on the interface is active.
        *  if_type: 0 for ethernet, 1 for ieee80211 
        */

        struct ifmediareq ifmr;
        const struct ifmedia_status_description *ifms;
        static const int ifm_status_valid_list[] = IFM_STATUS_VALID_LIST;
        static const struct ifmedia_status_description ifm_status_descriptions[] = IFM_STATUS_DESCRIPTIONS;
        int 		bit = 0, 	s = -1, res;

        s = open_socket(AF_INET);
        if (s < 0) {
            printf("error opening socket: %s\n", strerror(errno));
        }
        memset(&ifmr, 0, sizeof(ifmr));
        strlcpy(ifmr.ifm_name, if_name, sizeof(ifmr.ifm_name));
        res = ioctl(s, SIOCGIFMEDIA, (caddr_t) & ifmr);
        close(s);
        if (res) {
            printf("res: %d (%s)\n", res, strerror(errno));
            return 0;
        }
        if (if_type) {
            /* ieee80211 check */
            if (IFM_ACTIVE) {
                printf("connection_active: ieee80211 network is active\n");
                return 1;
            }
            printf("connection_active: ieee80211 failed check\n");
            return 0;
        } else {
            /* ethernet check */
            for (ifms = ifm_status_descriptions; ifms->ifms_valid != 0; ifms++) {
                if (ifms->ifms_type == IFM_TYPE(ifmr.ifm_current))
                    if (strcmp(IFM_STATUS_DESC(ifms, ifmr.ifm_status), "active") == 0) {
                        printf("connection_active: ethernet network is active\n");
                        return 1;
                    } else {
                        printf("connection_active: ethernet failed check\n");
                        return 0;
                    }
            }
        }
}
Пример #2
0
void
media_status(int s, char *ifname, char *delim)
{
	uint64_t *media_list;
	struct ifmediareq ifmr;

	memset(&ifmr, 0, sizeof(ifmr));
	strlcpy(ifmr.ifm_name, ifname, sizeof(ifmr.ifm_name));

	if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) {
		if (errno != ENOTTY)
			printf("%% media_status: SIOCGIFMEDIA: %s\n",
			    strerror(errno));
		return;
	}

	if (ifmr.ifm_count == 0) {
		if (verbose)
			printf("%% %s: No media types?\n", ifname);
		return;
	}

	media_list = calloc(ifmr.ifm_count, sizeof(*media_list));
	if (media_list == NULL) {
		printf("%% media_status: calloc: %s\n", strerror(errno));
		return;
	}
	ifmr.ifm_ulist = media_list;

	if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) {
		printf("%% media_status: SIOCGIFMEDIA: %s\n", strerror(errno));
		free(media_list);
		return;
	}

	printf("%s", delim);
	print_media_word(ifmr.ifm_current, 0, 0);
	if (ifmr.ifm_active != ifmr.ifm_current) {
		printf(" (");
		print_media_word(ifmr.ifm_active, 0, 0);
		putchar(')');
	}

	if (ifmr.ifm_status & IFM_AVALID) {
		const struct ifmedia_status_description *ifms;
		int bitno, found = 0;

		printf(", status ");
		for (bitno = 0; ifm_status_valid_list[bitno] != 0; bitno++) {

			for (ifms = ifm_status_descriptions;
			     ifms->ifms_valid != 0; ifms++) {

				if (ifms->ifms_type !=
				      IFM_TYPE(ifmr.ifm_current) ||
				    ifms->ifms_valid !=
				      ifm_status_valid_list[bitno])
					continue;

				printf("%s%s", found ? ", " : "",
				    IFM_STATUS_DESC(ifms, ifmr.ifm_status));
				found = 1;

				/*
				 * For each valid indicator bit, there's only
				 * one entry for each media type, so 
				 * terminate the inner loop now.
				 */
				break;
			}
		}
		if (found == 0)
			printf("unknown");
	}
	putchar('\n');

	free(media_list);
	return;
}