pap_status.c   [plain text]


/*
 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 * 
 * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
 * Reserved.  This file contains Original Code and/or Modifications of
 * Original Code as defined in and that are subject to the Apple Public
 * Source License Version 1.0 (the 'License').  You may not use this file
 * except in compliance with the License.  Please obtain a copy of the
 * License at http://www.apple.com/publicsource and read it before using
 * this file.
 * 
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
 * License for the specific language governing rights and limitations
 * under the License."
 * 
 * @APPLE_LICENSE_HEADER_END@
 */
/*
 *      Copyright (c) 1998 Apple Computer, Inc. 
 *
 *      The information contained herein is subject to change without
 *      notice and  should not be  construed as a commitment by Apple
 *      Computer, Inc. Apple Computer, Inc. assumes no responsibility
 *      for any errors that may appear.
 *
 *      Confidential and Proprietary to Apple Computer, Inc.
 *
 */

#include <fcntl.h>
#include <sys/errno.h>
#include <sys/param.h>

#include <netat/appletalk.h>
#include <netat/pap.h>
#include <netat/atp.h>

#define	SET_ERRNO(e) errno = e

char	*pap_status(tuple)
at_nbptuple_t	*tuple;
{
	int		fd;
	u_char		rdata[512];
	int		tmpErrno;
	char		*pap_status_get();
	int userdata;
	u_char	*puserdata = (u_char *)&userdata;
	at_resp_t resp;
	at_retry_t retry;

	if (tuple == NULL) {
		SET_ERRNO(EINVAL);
		return (NULL);
	}
	
	if (_nbp_validate_entity_(&tuple->enu_entity,0,1)==0){/*nometa,zone ok*/
		SET_ERRNO(EINVAL);
		return (NULL);
	}

	pap_status_update("=", P_NOEXIST, strlen(P_NOEXIST));

	fd = atp_open(NULL);
	if (fd < 0)
		return(NULL);

	puserdata[0] = 0;
	puserdata[1] = AT_PAP_TYPE_SEND_STATUS;
	puserdata[2] = 0;
	puserdata[3] = 0;
	retry.interval = 2;
	retry.retries = 5;
	resp.bitmap = 0x01;
	resp.resp[0].iov_base = rdata;
	resp.resp[0].iov_len = sizeof(rdata);

	for (;;) {
		if (atp_sendreq(fd, &tuple->enu_addr, 0, 0, userdata, 0, 0, 0,
				&resp, &retry, 0) < 0) {
			tmpErrno = errno;
			atp_close(fd);
			SET_ERRNO(tmpErrno);
			return(NULL);
		}
		puserdata = (u_char *)&resp.userdata[0];
		if (puserdata[1] != AT_PAP_TYPE_SEND_STS_REPLY) {
			puserdata = (u_char *)&userdata;
			continue;
		}
		atp_close(fd);
		pap_status_update(tuple->enu_entity.type.str, 
			&rdata[5], rdata[4]);
		return(pap_status_get());
	}
}