]> git.meshlink.io Git - catta/blob - avahi-common/alternative.c
follow Bonjour's hostname number incrementing algorithm for handling conflicts. On...
[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 *e;
36     char *r;
37
38     assert(s);
39
40     e = strrchr(s, '-');
41
42     if (e) {
43         const char *p;
44         
45         for (p = e+1; *p; p++)
46             if (!isdigit(*p)) {
47                 e = NULL;
48                 break;
49             }
50
51         if (e && (*(e+1) == '0' || (*(e+1) == 0)))
52             e = NULL;
53     }
54
55     if (e) {
56         char *c;
57
58         e++;
59         
60         if (!(c = avahi_strndup(s, e-s)))
61             return NULL;
62
63         r = avahi_strdup_printf("%s%i", c, atoi(e)+1);
64         avahi_free(c);
65         
66     } else
67         r = avahi_strdup_printf("%s-2", s);
68     
69     return r;
70 }
71
72 char *avahi_alternative_service_name(const char *s) {
73     const char *e;
74     char *r;
75     
76     assert(s);
77
78     if ((e = strstr(s, " #"))) {
79         const char *n, *p;
80         e += 2;
81     
82         while ((n = strstr(e, " #")))
83             e = n + 2;
84
85         for (p = e; *p; p++)
86             if (!isdigit(*p)) {
87                 e = NULL;
88                 break;
89             }
90
91         if (e && (*e == '0' || *e == 0))
92             e = NULL;
93     }
94     
95     if (e) {
96         char *c;
97
98         if (!(c = avahi_strndup(s, e-s)))
99             return NULL;
100         
101         r = avahi_strdup_printf("%s%i", c, atoi(e)+1);
102         avahi_free(c);
103     } else
104         r = avahi_strdup_printf("%s #2", s);
105
106     return r;
107 }