]> git.meshlink.io Git - catta/blob - avahi-common/alternative.c
Complete AVAHI_LOOKUP_NO_ADDRESS fix
[catta] / avahi-common / alternative.c
1 /* $Id$ */
2
3 /***
4   This file is part of avahi.
5  
6   avahi is free software; you can redistribute it and/or modify it
7   under the terms of the GNU Lesser General Public License as
8   published by the Free Software Foundation; either version 2.1 of the
9   License, or (at your option) any later version.
10  
11   avahi is distributed in the hope that it will be useful, but WITHOUT
12   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13   or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
14   Public License for more details.
15  
16   You should have received a copy of the GNU Lesser General Public
17   License along with avahi; if not, write to the Free Software
18   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19   USA.
20 ***/
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <string.h>
27 #include <stdlib.h>
28 #include <ctype.h>
29 #include <assert.h>
30
31 #include "alternative.h"
32 #include "malloc.h"
33
34 char * avahi_alternative_host_name(const char *s) {
35     const char *p, *e;
36     char *r;
37
38     assert(s);
39
40     e = s;
41     
42     for (p = s; *p; p++)
43         if (!isdigit(*p))
44             e = p+1;
45
46     if (*e) {
47         char *c;
48
49         if (!(c = avahi_strndup(s, e-s)))
50             return NULL;
51
52         r = avahi_strdup_printf("%s%i", c, atoi(e)+1);
53         avahi_free(c);
54         
55     } else
56         r = avahi_strdup_printf("%s2", s);
57     
58     return r;
59 }
60
61 char *avahi_alternative_service_name(const char *s) {
62     const char *e;
63     char *r;
64     
65     assert(s);
66
67     if ((e = strstr(s, " #"))) {
68         const char *n, *p;
69         e += 2;
70     
71         while ((n = strstr(e, " #")))
72             e = n + 2;
73
74         for (p = e; *p; p++)
75             if (!isdigit(*p)) {
76                 e = NULL;
77                 break;
78             }
79     }
80     
81     if (e) {
82         char *c;
83
84         if (!(c = avahi_strndup(s, e-s)))
85             return NULL;
86         
87         r = avahi_strdup_printf("%s%i", c, atoi(e)+1);
88         avahi_free(c);
89     } else
90         r = avahi_strdup_printf("%s #2", s);
91
92     return r;
93 }