#1 "main.c"






static char * rcsid_main_c = "$Id: main.c,v 1.31 92/12/22 17:48:00 probe Exp $" ; 

#1 "attach.h" 1








#1 "config.h" 1

# 83
typedef int sig_catch ; 

char * malloc ( ) ; 
#9 "attach.h" 2


#1 "/NextDeveloper/Headers/ansi/stdio.h" 1











#1 "/NextDeveloper/Headers/ansi/standards.h" 1

#12 "/NextDeveloper/Headers/ansi/stdio.h" 2

# 34
extern struct _iobuf { 
int _cnt ; 
char * _ptr ; 
char * _base ; 
int _bufsiz ; 
short _flag ; 

unsigned char _file ; 



char _smallbuf ; 
} _iob [ ] ; 
# 70
extern char * bsd_sprintf ( ) ; 
extern char * bsd_vsprintf ( ) ; 


extern struct _iobuf * fopen ( ) ; 
extern struct _iobuf * freopen ( ) ; 
extern long int ftell ( ) ; 
extern char * fgets ( ) ; 
extern char * gets ( ) ; 
# 234
extern int fileno ( struct _iobuf * stream ) ; 
# 265
extern struct _iobuf * fdopen ( ) ; 
extern struct _iobuf * popen ( ) ; 
extern int pclose ( ) ; 
#11 "attach.h" 2

#1 "/NextDeveloper/Headers/ansi/ctype.h" 1










extern int isalnum ( int c ) ; 
extern int isalpha ( int c ) ; 
extern int iscntrl ( int c ) ; 
extern int isdigit ( int c ) ; 
extern int isgraph ( int c ) ; 
extern int islower ( int c ) ; 
extern int isprint ( int c ) ; 
extern int ispunct ( int c ) ; 
extern int isspace ( int c ) ; 
extern int isupper ( int c ) ; 
extern int isxdigit ( int c ) ; 
extern int tolower ( int c ) ; 
extern int toupper ( int c ) ; 
# 50
extern const char _ctype_ [ ] ; 
#12 "attach.h" 2

#1 "/NextDeveloper/Headers/ansi/errno.h" 1






#1 "/NextDeveloper/Headers/bsd/sys/errno.h" 1

# 199
extern int errno ; 




extern void perror ( const char * ) ; 
extern char * sys_errlist [ ] ; 
extern int sys_nerr ; 
#7 "/NextDeveloper/Headers/ansi/errno.h" 2



extern int errno ; 
#13 "attach.h" 2




#1 "/NextDeveloper/Headers/bsd/netdb.h" 1














struct hostent { 
char * h_name ; 
char * * h_aliases ; 
int h_addrtype ; 
int h_length ; 
char * * h_addr_list ; 

} ; 





struct netent { 
char * n_name ; 
char * * n_aliases ; 
int n_addrtype ; 
unsigned long n_net ; 
} ; 

struct servent { 
char * s_name ; 
char * * s_aliases ; 
int s_port ; 
char * s_proto ; 
} ; 

struct protoent { 
char * p_name ; 
char * * p_aliases ; 
int p_proto ; 
} ; 

struct rpcent { 
char * r_name ; 
char * * r_aliases ; 
int r_number ; 
} ; 


struct hostent * gethostbyname ( ) , * gethostbyaddr ( ) , * gethostent ( ) ; 
struct netent * getnetbyname ( ) , * getnetbyaddr ( ) , * getnetent ( ) ; 
struct servent * getservbyname ( ) , * getservbyport ( ) , * getservent ( ) ; 
struct protoent * getprotobyname ( ) , * getprotobynumber ( ) , * getprotoent ( ) ; 
struct rpcent * getrpcbyname ( ) , * getrpcbynumber ( ) , * getrpcent ( ) ; 
# 96
extern int h_errno ; 
#17 "attach.h" 2

#1 "/NextDeveloper/Headers/bsd/strings.h" 1














extern char * strcat ( ) ; 
extern char * strncat ( ) ; 
extern int strcmp ( ) ; 
extern int strncmp ( ) ; 
extern int strcasecmp ( ) ; 
extern int strncasecmp ( ) ; 
extern char * strcpy ( ) ; 
extern char * strncpy ( ) ; 
extern int strlen ( ) ; 
extern char * strchr ( ) ; 
extern char * strrchr ( ) ; 
extern char * index ( ) ; 
extern char * rindex ( ) ; 
#18 "attach.h" 2


#1 "/NextDeveloper/Headers/bsd/sys/types.h" 1

# 85
typedef unsigned char u_char ; 
typedef unsigned short u_short ; 
typedef unsigned int u_int ; 
typedef unsigned long u_long ; 
typedef unsigned short ushort ; 

#1 "/NextDeveloper/Headers/bsd/machine/label_t.h" 1








#1 "/NextDeveloper/Headers/architecture/ARCH_INCLUDE.h" 1

#9 "/NextDeveloper/Headers/bsd/machine/label_t.h" 2


#1 "/NextDeveloper/Headers/bsd/m68k/label_t.h" 1
















typedef struct label_t { 
int val [ 13 ] ; 
} label_t ; 
#11 "/NextDeveloper/Headers/bsd/machine/label_t.h" 2

#91 "/NextDeveloper/Headers/bsd/sys/types.h" 2





typedef struct _quad { long val [ 2 ] ; } quad ; 


typedef long daddr_t ; 
typedef char * caddr_t ; 



typedef long time_t ; 







typedef long size_t ; 





typedef short dev_t ; 
typedef short gid_t ; 
typedef short uid_t ; 

typedef u_long ino_t ; 








typedef long off_t ; 
# 154
typedef long fd_mask ; 






typedef struct fd_set { 
fd_mask fds_bits [ ( ( ( 256 ) + ( ( ( sizeof ( fd_mask ) * 8 ) ) - 1 ) ) / ( ( sizeof ( fd_mask ) * 8 ) ) ) ] ; 
} fd_set ; 
#20 "attach.h" 2

#1 "/NextDeveloper/Headers/bsd/sys/file.h" 1

# 29
#1 "/NextDeveloper/Headers/bsd/sys/fcntl.h" 1

# 144
struct flock { 

short l_type ; 
short l_whence ; 





long l_start ; 
long l_len ; 





short l_pid ; 

short l_xxx ; 

} ; 
#29 "/NextDeveloper/Headers/bsd/sys/file.h" 2

#21 "attach.h" 2

#1 "/NextDeveloper/Headers/bsd/sys/param.h" 1

# 45
#1 "/NextDeveloper/Headers/bsd/machine/machparam.h" 1










#1 "/NextDeveloper/Headers/bsd/m68k/machparam.h" 1














#1 "/NextDeveloper/Headers/mach/m68k/vm_param.h" 1

# 22
extern int 
m68k_page_size , 
m68k_page_mask , 
m68k_page_shift , 
m68k_is , 
m68k_tia , 
m68k_tib , 
m68k_pt1_entries , 
m68k_pt2_entries , 
m68k_pt1_size , 
m68k_pt2_size , 
m68k_pt1_shift , 
m68k_pt2_shift , 
m68k_pt1_mask , 
m68k_pt2_mask , 
m68k_pt2_maps ; 
#15 "/NextDeveloper/Headers/bsd/m68k/machparam.h" 2

#11 "/NextDeveloper/Headers/bsd/machine/machparam.h" 2

#45 "/NextDeveloper/Headers/bsd/sys/param.h" 2

# 103
#1 "/NextDeveloper/Headers/bsd/sys/signal.h" 1

# 33
#1 "/NextDeveloper/Headers/bsd/machine/signal.h" 1










#1 "/NextDeveloper/Headers/bsd/m68k/signal.h" 1

# 22
struct sigcontext { 
int sc_onstack ; 
int sc_mask ; 
int sc_sp ; 
int sc_pc ; 
int sc_ps ; 
int sc_d0 ; 
} ; 
#11 "/NextDeveloper/Headers/bsd/machine/signal.h" 2

#33 "/NextDeveloper/Headers/bsd/sys/signal.h" 2

# 143
struct sigvec { 
void ( * sv_handler ) ( ) ; 
int sv_mask ; 
int sv_flags ; 
} ; 











struct sigstack { 
char * ss_sp ; 
int ss_onstack ; 
} ; 
# 198
extern int sigblock ( int ) ; 
extern int sigpause ( int ) ; 
extern int sigreturn ( struct sigcontext * ) ; 
extern int sigsetmask ( int ) ; 
extern int sigstack ( struct sigstack * , struct sigstack * ) ; 

extern int sigvec ( int , struct sigvec * , struct sigvec * ) ; 


extern int siginterrupt ( int , int ) ; 

extern int ( * signal ( int , int ( * ) ( ) ) ) ( ) ; 
#103 "/NextDeveloper/Headers/bsd/sys/param.h" 2

#22 "attach.h" 2

#1 "/NextDeveloper/Headers/bsd/sys/socket.h" 1

# 108
struct linger { 
int l_onoff ; 
int l_linger ; 
} ; 
# 145
struct sockaddr { 
u_short sa_family ; 
char sa_data [ 14 ] ; 
} ; 





struct sockproto { 
u_short sp_family ; 
u_short sp_protocol ; 
} ; 
# 190
struct msghdr { 
caddr_t msg_name ; 
int msg_namelen ; 
struct iovec * msg_iov ; 
int msg_iovlen ; 
caddr_t msg_accrights ; 
int msg_accrightslen ; 
} ; 








extern int accept ( int , struct sockaddr * , int * ) ; 
extern int bind ( int , struct sockaddr * , int ) ; 
extern int connect ( int , struct sockaddr * , int ) ; 
extern int getpeername ( int , struct sockaddr * , int * ) ; 
extern int getsockname ( int , struct sockaddr * , int * ) ; 
extern int getsockopt ( int , int , int , void * optval , int * ) ; 
extern int setsockopt ( int , int , int , void * optval , int ) ; 
extern int listen ( int , int ) ; 
extern int recv ( int , void * , int , int ) ; 
extern int recvfrom ( int , void * , int , int , struct sockaddr * , int * ) ; 
extern int recvmsg ( int , struct msghdr * , int ) ; 
extern int send ( int , void * , int , int ) ; 
extern int sendto ( int , void * , int , int , struct sockaddr * , int ) ; 
extern int sendmsg ( int , struct msghdr * , int ) ; 
extern int socket ( int , int , int ) ; 
extern int socketpair ( int , int , int , int * ) ; 
#23 "attach.h" 2

#1 "/NextDeveloper/Headers/bsd/sys/time.h" 1

# 48
struct timeval { 
long tv_sec ; 
long tv_usec ; 
} ; 

struct timezone { 
int tz_minuteswest ; 
int tz_dsttime ; 
} ; 
# 85
struct itimerval { 
struct timeval it_interval ; 
struct timeval it_value ; 
} ; 

















#1 "/NextDeveloper/Headers/ansi/time.h" 1

# 54
struct tm { 
int tm_sec ; 
int tm_min ; 
int tm_hour ; 
int tm_mday ; 
int tm_mon ; 
int tm_year ; 
int tm_wday ; 
int tm_yday ; 
int tm_isdst ; 

long tm_gmtoff ; 
char * tm_zone ; 

} ; 



extern struct tm * gmtime ( ) , * localtime ( ) ; 
extern char * asctime ( ) , * ctime ( ) ; 
#106 "/NextDeveloper/Headers/bsd/sys/time.h" 2




extern int adjtime ( struct timeval * , struct timeval * ) ; 
extern int getitimer ( int , struct itimerval * ) ; 
extern int setitimer ( int , struct itimerval * , struct itimerval * ) ; 
extern int gettimeofday ( struct timeval * , struct timezone * ) ; 
extern int settimeofday ( struct timeval * , struct timezone * ) ; 
extern int utimes ( const char * , struct timeval * ) ; 
#24 "attach.h" 2


#1 "/NextDeveloper/Headers/bsd/netinet/in.h" 1

# 113
struct in_addr { 

union { 
struct { u_char s_b1 , s_b2 , s_b3 , s_b4 ; } S_un_b ; 
struct { u_short s_w1 , s_w2 ; } S_un_w ; 
u_long S_addr ; 
} S_un ; 









} ; 
# 177
struct sockaddr_in { 
short sin_family ; 
u_short sin_port ; 
struct in_addr sin_addr ; 
char sin_zero [ 8 ] ; 
} ; 











#1 "/NextDeveloper/Headers/architecture/byte_order.h" 1

# 21
typedef unsigned long NXSwappedFloat ; 
typedef unsigned long long NXSwappedDouble ; 



#1 "/NextDeveloper/Headers/architecture/m68k/byte_order.h" 1














static inline 
unsigned short 
NXSwapShort ( 
unsigned short inv 
) 
{ 
union sconv { 
unsigned short us ; 
unsigned char uc [ 2 ] ; 
} * inp , outv ; 

inp = ( union sconv * ) & inv ; 

outv . uc [ 0 ] = inp -> uc [ 1 ] ; 
outv . uc [ 1 ] = inp -> uc [ 0 ] ; 

return ( outv . us ) ; 
} 

static inline 
unsigned int 
NXSwapInt ( 
unsigned int inv 
) 
{ 
union iconv { 
unsigned int ui ; 
unsigned char uc [ 4 ] ; 
} * inp , outv ; 

inp = ( union iconv * ) & inv ; 

outv . uc [ 0 ] = inp -> uc [ 3 ] ; 
outv . uc [ 1 ] = inp -> uc [ 2 ] ; 
outv . uc [ 2 ] = inp -> uc [ 1 ] ; 
outv . uc [ 3 ] = inp -> uc [ 0 ] ; 

return ( outv . ui ) ; 
} 

static inline 
unsigned long 
NXSwapLong ( 
unsigned long inv 
) 
{ 
union lconv { 
unsigned long ul ; 
unsigned char uc [ 4 ] ; 
} * inp , outv ; 

inp = ( union lconv * ) & inv ; 

outv . uc [ 0 ] = inp -> uc [ 3 ] ; 
outv . uc [ 1 ] = inp -> uc [ 2 ] ; 
outv . uc [ 2 ] = inp -> uc [ 1 ] ; 
outv . uc [ 3 ] = inp -> uc [ 0 ] ; 

return ( outv . ul ) ; 
} 

static inline 
unsigned long long 
NXSwapLongLong ( 
unsigned long long inv 
) 
{ 
union llconv { 
unsigned long long ull ; 
unsigned char uc [ 8 ] ; 
} * inp , outv ; 

inp = ( union llconv * ) & inv ; 

outv . uc [ 0 ] = inp -> uc [ 7 ] ; 
outv . uc [ 1 ] = inp -> uc [ 6 ] ; 
outv . uc [ 2 ] = inp -> uc [ 5 ] ; 
outv . uc [ 3 ] = inp -> uc [ 4 ] ; 
outv . uc [ 4 ] = inp -> uc [ 3 ] ; 
outv . uc [ 5 ] = inp -> uc [ 2 ] ; 
outv . uc [ 6 ] = inp -> uc [ 1 ] ; 
outv . uc [ 7 ] = inp -> uc [ 0 ] ; 

return ( outv . ull ) ; 
} 

static inline NXSwappedFloat 
NXConvertHostFloatToSwapped ( float x ) 
{ 
union fconv { 
float number ; 
NXSwappedFloat sf ; 
} ; 
return ( ( union fconv * ) & x ) -> sf ; 
} 

static inline float 
NXConvertSwappedFloatToHost ( NXSwappedFloat x ) 
{ 
union fconv { 
float number ; 
NXSwappedFloat sf ; 
} ; 
return ( ( union fconv * ) & x ) -> number ; 
} 

static inline NXSwappedDouble 
NXConvertHostDoubleToSwapped ( double x ) 
{ 
union dconv { 
double number ; 
NXSwappedDouble sd ; 
} ; 
return ( ( union dconv * ) & x ) -> sd ; 
} 

static inline double 
NXConvertSwappedDoubleToHost ( NXSwappedDouble x ) 
{ 
union dconv { 
double number ; 
NXSwappedDouble sd ; 
} ; 
return ( ( union dconv * ) & x ) -> number ; 
} 

static inline NXSwappedFloat 
NXSwapFloat ( NXSwappedFloat x ) 
{ 
return NXSwapLong ( x ) ; 
} 

static inline NXSwappedDouble 
NXSwapDouble ( NXSwappedDouble x ) 
{ 
return NXSwapLongLong ( x ) ; 
} 
#26 "/NextDeveloper/Headers/architecture/byte_order.h" 2







enum NXByteOrder { 
NX_UnknownByteOrder , 
NX_LittleEndian , 
NX_BigEndian 
} ; 

static inline 
enum NXByteOrder 
NXHostByteOrder ( void ) 
{ 
unsigned int _x ; 

_x = ( NX_BigEndian << 24 ) | NX_LittleEndian ; 

return ( ( enum NXByteOrder ) * ( ( unsigned char * ) & _x ) ) ; 
} 









static inline 
unsigned short 
NXSwapBigShortToHost ( 
unsigned short x 
) 
{ 
return ( x ) ; 
} 

static inline 
unsigned int 
NXSwapBigIntToHost ( 
unsigned int x 
) 
{ 
return ( x ) ; 
} 

static inline 
unsigned long 
NXSwapBigLongToHost ( 
unsigned long x 
) 
{ 
return ( x ) ; 
} 

static inline 
unsigned long long 
NXSwapBigLongLongToHost ( 
unsigned long long x 
) 
{ 
return ( x ) ; 
} 

static inline 
double 
NXSwapBigDoubleToHost ( 
NXSwappedDouble x 
) 
{ 
return NXConvertSwappedDoubleToHost ( x ) ; 
} 

static inline 
float 
NXSwapBigFloatToHost ( 
NXSwappedFloat x 
) 
{ 
return NXConvertSwappedFloatToHost ( x ) ; 
} 

static inline 
unsigned short 
NXSwapHostShortToBig ( 
unsigned short x 
) 
{ 
return ( x ) ; 
} 

static inline 
unsigned int 
NXSwapHostIntToBig ( 
unsigned int x 
) 
{ 
return ( x ) ; 
} 

static inline 
unsigned long 
NXSwapHostLongToBig ( 
unsigned long x 
) 
{ 
return ( x ) ; 
} 

static inline 
unsigned long long 
NXSwapHostLongLongToBig ( 
unsigned long long x 
) 
{ 
return ( x ) ; 
} 

static inline 
NXSwappedDouble 
NXSwapHostDoubleToBig ( 
double x 
) 
{ 
return NXConvertHostDoubleToSwapped ( x ) ; 
} 

static inline 
NXSwappedFloat 
NXSwapHostFloatToBig ( 
float x 
) 
{ 
return NXConvertHostFloatToSwapped ( x ) ; 
} 

static inline 
unsigned short 
NXSwapLittleShortToHost ( 
unsigned short x 
) 
{ 
return ( NXSwapShort ( x ) ) ; 
} 

static inline 
unsigned int 
NXSwapLittleIntToHost ( 
unsigned int x 
) 
{ 
return ( NXSwapInt ( x ) ) ; 
} 

static inline 
unsigned long 
NXSwapLittleLongToHost ( 
unsigned long x 
) 
{ 
return ( NXSwapLong ( x ) ) ; 
} 

static inline 
unsigned long long 
NXSwapLittleLongLongToHost ( 
unsigned long long x 
) 
{ 
return ( NXSwapLongLong ( x ) ) ; 
} 

static inline 
double 
NXSwapLittleDoubleToHost ( 
NXSwappedDouble x 
) 
{ 
return NXConvertSwappedDoubleToHost ( NXSwapDouble ( x ) ) ; 
} 

static inline 
float 
NXSwapLittleFloatToHost ( 
NXSwappedFloat x 
) 
{ 
return NXConvertSwappedFloatToHost ( NXSwapFloat ( x ) ) ; 
} 

static inline 
unsigned short 
NXSwapHostShortToLittle ( 
unsigned short x 
) 
{ 
return ( NXSwapShort ( x ) ) ; 
} 

static inline 
unsigned int 
NXSwapHostIntToLittle ( 
unsigned int x 
) 
{ 
return ( NXSwapInt ( x ) ) ; 
} 

static inline 
unsigned long 
NXSwapHostLongToLittle ( 
unsigned long x 
) 
{ 
return ( NXSwapLong ( x ) ) ; 
} 

static inline 
unsigned long long 
NXSwapHostLongLongToLittle ( 
unsigned long long x 
) 
{ 
return ( NXSwapLongLong ( x ) ) ; 
} 

static inline 
NXSwappedDouble 
NXSwapHostDoubleToLittle ( 
double x 
) 
{ 
return NXSwapDouble ( NXConvertHostDoubleToSwapped ( x ) ) ; 
} 

static inline 
NXSwappedFloat 
NXSwapHostFloatToLittle ( 
float x 
) 
{ 
return NXSwapFloat ( NXConvertHostFloatToSwapped ( x ) ) ; 
} 
#194 "/NextDeveloper/Headers/bsd/netinet/in.h" 2

#26 "attach.h" 2



#1 "/NextDeveloper/Headers/bsd/rpc/rpc.h" 1















#1 "/NextDeveloper/Headers/bsd/rpc/types.h" 1

# 36
extern char * malloc ( ) ; 
#16 "/NextDeveloper/Headers/bsd/rpc/rpc.h" 2




#1 "/NextDeveloper/Headers/bsd/rpc/xdr.h" 1

# 51
enum xdr_op { 
XDR_ENCODE = 0 , 
XDR_DECODE = 1 , 
XDR_FREE = 2 
} ; 

















typedef int ( * xdrproc_t ) ( ) ; 







typedef struct { 
enum xdr_op x_op ; 
struct xdr_ops { 
int ( * x_getlong ) ( ) ; 
int ( * x_putlong ) ( ) ; 
int ( * x_getbytes ) ( ) ; 
int ( * x_putbytes ) ( ) ; 
u_int ( * x_getpostn ) ( ) ; 
int ( * x_setpostn ) ( ) ; 
long * ( * x_inline ) ( ) ; 
void ( * x_destroy ) ( ) ; 
} * x_ops ; 
caddr_t x_public ; 
caddr_t x_private ; 
caddr_t x_base ; 
int x_handy ; 
} XDR ; 
# 158
struct xdr_discrim { 
int value ; 
xdrproc_t proc ; 
} ; 
# 196
extern int xdr_void ( ) ; 
extern int xdr_int ( ) ; 
extern int xdr_u_int ( ) ; 
extern int xdr_long ( ) ; 
extern int xdr_u_long ( ) ; 
extern int xdr_short ( ) ; 
extern int xdr_u_short ( ) ; 
extern int xdr_bool ( ) ; 
extern int xdr_enum ( ) ; 
extern int xdr_array ( ) ; 
extern int xdr_bytes ( ) ; 
extern int xdr_opaque ( ) ; 
extern int xdr_string ( ) ; 
extern int xdr_union ( ) ; 
extern int xdr_char ( ) ; 
extern int xdr_u_char ( ) ; 
extern int xdr_vector ( ) ; 
extern int xdr_float ( ) ; 
extern int xdr_double ( ) ; 
extern int xdr_reference ( ) ; 
extern int xdr_pointer ( ) ; 
extern int xdr_wrapstring ( ) ; 






struct netobj { 
u_int n_len ; 
char * n_bytes ; 
} ; 
typedef struct netobj netobj ; 
extern int xdr_netobj ( ) ; 





extern void xdrmem_create ( ) ; 
extern void xdrstdio_create ( ) ; 
extern void xdrrec_create ( ) ; 
extern int xdrrec_endofrecord ( ) ; 
extern int xdrrec_skiprecord ( ) ; 
extern int xdrrec_eof ( ) ; 
#20 "/NextDeveloper/Headers/bsd/rpc/rpc.h" 2



#1 "/NextDeveloper/Headers/bsd/rpc/auth.h" 1



















#1 "/NextDeveloper/Headers/bsd/rpc/machine/auth.h" 1








#1 "/NextDeveloper/Headers/bsd/rpc/m68k/auth.h" 1

# 24
typedef u_long u_int32 ; 
#9 "/NextDeveloper/Headers/bsd/rpc/machine/auth.h" 2

#20 "/NextDeveloper/Headers/bsd/rpc/auth.h" 2








enum auth_stat { 
AUTH_OK = 0 , 



AUTH_BADCRED = 1 , 
AUTH_REJECTEDCRED = 2 , 
AUTH_BADVERF = 3 , 
AUTH_REJECTEDVERF = 4 , 
AUTH_TOOWEAK = 5 , 



AUTH_INVALIDRESP = 6 , 
AUTH_FAILED = 7 
} ; 

union des_block { 
struct { 
u_int32 high ; 
u_int32 low ; 
} key ; 
char c [ 8 ] ; 
} ; 
typedef union des_block des_block ; 
extern int xdr_des_block ( ) ; 




struct opaque_auth { 
int oa_flavor ; 
caddr_t oa_base ; 
u_int oa_length ; 
} ; 





typedef struct { 
struct opaque_auth ah_cred ; 
struct opaque_auth ah_verf ; 



struct auth_ops { 
void ( * ah_nextverf ) ( ) ; 
int ( * ah_marshal ) ( ) ; 
int ( * ah_validate ) ( ) ; 
int ( * ah_refresh ) ( ) ; 
void ( * ah_destroy ) ( ) ; 
} * ah_ops ; 
caddr_t ah_private ; 

union des_block ah_key ; 

} AUTH ; 
# 122
extern struct opaque_auth _null_auth ; 















extern AUTH * authunix_create ( ) ; 
extern AUTH * authunix_create_default ( ) ; 
extern AUTH * authnone_create ( ) ; 
extern AUTH * authdes_create ( ) ; 
#23 "/NextDeveloper/Headers/bsd/rpc/rpc.h" 2



#1 "/NextDeveloper/Headers/bsd/rpc/clnt.h" 1

# 28
enum clnt_stat { 
RPC_SUCCESS = 0 , 



RPC_CANTENCODEARGS = 1 , 
RPC_CANTDECODERES = 2 , 
RPC_CANTSEND = 3 , 
RPC_CANTRECV = 4 , 
RPC_TIMEDOUT = 5 , 
RPC_INTR = 18 , 



RPC_VERSMISMATCH = 6 , 
RPC_AUTHERROR = 7 , 
RPC_PROGUNAVAIL = 8 , 
RPC_PROGVERSMISMATCH = 9 , 
RPC_PROCUNAVAIL = 10 , 
RPC_CANTDECODEARGS = 11 , 
RPC_SYSTEMERROR = 12 , 




RPC_UNKNOWNHOST = 13 , 
RPC_UNKNOWNPROTO = 17 , 




RPC_PMAPFAILURE = 14 , 
RPC_PROGNOTREGISTERED = 15 , 



RPC_FAILED = 16 
} ; 





struct rpc_err { 
enum clnt_stat re_status ; 
union { 
int RE_errno ; 
enum auth_stat RE_why ; 
struct { 
u_long low ; 
u_long high ; 
} RE_vers ; 
struct { 
long s1 ; 
long s2 ; 
} RE_lb ; 
} ru ; 




} ; 







typedef struct { 
AUTH * cl_auth ; 
struct clnt_ops { 
enum clnt_stat ( * cl_call ) ( ) ; 
void ( * cl_abort ) ( ) ; 
void ( * cl_geterr ) ( ) ; 
int ( * cl_freeres ) ( ) ; 
void ( * cl_destroy ) ( ) ; 
int ( * cl_control ) ( ) ; 
} * cl_ops ; 
caddr_t cl_private ; 
} CLIENT ; 
# 223
extern CLIENT * clntraw_create ( ) ; 





extern CLIENT * 
clnt_create ( 
char * host , 
u_long prog , 
u_long vers , 
char * prot ) ; 




extern CLIENT * 
clnttcp_create ( 
struct sockaddr_in * raddr , 
u_long prog , 
u_long version , 
register int * sockp , 
u_int sendsz , 
u_int recvsz ) ; 





extern CLIENT * 
clntudp_create ( 
struct sockaddr_in * raddr , 
u_long program , 
u_long version , 
struct timeval wait , 
int * sockp ) ; 




extern CLIENT * 
clntudp_bufcreate ( 
struct sockaddr_in * raddr , 
u_long program , 
u_long version , 
struct timeval wait , 
int * sockp , 
u_int sendsz , 
u_int recvsz ) ; 




extern void clnt_pcreateerror ( const char * msg ) ; 
extern char * clnt_spcreateerror ( const char * msg ) ; 




extern void clnt_perrno ( enum clnt_stat num ) ; 




extern void clnt_perror ( CLIENT * clnt , const char * msg ) ; 
extern char * clnt_sperror ( CLIENT * clnt , const char * msg ) ; 
extern void clnt_syslog ( CLIENT * clnt , const char * msg ) ; 




struct rpc_createerr { 
enum clnt_stat cf_stat ; 
struct rpc_err cf_error ; 
} ; 

extern struct rpc_createerr rpc_createerr ; 




extern char * clnt_sperrno ( enum clnt_stat num ) ; 
#26 "/NextDeveloper/Headers/bsd/rpc/rpc.h" 2



#1 "/NextDeveloper/Headers/bsd/rpc/rpc_msg.h" 1

# 23
enum msg_type { 
CALL = 0 , 
REPLY = 1 
} ; 

enum reply_stat { 
MSG_ACCEPTED = 0 , 
MSG_DENIED = 1 
} ; 

enum accept_stat { 
SUCCESS = 0 , 
PROG_UNAVAIL = 1 , 
PROG_MISMATCH = 2 , 
PROC_UNAVAIL = 3 , 
GARBAGE_ARGS = 4 , 
SYSTEM_ERR = 5 
} ; 

enum reject_stat { 
RPC_MISMATCH = 0 , 
AUTH_ERROR = 1 
} ; 










struct accepted_reply { 
struct opaque_auth ar_verf ; 
enum accept_stat ar_stat ; 
union { 
struct { 
u_long low ; 
u_long high ; 
} AR_versions ; 
struct { 
caddr_t where ; 
xdrproc_t proc ; 
} AR_results ; 

} ru ; 


} ; 




struct rejected_reply { 
enum reject_stat rj_stat ; 
union { 
struct { 
u_long low ; 
u_long high ; 
} RJ_versions ; 
enum auth_stat RJ_why ; 
} ru ; 


} ; 




struct reply_body { 
enum reply_stat rp_stat ; 
union { 
struct accepted_reply RP_ar ; 
struct rejected_reply RP_dr ; 
} ru ; 


} ; 




struct call_body { 
u_long cb_rpcvers ; 
u_long cb_prog ; 
u_long cb_vers ; 
u_long cb_proc ; 
struct opaque_auth cb_cred ; 
struct opaque_auth cb_verf ; 
} ; 




struct rpc_msg { 
u_long rm_xid ; 
enum msg_type rm_direction ; 
union { 
struct call_body RM_cmb ; 
struct reply_body RM_rmb ; 
} ru ; 


} ; 










extern int xdr_callmsg ( ) ; 







extern int xdr_callhdr ( ) ; 







extern int xdr_replymsg ( ) ; 







extern void _seterr_reply ( ) ; 
#29 "/NextDeveloper/Headers/bsd/rpc/rpc.h" 2

#1 "/NextDeveloper/Headers/bsd/rpc/auth_unix.h" 1

# 29
struct authunix_parms { 
u_long aup_time ; 
char * aup_machname ; 
int aup_uid ; 
int aup_gid ; 
u_int aup_len ; 
int * aup_gids ; 
} ; 

extern int xdr_authunix_parms ( ) ; 






struct short_hand_verf { 
struct opaque_auth new_cred ; 
} ; 
#30 "/NextDeveloper/Headers/bsd/rpc/rpc.h" 2

#1 "/NextDeveloper/Headers/bsd/rpc/auth_des.h" 1


















enum authdes_namekind { 
ADN_FULLNAME , 
ADN_NICKNAME 
} ; 





struct authdes_fullname { 
char * name ; 
des_block key ; 
u_long window ; 
} ; 





struct authdes_cred { 
enum authdes_namekind adc_namekind ; 
struct authdes_fullname adc_fullname ; 
u_long adc_nickname ; 
} ; 






struct authdes_verf { 
union { 
struct timeval adv_ctime ; 
des_block adv_xtime ; 
} adv_time_u ; 
u_long adv_int_u ; 
} ; 
#31 "/NextDeveloper/Headers/bsd/rpc/rpc.h" 2



#1 "/NextDeveloper/Headers/bsd/rpc/svc.h" 1

# 38
enum xprt_stat { 
XPRT_DIED , 
XPRT_MOREREQS , 
XPRT_IDLE 
} ; 




typedef struct { 
int xp_sock ; 
u_short xp_port ; 
struct xp_ops { 
int ( * xp_recv ) ( ) ; 
enum xprt_stat ( * xp_stat ) ( ) ; 
int ( * xp_getargs ) ( ) ; 
int ( * xp_reply ) ( ) ; 
int ( * xp_freeargs ) ( ) ; 
void ( * xp_destroy ) ( ) ; 
} * xp_ops ; 
int xp_addrlen ; 
struct sockaddr_in xp_raddr ; 
struct opaque_auth xp_verf ; 
caddr_t xp_p1 ; 
caddr_t xp_p2 ; 
} SVCXPRT ; 
# 112
struct svc_req { 
u_long rq_prog ; 
u_long rq_vers ; 
u_long rq_proc ; 
struct opaque_auth rq_cred ; 
caddr_t rq_clntcred ; 
SVCXPRT * rq_xprt ; 
} ; 












extern int svc_register ( ) ; 








extern void svc_unregister ( ) ; 







extern void xprt_register ( ) ; 







extern void xprt_unregister ( ) ; 
# 185
extern int svc_sendreply ( ) ; 
extern void svcerr_decode ( ) ; 
extern void svcerr_weakauth ( ) ; 
extern void svcerr_noproc ( ) ; 
extern void svcerr_progvers ( ) ; 
extern void svcerr_auth ( ) ; 
extern void svcerr_noprog ( ) ; 
extern void svcerr_systemerr ( ) ; 
















extern fd_set svc_fdset ; 






extern void rpctest_service ( ) ; 

extern void svc_getreq ( ) ; 
extern void svc_getreqset ( ) ; 
extern void svc_run ( ) ; 













extern SVCXPRT * svcraw_create ( ) ; 




extern SVCXPRT * svcudp_create ( ) ; 
extern SVCXPRT * svcudp_bufcreate ( ) ; 




extern SVCXPRT * svctcp_create ( ) ; 





SVCXPRT * svcfd_create ( ) ; 
#34 "/NextDeveloper/Headers/bsd/rpc/rpc.h" 2

#1 "/NextDeveloper/Headers/bsd/rpc/svc_auth.h" 1
















extern enum auth_stat _authenticate ( ) ; 
#35 "/NextDeveloper/Headers/bsd/rpc/rpc.h" 2

#29 "attach.h" 2


#1 "/NextDeveloper/Headers/bsd/nfs/nfs.h" 1

# 38
enum nfsstat { 
NFS_OK = 0 , 
NFSERR_PERM = 1 , 
NFSERR_NOENT = 2 , 
NFSERR_IO = 5 , 
NFSERR_NXIO = 6 , 
NFSERR_ACCES = 13 , 
NFSERR_EXIST = 17 , 
NFSERR_NODEV = 19 , 
NFSERR_NOTDIR = 20 , 
NFSERR_ISDIR = 21 , 
NFSERR_FBIG = 27 , 
NFSERR_NOSPC = 28 , 
NFSERR_ROFS = 30 , 
NFSERR_NAMETOOLONG = 63 , 
NFSERR_NOTEMPTY = 66 , 
NFSERR_DQUOT = 69 , 
NFSERR_STALE = 70 , 
NFSERR_WFLUSH 
} ; 






enum nfsftype { 
NFNON , 
NFREG , 
NFDIR , 
NFBLK , 
NFCHR , 
NFLNK 
} ; 
# 137
typedef struct { 
char fh_data [ 32 ] ; 
} fhandle_t ; 






struct nfswriteargs { 
fhandle_t wa_fhandle ; 
u_long wa_begoff ; 
u_long wa_offset ; 
u_long wa_totcount ; 
u_long wa_count ; 
char * wa_data ; 
struct mbuf * wa_mbuf ; 
} ; 





struct nfsfattr { 
enum nfsftype na_type ; 
u_long na_mode ; 
u_long na_nlink ; 
u_long na_uid ; 
u_long na_gid ; 
u_long na_size ; 
u_long na_blocksize ; 
u_long na_rdev ; 
u_long na_blocks ; 
u_long na_fsid ; 
u_long na_nodeid ; 
struct timeval na_atime ; 
struct timeval na_mtime ; 
struct timeval na_ctime ; 
} ; 







struct nfsreadargs { 
fhandle_t ra_fhandle ; 
u_long ra_offset ; 
u_long ra_count ; 
u_long ra_totcount ; 
} ; 




struct nfsrrok { 
struct nfsfattr rrok_attr ; 
u_long rrok_count ; 
char * rrok_data ; 
struct buf * rrok_bp ; 
struct vnode * rrok_vp ; 
} ; 




struct nfsrdresult { 
enum nfsstat rr_status ; 
union { 
struct nfsrrok rr_ok_u ; 
} rr_u ; 
} ; 











struct nfssattr { 
u_long sa_mode ; 
u_long sa_uid ; 
u_long sa_gid ; 
u_long sa_size ; 
struct timeval sa_atime ; 
struct timeval sa_mtime ; 
} ; 





struct nfsattrstat { 
enum nfsstat ns_status ; 
union { 
struct nfsfattr ns_attr_u ; 
} ns_u ; 
} ; 






struct nfssrok { 
u_long srok_count ; 
char * srok_data ; 
} ; 




struct nfsrdlnres { 
enum nfsstat rl_status ; 
union { 
struct nfssrok rl_srok_u ; 
} rl_u ; 
} ; 








struct nfsrddirargs { 
fhandle_t rda_fh ; 
u_long rda_offset ; 
u_long rda_count ; 
} ; 




struct nfsrdok { 
u_long rdok_offset ; 
u_long rdok_size ; 
int rdok_eof ; 
struct direct * rdok_entries ; 
} ; 




struct nfsrddirres { 
u_long rd_bufsize ; 
enum nfsstat rd_status ; 
union { 
struct nfsrdok rd_rdok_u ; 
} rd_u ; 
} ; 










struct nfsdiropargs { 
fhandle_t da_fhandle ; 
char * da_name ; 
} ; 




struct nfsdrok { 
fhandle_t drok_fhandle ; 
struct nfsfattr drok_attr ; 
} ; 




struct nfsdiropres { 
enum nfsstat dr_status ; 
union { 
struct nfsdrok dr_drok_u ; 
} dr_u ; 
} ; 







struct nfssaargs { 
fhandle_t saa_fh ; 
struct nfssattr saa_sa ; 
} ; 




struct nfscreatargs { 
struct nfsdiropargs ca_da ; 
struct nfssattr ca_sa ; 
} ; 




struct nfslinkargs { 
fhandle_t la_from ; 
struct nfsdiropargs la_to ; 
} ; 




struct nfsrnmargs { 
struct nfsdiropargs rna_from ; 
struct nfsdiropargs rna_to ; 
} ; 




struct nfsslargs { 
struct nfsdiropargs sla_from ; 
char * sla_tnm ; 
struct nfssattr sla_sa ; 
} ; 




struct nfsstatfsok { 
u_long fsok_tsize ; 
u_long fsok_bsize ; 
u_long fsok_blocks ; 
u_long fsok_bfree ; 
u_long fsok_bavail ; 
} ; 




struct nfsstatfs { 
enum nfsstat fs_status ; 
union { 
struct nfsstatfsok fs_fsok_u ; 
} fs_u ; 
} ; 










int xdr_attrstat ( ) ; 
int xdr_creatargs ( ) ; 
int xdr_diropargs ( ) ; 
int xdr_diropres ( ) ; 
int xdr_drok ( ) ; 
int xdr_fattr ( ) ; 
int xdr_fhandle ( ) ; 
int xdr_linkargs ( ) ; 
int xdr_rddirargs ( ) ; 
int xdr_putrddirres ( ) ; 
int xdr_getrddirres ( ) ; 
int xdr_rdlnres ( ) ; 
int xdr_rdresult ( ) ; 
int xdr_readargs ( ) ; 
int xdr_rnmargs ( ) ; 
int xdr_rrok ( ) ; 
int xdr_saargs ( ) ; 
int xdr_sattr ( ) ; 
int xdr_slargs ( ) ; 
int xdr_srok ( ) ; 
int xdr_timeval ( ) ; 
int xdr_writeargs ( ) ; 
int xdr_statfs ( ) ; 
#31 "attach.h" 2





#1 "/NextDeveloper/Headers/bsd/nfs/nfs_mount.h" 1





#1 "/NextDeveloper/Headers/mach/features.h" 1

#6 "/NextDeveloper/Headers/bsd/nfs/nfs_mount.h" 2

#36 "attach.h" 2


#1 "/NextDeveloper/Headers/bsd/rpcsvc/mount.h" 1

# 23
int xdr_fhstatus ( ) ; 

int xdr_path ( ) ; 
int xdr_fhandle ( ) ; 
int xdr_mountlist ( ) ; 
int xdr_exports ( ) ; 


struct mountlist { 
char * ml_name ; 
char * ml_path ; 
struct mountlist * ml_nxt ; 
} ; 

struct fhstatus { 
int fhs_status ; 
fhandle_t fhs_fh ; 
} ; 






struct exports { 
dev_t ex_dev ; 
char * ex_name ; 
struct groups * ex_groups ; 
struct exports * ex_next ; 
short ex_rootmap ; 
short ex_flags ; 
} ; 

struct groups { 
char * g_name ; 
struct groups * g_next ; 
} ; 
#38 "attach.h" 2

# 60
#1 "/NextDeveloper/Headers/bsd/sys/mount.h" 1

# 68
struct ufs_args { 
char * fspec ; 
} ; 


struct pc_args { 
char * fspec ; 
} ; 

struct cfs_args { 
char * fspec ; 
} ; 

struct mac_args { 
char * fspec ; 
} ; 

struct cdaudio_args { 
char * fspec ; 
} ; 
#60 "attach.h" 2

# 90
struct _attachtab { 
struct _attachtab * next , * prev ; 
char version [ 3 ] ; 
char explicit ; 
char status ; 
char mode ; 
struct _fstypes * fs ; 
struct in_addr hostaddr [ 64 ] ; 
int rmdir ; 
int drivenum ; 
int flags ; 
int nowners ; 
uid_t owners [ 64 ] ; 
char hesiodname [ 1024 ] ; 
char host [ 1024 ] ; 
char hostdir [ 1024 ] ; 
char mntpt [ 1024 ] ; 
} ; 
# 153
struct _fstypes { 
char * name ; 
int type ; 
int mount_type ; 
int flags ; 
char * good_flags ; 
int ( * attach ) ( ) ; 
int ( * detach ) ( ) ; 
char * * ( * explicit ) ( ) ; 
int ( * flush ) ( ) ; 
} ; 









extern struct _fstypes fstypes [ ] ; 














struct mntopts { 
int type ; 
int flags ; 

int nfs_port ; 

union tsa { 

struct ufs_args ufs ; 


struct nfs_args nfs ; 

} tsa ; 
} ; 





struct command_list { 
char * large ; 
char * small ; 
} ; 













struct cache_ent { 
struct in_addr addr ; 
CLIENT * handle ; 
struct sockaddr_in sin ; 
int fd ; 
int error ; 
} ; 
# 315
extern int afs_auth ( const char * , const char * ) , afs_auth_to_cell ( const char * ) ; 
extern int afs_zinit ( const char * , const char * ) ; 









extern char * errstr ( ) ; 

AUTH * spoofunix_create_default ( ) ; 
CLIENT * rpc_create ( ) ; 
extern char * strdup ( ) , * strtok ( ) ; 
extern int errno ; 
extern unsigned long rvderrno ; 
extern char * sys_errlist [ ] ; 
extern char * * build_hesiod_line ( ) , * * conf_filsys_resolve ( ) ; 
extern struct _fstypes * get_fs ( ) ; 
extern char * filsys_options ( ) ; 
extern char * stropt ( ) , * struid ( ) , * path_canon ( ) ; 
extern struct _attachtab * attachtab_lookup ( ) , * attachtab_lookup_mntpt ( ) ; 

extern int verbose , debug_flag , map_anyway , do_nfsid , print_path , explicit ; 
extern int owner_check , owner_list , override , keep_mount ; 
extern int error_status , force , lock_filesystem , lookup , euid , clean_detach ; 
extern int exp_mntpt , exp_allow ; 

extern int use_zephyr ; 

extern char override_mode , * mount_options , * filsys_type ; 
extern char * mntpt ; 
extern int override_suid , default_suid , skip_fsck , nfs_root_hack ; 
extern char * spoofhost , * attachtab_fn , * mtab_fn , * nfs_mount_dir ; 

extern char * aklog_fn , * afs_mount_dir ; 

extern char * fsck_fn ; 

extern char * ownerlist ( ) ; 
extern void add_an_owner ( ) ; 
extern int is_an_owner ( ) , real_uid , effective_uid , owner_uid ; 

extern char internal_getopt ( ) ; 
extern void mark_in_use ( ) , add_options ( ) , check_root_privs ( ) ; 

extern char exp_hesline [ 1024 ] ; 
extern char * exp_hesptr [ 2 ] ; 
extern char * abort_msg ; 









extern int nfsid ( const char * , struct in_addr , int , int , const char * , int , int ) ; 
extern AUTH * spoofunix_create_default ( char * , int ) ; 

extern int attach ( const char * ) , detach ( const char * ) ; 
extern void detach_all ( void ) , detach_host ( const char * ) ; 
extern int read_config_file ( const char * ) ; 
extern int parse_username ( const char * ) ; 
extern int trusted_user ( int ) ; 
extern void lock_attachtab ( void ) , unlock_attachtab ( void ) ; 
extern void lint_attachtab ( void ) , get_attachtab ( void ) , free_attachtab ( void ) ; 

extern int zephyr_sub ( int ) , zephyr_unsub ( int ) ; 
extern void zephyr_addsub ( const char * ) ; 

















extern char * progname ; 
#9 "main.c" 2

#1 "/NextDeveloper/Headers/ansi/signal.h" 1

#10 "main.c" 2

#1 "/NextDeveloper/Headers/ansi/string.h" 1










extern char * strcpyn ( ) ; 
extern char * strcatn ( ) ; 
extern int strcmpn ( ) ; 
extern char * strchr ( ) ; 
extern char * strrchr ( ) ; 
extern char * strpbrk ( ) ; 
extern int strspn ( ) ; 
extern int strcspn ( ) ; 
extern char * strtok ( ) ; 
#11 "main.c" 2


int verbose = 1 , debug_flag = 0 , map_anyway = 1 , do_nfsid = 1 ; 
int print_path = 0 , explicit = 0 , owner_check = 0 , override = 0 ; 
int owner_list = 1 , clean_detach = 0 , exp_allow = 1 , exp_mntpt = 1 ; 



int real_uid , effective_uid , owner_uid ; 

int lock_filesystem = 0 ; 
int nfs_root_hack = 1 ; 


int keep_mount = 0 ; 



int error_status = 0 ; 
int force = 0 ; 

int use_zephyr = 1 ; 

char override_mode , * mount_options , * filsys_type ; 
char * mntpt ; 
int override_suid , default_suid , skip_fsck , lookup ; 
char * spoofhost , * attachtab_fn = 0 , * mtab_fn = 0 ; 
char * fsck_fn = 0 , * aklog_fn = 0 ; 
char * nfs_mount_dir = 0 , * afs_mount_dir = 0 ; 
char * progname ; 


int nfs_attach ( ) , nfs_detach ( ) ; 
char * * nfs_explicit ( ) ; 






int afs_attach ( ) , afs_detach ( ) ; 
char * * afs_explicit ( ) ; 


int ufs_attach ( ) , ufs_detach ( ) ; 

int err_attach ( ) , null_detach ( ) ; 
char * * ufs_explicit ( ) ; 
int mul_attach ( ) , mul_detach ( ) ; 

struct _fstypes fstypes [ ] = { 
{ "---" , 0 , - 1 , 0 , ( char * ) 0 , 0 , null_detach , 0 } , 

{ "NFS" , 001 , 1 , 
1 | 2 | 8 , 
"rwnm" , nfs_attach , nfs_detach , nfs_explicit } , 







{ "UFS" , 004 , 0 , 
1 | 8 , 
"rw" , ufs_attach , ufs_detach , ufs_explicit } , 


{ "AFS" , 020 , - 1 , 
1 | 4 , 
"nrw" , afs_attach , afs_detach , afs_explicit } , 

{ "ERR" , 010 , - 1 , 0 , ( char * ) 0 , err_attach , 0 , 0 } , 
{ "MUL" , 040 , - 1 , 0 , "-" , mul_attach , mul_detach , 0 } , 
{ 0 , - 1 , 0 , 0 , ( char * ) 0 , 0 , 0 , 0 } 
} ; 






main ( argc , argv ) 
int argc ; 
char * argv [ ] ; 
{ 
char * ptr ; 
extern sig_catch sig_trap ( ) ; 





umask ( 022 ) ; 










( void ) signal ( 15 , sig_trap ) ; 
( void ) signal ( 2 , sig_trap ) ; 
( void ) signal ( 1 , sig_trap ) ; 


real_uid = owner_uid = getuid ( ) ; 
effective_uid = geteuid ( ) ; 

progname = argv [ 0 ] ; 
ptr = rindex ( progname , '/' ) ; 
if ( ptr ) 
progname = ptr + 1 ; 

attachtab_fn = strdup ( "/usr/tmp/attachtab" ) ; 
mtab_fn = strdup ( "/etc/mtab" ) ; 

aklog_fn = strdup ( "/bin/athena/aklog" ) ; 
afs_mount_dir = strdup ( "/mit" ) ; 

fsck_fn = strdup ( "/etc/fsck" ) ; 






if ( argv [ 1 ] && ! strncmp ( argv [ 1 ] , "-P" , 2 ) ) { 
progname = argv [ 1 ] + 2 ; 
if ( * progname ) { 
argv += 1 ; 
argc -= 1 ; 
} else { 
if ( progname = argv [ 2 ] ) { 
argv += 2 ; 
argc -= 2 ; 
} else { 
fprintf ( ( & _iob [ 2 ] ) , 
"Must specify attach, detach nfsid, fsid, or zinit!\n" ) ; 
exit ( 1 ) ; 
} 
} 
} 

if ( ! strcmp ( progname , "attach" ) ) 
exit ( attachcmd ( argc , argv ) ) ; 
if ( ! strcmp ( progname , "detach" ) ) 
exit ( detachcmd ( argc , argv ) ) ; 


if ( ! strcmp ( progname , "nfsid" ) ) 
{ 
filsys_type = "NFS" ; 
exit ( fsidcmd ( argc , argv ) ) ; 
} 

if ( ! strcmp ( progname , "fsid" ) ) 
exit ( fsidcmd ( argc , argv ) ) ; 


if ( ! strcmp ( progname , "zinit" ) ) 
exit ( zinitcmd ( argc , argv ) ) ; 


fprintf ( ( & _iob [ 2 ] ) , "Not invoked with attach, detach, nfsid, fsid, or zinit!\n" ) ; 
exit ( 1 ) ; 
} 





fsidcmd ( argc , argv ) 
int argc ; 
char * argv [ ] ; 
{ 
extern struct _attachtab * attachtab_first ; 
int gotname , i , op , filsysp , hostp ; 

int cell_sw ; 

char * ops ; 
struct hostent * hent ; 
char hostname [ 1024 ] ; 
register struct _attachtab * atp ; 
struct in_addr addr ; 
static struct command_list options [ ] = { 
{ "-verbose" , "-v" } , 
{ "-quiet" , "-q" } , 
{ "-debug" , "-d" } , 
{ "-map" , "-m" } , 
{ "-unmap" , "-u" } , 
{ "-purge" , "-p" } , 
{ "-purgeuser" , "-r" } , 
{ "-spoofhost" , "-s" } , 
{ "-filsys" , "-f" } , 
{ "-host" , "-h" } , 

{ "-cell" , "-c" } , 

{ "-user" , "-U" } , 
{ "-all" , "-a" } , 
{ 0 , 0 } } ; 

check_root_privs ( progname ) ; 
read_config_file ( "/etc/athena/attach.conf" ) ; 

gotname = 0 ; 
filsysp = 1 ; 
hostp = 0 ; 
verbose = 1 ; 

cell_sw = 0 ; 

error_status = 0 ; 

op = 7 ; 
ops = "mapped" ; 


if ( filsys_type && ! strcmp ( filsys_type , "NFS" ) ) { 
hostp = 1 ; 
filsysp = 0 ; 
} else { 
hostp = filsysp = 1 ; 
} 


for ( i = 1 ; i < argc ; i ++ ) { 
if ( * argv [ i ] == '-' ) { 
switch ( internal_getopt ( argv [ i ] , options ) ) { 
case 'v' : 
verbose = 1 ; 
break ; 
case 'q' : 
verbose = 0 ; 
break ; 
case 'd' : 
debug_flag = 1 ; 
break ; 
case 'm' : 
op = 7 ; 
ops = "mapped" ; 
break ; 
case 'u' : 
op = 8 ; 
ops = "unmapped" ; 
break ; 
case 'r' : 
op = 10 ; 
ops = "mappings user-purged" ; 
break ; 
case 'p' : 
if ( ! trusted_user ( real_uid ) ) { 
fprintf ( ( & _iob [ 2 ] ) , 
"%s: nfsid purge is a privileged operation\n" , 
progname ) ; 
return 22 ; 
} 
op = 9 ; 
ops = "mappings purged" ; 
break ; 

case 'c' : 
filsysp = 0 ; 
cell_sw = 1 ; 
break ; 

case 'f' : 
filsysp = 1 ; 
hostp = 0 ; 
break ; 
case 'h' : 
filsysp = 0 ; 
hostp = 1 ; 
break ; 
case 'U' : 
++ i ; 
if ( trusted_user ( real_uid ) ) { 
if ( ! argv [ i ] ) { 
fprintf ( ( & _iob [ 2 ] ) , "%s: Username required with -U.\n" , 
progname ) ; 
return 1 ; 
} 
owner_uid = parse_username ( argv [ i ] ) ; 
} else { 
fprintf ( ( & _iob [ 2 ] ) , 
"%s: You are not authorized to use the -user option\n" , progname ) ; 
} 
break ; 
case 's' : 
if ( i == argc - 1 ) { 
fprintf ( ( & _iob [ 2 ] ) , "%s: No spoof host specified\n" , progname ) ; 
return ( 1 ) ; 
} 
spoofhost = argv [ ++ i ] ; 
break ; 
case 'a' : 








lock_attachtab ( ) ; 
get_attachtab ( ) ; 
unlock_attachtab ( ) ; 
atp = attachtab_first ; 
while ( atp ) { 
if ( atp -> fs -> type == 040 ) { 




} else if ( ( op == 7 || 
op == 8 ) && 
! is_an_owner ( atp , owner_uid ) ) { 






} else if ( atp -> fs -> type == 001 ) { 
if ( ( op == 7 || 
op == 8 ) && 
atp -> mode == 'n' ) { 

} else if ( nfsid ( atp -> host , atp -> hostaddr [ 0 ] , 
op , 1 , atp -> hesiodname , 0 , 
owner_uid ) == 0 && 
verbose ) 
printf ( "%s: %s %s\n" , progname , 
atp -> hesiodname , ops ) ; 

} else if ( atp -> fs -> type == 020 && 
op == 7 ) { 

if ( atp -> mode != 'n' && 
( afs_auth ( atp -> hesiodname , atp -> hostdir ) 
== 0 ) && verbose ) 
printf ( "%s: %s %s\n" , progname , 
atp -> hesiodname , ops ) ; 

} else 
if ( verbose ) 
printf ( "%s: %s ignored (operation not supported on %s)\n" , 
progname , atp -> hesiodname , 
atp -> fs -> name ) ; 
atp = atp -> next ; 
} 
free_attachtab ( ) ; 
gotname = 2 ; 
break ; 
default : 
fprintf ( ( & _iob [ 2 ] ) , "%s: Unknown switch %s\n" , progname , argv [ i ] ) ; 
return ( 1 ) ; 
} 
continue ; 
} 
gotname ++ ; 


if ( cell_sw ) { 
afs_auth_to_cell ( argv [ i ] ) ; 
continue ; 
} 


if ( filsysp ) { 
lock_attachtab ( ) ; 
get_attachtab ( ) ; 
unlock_attachtab ( ) ; 




if ( atp = attachtab_lookup ( argv [ i ] ) ) { 
if ( atp -> fs -> type == 040 ) 
gotname = 2 ; 
fsid_filsys ( atp , op , ops , argv [ i ] , owner_uid ) ; 
continue ; 
} else if ( ! hostp ) { 
error_status = 20 ; 
fprintf ( ( & _iob [ 2 ] ) , "%s: %s not attached\n" , progname , argv [ i ] ) ; 
} 
} 

if ( hostp ) { 



hent = gethostbyname ( argv [ i ] ) ; 
if ( ! hent ) { 
fprintf ( ( & _iob [ 2 ] ) , "%s: Can't resolve %s\n" , progname , argv [ i ] ) ; 
error_status = 21 ; 
} 
else { 
strcpy ( hostname , hent -> h_name ) ; 
bcopy ( hent -> h_addr_list [ 0 ] , & addr , 4 ) ; 
if ( ( nfsid ( hostname , addr , 
op , 1 , "nfsid" , 0 , owner_uid ) == 0 ) && verbose ) 
printf ( "%s: %s %s\n" , progname , hostname , ops ) ; 
} 
} 
} 

if ( gotname == 1 ) 
return ( error_status ) ; 
if ( gotname > 1 ) 
return ( error_status ? 2 : 0 ) ; 

fprintf ( ( & _iob [ 2 ] ) , "Usage: nfsid [options] [host host ...] or [filsys filsys ...]\n" ) ; 
return ( 1 ) ; 
} 


fsid_filsys ( atp , op , ops , filsys , uid ) 
struct _attachtab * atp ; 
int op ; 
char * ops ; 
char * filsys ; 
int uid ; 
{ 
char mul_buf [ 1024 ] , * cp ; 

if ( atp -> fs -> type == 040 ) { 
strcpy ( mul_buf , atp -> hostdir ) ; 
cp = strtok ( mul_buf , "," ) ; 
while ( cp ) { 
atp = attachtab_lookup ( cp ) ; 
if ( atp ) 
fsid_filsys ( atp , op , ops , atp -> hesiodname , uid ) ; 
cp = strtok ( 0 , "," ) ; 
} 

} else if ( atp -> fs -> type == 001 ) { 
if ( ( nfsid ( atp -> host , atp -> hostaddr [ 0 ] , op , 1 , 
filsys , 0 , owner_uid ) == 0 ) && 
verbose ) 
printf ( "%s: %s %s\n" , progname , filsys , ops ) ; 


} else if ( atp -> fs -> type == 020 ) { 
if ( op == 7 && 
( afs_auth ( atp -> hesiodname , atp -> hostdir ) == 0 ) 
&& verbose ) 
printf ( "%s: %s %s\n" , progname , filsys , ops ) ; 

} 
} 

attachcmd ( argc , argv ) 
int argc ; 
char * argv [ ] ; 
{ 
int gotname , i ; 
int print_host = 0 ; 

static struct command_list options [ ] = { 
{ "-verbose" , "-v" } , 
{ "-quiet" , "-q" } , 
{ "-force" , "-f" } , 
{ "-printpath" , "-p" } , 
{ "-lookup" , "-l" } , 
{ "-debug" , "-d" } , 
{ "-map" , "-y" } , 
{ "-nomap" , "-n" } , 
{ "-remap" , "-g" } , 
{ "-noremap" , "-a" } , 

{ "-zephyr" , "-z" } , 
{ "-nozephyr" , "-h" } , 

{ "-readonly" , "-r" } , 
{ "-write" , "-w" } , 
{ "-mountpoint" , "-m" } , 
{ "-noexplicit" , "-x" } , 
{ "-explicit" , "-e" } , 
{ "-type" , "-t" } , 
{ "-mountoptions" , "-o" } , 
{ "-spoofhost" , "-s" } , 
{ "-nosetuid" , "-N" } , 
{ "-setuid" , "-S" } , 
{ "-nosuid" , "-N" } , 
{ "-suid" , "-S" } , 
{ "-override" , "-O" } , 
{ "-skipfsck" , "-F" } , 
{ "-lock" , "-L" } , 
{ "-user" , "-U" } , 
{ "-host" , "-H" } , 
{ 0 , 0 } } ; 

read_config_file ( "/etc/athena/attach.conf" ) ; 

check_root_privs ( progname ) ; 
default_suid = 0 ; 

gotname = 0 ; 

verbose = 1 ; 
explicit = 0 ; 
force = 0 ; 
lookup = 0 ; 
mntpt = ( char * ) 0 ; 
override_mode = '\0' ; 
override_suid = - 1 ; 
mount_options = "" ; 
error_status = 0 ; 
map_anyway = 1 ; 

if ( argc == 1 ) 
return ( attach_print ( 0 ) ) ; 

for ( i = 1 ; i < argc ; i ++ ) { 
if ( * argv [ i ] == '-' ) { 
switch ( internal_getopt ( argv [ i ] , options ) ) { 
case 'v' : 
verbose = 1 ; 
print_path = 0 ; 
break ; 
case 'l' : 
lookup = 1 ; 
break ; 
case 'q' : 
verbose = 0 ; 
break ; 
case 'd' : 
debug_flag = 1 ; 
break ; 
case 'y' : 
do_nfsid = 1 ; 
break ; 
case 'n' : 
do_nfsid = 0 ; 
map_anyway = 0 ; 
break ; 
case 'p' : 
print_path = 1 ; 
verbose = 0 ; 
break ; 
case 'm' : 
if ( i == argc - 1 ) { 
fprintf ( ( & _iob [ 2 ] ) , "%s: No mount point specified\n" , 
progname ) ; 
return ( 1 ) ; 
} 
if ( exp_mntpt || trusted_user ( real_uid ) ) { 
mntpt = argv [ ++ i ] ; 
} else { 
fprintf ( ( & _iob [ 2 ] ) , 
"%s: You are not allowed to use the -mountpoint option\n" , 
progname ) ; 
i ++ ; 
} 
break ; 
case 'r' : 
override_mode = 'r' ; 
break ; 
case 'w' : 
override_mode = 'w' ; 
break ; 
case 'f' : 
force = 1 ; 
break ; 
case 'g' : 
map_anyway = 1 ; 
break ; 
case 'a' : 
map_anyway = 0 ; 
break ; 

case 'z' : 
use_zephyr = 1 ; 
break ; 
case 'h' : 
use_zephyr = 0 ; 
break ; 

case 'x' : 
explicit = 0 ; 
break ; 
case 'e' : 
if ( exp_allow || trusted_user ( real_uid ) ) 
explicit = 1 ; 
else 
fprintf ( ( & _iob [ 2 ] ) , 
"%s: You are not allowed to use the -explicit option\n" , progname ) ; 
break ; 
case 't' : 
if ( i == argc - 1 ) { 
fprintf ( ( & _iob [ 2 ] ) , "%s: No filesystem type specified\n" , progname ) ; 
return ( 1 ) ; 
} 
filsys_type = argv [ ++ i ] ; 
break ; 
case 'o' : 
if ( i == argc - 1 ) { 
fprintf ( ( & _iob [ 2 ] ) , "%s: No mount options specified\n" , progname ) ; 
return ( 1 ) ; 
} 
mount_options = argv [ ++ i ] ; 
break ; 
case 's' : 
if ( i == argc - 1 ) { 
fprintf ( ( & _iob [ 2 ] ) , "%s: No spoof host specified\n" , progname ) ; 
return ( 1 ) ; 
} 
spoofhost = argv [ ++ i ] ; 
break ; 
case 'N' : 
override_suid = 0 ; 
break ; 
case 'S' : 
if ( trusted_user ( real_uid ) ) 
override_suid = 1 ; 
else { 
fprintf ( ( & _iob [ 2 ] ) , 

"%s: You are not authorized to the -setuid option\n" , progname ) ; 
} 
break ; 
case 'O' : 
if ( trusted_user ( real_uid ) ) 
override = 1 ; 
else { 
fprintf ( ( & _iob [ 2 ] ) , 
"%s: You are not authorized to use -override option\n" , progname ) ; 
} 
break ; 
case 'L' : 
if ( trusted_user ( real_uid ) ) 
lock_filesystem = 1 ; 
else { 
fprintf ( ( & _iob [ 2 ] ) , 
"%s: You are not authorized to use -lock option\n" , progname ) ; 
} 
break ; 
case 'F' : 
skip_fsck = 1 ; 
break ; 
case 'U' : 
++ i ; 
if ( trusted_user ( real_uid ) ) { 
if ( argv [ i ] ) 
owner_uid = parse_username ( argv [ i ] ) ; 
} else { 
fprintf ( ( & _iob [ 2 ] ) , 
"You are not authorized to use the -user option\n" , progname ) ; 
} 
break ; 
case 'H' : 
print_host ++ ; 
break ; 
default : 
fprintf ( ( & _iob [ 2 ] ) , "%s: Unknown switch %s\n" , progname , argv [ i ] ) ; 
return ( 1 ) ; 
} 
continue ; 
} 
gotname ++ ; 

if ( print_host ) 
attach_print ( argv [ i ] ) ; 
else if ( attach ( argv [ i ] ) == 0 ) 
error_status = 0 ; 

override_mode = '\0' ; 
override_suid = - 1 ; 
override = 0 ; 
lock_filesystem = 0 ; 
mntpt = ( char * ) 0 ; 
} 



zephyr_sub ( 0 ) ; 


if ( gotname == 1 ) 
return ( error_status ) ; 
if ( gotname > 1 ) 
return ( error_status ? 2 : 0 ) ; 

fprintf ( ( & _iob [ 2 ] ) , 
"Usage: attach [options] filesystem [options] filesystem ...\n" ) ; 
return ( 1 ) ; 
} 

detachcmd ( argc , argv ) 
int argc ; 
char * argv [ ] ; 
{ 
int gotname , i ; 
int dohost ; 
static struct command_list options [ ] = { 
{ "-verbose" , "-v" } , 
{ "-quiet" , "-q" } , 
{ "-all" , "-a" } , 
{ "-debug" , "-d" } , 
{ "-unmap" , "-y" } , 
{ "-nomap" , "-n" } , 

{ "-zephyr" , "-z" } , 
{ "-nozephyr" , "-h" } , 

{ "-type" , "-t" } , 
{ "-explicit" , "-e" } , 
{ "-noexplicit" , "-x" } , 
{ "-force" , "-f" } , 
{ "-spoofhost" , "-s" } , 
{ "-override" , "-O" } , 
{ "-host" , "-H" } , 
{ "-user" , "-U" } , 
{ "-clean" , "-C" } , 
{ "-lint" , "-L" } , 
{ 0 , 0 } } ; 

check_root_privs ( progname ) ; 
read_config_file ( "/etc/athena/attach.conf" ) ; 

gotname = 0 ; 

verbose = 1 ; 
explicit = 0 ; 
force = 0 ; 
override = 0 ; 
dohost = 0 ; 
error_status = 0 ; 
filsys_type = 0 ; 

for ( i = 1 ; i < argc ; i ++ ) { 
if ( * argv [ i ] == '-' ) { 
switch ( internal_getopt ( argv [ i ] , options ) ) { 
case 'v' : 
verbose = 1 ; 
break ; 
case 'q' : 
verbose = 0 ; 
break ; 
case 'd' : 
debug_flag = 1 ; 
break ; 
case 'y' : 
do_nfsid = 1 ; 
break ; 
case 'n' : 
do_nfsid = 0 ; 
break ; 

case 'z' : 
use_zephyr = 1 ; 
break ; 
case 'h' : 
use_zephyr = 0 ; 
break ; 

case 'H' : 
dohost = 1 ; 
break ; 
case 'f' : 
force = 1 ; 
break ; 
case 'x' : 
explicit = 0 ; 
break ; 
case 'e' : 
explicit = 1 ; 
break ; 
case 't' : 
if ( i == argc - 1 ) { 
fprintf ( ( & _iob [ 2 ] ) , "%s: No filesystem type specified\n" , 
progname ) ; 
return ( 1 ) ; 
} 
filsys_type = argv [ ++ i ] ; 
break ; 
case 'a' : 
detach_all ( ) ; 
gotname = 2 ; 
break ; 
case 's' : 
if ( i == argc - 1 ) { 
fprintf ( ( & _iob [ 2 ] ) , "%s: No spoof host specified\n" , progname ) ; 
return ( 1 ) ; 
} 
spoofhost = argv [ ++ i ] ; 
break ; 
case 'O' : 
if ( trusted_user ( real_uid ) ) 
override = 1 ; 
else { 
fprintf ( ( & _iob [ 2 ] ) , 
"%s: You are not authorized to use -override option\n" , progname ) ; 
} 
break ; 
case 'U' : 
++ i ; 
if ( trusted_user ( real_uid ) ) { 
if ( ! argv [ i ] ) { 
fprintf ( ( & _iob [ 2 ] ) , "%s: Username required with -U.\n" , 
progname ) ; 
return ( 1 ) ; 
} 
owner_uid = parse_username ( argv [ i ] ) ; 
} else { 
fprintf ( ( & _iob [ 2 ] ) , 
"%s: You are not authorized to use the -user option\n" , progname ) ; 
} 
break ; 
case 'C' : 
clean_detach = 1 ; 
break ; 
case 'L' : 
if ( ! trusted_user ( real_uid ) ) { 
fprintf ( ( & _iob [ 2 ] ) , 
"%s: You are not authorized to use the -lint option\n" , 
progname ) ; 
return ( 1 ) ; 
} else { 
lint_attachtab ( ) ; 
gotname = 1 ; 
} 
break ; 
default : 
fprintf ( ( & _iob [ 2 ] ) , "%s: Unknown switch %s\n" , progname , argv [ i ] ) ; 
return ( 1 ) ; 
} 
continue ; 
} 
gotname ++ ; 
if ( dohost ) 
detach_host ( argv [ i ] ) ; 
else 
detach ( argv [ i ] ) ; 
dohost = 0 ; 
} 



zephyr_unsub ( 0 ) ; 


if ( gotname == 1 ) 
return ( error_status ) ; 
if ( gotname > 1 ) 
return ( error_status ? 2 : 0 ) ; 

fprintf ( ( & _iob [ 2 ] ) , 
"Usage: detach [options] filesystem [options] filesystem ...\n" ) ; 
return ( 1 ) ; 
} 


zinitcmd ( argc , argv ) 
int argc ; 
char * * argv ; 
{ 
extern struct _attachtab * attachtab_first ; 
char instbfr [ 1024 ] ; 
struct _attachtab * p ; 
int i ; 



int who = 1 ; 

static struct command_list options [ ] = { 
{ "-verbose" , "-v" } , 
{ "-quiet" , "-q" } , 
{ "-all" , "-a" } , 
{ "-me" , "-m" } , 
{ "-debug" , "-d" } , 
{ 0 , 0 } } ; 

read_config_file ( "/etc/athena/attach.conf" ) ; 
for ( i = 1 ; i < argc ; i ++ ) { 
if ( * argv [ i ] == '-' ) { 
switch ( internal_getopt ( argv [ i ] , options ) ) { 
case 'v' : 
verbose = 1 ; 
break ; 
case 'q' : 
verbose = 0 ; 
break ; 
case 'd' : 
debug_flag = 1 ; 
break ; 
case 'm' : 
who = 0 ; 
break ; 
case 'a' : 
who = 2 ; 
break ; 
} 
} 
} 

lock_attachtab ( ) ; 
get_attachtab ( ) ; 
unlock_attachtab ( ) ; 

for ( p = attachtab_first ; p ; p = p -> next ) { 
if ( p -> status == '*' ) 





continue ; 
if ( who != 2 && ! wants_to_subscribe ( p , real_uid , who ) ) 
continue ; 

if ( p -> fs -> type == 020 ) 
afs_zinit ( p -> hesiodname , p -> hostdir ) ; 
else 

if ( p -> fs -> flags & 2 ) { 
bsd_sprintf ( instbfr , "%s:%s" , p -> host , p -> hostdir ) ; 
zephyr_addsub ( instbfr ) ; 
zephyr_addsub ( p -> host ) ; 
} 
} 
free_attachtab ( ) ; 
return ( ( zephyr_sub ( 1 ) == 1 ) ? error_status : 0 ) ; 
} 

