static int RPCLogin(struct pluginDevice * bt) { char IDinfo[128]; static char IDbuf[128]; char * idptr = IDinfo; char * delim; int j; EXPECT(bt->rdfd, RPC, 10); /* Look for the unit type info */ if (EXPECT_TOK(bt->rdfd, BayTechAssoc, 2, IDinfo , sizeof(IDinfo), Debug) < 0) { LOG(PIL_CRIT, "No initial response from %s.", bt->idinfo); return(errno == ETIMEDOUT ? S_TIMEOUT : S_OOPS); } idptr += strspn(idptr, WHITESPACE); /* * We should be looking at something like this: * RPC-5 Telnet Host * Revision F 4.22, (C) 1999 * Bay Technical Associates */ /* Truncate the result after the RPC-5 part */ if ((delim = strchr(idptr, ' ')) != NULL) { *delim = EOS; } snprintf(IDbuf, sizeof(IDbuf), "BayTech RPC%s", idptr); REPLSTR(bt->idinfo, IDbuf); if (bt->idinfo == NULL) { return(S_OOPS); } bt->modelinfo = &ModelInfo[0]; for (j=0; ModelInfo[j].type != NULL; ++j) { /* * TIMXXX - * Look at device ID as this really describes the model. */ if (strcasecmp(ModelInfo[j].type, IDbuf) == 0) { bt->modelinfo = &ModelInfo[j]; break; } } /* Look for the unit id info */ EXPECT(bt->rdfd, UnitId, 10); SNARF(bt->rdfd, IDbuf, 2); delim = IDbuf + strcspn(IDbuf, WHITESPACE); *delim = EOS; REPLSTR(bt->unitid, IDbuf); if (bt->unitid == NULL) { return(S_OOPS); } /* Expect "username>" */ EXPECT(bt->rdfd, login, 2); SEND(bt->wrfd, bt->user); SEND(bt->wrfd, "\r"); /* Expect "password>" */ switch (StonithLookFor(bt->rdfd, password, 5)) { case 0: /* Good! */ break; case 1: /* OOPS! got another username prompt */ LOG(PIL_CRIT, "Invalid username for %s.", bt->idinfo); return(S_ACCESS); default: return(errno == ETIMEDOUT ? S_TIMEOUT : S_OOPS); } SEND(bt->wrfd, bt->passwd); SEND(bt->wrfd, "\r"); /* Expect "RPC-x Menu" */ switch (StonithLookFor(bt->rdfd, LoginOK, 5)) { case 0: /* Good! */ break; case 1: /* Uh-oh - bad password */ LOG(PIL_CRIT, "Invalid password for %s.", bt->idinfo); return(S_ACCESS); default: return(errno == ETIMEDOUT ? S_TIMEOUT : S_OOPS); } EXPECT(bt->rdfd, Menu, 2); return(S_OK); }
static int RPCNametoOutletList(struct pluginDevice* bt, const char * name , int outletlist[]) { char NameMapping[128]; int sockno; char sockname[32]; int maxfound = 0; /* Verify that we're in the top-level menu */ SEND(bt->wrfd, "\r"); /* Expect "RPC-x Menu" */ EXPECT(bt->rdfd, RPC, 5); EXPECT(bt->rdfd, Menu, 5); /* OK. Request sub-menu 1 (Outlet Control) */ SEND(bt->wrfd, "1\r"); /* Verify that we're in the sub-menu */ /* Expect: "RPC-x>" */ EXPECT(bt->rdfd, RPC, 5); EXPECT(bt->rdfd, GTSign, 5); /* The status command output contains mapping of hosts to outlets */ SEND(bt->wrfd, "STATUS\r"); /* Expect: "emperature:" so we can skip over it... */ EXPECT(bt->rdfd, bt->modelinfo->expect, 5); EXPECT(bt->rdfd, CRNL, 5); /* Looks Good! Parse the status output */ do { char * last; NameMapping[0] = EOS; SNARF(bt->rdfd, NameMapping, 5); if (!parse_socket_line(bt, NameMapping, &sockno, sockname)) { continue; } last = sockname+bt->modelinfo->socklen; *last = EOS; --last; /* Strip off trailing blanks */ for(; last > sockname; --last) { if (*last == ' ') { *last = EOS; }else{ break; } } if (strcasecmp(name, sockname) == 0) { outletlist[maxfound] = sockno; ++maxfound; } } while (strlen(NameMapping) > 2 && maxfound < MAXOUTLET); /* Pop back out to the top level menu */ SEND(bt->wrfd, "MENU\r"); return(maxfound); }
static int MSNametoOutlet(struct pluginDevice* ms, const char * name) { char NameMapping[128]; int sockno; char sockname[32]; int times = 0; int ret = -1; /* Verify that we're in the top-level menu */ EXPECT(ms->rdfd, Prompt, 5); SEND(ms->wrfd, "\033"); EXPECT(ms->rdfd, Prompt, 5); SEND(ms->wrfd, "\033"); EXPECT(ms->rdfd, Prompt, 5); SEND(ms->wrfd, "\033"); EXPECT(ms->rdfd, Prompt, 5); SEND(ms->wrfd, "\033"); /* Expect ">" */ EXPECT(ms->rdfd, Prompt, 5); /* Request menu 1 (Device Control) */ SEND(ms->wrfd, "1\r"); /* Expect: "-----" so we can skip over it... */ EXPECT(ms->rdfd, Separator, 5); EXPECT(ms->rdfd, CRNL, 5); EXPECT(ms->rdfd, CRNL, 5); /* Looks Good! Parse the status output */ do { times++; NameMapping[0] = EOS; SNARF(ms->rdfd, NameMapping, 5); if (sscanf(NameMapping , "%d- %23c",&sockno, sockname) == 2) { char * last = sockname+23; *last = EOS; --last; /* Strip off trailing blanks */ for(; last > sockname; --last) { if (*last == ' ') { *last = EOS; }else{ break; } } if (strcasecmp(name, sockname) == 0) { ret = sockno; } } } while (strlen(NameMapping) > 2 && times < 8); /* Pop back out to the top level menu */ EXPECT(ms->rdfd, Prompt, 5); SEND(ms->wrfd, "\033"); EXPECT(ms->rdfd, Prompt, 5); SEND(ms->wrfd, "\033"); EXPECT(ms->rdfd, Prompt, 5); SEND(ms->wrfd, "\033"); EXPECT(ms->rdfd, Prompt, 5); SEND(ms->wrfd, "\033"); return(ret); }