/* * Write a single sysctl setting */ static int sysctl_write_setting(const char *setting) { int retval; const char *name; const char *value; const char *equals; char *tmpname, *outname, *cptr; int fd; name = setting; equals = strchr(setting, '='); if (!equals) { bb_error_msg(ERR_NO_EQUALS, setting); return EXIT_FAILURE; } value = equals + 1; /* point to the value in name=value */ if (name == equals || !*value) { bb_error_msg(ERR_MALFORMED_SETTING, setting); return EXIT_FAILURE; } tmpname = xasprintf("%s%.*s", PROC_SYS, (int)(equals - name), name); outname = xstrdup(tmpname + strlen_PROC_SYS); while ((cptr = strchr(tmpname, '.')) != NULL) *cptr = '/'; while ((cptr = strchr(outname, '/')) != NULL) *cptr = '.'; fd = open(tmpname, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (fd < 0) { switch (errno) { case ENOENT: if (option_mask32 & FLAG_SHOW_KEY_ERRORS) bb_error_msg(ERR_INVALID_KEY, outname); break; case EACCES: bb_perror_msg(ERR_PERMISSION_DENIED, outname); break; default: bb_perror_msg(ERR_UNKNOWN_WRITING, outname); break; } retval = EXIT_FAILURE; } else { dwrite_str(fd, value); close(fd); if (option_mask32 & FLAG_SHOW_KEYS) { printf("%s = ", outname); } puts(value); retval = EXIT_SUCCESS; } free(tmpname); free(outname); return retval; } /* end sysctl_write_setting() */
/* * Read a sysctl setting * */ int sysctl_read_setting(const char *setting, int output) { int retval = 0; char *tmpname, *outname, *cptr; char inbuf[1025]; const char *name = setting; FILE *fp; if (!setting || !*setting) bb_error_msg(ERR_INVALID_KEY, setting); tmpname = concat_path_file(PROC_PATH, name); outname = xstrdup(tmpname + strlen(PROC_PATH)); while ((cptr = strchr(tmpname, '.')) != NULL) *cptr = '/'; while ((cptr = strchr(outname, '/')) != NULL) *cptr = '.'; if ((fp = fopen(tmpname, "r")) == NULL) { switch (errno) { case ENOENT: bb_error_msg(ERR_INVALID_KEY, outname); break; case EACCES: bb_error_msg(ERR_PERMISSION_DENIED, outname); break; default: bb_error_msg(ERR_UNKNOWN_READING, errno, outname); break; } retval = -1; } else { while (fgets(inbuf, sizeof(inbuf) - 1, fp)) { if (output) { dwrite_str(STDOUT_FILENO, outname); dwrite_str(STDOUT_FILENO, " = "); } dwrite_str(STDOUT_FILENO, inbuf); } fclose(fp); } free(tmpname); free(outname); return retval; } /* end sysctl_read_setting() */
/* * Write a single sysctl setting */ int sysctl_write_setting(const char *setting, int output) { int retval = 0; const char *name = setting; const char *value; const char *equals; char *tmpname, *outname, *cptr; int fd = -1; if (!name) /* probably dont' want to display this err */ return 0; if (!(equals = strchr(setting, '='))) { bb_error_msg(ERR_NO_EQUALS, setting); return -1; } value = equals + sizeof(char); /* point to the value in name=value */ if (!*name || !*value || name == equals) { bb_error_msg(ERR_MALFORMED_SETTING, setting); return -2; } tmpname = xasprintf("%s%.*s", PROC_PATH, (int)(equals - name), name); outname = xstrdup(tmpname + strlen(PROC_PATH)); while ((cptr = strchr(tmpname, '.')) != NULL) *cptr = '/'; while ((cptr = strchr(outname, '/')) != NULL) *cptr = '.'; fd = open(tmpname, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (fd < 0) { switch (errno) { case ENOENT: bb_error_msg(ERR_INVALID_KEY, outname); break; case EACCES: bb_perror_msg(ERR_PERMISSION_DENIED, outname); break; default: bb_error_msg(ERR_UNKNOWN_WRITING, errno, outname); break; } retval = -1; } else { dwrite_str(fd, value); close(fd); if (output) { dwrite_str(STDOUT_FILENO, outname); dwrite_str(STDOUT_FILENO, " = "); } dwrite_str(STDOUT_FILENO, value); dwrite_str(STDOUT_FILENO, "\n"); } /* cleanup */ free(tmpname); free(outname); return retval; } /* end sysctl_write_setting() */