147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/* -*- Mode: C; tab-width: 4 -*- 247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * 347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * Copyright (c) 2003-2004 Apple Computer, Inc. All rights reserved. 447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * 547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * Licensed under the Apache License, Version 2.0 (the "License"); 647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * you may not use this file except in compliance with the License. 747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * You may obtain a copy of the License at 847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * 947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * http://www.apache.org/licenses/LICENSE-2.0 1047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * 1147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * Unless required by applicable law or agreed to in writing, software 1247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * distributed under the License is distributed on an "AS IS" BASIS, 1347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * See the License for the specific language governing permissions and 1547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * limitations under the License. 1647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 1747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt File: daemon.c 1847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 1947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt Contains: main & associated Application layer for mDNSResponder on Linux. 2047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 2147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt */ 2247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 2347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if __APPLE__ 2447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// In Mac OS X 10.5 and later trying to use the daemon function gives a “‘daemon’ is deprecated” 2547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// error, which prevents compilation because we build with "-Werror". 2647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Since this is supposed to be portable cross-platform code, we don't care that daemon is 2747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// deprecated on Mac OS X 10.5, so we use this preprocessor trick to eliminate the error message. 2847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define daemon yes_we_know_that_daemon_is_deprecated_in_os_x_10_5_thankyou 2947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif 3047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 3147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include <stdio.h> 3247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include <string.h> 3347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include <unistd.h> 3447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include <stdlib.h> 3547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include <signal.h> 3647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include <errno.h> 3747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include <fcntl.h> 3847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include <pwd.h> 3947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include <sys/types.h> 4047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 410b6b4e32c36ce143bfd095119b4939e4cf826021Joshua Melcon#ifdef __ANDROID__ 420b6b4e32c36ce143bfd095119b4939e4cf826021Joshua Melcon#include "cutils/sockets.h" 430b6b4e32c36ce143bfd095119b4939e4cf826021Joshua Melcon#endif 440b6b4e32c36ce143bfd095119b4939e4cf826021Joshua Melcon 4547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if __APPLE__ 4647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#undef daemon 4747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltextern int daemon(int, int); 4847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif 4947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 5047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include "mDNSEmbeddedAPI.h" 5147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include "mDNSPosix.h" 5247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include "mDNSUNP.h" // For daemon() 5347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include "uds_daemon.h" 5447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include "PlatformCommon.h" 5547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 56dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt#ifndef MDNS_USERNAME 57dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt#define MDNS_USERNAME "nobody" 58dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt#endif 59dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt 6047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define CONFIG_FILE "/etc/mdnsd.conf" 6147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic domainname DynDNSZone; // Default wide-area zone for service registration 6247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic domainname DynDNSHostname; 6347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 6447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define RR_CACHE_SIZE 500 6547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic CacheEntity gRRCache[RR_CACHE_SIZE]; 6647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic mDNS_PlatformSupport PlatformStorage; 6747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 6847e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltmDNSlocal void mDNS_StatusCallback(mDNS *const m, mStatus result) 6947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt { 7047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt (void)m; // Unused 7147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (result == mStatus_NoError) 7247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt { 7347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt // On successful registration of dot-local mDNS host name, daemon may want to check if 7447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt // any name conflict and automatic renaming took place, and if so, record the newly negotiated 7547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt // name in persistent storage for next time. It should also inform the user of the name change. 7647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt // On Mac OS X we store the current dot-local mDNS host name in the SCPreferences store, 7747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt // and notify the user with a CFUserNotification. 7847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt } 7947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt else if (result == mStatus_ConfigChanged) 8047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt { 8147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt udsserver_handle_configchange(m); 8247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt } 8347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt else if (result == mStatus_GrowCache) 8447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt { 8547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt // Allocate another chunk of cache storage 8647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt CacheEntity *storage = malloc(sizeof(CacheEntity) * RR_CACHE_SIZE); 8747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (storage) mDNS_GrowCache(m, storage, RR_CACHE_SIZE); 8847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt } 8947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt } 9047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 9147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// %%% Reconfigure() probably belongs in the platform support layer (mDNSPosix.c), not the daemon cde 9247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// -- all client layers running on top of mDNSPosix.c need to handle network configuration changes, 9347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// not only the Unix Domain Socket Daemon 9447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 9547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic void Reconfigure(mDNS *m) 9647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt { 9747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt mDNSAddr DynDNSIP; 9847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt const mDNSAddr dummy = { mDNSAddrType_IPv4, { { { 1, 1, 1, 1 } } } };; 9947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt mDNS_SetPrimaryInterfaceInfo(m, NULL, NULL, NULL); 10047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (ParseDNSServers(m, uDNS_SERVERS_FILE) < 0) 10147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt LogMsg("Unable to parse DNS server list. Unicast DNS-SD unavailable"); 10247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt ReadDDNSSettingsFromConfFile(m, CONFIG_FILE, &DynDNSHostname, &DynDNSZone, NULL); 10347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt mDNSPlatformSourceAddrForDest(&DynDNSIP, &dummy); 10447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (DynDNSHostname.c[0]) mDNS_AddDynDNSHostName(m, &DynDNSHostname, NULL, NULL); 10547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (DynDNSIP.type) mDNS_SetPrimaryInterfaceInfo(m, &DynDNSIP, NULL, NULL); 10647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt mDNS_ConfigChanged(m); 10747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt } 10847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 10947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Do appropriate things at startup with command line arguments. Calls exit() if unhappy. 11047e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltmDNSlocal void ParseCmdLinArgs(int argc, char **argv) 11147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt { 11247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (argc > 1) 11347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt { 11447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (0 == strcmp(argv[1], "-debug")) mDNS_DebugMode = mDNStrue; 11547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt else printf("Usage: %s [-debug]\n", argv[0]); 11647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt } 117dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt#ifndef __ANDROID__ 11847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (!mDNS_DebugMode) 11947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt { 12047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt int result = daemon(0, 0); 12147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (result != 0) { LogMsg("Could not run as daemon - exiting"); exit(result); } 12247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if __APPLE__ 12347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt LogMsg("The POSIX mdnsd should only be used on OS X for testing - exiting"); 12447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt exit(-1); 12547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif 12647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt } 127dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt#endif // !__ANDROID__ 12847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt } 12947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 13047e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltmDNSlocal void DumpStateLog(mDNS *const m) 13147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Dump a little log of what we've been up to. 13247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt { 13347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt LogMsg("---- BEGIN STATE LOG ----"); 13447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt udsserver_info(m); 13547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt LogMsg("---- END STATE LOG ----"); 13647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt } 13747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 13847e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltmDNSlocal mStatus MainLoop(mDNS *m) // Loop until we quit. 13947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt { 14047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt sigset_t signals; 14147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt mDNSBool gotData = mDNSfalse; 14247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 14347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt mDNSPosixListenForSignalInEventLoop(SIGINT); 14447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt mDNSPosixListenForSignalInEventLoop(SIGTERM); 14547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt mDNSPosixListenForSignalInEventLoop(SIGUSR1); 14647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt mDNSPosixListenForSignalInEventLoop(SIGPIPE); 14747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt mDNSPosixListenForSignalInEventLoop(SIGHUP) ; 14847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 14947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt for (; ;) 15047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt { 15147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt // Work out how long we expect to sleep before the next scheduled task 15247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt struct timeval timeout; 15347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt mDNSs32 ticks; 15447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 15547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt // Only idle if we didn't find any data the last time around 15647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (!gotData) 15747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt { 15847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt mDNSs32 nextTimerEvent = mDNS_Execute(m); 15947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt nextTimerEvent = udsserver_idle(nextTimerEvent); 16047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt ticks = nextTimerEvent - mDNS_TimeNow(m); 16147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (ticks < 1) ticks = 1; 16247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt } 16347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt else // otherwise call EventLoop again with 0 timemout 16447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt ticks = 0; 16547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 16647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt timeout.tv_sec = ticks / mDNSPlatformOneSecond; 16747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt timeout.tv_usec = (ticks % mDNSPlatformOneSecond) * 1000000 / mDNSPlatformOneSecond; 16847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 16947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt (void) mDNSPosixRunEventLoopOnce(m, &timeout, &signals, &gotData); 17047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 17147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (sigismember(&signals, SIGHUP )) Reconfigure(m); 17247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (sigismember(&signals, SIGUSR1)) DumpStateLog(m); 17347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt // SIGPIPE happens when we try to write to a dead client; death should be detected soon in request_callback() and cleaned up. 17447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (sigismember(&signals, SIGPIPE)) LogMsg("Received SIGPIPE - ignoring"); 17547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (sigismember(&signals, SIGINT) || sigismember(&signals, SIGTERM)) break; 17647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt } 17747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt return EINTR; 17847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt } 17947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 18047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltint main(int argc, char **argv) 18147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt { 18247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt mStatus err; 18347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 18447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt ParseCmdLinArgs(argc, argv); 18547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 18647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt LogMsg("%s starting", mDNSResponderVersionString); 18747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 18847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt err = mDNS_Init(&mDNSStorage, &PlatformStorage, gRRCache, RR_CACHE_SIZE, mDNS_Init_AdvertiseLocalAddresses, 18947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt mDNS_StatusCallback, mDNS_Init_NoInitCallbackContext); 19047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 19147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (mStatus_NoError == err) 192dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt#ifdef __ANDROID__ 193dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt { 194dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt dnssd_sock_t s[1]; 195dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt char *socketname = strrchr(MDNS_UDS_SERVERPATH, '/'); 196dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt if (socketname) 197dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt { 198dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt socketname++; // skip '/' 199dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt s[0] = android_get_control_socket(socketname); 200dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt err = udsserver_init(s, 1); 201dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt } else { 202dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt err = udsserver_init(mDNSNULL, 0); 203dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt } 204dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt } 205dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt#else 20647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt err = udsserver_init(mDNSNULL, 0); 207dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt#endif // __ANDROID__ 20847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 20947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt Reconfigure(&mDNSStorage); 21047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 21147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt // Now that we're finished with anything privileged, switch over to running as "nobody" 21247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (mStatus_NoError == err) 21347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt { 214dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt const struct passwd *pw = getpwnam(MDNS_USERNAME); 21547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (pw != NULL) 21647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt setuid(pw->pw_uid); 21747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt else 218dd52342e088715929196886494c5055f9186d5c3Robert Greenwalt LogMsg("WARNING: mdnsd continuing as root because user \"%s\" does not exist", MDNS_USERNAME); 21947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt } 22047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 22147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (mStatus_NoError == err) 22247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt err = MainLoop(&mDNSStorage); 22347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 22447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt LogMsg("%s stopping", mDNSResponderVersionString); 22547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 22647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt mDNS_Close(&mDNSStorage); 22747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 22847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt if (udsserver_exit() < 0) 22947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt LogMsg("ExitCallback: udsserver_exit failed"); 23047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 23147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt #if MDNS_DEBUGMSGS > 0 23247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt printf("mDNSResponder exiting normally with %ld\n", err); 23347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt #endif 23447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 23547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt return err; 23647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt } 23747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 23847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// uds_daemon support //////////////////////////////////////////////////////////// 23947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 24047e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltmStatus udsSupportAddFDToEventLoop(int fd, udsEventCallback callback, void *context, void **platform_data) 24147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/* Support routine for uds_daemon.c */ 24247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt { 24347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt // Depends on the fact that udsEventCallback == mDNSPosixEventCallback 24447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt (void) platform_data; 24547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt return mDNSPosixAddFDToEventLoop(fd, callback, context); 24647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt } 24747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 24847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltint udsSupportReadFD(dnssd_sock_t fd, char *buf, int len, int flags, void *platform_data) 24947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt { 25047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt (void) platform_data; 25147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt return recv(fd, buf, len, flags); 25247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt } 25347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 25447e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltmStatus udsSupportRemoveFDFromEventLoop(int fd, void *platform_data) // Note: This also CLOSES the file descriptor 25547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt { 25647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt mStatus err = mDNSPosixRemoveFDFromEventLoop(fd); 25747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt (void) platform_data; 25847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt close(fd); 25947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt return err; 26047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt } 26147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 26247e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltmDNSexport void RecordUpdatedNiceLabel(mDNS *const m, mDNSs32 delay) 26347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt { 26447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt (void)m; 26547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt (void)delay; 26647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt // No-op, for now 26747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt } 26847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 26947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if _BUILDING_XCODE_PROJECT_ 27047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// If the process crashes, then this string will be magically included in the automatically-generated crash log 27147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltconst char *__crashreporter_info__ = mDNSResponderVersionString_SCCS + 5; 27247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltasm(".desc ___crashreporter_info__, 0x10"); 27347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif 27447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt 27547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// For convenience when using the "strings" command, this is the last thing in the file 27647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if mDNSResponderVersion > 1 27747e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltmDNSexport const char mDNSResponderVersionString_SCCS[] = "@(#) mDNSResponder-" STRINGIFY(mDNSResponderVersion) " (" __DATE__ " " __TIME__ ")"; 27847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#elif MDNS_VERSIONSTR_NODTS 27947e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltmDNSexport const char mDNSResponderVersionString_SCCS[] = "@(#) mDNSResponder (Engineering Build)"; 28047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else 28147e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltmDNSexport const char mDNSResponderVersionString_SCCS[] = "@(#) mDNSResponder (Engineering Build) (" __DATE__ " " __TIME__ ")"; 28247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif 283