• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-WNDR4500-V1.0.1.40_1.0.68/ap/gpl/timemachine/avahi-0.6.25/avahi-compat-libdns_sd/
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 <pthread.h>
27#include <unistd.h>
28#include <limits.h>
29#include <stdio.h>
30#include <string.h>
31#include <stdlib.h>
32#include <assert.h>
33#include <stdarg.h>
34#include <syslog.h>
35
36#include "warn.h"
37
38#ifndef COMPAT_LAYER
39#define COMPAT_LAYER "Apple Bonjour"
40#endif
41
42#ifndef CGI_SUBSYSTEM
43#define CGI_SUBSYSTEM "libdns_sd"
44#endif
45
46static pthread_mutex_t linkage_mutex = PTHREAD_MUTEX_INITIALIZER;
47static int linkage_warning = 0;
48
49const char *avahi_exe_name(void) {
50#ifdef HAVE_GETPROGNAME
51    return getprogname();
52#elif defined(__linux__)
53    static char exe_name[1024] = "";
54    static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
55
56    /* Yes, I know, this is not portable. But who cares? It's for
57     * cosmetics only, anyway. */
58
59    pthread_mutex_lock(&mutex);
60
61    if (exe_name[0] == 0) {
62        int k;
63
64        if ((k = readlink("/proc/self/exe", exe_name, sizeof(exe_name)-1)) < 0)
65            snprintf(exe_name, sizeof(exe_name), "(unknown)");
66        else {
67            char *slash;
68
69            assert((size_t) k <= sizeof(exe_name)-1);
70            exe_name[k] = 0;
71
72            if ((slash = strrchr(exe_name, '/')))
73                memmove(exe_name, slash+1, strlen(slash)+1);
74        }
75    }
76
77    pthread_mutex_unlock(&mutex);
78
79    return exe_name;
80#else
81#ifdef __GNUC__
82#warning "avahi_exe_name() needs to be implemented for your operating system"
83#endif
84    return "(unknown)";
85#endif
86}
87
88void avahi_warn(const char *fmt, ...) {
89    char msg[512]  = "*** WARNING *** ";
90    va_list ap;
91    size_t n;
92
93    assert(fmt);
94
95    va_start(ap, fmt);
96    n = strlen(msg);
97    vsnprintf(msg + n, sizeof(msg) - n, fmt, ap);
98    va_end(ap);
99
100    fprintf(stderr, "%s\n", msg);
101
102    openlog(avahi_exe_name(), LOG_PID, LOG_USER);
103    syslog(LOG_WARNING, "%s", msg);
104    closelog();
105}
106
107void avahi_warn_linkage(void) {
108    int w;
109
110    pthread_mutex_lock(&linkage_mutex);
111    w = linkage_warning;
112    linkage_warning = 1;
113    pthread_mutex_unlock(&linkage_mutex);
114
115    if (!w && !getenv("AVAHI_COMPAT_NOWARN")) {
116        avahi_warn("The program '%s' uses the "COMPAT_LAYER" compatibility layer of Avahi.", avahi_exe_name());
117        avahi_warn("Please fix your application to use the native API of Avahi!");
118        avahi_warn("For more information see <http://0pointer.de/avahi-compat?s="CGI_SUBSYSTEM"&e=%s>", avahi_exe_name());
119    }
120}
121
122void avahi_warn_unsupported(const char *function) {
123    avahi_warn("The program '%s' called '%s()' which is not supported (or only supported partially) in the "COMPAT_LAYER" compatibility layer of Avahi.", avahi_exe_name(), function);
124    avahi_warn("Please fix your application to use the native API of Avahi!");
125    avahi_warn("For more information see <http://0pointer.de/avahi-compat?s="CGI_SUBSYSTEM"&e=%s&f=%s>", avahi_exe_name(), function);
126}
127