diff options
author | Petr Písař <ppisar@redhat.com> | 2013-01-09 17:00:44 +0100 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2013-01-21 22:56:54 +0100 |
commit | fdcf21db852bc8d6c1d0b41f2812ba614851e2b4 (patch) | |
tree | 76808220c658bb8b9a020e4be14af27fdad1dab4 /setquota.c | |
parent | f61d6442cc92a2b2935db6995b8d901235dbd076 (diff) |
Recognize units at inode limits by setquota
This patch allows to specify suffixes at inode limits on setquota
command line and standard input. Decimal Units k, m, g, t are
implemented. Numeric value without suffix is equivatent to single
inodes as before. This is complementary functionality to `quota -s'.
Signed-off-by: Petr Písař <ppisar@redhat.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'setquota.c')
-rw-r--r-- | setquota.c | 39 |
1 files changed, 35 insertions, 4 deletions
@@ -106,6 +106,19 @@ static qsize_t parse_blocksize(const char *str, const char *msg) return ret; } +/* Convert inode count to number - print errstr message in case of failure */ +static qsize_t parse_inodecount(const char *str, const char *msg) +{ + qsize_t ret; + const char *error = str2number(str, &ret); + + if (error) { + errstr(_("%s: %s: %s\n"), msg, str, error); + usage(); + } + return ret; +} + /* Convert our flags to quota type */ static inline int flag2type(int flags) { @@ -241,8 +254,8 @@ static void parse_options(int argcnt, char **argstr) if (!(flags & (FL_GRACE | FL_INDIVIDUAL_GRACE | FL_PROTO))) { toset.dqb_bsoftlimit = parse_blocksize(argstr[optind++], _("Bad block softlimit")); toset.dqb_bhardlimit = parse_blocksize(argstr[optind++], _("Bad block hardlimit")); - toset.dqb_isoftlimit = parse_unum(argstr[optind++], _("Bad inode softlimit")); - toset.dqb_ihardlimit = parse_unum(argstr[optind++], _("Bad inode hardlimit")); + toset.dqb_isoftlimit = parse_inodecount(argstr[optind++], _("Bad inode softlimit")); + toset.dqb_ihardlimit = parse_inodecount(argstr[optind++], _("Bad inode hardlimit")); } else if (flags & FL_PROTO) protoid = name2id(protoname, flag2type(flags), !!(flags & FL_NUMNAMES), NULL); @@ -319,7 +332,7 @@ static int read_entry(qid_t *id, qsize_t *isoftlimit, qsize_t *ihardlimit, qsize static int line = 0; char name[MAXNAMELEN+1]; char linebuf[MAXLINELEN], *chptr; - unsigned long is, ih; + char is[MAXNAMELEN+1], ih[MAXNAMELEN+1]; char bs[MAXNAMELEN+1], bh[MAXNAMELEN+1]; const char *error; int ret; @@ -339,7 +352,7 @@ static int read_entry(qid_t *id, qsize_t *isoftlimit, qsize_t *ihardlimit, qsize chptr++; if (*chptr == '\n') continue; - ret = sscanf(chptr, "%s %s %s %lu %lu", name, bs, bh, &is, &ih); + ret = sscanf(chptr, "%s %s %s %s %s", name, bs, bh, is, ih); if (ret != 5) { errstr(_("Cannot parse input line %d.\n"), line); if (!(flags & FL_CONTINUE_BATCH)) @@ -373,6 +386,24 @@ static int read_entry(qid_t *id, qsize_t *isoftlimit, qsize_t *ihardlimit, qsize errstr(_("Skipping line.\n")); continue; } + error = str2number(is, isoftlimit); + if (error) { + errstr(_("Unable to parse inode soft limit '%s' " + "on line %d: %s\n"), is, line, error); + if (!(flags & FL_CONTINUE_BATCH)) + die(1, _("Exitting.\n")); + errstr(_("Skipping line.\n")); + continue; + } + error = str2number(ih, ihardlimit); + if (error) { + errstr(_("Unable to parse inode hard limit '%s' " + "on line %d: %s\n"), ih, line, error); + if (!(flags & FL_CONTINUE_BATCH)) + die(1, _("Exitting.\n")); + errstr(_("Skipping line.\n")); + continue; + } break; } *isoftlimit = is; |