[PATCH 4/4] Added test for "rach access-control-class" VTY command.

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.

Peter Stuge peter at stuge.se
Sun Sep 15 17:22:00 UTC 2013


Holger Hans Peter Freyther wrote:
> > > +        # Barred rach access control classes
> > > +        self.vty.verify("rach access-control-class 0 barred", [''])
> > > +        self.vty.verify("rach access-control-class 1 barred", [''])
> > > +        self.vty.verify("rach access-control-class 2 barred", [''])
> > 
> > what happened to the code that I sent for parsing ranges and not just
> > a single class digit?
> 
> can you re-send your patch/diff for that? I can help with the test
> case for that.

I didn't make an actual patch, I only wrote and sent the range/list
parsing code, since Alex wrote that it would get used it if I sent it.

I'm attaching a cleaned-up version with all functionality moved to
an actual function and now also featuring input validation not just
for characters but also their meaning. Out-of-range list/range
numbers are no longer silently ignored but cause an error.

What's the best way to proceed? I suppose I could send a patch to
add this function somewhere - maybe libosmocore? It should obviously
log instead of sending to stderr then.


//Peter
-------------- next part --------------
#include <stdio.h>

#ifndef MIN
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif /* MIN */
#ifndef MAX
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#endif /* MAX */

#ifndef ARRAY_SIZE
#define ARRAY_SIZE(a) (sizeof (a) / sizeof (a)[0])
#endif /* ARRAY_SIZE */

int parse_range_list(const char *str, int *val, size_t n_val) {
  int i, ret = 0;
  unsigned int a, b;
  int n1, n2;

  while (*str) {
    switch (sscanf(str, "%u%n-%u%n", &a, &n1, &b, &n2)) {
    case -1:
      perror("sscanf");
      return -1;

    case 0:
      goto invalid;

    case 1:
      if (a >= n_val)
        goto invalid;

      val[a] = 1;
      ret++;
      str += n1;
      break;

    case 2:
      if (a >= n_val || b >= n_val)
        goto invalid;

      for (i = MIN(a, b); i <= MAX(a, b); i++) {
        val[i] = 1;
        ret++;
      }
      str += n2;
      break;
    }

    if (',' == *str)
      str++;
    else if (*str)
      goto invalid;
  }

  return ret;

invalid:
  fprintf(stderr, "invalid input at '%.5s'\n", str);
  return -1;
}

int main(int argc,const char *argv[]) {
  int i, val[16];

  if (argc < 2) {
    fprintf(stderr, "usage: %s int[-int][,...]\n", *argv);
    return 1;
  }

  memset(val, 0, sizeof val);

  i = parse_range_list(argv[1], val, ARRAY_SIZE(val));
  if (-1 == i)
    return 2;

  printf("parse_range_list() returns %d\n", i);

  for (i = 0; i < ARRAY_SIZE(val); i++)
    printf("val[%d]=%d\n", i, val[i]);

  return 0;
}


More information about the OpenBSC mailing list