12 main(int argc
, char **argv
)
14 const unsigned int uargc
= (unsigned int)argc
;
16 size_t i
, j
, r
, rv
= 0, s
;
19 if (uargc
% 2 != 0 || uargc
< 4) {
20 (void)fprintf(stderr
, "usage: wrapper \"ii args\" host1 port1"
21 " [host2 port2 ...]\n");
25 for (i
= 0; i
< strlen(argv
[1]); i
++)
26 if (argv
[1][i
] == '<' || argv
[1][i
] == '>'
27 || argv
[1][i
] == '|' || argv
[1][i
] == ';'
28 || argv
[1][i
] == '(' || argv
[1][i
] == ')'
29 || argv
[1][i
] == '&' || argv
[1][i
] == '"'
30 || argv
[1][i
] == '\'')
31 err(1, "sh(1) meta-characters and quotation marks are "
32 "not allowed in the `ii args'.\n");
34 for (i
= 2; i
< uargc
; i
++)
37 * Permit port numbers that are in the range 0 < p <
40 if (atoi(argv
[i
]) < 1 || atoi(argv
[i
]) > 65535)
41 err(1, "Port number `%lu' is not in range.\n",
42 (unsigned long)i
/ 2);
43 for (j
= 0; j
< strlen(argv
[i
]); j
++)
44 if (argv
[i
][j
] < 0x30 || argv
[i
][j
] > 0x39)
45 err(1, "Character `%lu' in port `%lu'"
48 (unsigned long)i
/ 2);
51 * Permitted characters in the hostname fields:
52 * a-z (0x61 < c < 0x7a)
53 * 0-9 (0x30 < c < 0x39)
54 * A-Z (0x41 < c < 0x5a)
57 for (j
= 0; j
< strlen(argv
[i
]); j
++)
58 if (((argv
[i
][j
] < 0x61 || argv
[i
][j
] > 0x7a)
59 && (argv
[i
][j
] < 0x30 || argv
[i
][j
] > 0x39)
60 && (argv
[i
][j
] < 0x41 || argv
[i
][j
] > 0x5a))
61 && argv
[i
][j
] != '.' && argv
[i
][j
] != '-')
62 err(1, "Character `%lu' in hostname"
63 " `%lu' is not allowed.\n",
65 (unsigned long)i
/ 2);
68 printf("arguments: `%s'\n", argv
[1]);
69 for (i
= 2; i
< uargc
; i
+= 2)
70 printf("[%lu]: %s:%d\n", (unsigned long)(i
- 1) / 2, argv
[i
],
88 if ((chdir("/")) < 0) {
101 * Calculate a random number in the range 0-(i/2 - 1).
102 * http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx
104 r
= random() * 1.0 / ( RAND_MAX
+ 1.0 ) * (i
/ 2 - 1);
106 s
= strlen(argv
[1]) + strlen(argv
[r
* 2 + 2]) +
107 strlen(argv
[r
* 2 + 3]) + 10 + sizeof(EXECUTABLE
);
109 if ((init
= calloc(s
, 1)) == NULL
) {
113 strlcpy(init
, EXECUTABLE
" ", s
);
114 strlcat(init
, argv
[1], s
);
115 strlcat(init
, " -s ", s
);
116 strlcat(init
, argv
[r
* 2 + 2], s
);
117 strlcat(init
, " -p ", s
);
118 strlcat(init
, argv
[r
* 2 + 3], s
);