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