/* -*- Mode: C; tab-width: 4 -*-
 *
 * Copyright (c) 2002-2003 Apple Computer, Inc. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.

    Contains:	mDNS platform plugin for VxWorks.

    Copyright:  Copyright (C) 2002-2003 Apple Computer, Inc., All Rights Reserved.

 */

#ifndef __MDNS_VXWORKS__
#define __MDNS_VXWORKS__

#include    "vxWorks.h"
#include    "semLib.h"

#include    "mDNSEmbeddedAPI.h"

#ifdef  __cplusplus
extern "C" {
#endif

// Forward Declarations

typedef struct  MDNSInterfaceItem MDNSInterfaceItem;

//---------------------------------------------------------------------------------------------------------------------------
/*!	@struct		mDNS_PlatformSupport_struct

    @abstract	Structure containing platform-specific data.
 */

struct  mDNS_PlatformSupport_struct
{
    SEM_ID lockID;
    SEM_ID readyEvent;
    mStatus taskInitErr;
    SEM_ID quitEvent;
    MDNSInterfaceItem *     interfaceList;
    int commandPipe;
    int task;
    mDNSBool quit;
    long configID;
    int rescheduled;
};

//---------------------------------------------------------------------------------------------------------------------------
/*!	@function	mDNSReconfigure

    @abstract	Tell mDNS that the configuration has changed. Call when IP address changes, link goes up after being down, etc.

    @discussion

    VxWorks does not provide a generic mechanism for getting notified when network interfaces change so this routines
    provides a way for BSP-specific code to signal mDNS that something has changed and it should re-build its interfaces.
 */

void    mDNSReconfigure( void );

//---------------------------------------------------------------------------------------------------------------------------
/*!	@struct		ifaddrs

    @abstract	Interface information
 */

struct ifaddrs
{
    struct ifaddrs *    ifa_next;
    char *              ifa_name;
    u_int ifa_flags;
    struct sockaddr *   ifa_addr;
    struct sockaddr *   ifa_netmask;
    struct sockaddr *   ifa_dstaddr;
    void *              ifa_data;
};

//---------------------------------------------------------------------------------------------------------------------------
/*!	@function	getifaddrs

    @abstract	Builds a linked list of interfaces. Caller must free using freeifaddrs if successful.
 */

int getifaddrs( struct ifaddrs **outAddrs );

//---------------------------------------------------------------------------------------------------------------------------
/*!	@function	freeifaddrs

    @abstract	Frees a linked list of interfaces built with getifaddrs.
 */

void    freeifaddrs( struct ifaddrs *inAddrs );

//---------------------------------------------------------------------------------------------------------------------------
/*!	@function	sock_pton

    @abstract	Converts a 'p'resentation address string into a 'n'umeric sockaddr structure.

    @result		0 if successful or an error code on failure.
 */

int sock_pton( const char *inString, int inFamily, void *outAddr, size_t inAddrSize, size_t *outAddrSize );

//---------------------------------------------------------------------------------------------------------------------------
/*!	@function	sock_ntop

    @abstract	Converts a 'n'umeric sockaddr structure into a 'p'resentation address string.

    @result		Ptr to 'p'resentation address string buffer if successful or NULL on failure.
 */

char *  sock_ntop( const void *inAddr, size_t inAddrSize, char *inBuffer, size_t inBufferSize );

#ifdef  __cplusplus
}
#endif

#endif  // __MDNS_VXWORKS__
