Use new standard I/O for reading/writing sysctl values
thereby use one allocated buffer for I/O which now might be increased by the stdio function getline(3) on the file if required. Signed-off-by: Werner Fink <werner@suse.de>
This commit is contained in:
		
							
								
								
									
										55
									
								
								sysctl.c
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								sysctl.c
									
									
									
									
									
								
							| @@ -45,6 +45,7 @@ | ||||
| #include "fileutils.h" | ||||
| #include "nls.h" | ||||
| #include "xalloc.h" | ||||
| #include "proc/procio.h" | ||||
|  | ||||
| /* | ||||
|  *    Globals... | ||||
| @@ -64,6 +65,10 @@ static bool IgnoreError; | ||||
| static bool Quiet; | ||||
| static char *pattern; | ||||
|  | ||||
| #define LINELEN 4096 | ||||
| static char *iobuf; | ||||
| static size_t iolen = LINELEN; | ||||
|  | ||||
| /* Function prototypes. */ | ||||
| static int pattern_match(const char *string, const char *pat); | ||||
| static int DisplayAll(const char *restrict const path); | ||||
| @@ -156,14 +161,12 @@ static char *StripLeadingAndTrailingSpaces(char *oneline) | ||||
| /* | ||||
|  * Read a sysctl setting | ||||
|  */ | ||||
| #define IOBUFSIZ    (128<<10) | ||||
| static char *iobuf; | ||||
| static int ReadSetting(const char *restrict const name) | ||||
| { | ||||
| 	int rc = 0; | ||||
| 	char *restrict tmpname; | ||||
| 	char *restrict outname; | ||||
| 	char inbuf[1025]; | ||||
| 	ssize_t rlen; | ||||
| 	FILE *restrict fp; | ||||
| 	struct stat ts; | ||||
|  | ||||
| @@ -218,7 +221,7 @@ static int ReadSetting(const char *restrict const name) | ||||
| 		goto out; | ||||
| 	} | ||||
|  | ||||
| 	fp = fopen(tmpname, "r"); | ||||
| 	fp = fprocopen(tmpname, "r"); | ||||
|  | ||||
| 	if (!fp) { | ||||
| 		switch (errno) { | ||||
| @@ -241,11 +244,8 @@ static int ReadSetting(const char *restrict const name) | ||||
| 			break; | ||||
| 		} | ||||
| 	} else { | ||||
| 	    if (iobuf) | ||||
|             setvbuf(fp, iobuf, _IOFBF, IOBUFSIZ); | ||||
|  | ||||
| 		errno = 0; | ||||
| 		if (fgets(inbuf, sizeof inbuf - 1, fp)) { | ||||
| 		if ((rlen = getline(&iobuf, &iolen, fp)) > 0) { | ||||
| 			/* this loop is required, see | ||||
| 			 * /sbin/sysctl -a | egrep -6 dev.cdrom.info | ||||
| 			 */ | ||||
| @@ -254,23 +254,23 @@ static int ReadSetting(const char *restrict const name) | ||||
| 				if (PrintName) { | ||||
| 					fprintf(stdout, "%s = ", outname); | ||||
| 					do { | ||||
| 						fprintf(stdout, "%s", inbuf); | ||||
| 						nlptr = &inbuf[strlen(inbuf) - 1]; | ||||
| 						fprintf(stdout, "%s", iobuf); | ||||
| 						nlptr = &iobuf[strlen(iobuf) - 1]; | ||||
| 						/* already has the \n in it */ | ||||
| 						if (*nlptr == '\n') | ||||
| 							break; | ||||
| 					} while (fgets(inbuf, sizeof inbuf - 1, fp)); | ||||
| 					} while ((rlen = getline(&iobuf, &iolen, fp)) > 0); | ||||
| 					if (*nlptr != '\n') | ||||
| 						putchar('\n'); | ||||
| 				} else { | ||||
| 					if (!PrintNewline) { | ||||
| 						nlptr = strchr(inbuf, '\n'); | ||||
| 						nlptr = strchr(iobuf, '\n'); | ||||
| 						if (nlptr) | ||||
| 							*nlptr = '\0'; | ||||
| 					} | ||||
| 					fprintf(stdout, "%s", inbuf); | ||||
| 					fprintf(stdout, "%s", iobuf); | ||||
| 				} | ||||
| 			} while (fgets(inbuf, sizeof inbuf - 1, fp)); | ||||
| 			} while ((rlen = getline(&iobuf, &iolen, fp)) > 0); | ||||
| 		} else { | ||||
| 			switch (errno) { | ||||
| 			case EACCES: | ||||
| @@ -437,10 +437,7 @@ static int WriteSetting(const char *setting) | ||||
| 		goto out; | ||||
| 	} | ||||
|  | ||||
| 	fp = fopen(tmpname, "w"); | ||||
|  | ||||
| 	if (iobuf) | ||||
| 		setvbuf(fp, iobuf, _IOFBF, IOBUFSIZ); | ||||
| 	fp = fprocopen(tmpname, "w"); | ||||
|  | ||||
| 	if (!fp) { | ||||
| 		switch (errno) { | ||||
| @@ -501,20 +498,16 @@ static int pattern_match(const char *string, const char *pat) | ||||
| 	return (1); | ||||
| } | ||||
|  | ||||
| #define LINELEN 4096 | ||||
|  | ||||
| /* | ||||
|  * Preload the sysctl's from the conf file.  We parse the file and then | ||||
|  * reform it (strip out whitespace). | ||||
|  */ | ||||
| static int Preload(const char *restrict const filename) | ||||
| { | ||||
| 	char *oneline; | ||||
| 	FILE *fp; | ||||
| 	char *t; | ||||
| 	int n = 0; | ||||
| 	int rc = 0; | ||||
| 	size_t blen = LINELEN; | ||||
| 	ssize_t rlen; | ||||
| 	char *name, *value; | ||||
| 	glob_t globbuf; | ||||
| @@ -522,8 +515,6 @@ static int Preload(const char *restrict const filename) | ||||
| 	int globflg; | ||||
| 	int j; | ||||
|  | ||||
| 	oneline = xmalloc(blen); | ||||
|  | ||||
| 	globflg = GLOB_NOCHECK; | ||||
| #ifdef GLOB_BRACE | ||||
| 	globflg |= GLOB_BRACE; | ||||
| @@ -549,7 +540,7 @@ static int Preload(const char *restrict const filename) | ||||
| 			goto out; | ||||
| 		} | ||||
|  | ||||
| 		while ((rlen =  getline(&oneline, &blen, fp)) != -1) { | ||||
| 		while ((rlen =  getline(&iobuf, &iolen, fp)) > 0) { | ||||
| 			size_t offset; | ||||
|  | ||||
| 			n++; | ||||
| @@ -557,7 +548,7 @@ static int Preload(const char *restrict const filename) | ||||
| 			if (rlen < 2) | ||||
| 				continue; | ||||
|  | ||||
| 			t = StripLeadingAndTrailingSpaces(oneline); | ||||
| 			t = StripLeadingAndTrailingSpaces(iobuf); | ||||
| 			if (strlen(t) < 2) | ||||
| 				continue; | ||||
|  | ||||
| @@ -577,8 +568,8 @@ static int Preload(const char *restrict const filename) | ||||
| 				continue; | ||||
|  | ||||
| 			offset = strlen(name); | ||||
| 			memmove(&oneline[0], name, offset); | ||||
| 			oneline[offset++] = '='; | ||||
| 			memmove(&iobuf[0], name, offset); | ||||
| 			iobuf[offset++] = '='; | ||||
|  | ||||
| 			value = strtok(NULL, "\n\r"); | ||||
| 			if (!value || !*value) { | ||||
| @@ -591,11 +582,11 @@ static int Preload(const char *restrict const filename) | ||||
| 				value++; | ||||
|  | ||||
| 			/* should NameOnly affect this? */ | ||||
| 			memmove(&oneline[offset], value, strlen(value)); | ||||
| 			memmove(&iobuf[offset], value, strlen(value)); | ||||
| 			offset += strlen(value); | ||||
| 			oneline[offset] = '\0'; | ||||
| 			iobuf[offset] = '\0'; | ||||
|  | ||||
| 			rc |= WriteSetting(oneline); | ||||
| 			rc |= WriteSetting(iobuf); | ||||
| 		} | ||||
|  | ||||
| 		fclose(fp); | ||||
| @@ -822,7 +813,7 @@ int main(int argc, char *argv[]) | ||||
| 	argc -= optind; | ||||
| 	argv += optind; | ||||
|  | ||||
| 	iobuf = (char*)malloc(IOBUFSIZ);	/* Allow to fail */ | ||||
| 	iobuf = xmalloc(iolen); | ||||
|  | ||||
| 	if (DisplayAllOpt) | ||||
| 		return DisplayAll(PROC_PATH); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user