int LoadMountInfo(Rlist **list) /* This is, in fact, the most portable way to read the mount info! */ /* Depressing, isn't it? */ { FILE *pp; char buf1[CF_BUFSIZE], buf2[CF_BUFSIZE], buf3[CF_BUFSIZE]; char host[CF_MAXVARSIZE], source[CF_BUFSIZE], mounton[CF_BUFSIZE], vbuff[CF_BUFSIZE]; int i, nfs = false; for (i = 0; VMOUNTCOMM[VSYSTEMHARDCLASS][i] != ' '; i++) { buf1[i] = VMOUNTCOMM[VSYSTEMHARDCLASS][i]; } buf1[i] = '\0'; SetTimeOut(RPCTIMEOUT); if ((pp = cf_popen(buf1, "r")) == NULL) { CfOut(cf_error, "cf_popen", "Can't open %s\n", buf1); return false; } do { vbuff[0] = buf1[0] = buf2[0] = buf3[0] = source[0] = '\0'; if (ferror(pp)) /* abortable */ { CfOut(cf_error, "ferror", "Error getting mount info\n"); break; } CfReadLine(vbuff, CF_BUFSIZE, pp); if (ferror(pp)) /* abortable */ { CfOut(cf_error, "ferror", "Error getting mount info\n"); break; } if (strstr(vbuff, "nfs")) { nfs = true; } sscanf(vbuff, "%s%s%s", buf1, buf2, buf3); if ((vbuff[0] == '\0') || (vbuff[0] == '\n')) { break; } if (strstr(vbuff, "not responding")) { CfOut(cf_error, "", "%s\n", vbuff); } if (strstr(vbuff, "be root")) { CfOut(cf_error, "", "Mount access is denied. You must be root.\n"); CfOut(cf_error, "", "Use the -n option to run safely."); } if ((strstr(vbuff, "retrying")) || (strstr(vbuff, "denied")) || (strstr(vbuff, "backgrounding"))) { continue; } if ((strstr(vbuff, "exceeded")) || (strstr(vbuff, "busy"))) { continue; } if (strstr(vbuff, "RPC")) { CfOut(cf_inform, "", "There was an RPC timeout. Aborting mount operations.\n"); CfOut(cf_inform, "", "Session failed while trying to talk to remote host\n"); CfOut(cf_inform, "", "%s\n", vbuff); cf_pclose(pp); return false; } switch (VSYSTEMHARDCLASS) { case darwin: case linuxx: case unix_sv: case freebsd: case netbsd: case openbsd: case qnx: case crayos: case dragonfly: if (IsAbsoluteFileName(buf1)) { strcpy(host, "localhost"); strcpy(mounton, buf3); } else { sscanf(buf1, "%[^:]:%s", host, source); strcpy(mounton, buf3); } break; case solaris: case hp: if (IsAbsoluteFileName(buf3)) { strcpy(host, "localhost"); strcpy(mounton, buf1); } else { sscanf(buf1, "%[^:]:%s", host, source); strcpy(mounton, buf1); } break; case aix: /* skip header */ if (IsAbsoluteFileName(buf1)) { strcpy(host, "localhost"); strcpy(mounton, buf2); } else { strcpy(host, buf1); strcpy(source, buf1); strcpy(mounton, buf3); } break; case cfnt: strcpy(mounton, buf2); strcpy(host, buf1); break; case cfsco: CfOut(cf_error, "", "Don't understand SCO mount format, no data"); default: printf("cfengine software error: case %d = %s\n", VSYSTEMHARDCLASS, CLASSTEXT[VSYSTEMHARDCLASS]); FatalError("System error in GetMountInfo - no such class!"); } CfDebug("GOT: host=%s, source=%s, mounton=%s\n", host, source, mounton); if (nfs) { AugmentMountInfo(list, host, source, mounton, "nfs"); } else { AugmentMountInfo(list, host, source, mounton, NULL); } } while (!feof(pp)); alarm(0); signal(SIGALRM, SIG_DFL); cf_pclose(pp); return true; }
int LoadMountInfo(Rlist **list) /* This is, in fact, the most portable way to read the mount info! */ /* Depressing, isn't it? */ { FILE *pp; char buf1[CF_BUFSIZE], buf2[CF_BUFSIZE], buf3[CF_BUFSIZE]; char host[CF_MAXVARSIZE], source[CF_BUFSIZE], mounton[CF_BUFSIZE], vbuff[CF_BUFSIZE]; int i, nfs = false; for (i = 0; VMOUNTCOMM[VSYSTEMHARDCLASS][i] != ' '; i++) { buf1[i] = VMOUNTCOMM[VSYSTEMHARDCLASS][i]; } buf1[i] = '\0'; SetTimeOut(RPCTIMEOUT); if ((pp = cf_popen(buf1, "r")) == NULL) { CfOut(cf_error, "cf_popen", "Can't open %s\n", buf1); return false; } do { vbuff[0] = buf1[0] = buf2[0] = buf3[0] = source[0] = '\0'; if (ferror(pp)) /* abortable */ { CfOut(cf_error, "ferror", "Error getting mount info\n"); break; } if (CfReadLine(vbuff, CF_BUFSIZE, pp) == -1) { FatalError("Error in CfReadLine"); } if (ferror(pp)) /* abortable */ { CfOut(cf_error, "ferror", "Error getting mount info\n"); break; } if (strstr(vbuff, "nfs")) { nfs = true; } sscanf(vbuff, "%s%s%s", buf1, buf2, buf3); if ((vbuff[0] == '\0') || (vbuff[0] == '\n')) { break; } if (strstr(vbuff, "not responding")) { CfOut(cf_error, "", "%s\n", vbuff); } if (strstr(vbuff, "be root")) { CfOut(cf_error, "", "Mount access is denied. You must be root.\n"); CfOut(cf_error, "", "Use the -n option to run safely."); } if ((strstr(vbuff, "retrying")) || (strstr(vbuff, "denied")) || (strstr(vbuff, "backgrounding"))) { continue; } if ((strstr(vbuff, "exceeded")) || (strstr(vbuff, "busy"))) { continue; } if (strstr(vbuff, "RPC")) { CfOut(cf_inform, "", "There was an RPC timeout. Aborting mount operations.\n"); CfOut(cf_inform, "", "Session failed while trying to talk to remote host\n"); CfOut(cf_inform, "", "%s\n", vbuff); cf_pclose(pp); return false; } #if defined(__sun) || defined(__hpux) if (IsAbsoluteFileName(buf3)) { strcpy(host, "localhost"); strcpy(mounton, buf1); } else { sscanf(buf1, "%[^:]:%s", host, source); strcpy(mounton, buf1); } #elif defined(_AIX) /* skip header */ if (IsAbsoluteFileName(buf1)) { strcpy(host, "localhost"); strcpy(mounton, buf2); } else { strcpy(host, buf1); strcpy(source, buf1); strcpy(mounton, buf3); } #elif defined(__CYGWIN__) strcpy(mounton, buf2); strcpy(host, buf1); #elif defined(sco) || defined(__SCO_DS) CfOut(cf_error, "", "Don't understand SCO mount format, no data"); #else if (IsAbsoluteFileName(buf1)) { strcpy(host, "localhost"); strcpy(mounton, buf3); } else { sscanf(buf1, "%[^:]:%s", host, source); strcpy(mounton, buf3); } #endif CfDebug("GOT: host=%s, source=%s, mounton=%s\n", host, source, mounton); if (nfs) { AugmentMountInfo(list, host, source, mounton, "nfs"); } else { AugmentMountInfo(list, host, source, mounton, NULL); } } while (!feof(pp)); alarm(0); signal(SIGALRM, SIG_DFL); cf_pclose(pp); return true; }
bool LoadMountInfo(Seq *list) /* This is, in fact, the most portable way to read the mount info! */ /* Depressing, isn't it? */ { FILE *pp; char buf1[CF_BUFSIZE], buf2[CF_BUFSIZE], buf3[CF_BUFSIZE]; int i, nfs = false; for (i = 0; VMOUNTCOMM[VSYSTEMHARDCLASS][i] != ' '; i++) { buf1[i] = VMOUNTCOMM[VSYSTEMHARDCLASS][i]; } buf1[i] = '\0'; SetTimeOut(RPCTIMEOUT); if ((pp = cf_popen(buf1, "r", true)) == NULL) { Log(LOG_LEVEL_ERR, "Can't open '%s'. (cf_popen: %s)", buf1, GetErrorStr()); return false; } size_t vbuff_size = CF_BUFSIZE; char *vbuff = xmalloc(vbuff_size); for (;;) { buf1[0] = buf2[0] = buf3[0] = '\0'; nfs = false; ssize_t res = CfReadLine(&vbuff, &vbuff_size, pp); if (res == -1) { if (!feof(pp)) { Log(LOG_LEVEL_ERR, "Unable to read list of mounted filesystems. (fread: %s)", GetErrorStr()); cf_pclose(pp); free(vbuff); return false; } else { break; } } if (strstr(vbuff, "nfs")) { nfs = true; } // security note: buff is CF_BUFSIZE, so that is the max that can be written to buf1, buf2 or buf3 sscanf(vbuff, "%s%s%s", buf1, buf2, buf3); if ((vbuff[0] == '\0') || (vbuff[0] == '\n')) { break; } if (strstr(vbuff, "not responding")) { Log(LOG_LEVEL_ERR, "%s", vbuff); } if (strstr(vbuff, "be root")) { Log(LOG_LEVEL_ERR, "Mount access is denied. You must be root. Use the -n option to run safely"); } if ((strstr(vbuff, "retrying")) || (strstr(vbuff, "denied")) || (strstr(vbuff, "backgrounding"))) { continue; } if ((strstr(vbuff, "exceeded")) || (strstr(vbuff, "busy"))) { continue; } if (strstr(vbuff, "RPC")) { Log(LOG_LEVEL_INFO, "There was an RPC timeout. Aborting mount operations."); Log(LOG_LEVEL_INFO, "Session failed while trying to talk to remote host"); Log(LOG_LEVEL_INFO, "%s", vbuff); cf_pclose(pp); free(vbuff); return false; } // host: max FQDN is 255 chars (max IPv6 with IPv4 tunneling is 45 chars) // source, mounton: hardcoding max path length to 1023; longer is very unlikely char host[256], source[1024], mounton[1024]; host[0] = source[0] = mounton[0] = '\0'; #if defined(__sun) || defined(__hpux) if (IsAbsoluteFileName(buf3)) { strlcpy(host, "localhost", sizeof(host)); strlcpy(mounton, buf1, sizeof(mounton)); } else { sscanf(buf1, "%255[^:]:%1023s", host, source); strlcpy(mounton, buf1, sizeof(mounton)); } #elif defined(_AIX) /* skip header */ if (IsAbsoluteFileName(buf1)) { strlcpy(host, "localhost", sizeof(host)); strlcpy(mounton, buf2, sizeof(mounton)); } else { strlcpy(host, buf1, sizeof(host)); strlcpy(source, buf1, sizeof(source)); strlcpy(mounton, buf3, sizeof(mounton)); } #elif defined(__CYGWIN__) strlcpy(mounton, buf2, sizeof(mounton)); strlcpy(host, buf1, sizeof(host)); #elif defined(sco) || defined(__SCO_DS) Log(LOG_LEVEL_ERR, "Don't understand SCO mount format, no data"); #else if (IsAbsoluteFileName(buf1)) { strlcpy(host, "localhost", sizeof(host)); strlcpy(mounton, buf3, sizeof(mounton)); } else { sscanf(buf1, "%255[^:]:%1023s", host, source); strlcpy(mounton, buf3, sizeof(mounton)); } #endif Log(LOG_LEVEL_DEBUG, "LoadMountInfo: host '%s', source '%s', mounton '%s'", host, source, mounton); if (nfs) { AugmentMountInfo(list, host, source, mounton, "nfs"); } else { AugmentMountInfo(list, host, source, mounton, NULL); } } free(vbuff); alarm(0); signal(SIGALRM, SIG_DFL); cf_pclose(pp); return true; }