* Copyright (c) 1988 Regents of the University of California.
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
static char sccsid
[] = "@(#)api_bsd.c 4.1 (Berkeley) 12/4/88";
if (api_exch_outcommand(EXCH_CMD_DISASSOCIATE
) == -1) {
} else if (api_exch_flush() == -1) {
char *string
; /* if non-zero, where to connect to */
struct sockaddr_in server
;
struct storage_descriptor sd
;
extern unsigned short htons();
#endif /* !defined(htons) */
string
= getenv("API3270"); /* Get API */
"API3270 environmental variable not set - no API.\n");
if (sscanf(string
, "%[^:]:%d:%s", thehostname
,
(int *)&port
, keyname
) != 3) {
fprintf(stderr
, "API3270 environmental variable has bad format.\n");
/* Now, try to connect */
sock
= socket(AF_INET
, SOCK_STREAM
, 0);
perror("opening API socket");
server
.sin_family
= AF_INET
;
hp
= gethostbyname(thehostname
);
fprintf(stderr
, "%s specifies bad host name.\n", string
);
bcopy(hp
->h_addr
, (char *)&server
.sin_addr
, hp
->h_length
);
server
.sin_port
= htons(port
);
if (connect(sock
, (struct sockaddr
*)&server
, sizeof server
) < 0) {
perror("connecting to API server");
/* Now, try application level connection */
if (api_exch_init(sock
, "client") == -1) {
if (api_exch_outcommand(EXCH_CMD_ASSOCIATE
) == -1) {
keyfile
= fopen(keyname
, "r");
if (fscanf(keyfile
, "%s\n", inkey
) != 1) {
sd
.length
= strlen(inkey
)+1;
if (api_exch_outtype(EXCH_TYPE_STORE_DESC
, sizeof sd
, (char *)&sd
) == -1) {
if (api_exch_outtype(EXCH_TYPE_BYTES
, sd
.length
, inkey
) == -1) {
while ((i
= api_exch_nextcommand()) != EXCH_CMD_ASSOCIATED
) {
char *passwd
, *getpass();
if (api_exch_intype(EXCH_TYPE_STORE_DESC
,
sizeof sd
, (char *)&sd
) == -1) {
if (api_exch_intype(EXCH_TYPE_BYTES
, sd
.length
, buffer
) == -1) {
fprintf(stderr
, "%s\n", buffer
);
if (api_exch_outcommand(EXCH_CMD_ASSOCIATE
) == -1) {
if (api_exch_intype(EXCH_TYPE_STORE_DESC
, sizeof sd
, (char *)&sd
) == -1) {
if (api_exch_intype(EXCH_TYPE_BYTES
, sd
.length
, buffer
) == -1) {
passwd
= getpass(buffer
); /* Go to terminal */
passwd_length
= strlen(passwd
);
if (api_exch_intype(EXCH_TYPE_STORE_DESC
, sizeof sd
, (char *)&sd
) == -1) {
if (api_exch_intype(EXCH_TYPE_BYTES
, sd
.length
, buffer
) == -1) {
sd
.length
= passwd_length
;
if (api_exch_outcommand(EXCH_CMD_AUTH
) == -1) {
if (api_exch_outtype(EXCH_TYPE_STORE_DESC
, sizeof sd
, (char *)&sd
) == -1) {
if (api_exch_outtype(EXCH_TYPE_BYTES
, passwd_length
, passwd
) == -1) {
"Waiting for connection indicator, received 0x%x.\n", i
);
return 0; /* Happiness! */
api_exch_api(regs
, sregs
, parms
, length
)
struct storage_descriptor sd
;
if (api_exch_outcommand(EXCH_CMD_REQUEST
) == -1) {
if (api_exch_outtype(EXCH_TYPE_REGS
, sizeof *regs
, (char *)regs
) == -1) {
if (api_exch_outtype(EXCH_TYPE_SREGS
, sizeof *sregs
, (char *)sregs
) == -1) {
sd
.location
= (long) parms
;
if (api_exch_outtype(EXCH_TYPE_STORE_DESC
, sizeof sd
, (char *)&sd
) == -1) {
if (api_exch_outtype(EXCH_TYPE_BYTES
, length
, parms
) == -1) {
while ((i
= api_exch_nextcommand()) != EXCH_CMD_REPLY
) {
if (api_exch_intype(EXCH_TYPE_STORE_DESC
, sizeof sd
, (char *)&sd
)
/*XXX validity check GIMME? */
if (api_exch_outcommand(EXCH_CMD_HEREIS
) == -1) {
if (api_exch_outtype(EXCH_TYPE_STORE_DESC
, sizeof sd
, (char *)&sd
)
if (api_exch_outtype(EXCH_TYPE_BYTES
, sd
.length
,
(char *)sd
.location
) == -1) {
if (api_exch_intype(EXCH_TYPE_STORE_DESC
, sizeof sd
, (char *)&sd
)
/* XXX Validty check HEREIS? */
if (api_exch_intype(EXCH_TYPE_BYTES
, sd
.length
,
(char *)sd
.location
) == -1) {
fprintf(stderr
, "Waiting for reply command, we got command %d.\n",
if (api_exch_intype(EXCH_TYPE_REGS
, sizeof *regs
, (char *)regs
) == -1) {
if (api_exch_intype(EXCH_TYPE_SREGS
, sizeof *sregs
, (char *)sregs
) == -1) {
return 0; /* Happiness! */