Example #1
0
/*
 *     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() */
Example #2
0
/*
 *     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() */
Example #3
0
/*
 *     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() */