Skip to content

Commit

Permalink
* libmisc/Makefile.am, libmisc/getrange.c: Added function to parse
Browse files Browse the repository at this point in the history
	a range (useful for lastlog).
  • Loading branch information
nekral-guest committed Jun 14, 2008
1 parent 4f12c31 commit b8c5483
Show file tree
Hide file tree
Showing 3 changed files with 130 additions and 0 deletions.
5 changes: 5 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2008-06-14 Nicolas François <nicolas.francois@centraliens.net>

* libmisc/Makefile.am, libmisc/getrange.c: Added function to parse
a range (useful for lastlog).

2008-06-14 Nicolas François <nicolas.francois@centraliens.net>

* src/chsh.c: <signal.h> is not needed.
Expand Down
1 change: 1 addition & 0 deletions libmisc/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ libmisc_a_SOURCES = \
getdate.h \
getdate.y \
getlong.c \
getrange.c \
hushed.c \
isexpired.c \
limits.c \
Expand Down
124 changes: 124 additions & 0 deletions libmisc/getrange.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
/*
* Copyright (c) 2008 , Nicolas François
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the copyright holders or contributors may not be used to
* endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include <config.h>

#ident "$Id: $"

#include <ctype.h>
#include <stdlib.h>

#include "defines.h"
#include "prototypes.h"

/*
* Parse a range and indicate if the range is valid.
* Valid ranges are in the form:

This comment has been minimized.

Copy link
@alejandro-colomar

alejandro-colomar Jan 6, 2024

Collaborator

Is 42-7 a valid range?

Cc: @hallyn , @ikerexxe

This comment has been minimized.

Copy link
@alejandro-colomar

alejandro-colomar Jan 6, 2024

Collaborator

There's no code for rejecting that.

This comment has been minimized.

Copy link
@hallyn

hallyn Jan 6, 2024

Member

I don't see any point in supporting it. Returning an error if max < min would be good.

This comment has been minimized.

Copy link
@alejandro-colomar

alejandro-colomar Jan 7, 2024

Collaborator

I have a bunch of improvements for this function in https://github.com/alejandro-colomar/shadow/tree/getrange, including a patch adding a min>max check. That branch is queued after a few other PRs, starting at #875.

$ git log --oneline master..HEAD
a3a152aa (HEAD -> getrange, gh/getrange) lib/getrange.c: getrange(): Report an ERANGE error when min>max
391deb80 lib/getrange.c: getrange(): Add missing cast
5ac1052f lib/getrange.c: getrange(): Use getulong() instead of strtoul_noneg()
103510bf lib/getrange.c: getrange(): Rename local variable
1d32a1e4 lib/getrange.c: getrange(): Reduce uses of non-const pointer
7e85afc5 lib/, src/: Fix name of variable
6303d8a2 lib/getrange.c: getrange(): Use goto to deduplicate code
06ec7749 lib/getrange.c: getrange(): Return early to reduce indentation
28e95185 lib/getrange.c: getrange(): Return early, to reduce indentation
a57e845c lib/getrange.c: getrange(): Remove temporary variable
e519dd35 (gh/getlong, getlong) lib/atoi/getlong.h: getn(), getnum(): Add type-generic macros
1aff76b4 lib/atoi/getlong.[ch]: get[u]ll[ong](): Add [unsigned] long long variants
ec99f1f2 lib/atoi/getlong.[ch]: Add get[u]long() and reimplement get[u]l() in terms of get[u]long()
87527d8a lib/, src/: Define get[u]l() as inline functions
f8bd599a lib/, src/: get[u]l(): Rename get[u]long() to get[u]l()
9193037d (gh/strtou_, strtou_) lib/atoi/get[u]long.c: Move get[u]long to lib/atoi/
16c3ad8e tests/unit/test_atoi_strtoi.c: Test strtou_noneg()
a6f97feb lib/atoi/strtou_noneg.[ch]: Add strtou_noneg()
fd715bf1 tests/unit/test_atoi_strtoi.c: Test shadow_strtoi()
bdcb6ba4 lib/atoi/strtoi.[ch]: Add definitions of strtoi(3bsd) and strtou(3bsd)
1c097bac (gh/strtou, strtou) tests/unit/test_atoi_strtou_noneg.c: Test strtou[l]l_noneg()
8423d2e2 lib/, src/: Replace strtou[l]l(3) by strtou[l]l_noneg()
6ac96ba4 lib/atoi/strtou_noneg.[ch]: Add strtou[l]l_noneg()

This comment has been minimized.

* <long> -> min=max=long has_min has_max
* -<long> -> max=long !has_min has_max
* <long>- -> min=long has_min !has_max
* <long1>-<long2> -> min=long1 max=long2 has_min has_max
*
* If the range is valid, getrange returns 1.
* If the range is not valid, getrange returns 0.
*/
int getrange(char *range,
unsigned long *min, bool *has_min,
unsigned long *max, bool *has_max)
{
char *endptr;
unsigned long n;

if (NULL == range) {
return 0;
}

if ('-' == range[0]) {
if (!isdigit(range[1])) {
/* invalid */
return 0;
}
errno = 0;
n = strtoul (&range[1], &endptr, 10);
if (('\0' != *endptr) || (ERANGE == errno)) {
/* invalid */
return 0;
}
/* -<long> */
*has_min = false;
*has_max = true;
*max = n;
} else {
errno = 0;
n = strtoul (range, &endptr, 10);
if (ERANGE == errno) {
/* invalid */
return 0;
}
switch (*endptr) {
case '\0':
/* <long> */
*has_min = true;
*has_max = true;
*min = n;
*max = n;
break;
case '-':
endptr++;
if ('\0' == *endptr) {
/* <long>- */
*has_min = true;
*has_max = false;
*min = n;
} else if (!isdigit (*endptr)) {
/* invalid */
return 0;
} else {
*has_min = true;
*min = n;
errno = 0;
n = strtoul (endptr, &endptr, 10);
if ( ('\0' != *endptr)
|| (ERANGE == errno)) {
/* invalid */
return 0;
}
/* <long>-<long> */
*has_max = true;
*max = n;
}
break;
default:
return 0;
}
}

return 1;
}

0 comments on commit b8c5483

Please sign in to comment.