Annotation of embedaddon/miniupnpc/src/listdevices.c, revision 1.1.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>