2011-03-30 13:49:47 +00:00
|
|
|
.TH DIAL 2
|
|
|
|
.SH NAME
|
|
|
|
dial, hangup, announce, listen, accept, reject, netmkaddr, setnetmtpt, getnetconninfo, freenetconninfo \- make and break network connections
|
|
|
|
.SH SYNOPSIS
|
|
|
|
.B #include <u.h>
|
|
|
|
.br
|
|
|
|
.B #include <libc.h>
|
|
|
|
.PP
|
|
|
|
.B
|
|
|
|
int dial(char *addr, char *local, char *dir, int *cfdp)
|
|
|
|
.PP
|
|
|
|
.B
|
|
|
|
int hangup(int ctl)
|
|
|
|
.PP
|
|
|
|
.B
|
|
|
|
int announce(char *addr, char *dir)
|
|
|
|
.PP
|
|
|
|
.B
|
|
|
|
int listen(char *dir, char *newdir)
|
|
|
|
.PP
|
|
|
|
.B
|
|
|
|
int accept(int ctl, char *dir)
|
|
|
|
.PP
|
|
|
|
.B
|
|
|
|
int reject(int ctl, char *dir, char *cause)
|
|
|
|
.PP
|
|
|
|
.B
|
|
|
|
char* netmkaddr(char *addr, char *defnet, char *defservice)
|
|
|
|
.PP
|
|
|
|
.B
|
|
|
|
void setnetmtpt(char *to, int tolen, char *from)
|
|
|
|
.PP
|
|
|
|
.B
|
|
|
|
NetConnInfo* getnetconninfo(char *conndir, int fd)
|
|
|
|
.PP
|
|
|
|
.B
|
|
|
|
void freenetconninfo(NetConnInfo*)
|
|
|
|
.SH DESCRIPTION
|
|
|
|
For these routines,
|
|
|
|
.I addr
|
|
|
|
is a network address of the form
|
|
|
|
.IB network ! netaddr ! service\f1,
|
|
|
|
.IB network ! netaddr\f1,
|
|
|
|
or simply
|
|
|
|
.IR netaddr .
|
|
|
|
.I Network
|
|
|
|
is any directory listed in
|
|
|
|
.B /net
|
|
|
|
or the special token,
|
|
|
|
.BR net .
|
|
|
|
.B Net
|
|
|
|
is a free variable that stands for any network in common
|
|
|
|
between the source and the host
|
|
|
|
.IR netaddr .
|
|
|
|
.I Netaddr
|
|
|
|
can be a host name, a domain name, a network address,
|
|
|
|
or a meta-name of the form
|
|
|
|
.BI $ attribute\f1,
|
|
|
|
which
|
|
|
|
is replaced by
|
|
|
|
.I value
|
|
|
|
from the value-attribute pair
|
|
|
|
.IB attribute = value
|
|
|
|
most closely associated with the source host in the
|
|
|
|
network data base (see
|
|
|
|
.IR ndb (6)).
|
|
|
|
.PP
|
|
|
|
If a connection attempt is successful and
|
|
|
|
.I dir
|
|
|
|
is non-zero,
|
|
|
|
the path name of a
|
|
|
|
.I line directory
|
|
|
|
that has files for accessing the connection
|
|
|
|
is copied into
|
|
|
|
.IR dir .
|
|
|
|
The path name is guaranteed to be less than 40
|
|
|
|
bytes long.
|
|
|
|
One line directory exists for each possible connection.
|
|
|
|
The
|
|
|
|
.B data
|
|
|
|
file in the line directory should be used to communicate with the destination.
|
|
|
|
The
|
|
|
|
.B ctl
|
|
|
|
file in the line directory can be used to send commands to the line.
|
|
|
|
See
|
|
|
|
.IR ip (3)
|
|
|
|
for messages that can be written to the
|
|
|
|
.B ctl
|
|
|
|
file.
|
|
|
|
The last close of the
|
|
|
|
.B data
|
|
|
|
or
|
|
|
|
.B ctl
|
|
|
|
file will close the connection.
|
|
|
|
.PP
|
|
|
|
.I Dial
|
|
|
|
makes a call to destination
|
|
|
|
.I addr
|
|
|
|
on a multiplexed network.
|
|
|
|
If the network in
|
|
|
|
.I addr
|
|
|
|
is
|
|
|
|
.BR net ,
|
|
|
|
.I dial
|
2012-06-25 14:53:33 +00:00
|
|
|
will try all addresses on networks in common between source
|
|
|
|
and destination until a call succeeds.
|
2011-03-30 13:49:47 +00:00
|
|
|
It returns a file descriptor open for reading and writing the
|
|
|
|
.B data
|
|
|
|
file in the line directory.
|
|
|
|
The
|
|
|
|
.B addr
|
|
|
|
file in the line directory contains the address called.
|
|
|
|
If the network allows the local address to be set,
|
|
|
|
as is the case with UDP and TCP port numbers, and
|
|
|
|
.IR local
|
|
|
|
is non-zero, the local address will be set to
|
|
|
|
.IR local .
|
|
|
|
If
|
|
|
|
.I cfdp
|
|
|
|
is non-zero,
|
|
|
|
.BI * cfdp
|
|
|
|
is set to a file descriptor open for reading and
|
|
|
|
writing the control file.
|
|
|
|
.PP
|
|
|
|
.I Hangup
|
|
|
|
is a means of forcing a connection to hang up without
|
|
|
|
closing the
|
|
|
|
.B ctl
|
|
|
|
and
|
|
|
|
.B data
|
|
|
|
files.
|
|
|
|
.P
|
|
|
|
.I Announce
|
|
|
|
and
|
|
|
|
.I listen
|
|
|
|
are the complements of
|
|
|
|
.IR dial .
|
|
|
|
.I Announce
|
|
|
|
establishes a network
|
|
|
|
name to which calls can be made.
|
|
|
|
Like
|
|
|
|
.IR dial ,
|
|
|
|
.I announce
|
|
|
|
returns an open
|
|
|
|
.B ctl
|
|
|
|
file.
|
|
|
|
The
|
|
|
|
.I netaddr
|
|
|
|
used in announce may be a local address or an asterisk,
|
|
|
|
to indicate all local addresses, e.g.
|
|
|
|
.BR tcp!*!echo .
|
|
|
|
The
|
|
|
|
.I listen
|
|
|
|
routine takes as its first argument the
|
|
|
|
.I dir
|
|
|
|
of a previous
|
|
|
|
.IR announce .
|
|
|
|
When a call is received,
|
|
|
|
.I listen
|
|
|
|
returns an open
|
|
|
|
.B ctl
|
|
|
|
file for the line the call was received on.
|
|
|
|
It sets
|
|
|
|
.I newdir
|
|
|
|
to the path name of the new line directory.
|
|
|
|
.I Accept
|
|
|
|
accepts a call received by
|
|
|
|
.IR listen ,
|
|
|
|
while
|
|
|
|
.I reject
|
|
|
|
refuses the call because of
|
|
|
|
.IR cause .
|
|
|
|
.I Accept
|
|
|
|
returns a file descriptor for the data file opened
|
|
|
|
.BR ORDWR .
|
|
|
|
.PP
|
|
|
|
.I Netmkaddr
|
|
|
|
makes an address suitable for dialing or announcing.
|
|
|
|
It takes an address along with a default network and service to use
|
|
|
|
if they are not specified in the address.
|
|
|
|
It returns a pointer to static data holding the actual address to use.
|
|
|
|
.PP
|
|
|
|
.I Getnetconninfo
|
|
|
|
returns a structure containing information about a
|
|
|
|
network connection. The structure is:
|
|
|
|
.EX
|
|
|
|
typedef struct NetConnInfo NetConnInfo;
|
|
|
|
struct NetConnInfo
|
|
|
|
{
|
|
|
|
char *dir; /* connection directory */
|
|
|
|
char *root; /* network root */
|
|
|
|
char *spec; /* binding spec */
|
|
|
|
char *lsys; /* local system */
|
|
|
|
char *lserv; /* local service */
|
|
|
|
char *rsys; /* remote system */
|
|
|
|
char *rserv; /* remote service */
|
|
|
|
char *laddr; /* local address */
|
|
|
|
char *raddr; /* remote address */
|
|
|
|
};
|
|
|
|
.EE
|
|
|
|
.PP
|
|
|
|
The information is obtained from the connection directory,
|
|
|
|
.IR conndir .
|
|
|
|
If
|
|
|
|
.I conndir
|
|
|
|
is nil, the directory is obtained by performing
|
|
|
|
.IR fd2path (2)
|
|
|
|
on
|
|
|
|
.IR fd .
|
|
|
|
.I Getnetconninfo
|
|
|
|
returns either a completely specified structure, or
|
|
|
|
nil if either the structure can't be allocated or the
|
|
|
|
network directory can't be determined.
|
|
|
|
The structure
|
|
|
|
is freed using
|
|
|
|
.IR freenetconninfo .
|
|
|
|
.PP
|
|
|
|
.I Setnetmtpt
|
|
|
|
copies the name of the network mount point into
|
|
|
|
the buffer
|
|
|
|
.IR to ,
|
|
|
|
whose length is
|
|
|
|
.IR tolen .
|
|
|
|
It exists to merge two pre-existing conventions for specifying
|
|
|
|
the mount point.
|
|
|
|
Commands that take a network mount point as a parameter
|
|
|
|
(such as
|
|
|
|
.BR dns ,
|
|
|
|
.BR cs
|
|
|
|
(see
|
|
|
|
.IR ndb (8)),
|
|
|
|
and
|
|
|
|
.IR ipconfig (8))
|
|
|
|
should now call
|
|
|
|
.IR setnetmtpt .
|
|
|
|
If
|
|
|
|
.I from
|
|
|
|
is
|
|
|
|
.BR nil ,
|
|
|
|
the mount point is set to the default,
|
|
|
|
.BR /net .
|
|
|
|
If
|
|
|
|
.I from
|
|
|
|
points to a string starting with a slash,
|
|
|
|
the mount point is that path.
|
|
|
|
Otherwise, the mount point is the string pointed to by
|
|
|
|
.I from
|
|
|
|
appended to the string
|
|
|
|
.BR /net .
|
|
|
|
The last form is obsolete and is should be avoided.
|
|
|
|
It exists only to aid in conversion.
|
|
|
|
.SH EXAMPLES
|
|
|
|
Make a call and return an open file descriptor to
|
|
|
|
use for communications:
|
|
|
|
.IP
|
|
|
|
.EX
|
|
|
|
int callkremvax(void)
|
|
|
|
{
|
|
|
|
return dial("kremvax", 0, 0, 0);
|
|
|
|
}
|
|
|
|
.EE
|
|
|
|
.PP
|
|
|
|
Call the local authentication server:
|
|
|
|
.IP
|
|
|
|
.EX
|
|
|
|
int dialauth(char *service)
|
|
|
|
{
|
|
|
|
return dial(netmkaddr("$auth", 0, service), 0, 0, 0);
|
|
|
|
}
|
|
|
|
.EE
|
|
|
|
.PP
|
|
|
|
Announce as
|
|
|
|
.B kremvax
|
|
|
|
on TCP/IP and
|
|
|
|
loop forever receiving calls and echoing back
|
|
|
|
to the caller anything sent:
|
|
|
|
.IP
|
|
|
|
.EX
|
|
|
|
int
|
|
|
|
bekremvax(void)
|
|
|
|
{
|
|
|
|
int dfd, acfd, lcfd;
|
|
|
|
char adir[40], ldir[40];
|
|
|
|
int n;
|
|
|
|
char buf[256];
|
|
|
|
|
|
|
|
acfd = announce("tcp!*!7", adir);
|
|
|
|
if(acfd < 0)
|
|
|
|
return -1;
|
|
|
|
for(;;){
|
|
|
|
/* listen for a call */
|
|
|
|
lcfd = listen(adir, ldir);
|
|
|
|
if(lcfd < 0)
|
|
|
|
return -1;
|
|
|
|
/* fork a process to echo */
|
|
|
|
switch(fork()){
|
|
|
|
case -1:
|
|
|
|
perror("forking");
|
|
|
|
close(lcfd);
|
|
|
|
break;
|
|
|
|
case 0:
|
|
|
|
/* accept the call and open the data file */
|
|
|
|
dfd = accept(lcfd, ldir);
|
|
|
|
if(dfd < 0)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
/* echo until EOF */
|
|
|
|
while((n = read(dfd, buf, sizeof(buf))) > 0)
|
|
|
|
write(dfd, buf, n);
|
|
|
|
exits(0);
|
|
|
|
default:
|
|
|
|
close(lcfd);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.EE
|
|
|
|
.SH SOURCE
|
|
|
|
.BR /sys/src/libc/9sys ,
|
|
|
|
.B /sys/src/libc/port
|
|
|
|
.SH "SEE ALSO"
|
|
|
|
.IR auth (2),
|
|
|
|
.IR ip (3),
|
|
|
|
.IR ndb (8)
|
|
|
|
.SH DIAGNOSTICS
|
|
|
|
.IR Dial ,
|
|
|
|
.IR announce ,
|
|
|
|
and
|
|
|
|
.I listen
|
|
|
|
return \-1 if they fail.
|
|
|
|
.I Hangup
|
|
|
|
returns nonzero if it fails.
|