static int loadMibFromRcSource(char *mibSource) { int sourceFile; LoadMibState state; char buf[256]; int length; int result = 0; if (*mibSource == '\0') /* Use default file name. */ { mibSource = "mib.amsrc"; } sourceFile = iopen(mibSource, O_RDONLY, 0777); if (sourceFile < 0) { putSysErrmsg("Can't open MIB source file", mibSource); return -1; } memset((char *) &state, 0, sizeof state); state.abandoned = 0; state.currentOperation = LoadDormant; state.lineNbr = 0; while (1) { if (igets(sourceFile, buf, sizeof(buf), &length) == NULL) { if (length == 0) /* End of file. */ { break; /* Out of loop. */ } putErrmsg("Failed reading MIB.", mibSource); break; /* Out of loop. */ } state.lineNbr++; if (rcParse(&state, buf, length) < 0) { isprintf(buf, sizeof buf, "amsrc error at line %d.", state.lineNbr); writeMemo(buf); result = -1; break; /* Out of loop. */ } if (state.abandoned) { writeMemo("[?] Abandoning MIB load."); result = -1; break; /* Out of loop. */ } } close(sourceFile); return result; }
static int checkNodeListParms(IonParms *parms, char *wdName, unsigned long nodeNbr) { char *nodeListDir; char nodeListFileName[265]; int nodeListFile; int lineNbr = 0; int lineLen; char lineBuf[256]; unsigned long lineNodeNbr; int lineWmKey; char lineSdrName[MAX_SDR_NAME + 1]; char lineWdName[256]; int result; nodeListDir = getenv("ION_NODE_LIST_DIR"); if (nodeListDir == NULL) /* Single node on machine. */ { if (parms->wmKey == 0) { parms->wmKey = ION_DEFAULT_SM_KEY; } if (parms->wmKey != ION_DEFAULT_SM_KEY) { putErrmsg("Config parms wmKey != default.", itoa(ION_DEFAULT_SM_KEY)); return -1; } if (parms->sdrName[0] == '\0') { istrcpy(parms->sdrName, ION_DEFAULT_SDR_NAME, sizeof parms->sdrName); } if (strcmp(parms->sdrName, ION_DEFAULT_SDR_NAME) != 0) { putErrmsg("Config parms sdrName != default.", ION_DEFAULT_SDR_NAME); return -1; } return 0; } /* Configured for multi-node operation. */ isprintf(nodeListFileName, sizeof nodeListFileName, "%.255s%cion_nodes", nodeListDir, ION_PATH_DELIMITER); if (nodeNbr == 0) /* Just attaching. */ { nodeListFile = open(nodeListFileName, O_RDONLY, 0); } else /* Initializing the node. */ { nodeListFile = open(nodeListFileName, O_RDWR | O_CREAT, 00666); } if (nodeListFile < 0) { putSysErrmsg("Can't open ion_nodes file", nodeListFileName); writeMemo("[?] Remove ION_NODE_LIST_DIR from env?"); return -1; } while (1) { if (igets(nodeListFile, lineBuf, sizeof lineBuf, &lineLen) == NULL) { if (lineLen < 0) { close(nodeListFile); putErrmsg("Failed reading ion_nodes file.", nodeListFileName); return -1; } break; /* End of file. */ } lineNbr++; if (sscanf(lineBuf, "%lu %d %31s %255s", &lineNodeNbr, &lineWmKey, lineSdrName, lineWdName) < 4) { close(nodeListFile); putErrmsg("Syntax error at line#", itoa(lineNbr)); writeMemoNote("[?] Repair ion_nodes file.", nodeListFileName); return -1; } if (lineNodeNbr == nodeNbr) /* Match. */ { /* lineNodeNbr can't be zero (we never * write such lines to the file), so this * must be matching non-zero node numbers. * So we are re-initializing this node. */ close(nodeListFile); if (strcmp(lineWdName, wdName) != 0) { putErrmsg("CWD conflict at line#", itoa(lineNbr)); writeMemoNote("[?] Repair ion_nodes file.", nodeListFileName); return -1; } if (parms->wmKey == 0) { parms->wmKey = lineWmKey; } if (parms->wmKey != lineWmKey) { putErrmsg("WmKey conflict at line#", itoa(lineNbr)); writeMemoNote("[?] Repair ion_nodes file.", nodeListFileName); return -1; } if (parms->sdrName[0] == '\0') { istrcpy(parms->sdrName, lineSdrName, sizeof parms->sdrName); } if (strcmp(parms->sdrName, lineSdrName) != 0) { putErrmsg("SdrName conflict at line#", itoa(lineNbr)); writeMemoNote("[?] Repair ion_nodes file.", nodeListFileName); return -1; } return 0; } /* lineNodeNbr does not match nodeNbr (which may * be zero). */ if (strcmp(lineWdName, wdName) == 0) /* Match. */ { close(nodeListFile); if (nodeNbr == 0) /* Attaching. */ { parms->wmKey = lineWmKey; istrcpy(parms->sdrName, lineSdrName, MAX_SDR_NAME + 1); return 0; } /* Reinitialization conflict. */ putErrmsg("NodeNbr conflict at line#", itoa(lineNbr)); writeMemoNote("[?] Repair ion_nodes file.", nodeListFileName); return -1; } /* Haven't found matching line yet. Continue. */ } /* No matching lines in file. */ if (nodeNbr == 0) /* Attaching to existing node. */ { close(nodeListFile); putErrmsg("No node has been initialized in this directory.", wdName); return -1; } /* Initializing, so append line to the nodes list file. */ if (parms->wmKey == 0) { parms->wmKey = ION_DEFAULT_SM_KEY; } if (parms->sdrName[0] == '\0') { istrcpy(parms->sdrName, ION_DEFAULT_SDR_NAME, sizeof parms->sdrName); } isprintf(lineBuf, sizeof lineBuf, "%lu %d %.31s %.255s\n", nodeNbr, parms->wmKey, parms->sdrName, wdName); result = iputs(nodeListFile, lineBuf); close(nodeListFile); if (result < 0) { putErrmsg("Failed writing to ion_nodes file.", NULL); return -1; } return 0; }
int readIonParms(char *configFileName, IonParms *parms) { char ownHostName[MAXHOSTNAMELEN + 1]; char *endOfHostName; char configFileNameBuffer[PATHLENMAX + 1 + 9 + 1]; int configFile; char buffer[512]; int lineNbr; char line[256]; int lineLength; int result; char *cursor; int i; char *tokens[2]; int tokenCount; /* Set defaults. */ CHKERR(parms); memset((char *) parms, 0, sizeof(IonParms)); parms->wmSize = 5000000; parms->wmAddress = 0; /* Dyamically allocated. */ parms->configFlags = SDR_IN_DRAM; parms->heapWords = 250000; parms->heapKey = SM_NO_KEY; istrcpy(parms->pathName, "/usr/ion", sizeof parms->pathName); /* Determine name of config file. */ if (configFileName == NULL) { #ifdef ION_NO_DNS ownHostName[0] = '\0'; #else if (getNameOfHost(ownHostName, MAXHOSTNAMELEN) < 0) { writeMemo("[?] Can't get name of local host."); return -1; } #endif /* Find end of high-order part of host name. */ if ((endOfHostName = strchr(ownHostName, '.')) != NULL) { *endOfHostName = 0; } isprintf(configFileNameBuffer, sizeof configFileNameBuffer, "%.256s.ionconfig", ownHostName); configFileName = configFileNameBuffer; } /* Get overrides from config file. */ configFile = open(configFileName, O_RDONLY, 0777); if (configFile < 0) { if (errno == ENOENT) /* No overrides apply. */ { writeMemo("[i] admin pgm using default SDR parms."); printIonParms(parms); return 0; } isprintf(buffer, sizeof buffer, "[?] admin pgm can't open SDR \ config file '%.255s': %.64s", configFileName, system_error_msg()); writeMemo(buffer); return -1; } isprintf(buffer, sizeof buffer, "[i] admin pgm using SDR parm \ overrides from %.255s.", configFileName); writeMemo(buffer); lineNbr = 0; while (1) { if (igets(configFile, line, sizeof line, &lineLength) == NULL) { if (lineLength == 0) { result = 0; printIonParms(parms); } else { result = -1; writeErrMemo("admin pgm SDR config file igets \ failed"); } break; /* Done. */ } lineNbr++; if (lineLength < 1) { continue; /* Empty line. */ } if (line[0] == '#') /* Comment only. */ { continue; } tokenCount = 0; for (cursor = line, i = 0; i < 2; i++) { if (*cursor == '\0') { tokens[i] = NULL; } else { findToken((char **) &cursor, &(tokens[i])); tokenCount++; } } if (tokenCount != 2) { isprintf(buffer, sizeof buffer, "[?] incomplete SDR \ configuration file line (%d).", lineNbr); writeMemo(buffer); result = -1; break; } if (strcmp(tokens[0], "wmKey") == 0) { parms->wmKey = atoi(tokens[1]); continue; } if (strcmp(tokens[0], "wmSize") == 0) { parms->wmSize = atoi(tokens[1]); continue; } if (strcmp(tokens[0], "wmAddress") == 0) { parms->wmAddress = (char *) atol(tokens[1]); continue; } if (strcmp(tokens[0], "sdrName") == 0) { istrcpy(parms->sdrName, tokens[1], sizeof(parms->sdrName)); continue; } if (strcmp(tokens[0], "configFlags") == 0) { parms->configFlags = atoi(tokens[1]); continue; } if (strcmp(tokens[0], "heapWords") == 0) { parms->heapWords = atoi(tokens[1]); continue; } if (strcmp(tokens[0], "heapKey") == 0) { parms->heapKey = atoi(tokens[1]); continue; } if (strcmp(tokens[0], "pathName") == 0) { istrcpy(parms->pathName, tokens[1], sizeof(parms->pathName)); continue; } isprintf(buffer, sizeof buffer, "[?] unknown SDR config \ keyword '%.32s' at line %d.", tokens[0], lineNbr); writeMemo(buffer); result = -1; break; }
char * igets(char *str, int size, FILE *stream) { char *rval, *fname, *ptr; FILE *fp; rval = fgets(str, size, inc_fps[inc_nfps - 1]); if (! rval) { /* We got an EOF or error */ if (inc_nfps == 1) { /* * We're on the primary file * so we just return */ return(rval); } /* We step back to the previous file */ inc_nfps--; if (inc_prog[inc_nfps]) { rval += pclose(inc_fps[inc_nfps]); } else { rval += fclose(inc_fps[inc_nfps]); } inc_fps[inc_nfps] = NULL; inc_prog[inc_nfps] = 0; /* * And now we recurse into igets to read * "the next line" */ return(igets(str, size, stream)); } /* We got a line */ if (strncmp(str, "%include", 8)) { /* And it's not an include directive */ return(rval); } if (inc_nfps >= MAXLEVELS) { logit(LOG_ERR, "too many %%include levels"); return(rval); } /* Fetch out the filename */ if (! (fname = strchr(str, '"'))) { logit(LOG_ERR, "no open quote in %%include"); return(rval); } fname++; if (! (ptr = strchr(fname, '"'))) { logit(LOG_ERR, "no close quote in %%include"); return(rval); } *ptr = '\0'; /* Do the open */ if (*fname == '|') { fname++; if (! ((fp = popen(fname, "r")))) { logit(LOG_ERR, "error popening %%include: %s", fname); *ptr = '"'; return(rval); } inc_fps[inc_nfps] = fp; inc_prog[inc_nfps] = 1; inc_nfps++; } else { if (! ((fp = fopen(fname, "r")))) { logit(LOG_ERR, "error fopening %%include: %s", fname); *ptr = '"'; return(rval); } inc_fps[inc_nfps] = fp; inc_nfps++; if (inc_nfiles < MAXFILES) { inc_files[inc_nfiles] = zallocStr(&SysMemPool, fname); inc_nfiles++; } } /* * And now we recurse into igets to read * "the next line" */ return(igets(str, size, stream)); }
static int run_imcadmin(char *cmdFileName) { int cmdFile; char line[256]; int len; if (bpAttach() < 0) { putErrmsg("imcadmin can't attach to BP.", NULL); return -1; } if (imcInit() < 0) { putErrmsg("imcadmin can't initialize IMC database.", NULL); return -1; } if (cmdFileName == NULL) /* Interactive. */ { #ifdef FSWLOGGER return 0; #else cmdFile = fileno(stdin); isignal(SIGINT, handleQuit); while (1) { printf(": "); fflush(stdout); if (igets(cmdFile, line, sizeof line, &len) == NULL) { if (len == 0) { break; } putErrmsg("igets failed.", NULL); break; /* Out of loop. */ } if (len == 0) { continue; } if (processLine(line, len)) { break; /* Out of loop. */ } } #endif } else /* Scripted. */ { cmdFile = iopen(cmdFileName, O_RDONLY, 0777); if (cmdFile < 0) { PERROR("Can't open command file"); } else { while (1) { if (igets(cmdFile, line, sizeof line, &len) == NULL) { if (len == 0) { break; /* Loop. */ } putErrmsg("igets failed.", NULL); break; /* Loop. */ } if (len == 0 || line[0] == '#') /* Comment.*/ { continue; } if (processLine(line, len)) { break; /* Out of loop. */ } } close(cmdFile); } } writeErrmsgMemos(); printText("Stopping imcadmin."); ionDetach(); return 0; }