d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * CDDL HEADER START
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * The contents of this file are subject to the terms of the
d29b2c4438482eb00488be49a1f5d6835f455546ab * Common Development and Distribution License, Version 1.0 only
d29b2c4438482eb00488be49a1f5d6835f455546ab * (the "License"). You may not use this file except in compliance
d29b2c4438482eb00488be49a1f5d6835f455546ab * with the License.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d29b2c4438482eb00488be49a1f5d6835f455546ab * or http://www.opensolaris.org/os/licensing.
d29b2c4438482eb00488be49a1f5d6835f455546ab * See the License for the specific language governing permissions
d29b2c4438482eb00488be49a1f5d6835f455546ab * and limitations under the License.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * When distributing Covered Code, include this CDDL HEADER in each
d29b2c4438482eb00488be49a1f5d6835f455546ab * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d29b2c4438482eb00488be49a1f5d6835f455546ab * If applicable, add the following below this CDDL HEADER, with the
d29b2c4438482eb00488be49a1f5d6835f455546ab * fields enclosed by brackets "[]" replaced with your own identifying
d29b2c4438482eb00488be49a1f5d6835f455546ab * information: Portions Copyright [yyyy] [name of copyright owner]
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * CDDL HEADER END
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * Copyright (c) 2000 by Sun Microsystems, Inc.
d29b2c4438482eb00488be49a1f5d6835f455546ab * All rights reserved.
33f5ff17089e3a43e6e730bf80384c233123dbd9Milan Jurik */
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab#pragma ident "%Z%%M% %I% %E% SMI"
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <sys/types.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <sys/statvfs.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <sys/param.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <sys/stat.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <unistd.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <string.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <stdio.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <fcntl.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab#include "utils.h"
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abstatic FILE *
d29b2c4438482eb00488be49a1f5d6835f455546abminfree_open(const char *dir, int oflags, const char *fmode)
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab char path[MAXPATHLEN];
d29b2c4438482eb00488be49a1f5d6835f455546ab int fd;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab (void) snprintf(path, sizeof (path), "%s/minfree", dir);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab if ((fd = open(path, oflags, S_IRUSR | S_IWUSR)) >= 0)
d29b2c4438482eb00488be49a1f5d6835f455546ab return (fdopen(fd, fmode));
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab return (NULL);
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abint
d29b2c4438482eb00488be49a1f5d6835f455546abminfree_read(const char *dir, unsigned long long *ullp)
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab FILE *fp = minfree_open(dir, O_RDONLY, "r");
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab if (fp != NULL) {
d29b2c4438482eb00488be49a1f5d6835f455546ab char buf[BUFSIZ];
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans int status = -1;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab if (fgets(buf, BUFSIZ, fp) != NULL) {
d29b2c4438482eb00488be49a1f5d6835f455546ab if (valid_str2ull(buf, ullp))
d29b2c4438482eb00488be49a1f5d6835f455546ab status = 0;
d29b2c4438482eb00488be49a1f5d6835f455546ab else
d29b2c4438482eb00488be49a1f5d6835f455546ab warn(gettext("\"%s/minfree\": invalid minfree "
d29b2c4438482eb00488be49a1f5d6835f455546ab "value -- %s\n"), dir, buf);
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab (void) fclose(fp);
d29b2c4438482eb00488be49a1f5d6835f455546ab return (status);
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab return (-1);
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abint
d29b2c4438482eb00488be49a1f5d6835f455546abminfree_write(const char *dir, unsigned long long ull)
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab FILE *fp = minfree_open(dir, O_WRONLY | O_CREAT | O_TRUNC, "w");
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab if (fp != NULL) {
d29b2c4438482eb00488be49a1f5d6835f455546ab int status = fprintf(fp, "%llu\n", ull);
d29b2c4438482eb00488be49a1f5d6835f455546ab (void) fclose(fp);
d29b2c4438482eb00488be49a1f5d6835f455546ab return (status);
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab return (-1);
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abint
d29b2c4438482eb00488be49a1f5d6835f455546abminfree_compute(const char *dir, char *s, unsigned long long *ullp)
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab size_t len = strlen(s);
d29b2c4438482eb00488be49a1f5d6835f455546ab unsigned long long m = 1;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab struct statvfs64 fsb;
d29b2c4438482eb00488be49a1f5d6835f455546ab int pct;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab switch (s[len - 1]) {
d29b2c4438482eb00488be49a1f5d6835f455546ab case '%':
d29b2c4438482eb00488be49a1f5d6835f455546ab s[len - 1] = '\0';
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab if (!valid_str2int(s, &pct) || pct > 100) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans warn(gettext("invalid minfree %% -- %s\n"), s);
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans return (-1);
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
d29b2c4438482eb00488be49a1f5d6835f455546ab
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if (statvfs64(dir, &fsb) == -1) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans warn(gettext("failed to statvfs %s"), dir);
d29b2c4438482eb00488be49a1f5d6835f455546ab return (-1);
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab *ullp = fsb.f_blocks * fsb.f_frsize *
d29b2c4438482eb00488be49a1f5d6835f455546ab (u_longlong_t)pct / 100ULL / 1024ULL;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab return (0);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab case 'm':
d29b2c4438482eb00488be49a1f5d6835f455546ab case 'M':
d29b2c4438482eb00488be49a1f5d6835f455546ab m = 1024ULL;
d29b2c4438482eb00488be49a1f5d6835f455546ab /*FALLTHRU*/
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab case 'k':
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans case 'K':
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans s[len - 1] = '\0';
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans
d29b2c4438482eb00488be49a1f5d6835f455546ab if (valid_str2ull(s, ullp)) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans *ullp *= m;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans return (0);
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab warn(gettext("invalid minfree value -- %s\n"), s);
d29b2c4438482eb00488be49a1f5d6835f455546ab return (-1);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab default:
d29b2c4438482eb00488be49a1f5d6835f455546ab warn(gettext("expected m, k, or %% unit after "
d29b2c4438482eb00488be49a1f5d6835f455546ab "minfree -- %s\n"), s);
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans return (-1);
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans}
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans