119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * mountopts.c --- convert between default mount options and strings
33984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt *
419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 2002  Theodore Ts'o <tytso@mit.edu>
53984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt *
68558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * %Begin-Header%
78558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * This file may be redistributed under the terms of the GNU Library
88558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * General Public License, version 2.
98558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * %End-Header%
1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h>
1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdlib.h>
1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h>
1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <ctype.h>
1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <errno.h>
1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "e2p.h"
1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct mntopt {
2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	unsigned int	mask;
2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	const char	*string;
2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project};
2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic struct mntopt mntopt_list[] = {
2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{ EXT2_DEFM_DEBUG,	"debug" },
2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{ EXT2_DEFM_BSDGROUPS,	"bsdgroups" },
2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{ EXT2_DEFM_XATTR_USER,	"user_xattr" },
2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{ EXT2_DEFM_ACL,	"acl" },
3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{ EXT2_DEFM_UID16,	"uid16" },
3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{ EXT3_DEFM_JMODE_DATA, "journal_data" },
3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{ EXT3_DEFM_JMODE_ORDERED, "journal_data_ordered" },
3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{ EXT3_DEFM_JMODE_WBACK, "journal_data_writeback" },
348558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall	{ EXT4_DEFM_NOBARRIER,	"nobarrier" },
358558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall	{ EXT4_DEFM_BLOCK_VALIDITY, "block_validity" },
368558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall	{ EXT4_DEFM_DISCARD,	"discard"},
378558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall	{ EXT4_DEFM_NODELALLOC,	"nodelalloc"},
3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{ 0, 0 },
3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project};
4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectconst char *e2p_mntopt2string(unsigned int mask)
4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct mntopt  *f;
4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	static char buf[20];
4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int	fnum;
4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	for (f = mntopt_list; f->string; f++) {
4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (mask == f->mask)
4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			return f->string;
5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	for (fnum = 0; mask >>= 1; fnum++);
5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	sprintf(buf, "MNTOPT_%d", fnum);
5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return buf;
5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint e2p_string2mntopt(char *string, unsigned int *mask)
5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct mntopt  *f;
5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	char		*eptr;
6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int		num;
6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	for (f = mntopt_list; f->string; f++) {
6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (!strcasecmp(string, f->string)) {
6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			*mask = f->mask;
6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			return 0;
6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (strncasecmp(string, "MNTOPT_", 8))
6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return 1;
7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (string[8] == 0)
7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return 1;
7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	num = strtol(string+8, &eptr, 10);
7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (num > 32 || num < 0)
7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return 1;
7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (*eptr)
7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return 1;
7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	*mask = 1 << num;
7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return 0;
8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic char *skip_over_blanks(char *cp)
8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	while (*cp && isspace(*cp))
8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		cp++;
8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return cp;
8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic char *skip_over_word(char *cp)
9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	while (*cp && !isspace(*cp) && *cp != ',')
9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		cp++;
9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return cp;
9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Edit a mntopt set array as requested by the user.  The ok
9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * parameter, if non-zero, allows the application to limit what
9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * mntopts the user is allowed to set or clear using this function.
10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint e2p_edit_mntopts(const char *str, __u32 *mntopts, __u32 ok)
10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	char	*cp, *buf, *next;
10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int	neg;
10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	unsigned int	mask;
10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int	rc = 0;
10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	buf = malloc(strlen(str)+1);
10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (!buf)
11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return 1;
11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	strcpy(buf, str);
11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	cp = buf;
11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	while (cp && *cp) {
11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		neg = 0;
11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		cp = skip_over_blanks(cp);
11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		next = skip_over_word(cp);
11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (*next == 0)
11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			next = 0;
11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		else
12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			*next = 0;
12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		switch (*cp) {
12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		case '-':
12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		case '^':
12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			neg++;
12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		case '+':
12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			cp++;
12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (e2p_string2mntopt(cp, &mask)) {
13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			rc = 1;
13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (ok && !(ok & mask)) {
13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			rc = 1;
13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (mask & EXT3_DEFM_JMODE)
13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			*mntopts &= ~EXT3_DEFM_JMODE;
13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (neg)
14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			*mntopts &= ~mask;
14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		else
14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			*mntopts |= mask;
14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		cp = next ? next+1 : 0;
14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	free(buf);
14619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return rc;
14719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
148