#include <stdio.h>
#include <sys/stropts.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#define OPTLIST "m:t"
#define USAGE "USAGE: %s [ -m module | -t ]\n"
#define SUCCESS 0
#define FAILURE 1
#define ERR_USAGE 1
#define ERR_MODULE 2
#define ERR_STDIN 3
#define ERR_MEM 4
#define NMODULES 16
#define MAXMODULES 2048
static char *Cmd_namep;
static int more_modules(struct str_list *, int);
int
main(int argc, char **argv)
{
char *modp;
int i;
boolean_t mod_present;
boolean_t topmost;
struct str_mlist mlist[NMODULES];
struct str_list strlist;
Cmd_namep = argv[0];
mod_present = topmost = B_FALSE;
strlist.sl_nmods = NMODULES;
strlist.sl_modlist = mlist;
if (argc > 1) {
while ((i = getopt(argc, argv, OPTLIST)) != -1) {
switch (i) {
case 'm':
modp = optarg;
mod_present = B_TRUE;
break;
case 't':
topmost = B_TRUE;
break;
default:
(void) fprintf(stderr, USAGE, Cmd_namep);
return (ERR_USAGE);
}
}
if (optind < argc) {
(void) fprintf(stderr, USAGE, Cmd_namep);
return (ERR_USAGE);
}
}
if (topmost && mod_present) {
(void) fprintf(stderr,
"%s: [-t] and [-m] options cannot be used together\n",
Cmd_namep);
(void) fprintf(stderr, USAGE, Cmd_namep);
return (ERR_USAGE);
}
if ((i = ioctl(STDIN_FILENO, I_LIST, NULL)) < 0) {
perror("I_LIST");
(void) fprintf(stderr,
"%s: I_LIST ioctl failed\n", Cmd_namep);
return (ERR_STDIN);
}
if (i > strlist.sl_nmods)
if (more_modules(&strlist, i) != SUCCESS)
return (ERR_MEM);
strlist.sl_nmods = i;
if (ioctl(STDIN_FILENO, I_LIST, &strlist) < 0) {
perror("I_LIST");
(void) fprintf(stderr, "%s: I_LIST ioctl failed\n", Cmd_namep);
return (ERR_STDIN);
}
if (topmost) {
if (strlist.sl_nmods >= 2) {
(void) puts(strlist.sl_modlist[0].l_name);
return (SUCCESS);
}
return (ERR_MODULE);
}
if (mod_present) {
for (i = 0; i < strlist.sl_nmods; i++) {
if (strncmp(modp, strlist.sl_modlist[i].l_name,
FMNAMESZ) == 0) {
(void) puts("yes");
return (SUCCESS);
}
}
(void) puts("no");
return (ERR_MODULE);
}
for (i = 0; i < strlist.sl_nmods; i++)
(void) puts(strlist.sl_modlist[i].l_name);
return (SUCCESS);
}
static int
more_modules(struct str_list *listp, int n)
{
int i;
struct str_mlist *modp;
if (n > MAXMODULES) {
(void) fprintf(stderr,
"%s: too many modules (%d) -- max is %d\n",
Cmd_namep, n, MAXMODULES);
return (FAILURE);
}
if ((modp = calloc(n, sizeof (struct str_mlist))) == NULL) {
perror("calloc");
(void) fprintf(stderr,
"%s: failed to allocate space for module list\n",
Cmd_namep);
return (FAILURE);
}
for (i = 0; i < listp->sl_nmods; ++i)
(void) strncpy(modp[i].l_name, listp->sl_modlist[i].l_name,
FMNAMESZ);
listp->sl_nmods = n;
listp->sl_modlist = modp;
return (SUCCESS);
}