|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)client.c 4.2 (Berkeley) 7/7/83";
3: #endif
4:
5: #include <stdio.h>
6: #include <sys/types.h>
7: #include <sys/socket.h>
8: #include <netinet/in.h>
9: #include <netdb.h>
10: #include "courier.h"
11:
12: #if DEBUG
13: int CourierClientDebuggingFlag = 0;
14: #endif
15:
16: SendCallMessage(f, procedure, nwords, arguments)
17: int f;
18: Cardinal procedure, nwords;
19: Unspecified *arguments;
20: {
21: Cardinal p, n;
22:
23: #if DEBUG
24: if (CourierClientDebuggingFlag)
25: fprintf(stderr, "[SendCallMessage %d %d]\n", procedure, nwords);
26: #endif
27: PackCardinal(&procedure, &p, 1);
28: PackCardinal(&nwords, &n, 1);
29: write(f, &p, sizeof(Cardinal));
30: write(f, &n, sizeof(Cardinal));
31: write(f, arguments, nwords*sizeof(Unspecified));
32: }
33:
34: Unspecified *
35: ReceiveReturnMessage(f)
36: int f;
37: {
38: Cardinal nwords, n;
39: Unspecified *bp;
40:
41: if (ClientRead(f, &nwords, 1) == 0)
42: goto eof;
43: UnpackCardinal(&n, &nwords);
44: #if DEBUG
45: if (CourierClientDebuggingFlag)
46: fprintf(stderr, "[ReceiveReturnMessage %d]\n", n);
47: #endif
48: bp = Allocate(n);
49: if (ClientRead(f, bp, n) == 0)
50: goto eof;
51: return (bp);
52: eof:
53: fprintf(stderr, "\n\r\7Lost connection to server.\n");
54: exit(1);
55: }
56:
57: static
58: ClientRead(f, addr, nwords)
59: int f;
60: char *addr;
61: int nwords;
62: {
63: register int nbytes, n;
64: register char *p;
65:
66: for (p = addr, nbytes = 2*nwords; nbytes > 0; nbytes -= n, p += n) {
67: n = read(f, p, nbytes);
68: if (n <= 0)
69: return (0);
70: }
71: return (1);
72: }
73:
74: CourierActivate(program_name, host)
75: String program_name, host;
76: {
77: struct hostent *hp;
78: struct servent *srvp;
79: int f;
80: struct sockaddr_in sin;
81: Unspecified buf[50];
82: Cardinal n;
83: char c;
84:
85: hp = gethostbyname(host);
86: if (hp == 0) {
87: fprintf(stderr, "%s: unknown host\n", host);
88: exit(1);
89: }
90: srvp = getservbyname("courier", "tcp");
91: if (srvp == 0) {
92: fprintf(stderr, "tcp/courier: unknown service\n");
93: exit(1);
94: }
95: f = socket(AF_INET, SOCK_STREAM, 0, 0);
96: if (f < 0) {
97: perror("socket");
98: exit(1);
99: }
100: sin.sin_family = AF_INET;
101: sin.sin_port = 0;
102: sin.sin_addr.s_addr = 0;
103: if (bind(f, (caddr_t)&sin, sizeof (sin), 0) < 0) {
104: perror("bind");
105: exit(1);
106: }
107: sin.sin_family = hp->h_addrtype;
108: sin.sin_addr = *(struct in_addr *) hp->h_addr;
109: sin.sin_port = srvp->s_port;
110: if (connect(f, (caddr_t)&sin, sizeof(sin), 0) < 0) {
111: perror(hp->h_name);
112: exit(1);
113: }
114: #if DEBUG
115: if (CourierClientDebuggingFlag)
116: fprintf(stderr, "[CourierActivate: connected to %s]\n", hp->h_name);
117: #endif
118: n = PackString(&program_name, buf, 1);
119: write(f, buf, n*sizeof(Unspecified));
120: if (read(f, &c, 1) != 1) {
121: perror(host);
122: exit(1);
123: }
124: if (c != 0) {
125: do write(fileno(stderr), &c, 1);
126: while (read(f, &c, 1) == 1 && c != 0);
127: exit(1);
128: }
129: #if DEBUG
130: if (CourierClientDebuggingFlag)
131: fprintf(stderr, "[CourierActivate: running %s]\n", program_name);
132: #endif
133: return (f);
134: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.