Annotation of embedaddon/miniupnpc/src/listdevices.c, revision 1.1
1.1 ! misho 1: /* $Id: listdevices.c,v 1.8 2018/05/03 08:16:44 nanard Exp $ */
! 2: /* Project : miniupnp
! 3: * Author : Thomas Bernard
! 4: * Copyright (c) 2013-2015 Thomas Bernard
! 5: * This software is subject to the conditions detailed in the
! 6: * LICENCE file provided in this distribution. */
! 7:
! 8: #include <stdio.h>
! 9: #include <string.h>
! 10: #include <stdlib.h>
! 11: #ifdef _WIN32
! 12: #include <winsock2.h>
! 13: #endif /* _WIN32 */
! 14: #include "miniupnpc.h"
! 15:
! 16: struct upnp_dev_list {
! 17: struct upnp_dev_list * next;
! 18: char * descURL;
! 19: struct UPNPDev * * array;
! 20: size_t count;
! 21: size_t allocated_count;
! 22: };
! 23:
! 24: #define ADD_DEVICE_COUNT_STEP 16
! 25:
! 26: void add_device(struct upnp_dev_list * * list_head, struct UPNPDev * dev)
! 27: {
! 28: struct upnp_dev_list * elt;
! 29: size_t i;
! 30:
! 31: if(dev == NULL)
! 32: return;
! 33: for(elt = *list_head; elt != NULL; elt = elt->next) {
! 34: if(strcmp(elt->descURL, dev->descURL) == 0) {
! 35: for(i = 0; i < elt->count; i++) {
! 36: if (strcmp(elt->array[i]->st, dev->st) == 0 && strcmp(elt->array[i]->usn, dev->usn) == 0) {
! 37: return; /* already found */
! 38: }
! 39: }
! 40: if(elt->count >= elt->allocated_count) {
! 41: struct UPNPDev * * tmp;
! 42: elt->allocated_count += ADD_DEVICE_COUNT_STEP;
! 43: tmp = realloc(elt->array, elt->allocated_count * sizeof(struct UPNPDev *));
! 44: if(tmp == NULL) {
! 45: fprintf(stderr, "Failed to realloc(%p, %lu)\n", elt->array, (unsigned long)(elt->allocated_count * sizeof(struct UPNPDev *)));
! 46: return;
! 47: }
! 48: elt->array = tmp;
! 49: }
! 50: elt->array[elt->count++] = dev;
! 51: return;
! 52: }
! 53: }
! 54: elt = malloc(sizeof(struct upnp_dev_list));
! 55: if(elt == NULL) {
! 56: fprintf(stderr, "Failed to malloc(%lu)\n", (unsigned long)sizeof(struct upnp_dev_list));
! 57: return;
! 58: }
! 59: elt->next = *list_head;
! 60: elt->descURL = strdup(dev->descURL);
! 61: if(elt->descURL == NULL) {
! 62: fprintf(stderr, "Failed to strdup(%s)\n", dev->descURL);
! 63: free(elt);
! 64: return;
! 65: }
! 66: elt->allocated_count = ADD_DEVICE_COUNT_STEP;
! 67: elt->array = malloc(ADD_DEVICE_COUNT_STEP * sizeof(struct UPNPDev *));
! 68: if(elt->array == NULL) {
! 69: fprintf(stderr, "Failed to malloc(%lu)\n", (unsigned long)(ADD_DEVICE_COUNT_STEP * sizeof(struct UPNPDev *)));
! 70: free(elt->descURL);
! 71: free(elt);
! 72: return;
! 73: }
! 74: elt->array[0] = dev;
! 75: elt->count = 1;
! 76: *list_head = elt;
! 77: }
! 78:
! 79: void free_device(struct upnp_dev_list * elt)
! 80: {
! 81: free(elt->descURL);
! 82: free(elt->array);
! 83: free(elt);
! 84: }
! 85:
! 86: int main(int argc, char * * argv)
! 87: {
! 88: const char * searched_device = NULL;
! 89: const char * * searched_devices = NULL;
! 90: const char * multicastif = 0;
! 91: const char * minissdpdpath = 0;
! 92: int ipv6 = 0;
! 93: unsigned char ttl = 2;
! 94: int error = 0;
! 95: struct UPNPDev * devlist = 0;
! 96: struct UPNPDev * dev;
! 97: struct upnp_dev_list * sorted_list = NULL;
! 98: struct upnp_dev_list * dev_array;
! 99: int i;
! 100:
! 101: #ifdef _WIN32
! 102: WSADATA wsaData;
! 103: int nResult = WSAStartup(MAKEWORD(2,2), &wsaData);
! 104: if(nResult != NO_ERROR)
! 105: {
! 106: fprintf(stderr, "WSAStartup() failed.\n");
! 107: return -1;
! 108: }
! 109: #endif
! 110:
! 111: for(i = 1; i < argc; i++) {
! 112: if(strcmp(argv[i], "-6") == 0)
! 113: ipv6 = 1;
! 114: else if(strcmp(argv[i], "-d") == 0) {
! 115: if(++i >= argc) {
! 116: fprintf(stderr, "%s option needs one argument\n", "-d");
! 117: return 1;
! 118: }
! 119: searched_device = argv[i];
! 120: } else if(strcmp(argv[i], "-t") == 0) {
! 121: if(++i >= argc) {
! 122: fprintf(stderr, "%s option needs one argument\n", "-t");
! 123: return 1;
! 124: }
! 125: ttl = (unsigned char)atoi(argv[i]);
! 126: } else if(strcmp(argv[i], "-l") == 0) {
! 127: if(++i >= argc) {
! 128: fprintf(stderr, "-l option needs at least one argument\n");
! 129: return 1;
! 130: }
! 131: searched_devices = (const char * *)(argv + i);
! 132: break;
! 133: } else if(strcmp(argv[i], "-m") == 0) {
! 134: if(++i >= argc) {
! 135: fprintf(stderr, "-m option needs one argument\n");
! 136: return 1;
! 137: }
! 138: multicastif = argv[i];
! 139: } else {
! 140: printf("usage : %s [options] [-l <device1> <device2> ...]\n", argv[0]);
! 141: printf("options :\n");
! 142: printf(" -6 : use IPv6\n");
! 143: printf(" -m address/ifname : network interface to use for multicast\n");
! 144: printf(" -d <device string> : search only for this type of device\n");
! 145: printf(" -l <device1> <device2> ... : search only for theses types of device\n");
! 146: printf(" -t ttl : set multicast TTL. Default value is 2.\n");
! 147: printf(" -h : this help\n");
! 148: return 1;
! 149: }
! 150: }
! 151:
! 152: if(searched_device) {
! 153: printf("searching UPnP device type %s\n", searched_device);
! 154: devlist = upnpDiscoverDevice(searched_device,
! 155: 2000, multicastif, minissdpdpath,
! 156: 0/*localport*/, ipv6, ttl, &error);
! 157: } else if(searched_devices) {
! 158: printf("searching UPnP device types :\n");
! 159: for(i = 0; searched_devices[i]; i++)
! 160: printf("\t%s\n", searched_devices[i]);
! 161: devlist = upnpDiscoverDevices(searched_devices,
! 162: 2000, multicastif, minissdpdpath,
! 163: 0/*localport*/, ipv6, ttl, &error, 1);
! 164: } else {
! 165: printf("searching all UPnP devices\n");
! 166: devlist = upnpDiscoverAll(2000, multicastif, minissdpdpath,
! 167: 0/*localport*/, ipv6, ttl, &error);
! 168: }
! 169: if(devlist) {
! 170: for(dev = devlist, i = 1; dev != NULL; dev = dev->pNext, i++) {
! 171: printf("%3d: %-48s\n", i, dev->st);
! 172: printf(" %s\n", dev->descURL);
! 173: printf(" %s\n", dev->usn);
! 174: add_device(&sorted_list, dev);
! 175: }
! 176: putchar('\n');
! 177: for (dev_array = sorted_list; dev_array != NULL ; dev_array = dev_array->next) {
! 178: printf("%s :\n", dev_array->descURL);
! 179: for(i = 0; (unsigned)i < dev_array->count; i++) {
! 180: printf("%2d: %s\n", i+1, dev_array->array[i]->st);
! 181: printf(" %s\n", dev_array->array[i]->usn);
! 182: }
! 183: putchar('\n');
! 184: }
! 185: freeUPNPDevlist(devlist);
! 186: while(sorted_list != NULL) {
! 187: dev_array = sorted_list;
! 188: sorted_list = sorted_list->next;
! 189: free_device(dev_array);
! 190: }
! 191: } else {
! 192: printf("no device found.\n");
! 193: }
! 194:
! 195: return 0;
! 196: }
! 197:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>