char *string
; /* if non-zero, where to connect to */
struct sockaddr_in server
;
string
= getenv("API3270"); /* Get API */
"API3270 environmental variable not set - no API.\n");
if (sscanf(string
, "%[^:]:%d", thehostname
, &port
) != 2) {
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
, &server
.sin_addr
, hp
->h_length
);
server
.sin_port
= htons(port
);
if (connect(sock
, &server
, sizeof server
) < 0) {
perror("connecting to API server");
/* Now, try application level connection */
if (api_exch_init(sock
) == -1) {
if (api_exch_outcommand(EXCH_ASSOCIATE
) == -1) {
while ((i
= api_exch_inbyte()) != EXCH_ASSOCIATED
) {
struct storage_descriptor sd
;
char *passwd
, *getpass();
if (api_exch_intype(EXCH_TYPE_STORE_DESC
,
sizeof sd
, (char *)&sd
) == -1) {
sd
.length
= ntohs(sd
.length
);
if (api_exch_intype(EXCH_TYPE_BYTES
, sd
.length
, buffer
) == -1) {
fprintf(stderr
, "%s\n", buffer
);
if (api_exch_outcommand(EXCH_ASSOCIATE
) == -1) {
if (api_exch_intype(EXCH_TYPE_STORE_DESC
, sizeof sd
, (char *)&sd
) == -1) {
sd
.length
= ntohs(sd
.length
);
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) {
sd
.length
= ntohs(sd
.length
);
if (api_exch_intype(EXCH_TYPE_BYTES
, sd
.length
, buffer
) == -1) {
sd
.length
= htons(passwd_length
);
if (api_exch_outcommand(EXCH_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
)
struct storage_descriptor sd
;
if (api_exch_outcommand(EXCH_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) {
if (api_exch_outtype(EXCH_TYPE_STORE_DESC
, sizeof sd
, (char *)&sd
) == -1) {
while ((i
= api_exch_inbyte()) != EXCH_REPLY
) {
if (api_exch_intype(EXCH_TYPE_STORE_DESC
, sizeof sd
, (char *)&sd
)
/*XXX validity check GIMME? */
if (api_exch_outcommand(EXCH_HEREIS
) == -1) {
if (api_exch_outtype(EXCH_TYPE_STORE_DESC
, sizeof sd
, (char *)&sd
)
if (api_exch_outtype(EXCH_TYPE_BYTES
, ntohs(sd
.length
),
ntohl(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
, ntohs(sd
.length
),
ntohl(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! */