## diffname ip/dial.c 1997/0327
## diff -e /dev/null /n/emeliedump/1997/0327/sys/src/brazil/ip/dial.c
0a
#include "u.h"
#include "../port/lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "../port/error.h"
#include "kernel.h"
typedef struct DS DS;
static int call(char*, char*, DS*);
static void _dial_string_parse(char*, DS*);
enum
{
Maxstring= 128,
Maxpath= 256,
};
struct DS
{
char buf[Maxstring]; /* dist string */
char *netdir;
char *proto;
char *rem;
char *local; /* other args */
char *dir;
int *cfdp;
};
/*
* the dialstring is of the form '[/net/]proto!dest'
*/
int
kdial(char *dest, char *local, char *dir, int *cfdp)
{
DS ds;
char clone[Maxpath];
ds.local = local;
ds.dir = dir;
ds.cfdp = cfdp;
_dial_string_parse(dest, &ds);
if(ds.netdir == 0)
ds.netdir = "/net";
/* no connection server, don't translate */
snprint(clone, sizeof(clone), "%s/%s/clone", ds.netdir, ds.proto);
return call(clone, ds.rem, &ds);
}
static int
call(char *clone, char *dest, DS *ds)
{
int fd, cfd, n;
char name[3*NAMELEN+5], data[3*NAMELEN+10], *p;
cfd = kopen(clone, ORDWR);
if(cfd < 0){
kwerrstr("%s: %r", clone);
return -1;
}
/* get directory name */
n = kread(cfd, name, sizeof(name)-1);
if(n < 0){
kclose(cfd);
return -1;
}
name[n] = 0;
for(p = name; *p == ' '; p++)
;
sprint(name, "%d", strtoul(p, 0, 0));
p = strrchr(clone, '/');
*p = 0;
if(ds->dir)
snprint(ds->dir, 2*NAMELEN, "%s/%s", clone, name);
snprint(data, sizeof(data), "%s/%s/data", clone, name);
/* connect */
if(ds->local)
snprint(name, sizeof(name), "connect %s %s", dest, ds->local);
else
snprint(name, sizeof(name), "connect %s", dest);
if(kwrite(cfd, name, strlen(name)) < 0){
kwerrstr("%s failed: %r", name);
kclose(cfd);
return -1;
}
/* open data connection */
fd = kopen(data, ORDWR);
if(fd < 0){
kwerrstr("can't open %s: %r", data);
kclose(cfd);
return -1;
}
if(ds->cfdp)
*ds->cfdp = cfd;
else
kclose(cfd);
return fd;
}
/*
* parse a dial string
*/
static void
_dial_string_parse(char *str, DS *ds)
{
char *p, *p2;
strncpy(ds->buf, str, Maxstring);
ds->buf[Maxstring-1] = 0;
p = strchr(ds->buf, '!');
if(p == 0) {
ds->netdir = 0;
ds->proto = "net";
ds->rem = ds->buf;
} else {
if(*ds->buf != '/'){
ds->netdir = 0;
ds->proto = ds->buf;
} else {
for(p2 = p; *p2 != '/'; p2--)
;
*p2++ = 0;
ds->netdir = ds->buf;
ds->proto = p2;
}
*p = 0;
ds->rem = p + 1;
}
}
.
## diffname ip/dial.c 1998/0825
## diff -e /n/emeliedump/1997/0327/sys/src/brazil/ip/dial.c /n/emeliedump/1998/0825/sys/src/brazil/ip/dial.c
73c
sprint(name, "%lud", strtoul(p, 0, 0));
.
## diffname ip/dial.c 2000/1111 # deleted
## diff -e /n/emeliedump/1998/0825/sys/src/brazil/ip/dial.c /n/emeliedump/2000/1111/sys/src/9/ip/dial.c
1,136d
|