Combined constraints and introduced value randomizer.
diff --git a/skeletons/converter-example.c b/skeletons/converter-example.c
index a1dc8f4..ec1cc10 100644
--- a/skeletons/converter-example.c
+++ b/skeletons/converter-example.c
@@ -58,14 +58,35 @@
static int opt_onepdu; /* -1 (decode single PDU) */
#ifdef JUNKTEST /* Enable -J <probability> */
-#define JUNKOPT "J:"
+#define JUNKOPT "J:"
static double opt_jprob; /* Junk bit probability */
static int junk_failures;
static void junk_bytes_with_probability(uint8_t *, size_t, double prob);
-#else
-#define JUNKOPT
+
+#define RANDOPT "R:"
+static ssize_t random_max_size = 0; /* Size of the random data */
+
+#if !defined(__FreeBSD__) && !(defined(__APPLE__) && defined(__MACH__))
+static void
+srandomdev(void) {
+ FILE *f = fopen("/dev/urandom", "rb");
+ unsigned seed;
+ if(f) {
+ if(fread(&seed, 1, sizeof(seed), f) != sizeof(seed)) {
+ seed = time(NULL);
+ }
+ fclose(f);
+ } else {
+ seed = time(NULL);
+ }
+ srandom(seed);
+}
#endif
+#else /* !JUNKTEST */
+#define JUNKOPT
+#endif /* JUNKTEST */
+
/* Debug output function */
static void
DEBUG(const char *fmt, ...) {
@@ -195,7 +216,7 @@
/*
* Pocess the command-line argments.
*/
- while((ch = getopt(ac, av, "i:o:1b:cdn:p:hs:" JUNKOPT)) != -1)
+ while((ch = getopt(ac, av, "i:o:1b:cdn:p:hs:" JUNKOPT RANDOPT)) != -1)
switch(ch) {
case 'i':
sel = ats_by_name(optarg, pduType, input_encodings);
@@ -296,6 +317,17 @@
exit(EX_UNAVAILABLE);
}
break;
+ case 'R':
+ isyntax = ATS_RANDOM;
+ random_max_size = atoi(optarg);
+ if(random_max_size < 0) {
+ fprintf(stderr,
+ "-R %s: Non-negative value expected\n",
+ optarg);
+ exit(EX_UNAVAILABLE);
+ }
+ srandomdev();
+ break;
#endif /* JUNKTEST */
case 'h':
default:
@@ -339,6 +371,8 @@
" -s <size> Set the stack usage limit (default is %d)\n"
#ifdef JUNKTEST
" -J <prob> Set random junk test bit garbaging probability\n"
+ " -R <size> Generate a random value of roughly the given size,\n"
+ " instead of parsing the value from file.\n"
#endif
, (long)suggested_bufsize, ASN__DEFAULT_STACK_MAX);
exit(EX_USAGE);
@@ -347,7 +381,7 @@
ac -= optind;
av += optind;
- if(ac < 1) {
+ if(ac < 1 && isyntax != ATS_RANDOM) {
fprintf(stderr, "%s: No input files specified. "
"Try '-h' for more information\n",
av[-optind]);
@@ -378,19 +412,39 @@
/*
* Process all files in turn.
*/
- for(ac_i = 0; ac_i < ac; ac_i++) {
+ for(ac_i = (isyntax == ATS_RANDOM) ? -1 : 0; ac_i < ac; ac_i++) {
asn_enc_rval_t erv;
void *structure; /* Decoded structure */
- FILE *file = argument_to_file(av, ac_i);
- char *name = argument_to_name(av, ac_i);
+ FILE *file;
+ char *name;
int first_pdu;
+ if(ac_i == -1) {
+ file = NULL;
+ name = "<random value generator>";
+ opt_onepdu = 1;
+ } else {
+ file = argument_to_file(av, ac_i);
+ name = argument_to_name(av, ac_i);
+ }
+
for(first_pdu = 1; (first_pdu || !opt_onepdu); first_pdu = 0) {
/*
* Decode the encoded structure from file.
*/
- structure = data_decode_from_file(isyntax, pduType, file, name,
- suggested_bufsize, first_pdu);
+ if(isyntax == ATS_RANDOM) {
+ structure = NULL;
+ if(asn_random_fill(pduType, &structure, random_max_size) != 0) {
+ fprintf(stderr,
+ "Cannot generate a random value.\n",
+ random_max_size);
+ assert(structure == NULL);
+ errno = EINVAL;
+ }
+ } else {
+ structure = data_decode_from_file(isyntax, pduType, file, name,
+ suggested_bufsize, first_pdu);
+ }
if(!structure) {
if(errno) {
/* Error message is already printed */
@@ -429,6 +483,8 @@
if(erv.encoded == -1) {
fprintf(stderr, "%s: Cannot convert %s into %s\n", name,
pduType->name, ats_simple_name(osyntax));
+ DEBUG("Conversion failed for %s:\n", pduType->name);
+ asn_fprint(stderr, pduType, structure);
exit(EX_UNAVAILABLE);
}
DEBUG("Encoded in %zd bytes of %s", erv.encoded,