]>
diplodocus.org Git - nmh/blob - sbr/client.c
3 * client.c -- connect to a server
5 * This code is Copyright (c) 2002, by the authors of nmh. See the
6 * COPYRIGHT file in the root directory of the nmh distribution for
7 * complete copyright information.
13 #include <sys/socket.h>
14 #include <netinet/in.h>
16 #include <arpa/inet.h>
24 /* client's own static version of several nmh subroutines */
25 static char **client_brkstring (char *, char *, char *);
26 static int client_brkany (char, char *);
27 static char **client_copyip (char **, char **, int);
28 static char *client_getcpy (char *);
29 static void client_freelist(char **);
33 client (char *args
, char *service
, char *response
, int len_response
, int debug
)
36 char **ap
, *arguments
[MAXARGS
];
37 struct addrinfo hints
, *res
, *ai
;
40 if (args
!= NULL
&& *args
!= 0) {
41 ap
= client_copyip (client_brkstring (client_getcpy (args
), " ", "\n"),
44 if (servers
!= NULL
&& *servers
!= 0)
45 ap
= client_copyip (client_brkstring (client_getcpy (servers
), " ", "\n"),
48 if (ap
== arguments
) {
49 *ap
++ = client_getcpy ("localhost");
53 memset(&hints
, 0, sizeof(hints
));
55 hints
.ai_flags
= AI_ADDRCONFIG
;
57 hints
.ai_family
= PF_UNSPEC
;
58 hints
.ai_socktype
= SOCK_STREAM
;
60 for (ap
= arguments
; *ap
; ap
++) {
63 fprintf(stderr
, "Trying to connect to \"%s\" ...\n", *ap
);
66 rc
= getaddrinfo(*ap
, service
, &hints
, &res
);
70 fprintf(stderr
, "Lookup of \"%s\" failed: %s\n", *ap
,
76 for (ai
= res
; ai
!= NULL
; ai
= ai
->ai_next
) {
78 char address
[NI_MAXHOST
];
79 char port
[NI_MAXSERV
];
81 rc
= getnameinfo(ai
->ai_addr
, ai
->ai_addrlen
, address
,
82 sizeof(address
), port
, sizeof port
,
83 NI_NUMERICHOST
| NI_NUMERICSERV
);
85 fprintf(stderr
, "Connecting to %s:%s...\n",
86 rc
? "unknown" : address
,
90 sd
= socket(ai
->ai_family
, ai
->ai_socktype
, ai
->ai_protocol
);
94 fprintf(stderr
, "socket() failed: %s\n", strerror(errno
));
98 if (connect(sd
, ai
->ai_addr
, ai
->ai_addrlen
) == 0) {
100 client_freelist(arguments
);
105 fprintf(stderr
, "Connection failed: %s\n", strerror(errno
));
114 client_freelist(arguments
);
115 strncpy (response
, "no servers available", len_response
);
121 * Free a list of strings
125 client_freelist(char **list
)
132 * static copies of three nmh subroutines
135 static char *broken
[MAXARGS
+ 1];
138 client_brkstring (char *strg
, char *brksep
, char *brkterm
)
141 register char c
, *sp
;
145 for (bi
= 0; bi
< MAXARGS
; bi
++) {
146 while (client_brkany (c
= *sp
, brksep
))
148 if (!c
|| client_brkany (c
, brkterm
)) {
155 while ((c
= *++sp
) && !client_brkany (c
, brksep
) && !client_brkany (c
, brkterm
))
165 * returns 1 if chr in strg, 0 otherwise
168 client_brkany (char chr
, char *strg
)
173 for (sp
= strg
; *sp
; sp
++)
181 * copy a string array and return pointer to end
184 client_copyip (char **p
, char **q
, int len_q
)
186 while (*p
&& --len_q
> 0)
196 client_getcpy (char *str
)
201 len
= strlen(str
) + 1;
202 cp
= mh_xmalloc(len
);
204 memcpy (cp
, str
, len
);