From mboxrd@z Thu Jan 1 00:00:00 1970 Date: Thu, 10 Dec 1998 10:19:48 +0000 From: Franklin Robert Araujo =?iso-8859-1?Q?Fran=E7a?= 973930@dcc.unicamp.br Subject: [9fans] dial M for Minimalism Topicbox-Message-UUID: 8caa9aa8-eac8-11e9-9e20-41e7f4b1d025 Message-ID: <19981210101948.LuiGpp7CHDnzJZYCa2mIf_LQUxyYR1UsSrFUkB9FhoM@z> forsyth@caldo.demon.co.uk wrote: > as a doctor, i am often asked ``why doesn't Plan 9 (or Inferno) use > the `standard' socket calls?'' > > the source of tcpblast.c was recently posted to this list. > it makes a tcp/ip call to a given machine. > the bits that do so are shown below (i have completed > the code that looks up the service name): > > #include > #include > #include > #include > > ... > > struct sockaddr_in sock_in; > struct servent *sp; > struct hostent *host; > > ... > memset(&sock_in, 0, sizeof (sock_in)); > sock_in.sin_family = AF_INET; > f = socket(AF_INET, SOCK_STREAM, 0); > if (f < 0) { > perror("tcpblast: socket"); > exit(3); > } > if (bind(f, (struct sockaddr*) &sock_in, sizeof (sock_in)) < 0) { > perror("tcpblast: bind"); > exit(1); > } > > host = gethostbyname(argv[1]); > if (host) { > sock_in.sin_family = host->h_addrtype; > memmove(&sock_in.sin_addr, host->h_addr, host->h_length); > } else { > sock_in.sin_family = AF_INET; > sock_in.sin_addr.s_addr = inet_addr(argv[1]); > if (sock_in.sin_addr.s_addr == -1) { > fprintf(stderr, "tcpblast: %s unknown host\n", argv[1]); > exit(1); > } > } > sp = getservbyname("discard", "tcp"); > if (sp) > sock_in.sin_port = sp->s_port; > else > sock_in.sin_port = htons(9); > > if (connect(f, (struct sockaddr*) &sock_in, sizeof(sock_in)) <0) > { > perror("tcpblast connect:"); > exit(1); > } > > by contrast, in my variant for Plan 9, i wrote: > > #include > #include > > ... > > fd = dial(netmkaddr(argv[0], "tcp", "discard"), nil, nil, nil); > if(fd < 0){ > fprint(2, "tcpbuzz: can't dial %s: %r\n", argv[0]); > exits("dial"); > } > > the nil, nil, nil looks and sounds like a Eurovision Song Contest > score, which is perhaps a blemish. (each nil represents a default > that more specialised applications can set to access such things as > port number assignment and the connection's control and status files. > Inferno's dial interface is simpler still, partly because of the use > of Limbo tuples.) apart from that, the incantation is straightforward > and easy to write. because the interface and underlying > infrastructure provides a good degree of abstraction, it also works > without change for all suitable network types and protocols; it isn't > limited to TCP/IP or IP networks. the connection service and name > space together sort out the details; that the network files live in > the per-process name space also enables the same code to dial through > an imported gateway.