17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 545916cd2Sjpk * Common Development and Distribution License (the "License"). 645916cd2Sjpk * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 2145916cd2Sjpk 227c478bd9Sstevel@tonic-gate /* 23*f875b4ebSrica * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 247c478bd9Sstevel@tonic-gate * Use is subject to license terms. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate 277c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 287c478bd9Sstevel@tonic-gate 297c478bd9Sstevel@tonic-gate /* 307c478bd9Sstevel@tonic-gate * scan /dev directory for mountable objects and construct device_allocate 317c478bd9Sstevel@tonic-gate * file for allocate.... 327c478bd9Sstevel@tonic-gate * 337c478bd9Sstevel@tonic-gate * devices are: 347c478bd9Sstevel@tonic-gate * tape (cartridge) 357c478bd9Sstevel@tonic-gate * /dev/rst* 367c478bd9Sstevel@tonic-gate * /dev/nrst* 377c478bd9Sstevel@tonic-gate * /dev/rmt/... 387c478bd9Sstevel@tonic-gate * audio 397c478bd9Sstevel@tonic-gate * /dev/audio 407c478bd9Sstevel@tonic-gate * /dev/audioctl 417c478bd9Sstevel@tonic-gate * /dev/sound/... 427c478bd9Sstevel@tonic-gate * floppy 437c478bd9Sstevel@tonic-gate * /dev/diskette 447c478bd9Sstevel@tonic-gate * /dev/fd* 457c478bd9Sstevel@tonic-gate * /dev/rdiskette 467c478bd9Sstevel@tonic-gate * /dev/rfd* 477c478bd9Sstevel@tonic-gate * CD 487c478bd9Sstevel@tonic-gate * /dev/sr* 497c478bd9Sstevel@tonic-gate * /dev/nsr* 507c478bd9Sstevel@tonic-gate * /dev/dsk/c?t?d0s? 517c478bd9Sstevel@tonic-gate * /dev/rdsk/c?t?d0s? 5245916cd2Sjpk * 537c478bd9Sstevel@tonic-gate */ 547c478bd9Sstevel@tonic-gate 5545916cd2Sjpk #include <errno.h> 5645916cd2Sjpk #include <fcntl.h> 577c478bd9Sstevel@tonic-gate #include <sys/types.h> /* for stat(2), etc. */ 587c478bd9Sstevel@tonic-gate #include <sys/stat.h> 597c478bd9Sstevel@tonic-gate #include <dirent.h> /* for readdir(3), etc. */ 607c478bd9Sstevel@tonic-gate #include <unistd.h> /* for readlink(2) */ 6145916cd2Sjpk #include <stropts.h> 627c478bd9Sstevel@tonic-gate #include <string.h> /* for strcpy(3), etc. */ 637c478bd9Sstevel@tonic-gate #include <strings.h> /* for bcopy(3C), etc. */ 647c478bd9Sstevel@tonic-gate #include <stdio.h> /* for perror(3) */ 657c478bd9Sstevel@tonic-gate #include <stdlib.h> /* for atoi(3) */ 6645916cd2Sjpk #include <sys/dkio.h> 677c478bd9Sstevel@tonic-gate #include <locale.h> 687c478bd9Sstevel@tonic-gate #include <libintl.h> 6945916cd2Sjpk #include <libdevinfo.h> 7045916cd2Sjpk #include <secdb.h> 71*f875b4ebSrica #include <deflt.h> 727c478bd9Sstevel@tonic-gate #include <auth_attr.h> 737c478bd9Sstevel@tonic-gate #include <auth_list.h> 7445916cd2Sjpk #include <bsm/devices.h> 7545916cd2Sjpk #include <bsm/devalloc.h> 7645916cd2Sjpk #include <tsol/label.h> 777c478bd9Sstevel@tonic-gate 787c478bd9Sstevel@tonic-gate #ifndef TEXT_DOMAIN 797c478bd9Sstevel@tonic-gate #define TEXT_DOMAIN "SUNW_OST_OSCMD" 807c478bd9Sstevel@tonic-gate #endif 817c478bd9Sstevel@tonic-gate 8245916cd2Sjpk #define MKDEVALLOC "mkdevalloc" 8345916cd2Sjpk #define MKDEVMAPS "mkdevmaps" 8445916cd2Sjpk 857c478bd9Sstevel@tonic-gate #define DELTA 5 /* array size delta when full */ 8645916cd2Sjpk #define SECLIB "/etc/security/lib" 877c478bd9Sstevel@tonic-gate 887c478bd9Sstevel@tonic-gate /* "/dev/rst...", "/dev/nrst...", "/dev/rmt/..." */ 897c478bd9Sstevel@tonic-gate struct tape { 907c478bd9Sstevel@tonic-gate char *name; 917c478bd9Sstevel@tonic-gate char *device; 927c478bd9Sstevel@tonic-gate int number; 937c478bd9Sstevel@tonic-gate } *tape; 947c478bd9Sstevel@tonic-gate #define DFLT_NTAPE 10 /* size of initial array */ 957c478bd9Sstevel@tonic-gate #define SIZE_OF_RST 3 /* |rmt| */ 967c478bd9Sstevel@tonic-gate #define SIZE_OF_NRST 4 /* |nrmt| */ 977c478bd9Sstevel@tonic-gate #define SIZE_OF_TMP 4 /* |/tmp| */ 987c478bd9Sstevel@tonic-gate #define SIZE_OF_RMT 8 /* |/dev/rmt| */ 9945916cd2Sjpk #define TAPE_CLEAN SECLIB"/st_clean" 1007c478bd9Sstevel@tonic-gate 1017c478bd9Sstevel@tonic-gate /* "/dev/audio", "/dev/audioctl", "/dev/sound/..." */ 1027c478bd9Sstevel@tonic-gate struct audio { 1037c478bd9Sstevel@tonic-gate char *name; 1047c478bd9Sstevel@tonic-gate char *device; 1057c478bd9Sstevel@tonic-gate int number; 1067c478bd9Sstevel@tonic-gate } *audio; 1077c478bd9Sstevel@tonic-gate #define DFLT_NAUDIO 10 /* size of initial array */ 1087c478bd9Sstevel@tonic-gate #define SIZE_OF_SOUND 10 /* |/dev/sound| */ 10945916cd2Sjpk #define AUDIO_CLEAN SECLIB"/audio_clean" 1107c478bd9Sstevel@tonic-gate 1117c478bd9Sstevel@tonic-gate /* "/dev/sr", "/dev/nsr", "/dev/dsk/c?t?d0s?", "/dev/rdsk/c?t?d0s?" */ 1127c478bd9Sstevel@tonic-gate struct cd { 1137c478bd9Sstevel@tonic-gate char *name; 1147c478bd9Sstevel@tonic-gate char *device; 1157c478bd9Sstevel@tonic-gate int id; 1167c478bd9Sstevel@tonic-gate int controller; 1177c478bd9Sstevel@tonic-gate int number; 1187c478bd9Sstevel@tonic-gate } *cd; 1197c478bd9Sstevel@tonic-gate #define DFLT_NCD 10 /* size of initial array */ 1207c478bd9Sstevel@tonic-gate #define SIZE_OF_SR 2 /* |sr| */ 1217c478bd9Sstevel@tonic-gate #define SIZE_OF_RSR 3 /* |rsr| */ 1227c478bd9Sstevel@tonic-gate #define SIZE_OF_DSK 8 /* |/dev/dsk| */ 1237c478bd9Sstevel@tonic-gate #define SIZE_OF_RDSK 9 /* |/dev/rdsk| */ 12445916cd2Sjpk #define CD_CLEAN SECLIB"/sr_clean" 1257c478bd9Sstevel@tonic-gate 12645916cd2Sjpk /* "/dev/sr", "/dev/nsr", "/dev/dsk/c?t?d0s?", "/dev/rdsk/c?t?d0s?" */ 12745916cd2Sjpk struct rmdisk { 12845916cd2Sjpk char *name; 12945916cd2Sjpk char *device; 13045916cd2Sjpk int id; 13145916cd2Sjpk int controller; 13245916cd2Sjpk int number; 13345916cd2Sjpk } *rmdisk, *rmdisk_r; 13445916cd2Sjpk #define DFLT_RMDISK 10 /* size of initial array */ 1357c478bd9Sstevel@tonic-gate 1367c478bd9Sstevel@tonic-gate /* "/dev/fd0*", "/dev/rfd0*", "/dev/fd1*", "/dev/rfd1*" */ 1377c478bd9Sstevel@tonic-gate struct fp { 1387c478bd9Sstevel@tonic-gate char *name; 1397c478bd9Sstevel@tonic-gate char *device; 1407c478bd9Sstevel@tonic-gate int number; 1417c478bd9Sstevel@tonic-gate } *fp; 1427c478bd9Sstevel@tonic-gate #define DFLT_NFP 10 /* size of initial array */ 1437c478bd9Sstevel@tonic-gate #define SIZE_OF_FD0 3 /* |fd0| */ 1447c478bd9Sstevel@tonic-gate #define SIZE_OF_RFD0 4 /* |rfd0| */ 14545916cd2Sjpk #define FLOPPY_CLEAN SECLIB"/fd_clean" 1467c478bd9Sstevel@tonic-gate 1477c478bd9Sstevel@tonic-gate static void dotape(); 1487c478bd9Sstevel@tonic-gate static void doaudio(); 1497c478bd9Sstevel@tonic-gate static void dofloppy(); 15045916cd2Sjpk static int docd(); 15145916cd2Sjpk static void dormdisk(int); 1527c478bd9Sstevel@tonic-gate static void initmem(); 1537c478bd9Sstevel@tonic-gate static int expandmem(int, void **, int); 1547c478bd9Sstevel@tonic-gate static void no_memory(void); 1557c478bd9Sstevel@tonic-gate 15645916cd2Sjpk int system_labeled = 0; 15745916cd2Sjpk int do_devalloc = 0; 15845916cd2Sjpk int do_devmaps = 0; 15945916cd2Sjpk int do_files = 0; 16045916cd2Sjpk devlist_t devlist; 16145916cd2Sjpk 1627883e825Spaulson int 16345916cd2Sjpk main(int argc, char **argv) 1647c478bd9Sstevel@tonic-gate { 16545916cd2Sjpk int cd_count = 0; 16645916cd2Sjpk char *progname; 16745916cd2Sjpk 1687c478bd9Sstevel@tonic-gate (void) setlocale(LC_ALL, ""); 1697c478bd9Sstevel@tonic-gate (void) textdomain(TEXT_DOMAIN); 1707c478bd9Sstevel@tonic-gate 17145916cd2Sjpk if ((progname = strrchr(argv[0], '/')) == NULL) 17245916cd2Sjpk progname = argv[0]; 17345916cd2Sjpk else 17445916cd2Sjpk progname++; 17545916cd2Sjpk if (strcmp(progname, MKDEVALLOC) == 0) 17645916cd2Sjpk do_devalloc = 1; 17745916cd2Sjpk else if (strcmp(progname, MKDEVMAPS) == 0) 17845916cd2Sjpk do_devmaps = 1; 17945916cd2Sjpk else 18045916cd2Sjpk exit(1); 18145916cd2Sjpk 18245916cd2Sjpk system_labeled = is_system_labeled(); 183facf4a8dSllai1 184*f875b4ebSrica if (!system_labeled) { 185*f875b4ebSrica /* 186*f875b4ebSrica * is_system_labeled() will return false in case we are 187*f875b4ebSrica * starting before the first reboot after Trusted Extensions 188*f875b4ebSrica * is enabled. Check the setting in /etc/system to see if 189*f875b4ebSrica * TX is enabled (even if not yet booted). 190*f875b4ebSrica */ 191*f875b4ebSrica if (defopen("/etc/system") == 0) { 192*f875b4ebSrica if (defread("set sys_labeling=1") != NULL) 193*f875b4ebSrica system_labeled = 1; 194*f875b4ebSrica 195*f875b4ebSrica /* close defaults file */ 196*f875b4ebSrica (void) defopen(NULL); 197*f875b4ebSrica } 198*f875b4ebSrica } 199*f875b4ebSrica 200*f875b4ebSrica #ifdef DEBUG 201facf4a8dSllai1 /* test hook: see also devfsadm.c and allocate.c */ 202facf4a8dSllai1 if (!system_labeled) { 203*f875b4ebSrica struct stat tx_stat; 204*f875b4ebSrica 205facf4a8dSllai1 system_labeled = is_system_labeled_debug(&tx_stat); 206facf4a8dSllai1 if (system_labeled) { 207facf4a8dSllai1 fprintf(stderr, "/ALLOCATE_FORCE_LABEL is set,\n" 208facf4a8dSllai1 "forcing system label on for testing...\n"); 209facf4a8dSllai1 } 210facf4a8dSllai1 } 211*f875b4ebSrica #endif 21245916cd2Sjpk 21345916cd2Sjpk if (system_labeled && do_devalloc && (argc == 2) && 21445916cd2Sjpk (strcmp(argv[1], DA_IS_LABELED) == 0)) { 21545916cd2Sjpk /* 21645916cd2Sjpk * write device entries to device_allocate and device_maps. 21745916cd2Sjpk * default is to print them on stdout. 21845916cd2Sjpk */ 21945916cd2Sjpk do_files = 1; 22045916cd2Sjpk } 22145916cd2Sjpk 2227c478bd9Sstevel@tonic-gate initmem(); /* initialize memory */ 22345916cd2Sjpk dotape(); 22445916cd2Sjpk doaudio(); 22545916cd2Sjpk dofloppy(); 22645916cd2Sjpk cd_count = docd(); 22745916cd2Sjpk if (system_labeled) 22845916cd2Sjpk dormdisk(cd_count); 2297883e825Spaulson 2307883e825Spaulson return (0); 2317c478bd9Sstevel@tonic-gate } 2327c478bd9Sstevel@tonic-gate 2337c478bd9Sstevel@tonic-gate static void 2347c478bd9Sstevel@tonic-gate dotape() 2357c478bd9Sstevel@tonic-gate { 2367c478bd9Sstevel@tonic-gate DIR *dirp; 2377c478bd9Sstevel@tonic-gate struct dirent *dep; /* directory entry pointer */ 23845916cd2Sjpk int i, j; 2397c478bd9Sstevel@tonic-gate char *nm; /* name/device of special device */ 2407c478bd9Sstevel@tonic-gate char linkvalue[2048]; /* symlink value */ 2417c478bd9Sstevel@tonic-gate struct stat stat; /* determine if it's a symlink */ 2427c478bd9Sstevel@tonic-gate int sz; /* size of symlink value */ 2437c478bd9Sstevel@tonic-gate char *cp; /* pointer into string */ 2447c478bd9Sstevel@tonic-gate int ntape; /* max array size */ 24545916cd2Sjpk int tape_count; 24645916cd2Sjpk int first = 0; 24745916cd2Sjpk char *dname, *dtype, *dclean; 24845916cd2Sjpk da_args dargs; 24945916cd2Sjpk deventry_t *entry; 2507c478bd9Sstevel@tonic-gate 2517c478bd9Sstevel@tonic-gate ntape = DFLT_NTAPE; 2527c478bd9Sstevel@tonic-gate 2537c478bd9Sstevel@tonic-gate /* 2547c478bd9Sstevel@tonic-gate * look for rst* and nrst* 2557c478bd9Sstevel@tonic-gate */ 2567c478bd9Sstevel@tonic-gate 2577c478bd9Sstevel@tonic-gate if ((dirp = opendir("/dev")) == NULL) { 2587c478bd9Sstevel@tonic-gate perror(gettext("open /dev failure")); 2597c478bd9Sstevel@tonic-gate exit(1); 2607c478bd9Sstevel@tonic-gate } 2617c478bd9Sstevel@tonic-gate 2627c478bd9Sstevel@tonic-gate i = 0; 2637c478bd9Sstevel@tonic-gate while (dep = readdir(dirp)) { 2647c478bd9Sstevel@tonic-gate /* ignore if neither rst* nor nrst* */ 2657c478bd9Sstevel@tonic-gate if (strncmp(dep->d_name, "rst", SIZE_OF_RST) && 2667c478bd9Sstevel@tonic-gate strncmp(dep->d_name, "nrst", SIZE_OF_NRST)) 2677c478bd9Sstevel@tonic-gate continue; 2687c478bd9Sstevel@tonic-gate 2697c478bd9Sstevel@tonic-gate /* if array full, then expand it */ 2707c478bd9Sstevel@tonic-gate if (i == ntape) { 2717c478bd9Sstevel@tonic-gate /* will exit(1) if insufficient memory */ 2727c478bd9Sstevel@tonic-gate ntape = expandmem(i, (void **)&tape, 2737c478bd9Sstevel@tonic-gate sizeof (struct tape)); 2747c478bd9Sstevel@tonic-gate } 2757c478bd9Sstevel@tonic-gate 2767c478bd9Sstevel@tonic-gate /* save name (/dev + / + d_name + \0) */ 2777c478bd9Sstevel@tonic-gate nm = (char *)malloc(SIZE_OF_TMP + 1 + strlen(dep->d_name) + 1); 2787c478bd9Sstevel@tonic-gate if (nm == NULL) 2797c478bd9Sstevel@tonic-gate no_memory(); 2807c478bd9Sstevel@tonic-gate (void) strcpy(nm, "/dev/"); 2817c478bd9Sstevel@tonic-gate (void) strcat(nm, dep->d_name); 2827c478bd9Sstevel@tonic-gate tape[i].name = nm; 2837c478bd9Sstevel@tonic-gate 2847c478bd9Sstevel@tonic-gate /* ignore if not symbolic link (note i not incremented) */ 2857c478bd9Sstevel@tonic-gate if (lstat(tape[i].name, &stat) < 0) { 2867c478bd9Sstevel@tonic-gate perror("stat(2) failed "); 2877c478bd9Sstevel@tonic-gate exit(1); 2887c478bd9Sstevel@tonic-gate } 2897c478bd9Sstevel@tonic-gate if ((stat.st_mode & S_IFMT) != S_IFLNK) 2907c478bd9Sstevel@tonic-gate continue; 2917c478bd9Sstevel@tonic-gate 2927c478bd9Sstevel@tonic-gate /* get name from symbolic link */ 2937c478bd9Sstevel@tonic-gate if ((sz = readlink(tape[i].name, linkvalue, 2947c478bd9Sstevel@tonic-gate sizeof (linkvalue))) < 0) 2957c478bd9Sstevel@tonic-gate continue; 2967c478bd9Sstevel@tonic-gate nm = (char *)malloc(sz + 1); 2977c478bd9Sstevel@tonic-gate if (nm == NULL) 2987c478bd9Sstevel@tonic-gate no_memory(); 2997c478bd9Sstevel@tonic-gate (void) strncpy(nm, linkvalue, sz); 3007c478bd9Sstevel@tonic-gate nm[sz] = '\0'; 3017c478bd9Sstevel@tonic-gate tape[i].device = nm; 3027c478bd9Sstevel@tonic-gate 3037c478bd9Sstevel@tonic-gate /* get device number */ 3047c478bd9Sstevel@tonic-gate cp = strrchr(tape[i].device, '/'); 3057c478bd9Sstevel@tonic-gate cp++; /* advance to device # */ 3067c478bd9Sstevel@tonic-gate (void) sscanf(cp, "%d", &tape[i].number); 3077c478bd9Sstevel@tonic-gate 3087c478bd9Sstevel@tonic-gate i++; 3097c478bd9Sstevel@tonic-gate } 3107c478bd9Sstevel@tonic-gate 3117c478bd9Sstevel@tonic-gate (void) closedir(dirp); 3127c478bd9Sstevel@tonic-gate 3137c478bd9Sstevel@tonic-gate /* 3147c478bd9Sstevel@tonic-gate * scan /dev/rmt and add entry to table 3157c478bd9Sstevel@tonic-gate */ 3167c478bd9Sstevel@tonic-gate 3177c478bd9Sstevel@tonic-gate if ((dirp = opendir("/dev/rmt")) == NULL) { 3187c478bd9Sstevel@tonic-gate perror(gettext("open /dev failure")); 3197c478bd9Sstevel@tonic-gate exit(1); 3207c478bd9Sstevel@tonic-gate } 3217c478bd9Sstevel@tonic-gate 3227c478bd9Sstevel@tonic-gate while (dep = readdir(dirp)) { 3237c478bd9Sstevel@tonic-gate /* skip . .. etc... */ 3247c478bd9Sstevel@tonic-gate if (strncmp(dep->d_name, ".", 1) == NULL) 3257c478bd9Sstevel@tonic-gate continue; 3267c478bd9Sstevel@tonic-gate 3277c478bd9Sstevel@tonic-gate /* if array full, then expand it */ 3287c478bd9Sstevel@tonic-gate if (i == ntape) { 3297c478bd9Sstevel@tonic-gate /* will exit(1) if insufficient memory */ 3307c478bd9Sstevel@tonic-gate ntape = expandmem(i, (void **)&tape, 3317c478bd9Sstevel@tonic-gate sizeof (struct tape)); 3327c478bd9Sstevel@tonic-gate } 3337c478bd9Sstevel@tonic-gate 3347c478bd9Sstevel@tonic-gate /* save name (/dev/rmt + / + d_name + \0) */ 3357c478bd9Sstevel@tonic-gate nm = (char *)malloc(SIZE_OF_RMT + 1 + strlen(dep->d_name) + 1); 3367c478bd9Sstevel@tonic-gate if (nm == NULL) 3377c478bd9Sstevel@tonic-gate no_memory(); 3387c478bd9Sstevel@tonic-gate (void) strcpy(nm, "/dev/rmt/"); 3397c478bd9Sstevel@tonic-gate (void) strcat(nm, dep->d_name); 3407c478bd9Sstevel@tonic-gate tape[i].name = nm; 3417c478bd9Sstevel@tonic-gate 3427c478bd9Sstevel@tonic-gate /* save device name (rmt/ + d_name + \0) */ 3437c478bd9Sstevel@tonic-gate nm = (char *)malloc(SIZE_OF_TMP + strlen(dep->d_name) + 1); 3447c478bd9Sstevel@tonic-gate if (nm == NULL) 3457c478bd9Sstevel@tonic-gate no_memory(); 3467c478bd9Sstevel@tonic-gate (void) strcpy(nm, "rmt/"); 3477c478bd9Sstevel@tonic-gate (void) strcat(nm, dep->d_name); 3487c478bd9Sstevel@tonic-gate tape[i].device = nm; 3497c478bd9Sstevel@tonic-gate 3507c478bd9Sstevel@tonic-gate (void) sscanf(dep->d_name, "%d", &tape[i].number); 3517c478bd9Sstevel@tonic-gate 3527c478bd9Sstevel@tonic-gate i++; 3537c478bd9Sstevel@tonic-gate } 35445916cd2Sjpk tape_count = i; 3557c478bd9Sstevel@tonic-gate 3567c478bd9Sstevel@tonic-gate (void) closedir(dirp); 3577c478bd9Sstevel@tonic-gate 3587c478bd9Sstevel@tonic-gate /* remove duplicate entries */ 35945916cd2Sjpk for (i = 0; i < tape_count - 1; i++) { 36045916cd2Sjpk for (j = i + 1; j < tape_count; j++) { 3617c478bd9Sstevel@tonic-gate if (strcmp(tape[i].device, tape[j].device)) 3627c478bd9Sstevel@tonic-gate continue; 3637c478bd9Sstevel@tonic-gate tape[j].number = -1; 3647c478bd9Sstevel@tonic-gate } 3657c478bd9Sstevel@tonic-gate } 3667c478bd9Sstevel@tonic-gate 36745916cd2Sjpk if (system_labeled) { 36845916cd2Sjpk dname = DA_TAPE_NAME; 36945916cd2Sjpk dtype = DA_TAPE_TYPE; 37045916cd2Sjpk dclean = DA_DEFAULT_TAPE_CLEAN; 37145916cd2Sjpk } else { 37245916cd2Sjpk dname = "st"; 37345916cd2Sjpk dtype = "st"; 37445916cd2Sjpk dclean = TAPE_CLEAN; 37545916cd2Sjpk } 3767c478bd9Sstevel@tonic-gate for (i = 0; i < 8; i++) { 37745916cd2Sjpk for (j = 0; j < tape_count; j++) { 37845916cd2Sjpk if (tape[j].number != i) 37945916cd2Sjpk continue; 38045916cd2Sjpk if (do_files) { 38145916cd2Sjpk (void) da_add_list(&devlist, tape[j].name, i, 38245916cd2Sjpk DA_TAPE); 38345916cd2Sjpk } else if (do_devalloc) { 38445916cd2Sjpk /* print device_allocate for tape devices */ 38545916cd2Sjpk if (system_labeled) { 38645916cd2Sjpk (void) printf("%s%d%s\\\n", 38745916cd2Sjpk dname, i, KV_DELIMITER); 38845916cd2Sjpk (void) printf("\t%s%s\\\n", 38945916cd2Sjpk DA_TAPE_TYPE, KV_DELIMITER); 39045916cd2Sjpk (void) printf("\t%s%s\\\n", 39145916cd2Sjpk DA_RESERVED, KV_DELIMITER); 39245916cd2Sjpk (void) printf("\t%s%s\\\n", 39345916cd2Sjpk DA_RESERVED, KV_DELIMITER); 39445916cd2Sjpk (void) printf("\t%s%s\\\n", 39545916cd2Sjpk DEFAULT_DEV_ALLOC_AUTH, 39645916cd2Sjpk KV_DELIMITER); 39745916cd2Sjpk (void) printf("\t%s\n\n", dclean); 39845916cd2Sjpk } else { 3997c478bd9Sstevel@tonic-gate (void) printf( 4007c478bd9Sstevel@tonic-gate "st%d;st;reserved;reserved;%s;", 4017c478bd9Sstevel@tonic-gate i, DEFAULT_DEV_ALLOC_AUTH); 40245916cd2Sjpk (void) printf("%s%s\n", SECLIB, 40345916cd2Sjpk "/st_clean"); 4047c478bd9Sstevel@tonic-gate } 40545916cd2Sjpk break; 40645916cd2Sjpk } else if (do_devmaps) { 40745916cd2Sjpk /* print device_maps for tape devices */ 40845916cd2Sjpk if (first) { 40945916cd2Sjpk (void) printf(" "); 41045916cd2Sjpk } else { 41145916cd2Sjpk if (system_labeled) { 41245916cd2Sjpk (void) printf("%s%d%s\\\n", 41345916cd2Sjpk dname, i, KV_TOKEN_DELIMIT); 41445916cd2Sjpk (void) printf("\t%s%s\\\n", 41545916cd2Sjpk dtype, KV_TOKEN_DELIMIT); 41645916cd2Sjpk (void) printf("\t"); 41745916cd2Sjpk } else { 41845916cd2Sjpk (void) printf("st%d:\\\n", i); 41945916cd2Sjpk (void) printf("\trmt:\\\n"); 42045916cd2Sjpk (void) printf("\t"); 42145916cd2Sjpk } 42245916cd2Sjpk first++; 42345916cd2Sjpk } 42445916cd2Sjpk (void) printf("%s", tape[j].name); 42545916cd2Sjpk } 42645916cd2Sjpk } 42745916cd2Sjpk if (do_devmaps && first) { 42845916cd2Sjpk (void) printf("\n\n"); 42945916cd2Sjpk first = 0; 43045916cd2Sjpk } 43145916cd2Sjpk } 43245916cd2Sjpk if (do_files && tape_count) { 43345916cd2Sjpk dargs.rootdir = NULL; 43445916cd2Sjpk dargs.devnames = NULL; 43545916cd2Sjpk dargs.optflag = DA_ADD; 43645916cd2Sjpk for (entry = devlist.tape; entry != NULL; entry = entry->next) { 43745916cd2Sjpk dargs.devinfo = &(entry->devinfo); 43845916cd2Sjpk (void) da_update_device(&dargs); 4397c478bd9Sstevel@tonic-gate } 4407c478bd9Sstevel@tonic-gate } 4417c478bd9Sstevel@tonic-gate } 4427c478bd9Sstevel@tonic-gate 4437c478bd9Sstevel@tonic-gate static void 4447c478bd9Sstevel@tonic-gate doaudio() 4457c478bd9Sstevel@tonic-gate { 4467c478bd9Sstevel@tonic-gate DIR *dirp; 4477c478bd9Sstevel@tonic-gate struct dirent *dep; /* directory entry pointer */ 44845916cd2Sjpk int i, j; 4497c478bd9Sstevel@tonic-gate char *nm; /* name/device of special device */ 4507c478bd9Sstevel@tonic-gate char linkvalue[2048]; /* symlink value */ 4517c478bd9Sstevel@tonic-gate struct stat stat; /* determine if it's a symlink */ 4527c478bd9Sstevel@tonic-gate int sz; /* size of symlink value */ 4537c478bd9Sstevel@tonic-gate char *cp; /* pointer into string */ 4547c478bd9Sstevel@tonic-gate int naudio; /* max array size */ 45545916cd2Sjpk int audio_count = 0; 45645916cd2Sjpk int len, slen; 45745916cd2Sjpk int first = 0; 45845916cd2Sjpk char dname[128]; 45945916cd2Sjpk char *dclean; 46045916cd2Sjpk da_args dargs; 46145916cd2Sjpk deventry_t *entry; 4627c478bd9Sstevel@tonic-gate 4637c478bd9Sstevel@tonic-gate naudio = DFLT_NAUDIO; 4647c478bd9Sstevel@tonic-gate 4657c478bd9Sstevel@tonic-gate if ((dirp = opendir("/dev")) == NULL) { 4667c478bd9Sstevel@tonic-gate perror(gettext("open /dev failure")); 4677c478bd9Sstevel@tonic-gate exit(1); 4687c478bd9Sstevel@tonic-gate } 4697c478bd9Sstevel@tonic-gate 4707c478bd9Sstevel@tonic-gate i = 0; 4717c478bd9Sstevel@tonic-gate while (dep = readdir(dirp)) { 4727c478bd9Sstevel@tonic-gate if (strcmp(dep->d_name, "audio") && 4737c478bd9Sstevel@tonic-gate strcmp(dep->d_name, "audioctl")) 4747c478bd9Sstevel@tonic-gate continue; 4757c478bd9Sstevel@tonic-gate 4767c478bd9Sstevel@tonic-gate /* if array full, then expand it */ 4777c478bd9Sstevel@tonic-gate if (i == naudio) { 4787c478bd9Sstevel@tonic-gate /* will exit(1) if insufficient memory */ 4797c478bd9Sstevel@tonic-gate naudio = expandmem(i, (void **)&audio, 4807c478bd9Sstevel@tonic-gate sizeof (struct audio)); 4817c478bd9Sstevel@tonic-gate } 4827c478bd9Sstevel@tonic-gate 4837c478bd9Sstevel@tonic-gate /* save name (/dev + 1 + d_name + \0) */ 4847c478bd9Sstevel@tonic-gate nm = (char *)malloc(SIZE_OF_TMP + 1 + strlen(dep->d_name) + 1); 4857c478bd9Sstevel@tonic-gate if (nm == NULL) 4867c478bd9Sstevel@tonic-gate no_memory(); 4877c478bd9Sstevel@tonic-gate (void) strcpy(nm, "/dev/"); 4887c478bd9Sstevel@tonic-gate (void) strcat(nm, dep->d_name); 4897c478bd9Sstevel@tonic-gate audio[i].name = nm; 4907c478bd9Sstevel@tonic-gate 4917c478bd9Sstevel@tonic-gate /* ignore if not symbolic link (note i not incremented) */ 4927c478bd9Sstevel@tonic-gate if (lstat(audio[i].name, &stat) < 0) { 4937c478bd9Sstevel@tonic-gate perror(gettext("stat(2) failed ")); 4947c478bd9Sstevel@tonic-gate exit(1); 4957c478bd9Sstevel@tonic-gate } 4967c478bd9Sstevel@tonic-gate if ((stat.st_mode & S_IFMT) != S_IFLNK) 4977c478bd9Sstevel@tonic-gate continue; 4987c478bd9Sstevel@tonic-gate 4997c478bd9Sstevel@tonic-gate /* get name from symbolic link */ 5007c478bd9Sstevel@tonic-gate if ((sz = readlink(audio[i].name, linkvalue, 5017c478bd9Sstevel@tonic-gate sizeof (linkvalue))) < 0) 5027c478bd9Sstevel@tonic-gate continue; 5037c478bd9Sstevel@tonic-gate nm = (char *)malloc(sz + 1); 5047c478bd9Sstevel@tonic-gate if (nm == NULL) 5057c478bd9Sstevel@tonic-gate no_memory(); 5067c478bd9Sstevel@tonic-gate (void) strncpy(nm, linkvalue, sz); 5077c478bd9Sstevel@tonic-gate nm[sz] = '\0'; 5087c478bd9Sstevel@tonic-gate audio[i].device = nm; 5097c478bd9Sstevel@tonic-gate 5107c478bd9Sstevel@tonic-gate cp = strrchr(audio[i].device, '/'); 5117c478bd9Sstevel@tonic-gate cp++; /* advance to device # */ 5127c478bd9Sstevel@tonic-gate (void) sscanf(cp, "%d", &audio[i].number); 5137c478bd9Sstevel@tonic-gate 5147c478bd9Sstevel@tonic-gate i++; 5157c478bd9Sstevel@tonic-gate } 5167c478bd9Sstevel@tonic-gate 5177c478bd9Sstevel@tonic-gate (void) closedir(dirp); 5187c478bd9Sstevel@tonic-gate 5197c478bd9Sstevel@tonic-gate if ((dirp = opendir("/dev/sound")) == NULL) { 5207c478bd9Sstevel@tonic-gate goto skip; 5217c478bd9Sstevel@tonic-gate } 5227c478bd9Sstevel@tonic-gate 5237c478bd9Sstevel@tonic-gate while (dep = readdir(dirp)) { 5247c478bd9Sstevel@tonic-gate /* skip . .. etc... */ 5257c478bd9Sstevel@tonic-gate if (strncmp(dep->d_name, ".", 1) == NULL) 5267c478bd9Sstevel@tonic-gate continue; 5277c478bd9Sstevel@tonic-gate 5287c478bd9Sstevel@tonic-gate /* if array full, then expand it */ 5297c478bd9Sstevel@tonic-gate if (i == naudio) { 5307c478bd9Sstevel@tonic-gate /* will exit(1) if insufficient memory */ 5317c478bd9Sstevel@tonic-gate naudio = expandmem(i, (void **)&audio, 5327c478bd9Sstevel@tonic-gate sizeof (struct audio)); 5337c478bd9Sstevel@tonic-gate } 5347c478bd9Sstevel@tonic-gate 5357c478bd9Sstevel@tonic-gate /* save name (/dev/sound + / + d_name + \0) */ 5367c478bd9Sstevel@tonic-gate nm = (char *)malloc(SIZE_OF_SOUND + 1 + 5377c478bd9Sstevel@tonic-gate strlen(dep->d_name) + 1); 5387c478bd9Sstevel@tonic-gate if (nm == NULL) 5397c478bd9Sstevel@tonic-gate no_memory(); 5407c478bd9Sstevel@tonic-gate (void) strcpy(nm, "/dev/sound/"); 5417c478bd9Sstevel@tonic-gate (void) strcat(nm, dep->d_name); 5427c478bd9Sstevel@tonic-gate audio[i].name = nm; 5437c478bd9Sstevel@tonic-gate 5447c478bd9Sstevel@tonic-gate nm = (char *)malloc(SIZE_OF_SOUND + 1 + 5457c478bd9Sstevel@tonic-gate strlen(dep->d_name) + 1); 5467c478bd9Sstevel@tonic-gate if (nm == NULL) 5477c478bd9Sstevel@tonic-gate no_memory(); 5487c478bd9Sstevel@tonic-gate (void) strcpy(nm, "/dev/sound/"); 5497c478bd9Sstevel@tonic-gate (void) strcat(nm, dep->d_name); 5507c478bd9Sstevel@tonic-gate audio[i].device = nm; 5517c478bd9Sstevel@tonic-gate 5527c478bd9Sstevel@tonic-gate (void) sscanf(dep->d_name, "%d", &audio[i].number); 5537c478bd9Sstevel@tonic-gate 5547c478bd9Sstevel@tonic-gate i++; 5557c478bd9Sstevel@tonic-gate } 5567c478bd9Sstevel@tonic-gate 5577c478bd9Sstevel@tonic-gate (void) closedir(dirp); 5587c478bd9Sstevel@tonic-gate 5597c478bd9Sstevel@tonic-gate skip: 56045916cd2Sjpk audio_count = i; 5617c478bd9Sstevel@tonic-gate 5627c478bd9Sstevel@tonic-gate /* remove duplicate entries */ 56345916cd2Sjpk for (i = 0; i < audio_count - 1; i++) { 56445916cd2Sjpk for (j = i + 1; j < audio_count; j++) { 5657c478bd9Sstevel@tonic-gate if (strcmp(audio[i].device, audio[j].device)) 5667c478bd9Sstevel@tonic-gate continue; 5677c478bd9Sstevel@tonic-gate audio[j].number = -1; 5687c478bd9Sstevel@tonic-gate } 5697c478bd9Sstevel@tonic-gate } 5707c478bd9Sstevel@tonic-gate 57145916cd2Sjpk /* print out device_allocate entries for audio devices */ 57245916cd2Sjpk (void) strcpy(dname, DA_AUDIO_NAME); 57345916cd2Sjpk slen = strlen(DA_AUDIO_NAME); 57445916cd2Sjpk len = sizeof (dname) - slen; 57545916cd2Sjpk dclean = system_labeled ? DA_DEFAULT_AUDIO_CLEAN : AUDIO_CLEAN; 5767c478bd9Sstevel@tonic-gate for (i = 0; i < 8; i++) { 57745916cd2Sjpk for (j = 0; j < audio_count; j++) { 57845916cd2Sjpk if (audio[j].number != i) 57945916cd2Sjpk continue; 58045916cd2Sjpk if (system_labeled) 58145916cd2Sjpk (void) snprintf(dname+slen, len, "%d", i); 58245916cd2Sjpk if (do_files) { 58345916cd2Sjpk (void) da_add_list(&devlist, audio[j].name, 58445916cd2Sjpk i, DA_AUDIO); 58545916cd2Sjpk } else if (do_devalloc) { 58645916cd2Sjpk /* print device_allocate for audio devices */ 58745916cd2Sjpk if (system_labeled) { 58845916cd2Sjpk (void) printf("%s%s\\\n", 58945916cd2Sjpk dname, KV_DELIMITER); 59045916cd2Sjpk (void) printf("\t%s%s\\\n", 59145916cd2Sjpk DA_AUDIO_TYPE, KV_DELIMITER); 59245916cd2Sjpk (void) printf("\t%s%s\\\n", 59345916cd2Sjpk DA_RESERVED, KV_DELIMITER); 59445916cd2Sjpk (void) printf("\t%s%s\\\n", 59545916cd2Sjpk DA_RESERVED, KV_DELIMITER); 59645916cd2Sjpk (void) printf("\t%s%s\\\n", 59745916cd2Sjpk DEFAULT_DEV_ALLOC_AUTH, 59845916cd2Sjpk KV_DELIMITER); 59945916cd2Sjpk (void) printf("\t%s\n\n", dclean); 60045916cd2Sjpk } else { 6017c478bd9Sstevel@tonic-gate (void) printf("audio;audio;"); 6027c478bd9Sstevel@tonic-gate (void) printf("reserved;reserved;%s;", 6037c478bd9Sstevel@tonic-gate DEFAULT_DEV_ALLOC_AUTH); 60445916cd2Sjpk (void) printf("%s%s\n", SECLIB, 60545916cd2Sjpk "/audio_clean"); 6067c478bd9Sstevel@tonic-gate } 60745916cd2Sjpk break; 60845916cd2Sjpk } else if (do_devmaps) { 60945916cd2Sjpk /* print device_maps for audio devices */ 61045916cd2Sjpk if (first) { 61145916cd2Sjpk (void) printf(" "); 61245916cd2Sjpk } else { 61345916cd2Sjpk if (system_labeled) { 61445916cd2Sjpk (void) printf("%s%s\\\n", 61545916cd2Sjpk dname, KV_TOKEN_DELIMIT); 61645916cd2Sjpk (void) printf("\t%s%s\\\n", 61745916cd2Sjpk DA_AUDIO_TYPE, 61845916cd2Sjpk KV_TOKEN_DELIMIT); 61945916cd2Sjpk (void) printf("\t"); 62045916cd2Sjpk } else { 62145916cd2Sjpk (void) printf("audio:\\\n"); 62245916cd2Sjpk (void) printf("\taudio:\\\n"); 62345916cd2Sjpk (void) printf("\t"); 62445916cd2Sjpk } 62545916cd2Sjpk first++; 62645916cd2Sjpk } 62745916cd2Sjpk (void) printf("%s", audio[j].name); 62845916cd2Sjpk } 62945916cd2Sjpk } 63045916cd2Sjpk if (do_devmaps && first) { 63145916cd2Sjpk (void) printf("\n\n"); 63245916cd2Sjpk first = 0; 63345916cd2Sjpk } 63445916cd2Sjpk } 63545916cd2Sjpk if (do_files && audio_count) { 63645916cd2Sjpk dargs.rootdir = NULL; 63745916cd2Sjpk dargs.devnames = NULL; 63845916cd2Sjpk dargs.optflag = DA_ADD; 63945916cd2Sjpk for (entry = devlist.audio; entry != NULL; 64045916cd2Sjpk entry = entry->next) { 64145916cd2Sjpk dargs.devinfo = &(entry->devinfo); 64245916cd2Sjpk (void) da_update_device(&dargs); 6437c478bd9Sstevel@tonic-gate } 6447c478bd9Sstevel@tonic-gate } 6457c478bd9Sstevel@tonic-gate } 6467c478bd9Sstevel@tonic-gate 6477c478bd9Sstevel@tonic-gate static void 6487c478bd9Sstevel@tonic-gate dofloppy() 6497c478bd9Sstevel@tonic-gate { 6507c478bd9Sstevel@tonic-gate DIR *dirp; 6517c478bd9Sstevel@tonic-gate struct dirent *dep; /* directory entry pointer */ 65245916cd2Sjpk int i, j; 6537c478bd9Sstevel@tonic-gate char *nm; /* name/device of special device */ 6547c478bd9Sstevel@tonic-gate char linkvalue[2048]; /* symlink value */ 6557c478bd9Sstevel@tonic-gate struct stat stat; /* determine if it's a symlink */ 6567c478bd9Sstevel@tonic-gate int sz; /* size of symlink value */ 6577c478bd9Sstevel@tonic-gate char *cp; /* pointer into string */ 6587c478bd9Sstevel@tonic-gate int nfp; /* max array size */ 65945916cd2Sjpk int floppy_count = 0; 66045916cd2Sjpk int first = 0; 66145916cd2Sjpk char *dname, *dclean; 66245916cd2Sjpk da_args dargs; 66345916cd2Sjpk deventry_t *entry; 6647c478bd9Sstevel@tonic-gate 6657c478bd9Sstevel@tonic-gate nfp = DFLT_NFP; 6667c478bd9Sstevel@tonic-gate 6677c478bd9Sstevel@tonic-gate /* 6687c478bd9Sstevel@tonic-gate * look for fd* and rfd* 6697c478bd9Sstevel@tonic-gate */ 6707c478bd9Sstevel@tonic-gate 6717c478bd9Sstevel@tonic-gate if ((dirp = opendir("/dev")) == NULL) { 6727c478bd9Sstevel@tonic-gate perror(gettext("open /dev failure")); 6737c478bd9Sstevel@tonic-gate exit(1); 6747c478bd9Sstevel@tonic-gate } 6757c478bd9Sstevel@tonic-gate 6767c478bd9Sstevel@tonic-gate i = 0; 6777c478bd9Sstevel@tonic-gate while (dep = readdir(dirp)) { 6787c478bd9Sstevel@tonic-gate /* ignore if neither rst* nor nrst* */ 6797c478bd9Sstevel@tonic-gate if (strncmp(dep->d_name, "fd0", SIZE_OF_FD0) && 6807c478bd9Sstevel@tonic-gate strncmp(dep->d_name, "rfd0", SIZE_OF_RFD0) && 6817c478bd9Sstevel@tonic-gate strncmp(dep->d_name, "fd1", SIZE_OF_FD0) && 6827c478bd9Sstevel@tonic-gate strncmp(dep->d_name, "rfd0", SIZE_OF_RFD0)) 6837c478bd9Sstevel@tonic-gate continue; 6847c478bd9Sstevel@tonic-gate 6857c478bd9Sstevel@tonic-gate /* if array full, then expand it */ 6867c478bd9Sstevel@tonic-gate if (i == nfp) { 6877c478bd9Sstevel@tonic-gate /* will exit(1) if insufficient memory */ 6887c478bd9Sstevel@tonic-gate nfp = expandmem(i, (void **)&fp, sizeof (struct fp)); 6897c478bd9Sstevel@tonic-gate } 6907c478bd9Sstevel@tonic-gate 6917c478bd9Sstevel@tonic-gate /* save name (/dev + 1 + d_name + \0) */ 6927c478bd9Sstevel@tonic-gate nm = (char *)malloc(SIZE_OF_TMP + 1 + strlen(dep->d_name) + 1); 6937c478bd9Sstevel@tonic-gate if (nm == NULL) 6947c478bd9Sstevel@tonic-gate no_memory(); 6957c478bd9Sstevel@tonic-gate (void) strcpy(nm, "/dev/"); 6967c478bd9Sstevel@tonic-gate (void) strcat(nm, dep->d_name); 6977c478bd9Sstevel@tonic-gate fp[i].name = nm; 6987c478bd9Sstevel@tonic-gate 6997c478bd9Sstevel@tonic-gate /* ignore if not symbolic link (note i not incremented) */ 7007c478bd9Sstevel@tonic-gate if (lstat(fp[i].name, &stat) < 0) { 7017c478bd9Sstevel@tonic-gate perror(gettext("stat(2) failed ")); 7027c478bd9Sstevel@tonic-gate exit(1); 7037c478bd9Sstevel@tonic-gate } 7047c478bd9Sstevel@tonic-gate if ((stat.st_mode&S_IFMT) != S_IFLNK) 7057c478bd9Sstevel@tonic-gate continue; 7067c478bd9Sstevel@tonic-gate 7077c478bd9Sstevel@tonic-gate /* get name from symbolic link */ 7087c478bd9Sstevel@tonic-gate if ((sz = readlink(fp[i].name, linkvalue, 7097c478bd9Sstevel@tonic-gate sizeof (linkvalue))) < 0) 7107c478bd9Sstevel@tonic-gate continue; 7117c478bd9Sstevel@tonic-gate nm = (char *)malloc(sz+1); 7127c478bd9Sstevel@tonic-gate if (nm == NULL) 7137c478bd9Sstevel@tonic-gate no_memory(); 7147c478bd9Sstevel@tonic-gate (void) strncpy(nm, linkvalue, sz); 7157c478bd9Sstevel@tonic-gate nm[sz] = '\0'; 7167c478bd9Sstevel@tonic-gate fp[i].device = nm; 7177c478bd9Sstevel@tonic-gate 7187c478bd9Sstevel@tonic-gate /* get device number */ 7197c478bd9Sstevel@tonic-gate cp = strchr(fp[i].name, 'd'); 7207c478bd9Sstevel@tonic-gate cp++; /* advance to device # */ 7217c478bd9Sstevel@tonic-gate cp = strchr(cp, 'd'); 7227c478bd9Sstevel@tonic-gate cp++; /* advance to device # */ 7237c478bd9Sstevel@tonic-gate (void) sscanf(cp, "%d", &fp[i].number); 7247c478bd9Sstevel@tonic-gate 7257c478bd9Sstevel@tonic-gate i++; 7267c478bd9Sstevel@tonic-gate } 7277c478bd9Sstevel@tonic-gate 7287c478bd9Sstevel@tonic-gate (void) closedir(dirp); 7297c478bd9Sstevel@tonic-gate 73045916cd2Sjpk floppy_count = i; 7317c478bd9Sstevel@tonic-gate 73245916cd2Sjpk /* print out device_allocate entries for floppy devices */ 73345916cd2Sjpk if (system_labeled) { 73445916cd2Sjpk dname = DA_FLOPPY_NAME; 73545916cd2Sjpk dclean = DA_DEFAULT_DISK_CLEAN; 73645916cd2Sjpk } else { 73745916cd2Sjpk dname = "fd"; 73845916cd2Sjpk dclean = FLOPPY_CLEAN; 73945916cd2Sjpk } 7407c478bd9Sstevel@tonic-gate for (i = 0; i < 8; i++) { 74145916cd2Sjpk for (j = 0; j < floppy_count; j++) { 74245916cd2Sjpk if (fp[j].number != i) 74345916cd2Sjpk continue; 74445916cd2Sjpk if (do_files) { 74545916cd2Sjpk (void) da_add_list(&devlist, fp[j].name, i, 74645916cd2Sjpk DA_FLOPPY); 74745916cd2Sjpk } else if (do_devalloc) { 74845916cd2Sjpk /* print device_allocate for floppy devices */ 74945916cd2Sjpk if (system_labeled) { 75045916cd2Sjpk (void) printf("%s%d%s\\\n", 75145916cd2Sjpk dname, i, KV_DELIMITER); 75245916cd2Sjpk (void) printf("\t%s%s\\\n", 75345916cd2Sjpk DA_FLOPPY_TYPE, KV_DELIMITER); 75445916cd2Sjpk (void) printf("\t%s%s\\\n", 75545916cd2Sjpk DA_RESERVED, KV_DELIMITER); 75645916cd2Sjpk (void) printf("\t%s%s\\\n", 75745916cd2Sjpk DA_RESERVED, KV_DELIMITER); 75845916cd2Sjpk (void) printf("\t%s%s\\\n", 75945916cd2Sjpk DEFAULT_DEV_ALLOC_AUTH, 76045916cd2Sjpk KV_DELIMITER); 76145916cd2Sjpk (void) printf("\t%s\n\n", dclean); 76245916cd2Sjpk } else { 76345916cd2Sjpk (void) printf( 76445916cd2Sjpk "fd%d;fd;reserved;reserved;%s;", 7657c478bd9Sstevel@tonic-gate i, DEFAULT_DEV_ALLOC_AUTH); 76645916cd2Sjpk (void) printf("%s%s\n", SECLIB, 76745916cd2Sjpk "/fd_clean"); 7687c478bd9Sstevel@tonic-gate } 76945916cd2Sjpk break; 77045916cd2Sjpk } else if (do_devmaps) { 77145916cd2Sjpk /* print device_maps for floppy devices */ 77245916cd2Sjpk if (first) { 77345916cd2Sjpk (void) printf(" "); 77445916cd2Sjpk } else { 77545916cd2Sjpk if (system_labeled) { 77645916cd2Sjpk (void) printf("%s%d%s\\\n", 77745916cd2Sjpk dname, i, KV_TOKEN_DELIMIT); 77845916cd2Sjpk (void) printf("\t%s%s\\\n", 77945916cd2Sjpk DA_FLOPPY_TYPE, 78045916cd2Sjpk KV_TOKEN_DELIMIT); 78145916cd2Sjpk (void) printf("\t"); 78245916cd2Sjpk } else { 78345916cd2Sjpk (void) printf("fd%d:\\\n", i); 78445916cd2Sjpk (void) printf("\tfd:\\\n"); 78545916cd2Sjpk (void) printf("\t"); 78645916cd2Sjpk } 78745916cd2Sjpk if (i == 0) { 78845916cd2Sjpk (void) printf("/dev/diskette "); 78945916cd2Sjpk (void) printf( 79045916cd2Sjpk "/dev/rdiskette "); 79145916cd2Sjpk } 79245916cd2Sjpk first++; 79345916cd2Sjpk } 79445916cd2Sjpk (void) printf("%s", fp[j].name); 79545916cd2Sjpk } 79645916cd2Sjpk } 79745916cd2Sjpk if (do_devmaps && first) { 79845916cd2Sjpk (void) printf("\n\n"); 79945916cd2Sjpk first = 0; 80045916cd2Sjpk } 80145916cd2Sjpk } 80245916cd2Sjpk if (do_files && floppy_count) { 80345916cd2Sjpk dargs.rootdir = NULL; 80445916cd2Sjpk dargs.devnames = NULL; 80545916cd2Sjpk dargs.optflag = DA_ADD; 80645916cd2Sjpk for (entry = devlist.floppy; entry != NULL; 80745916cd2Sjpk entry = entry->next) { 80845916cd2Sjpk dargs.devinfo = &(entry->devinfo); 80945916cd2Sjpk (void) da_update_device(&dargs); 8107c478bd9Sstevel@tonic-gate } 8117c478bd9Sstevel@tonic-gate } 8127c478bd9Sstevel@tonic-gate } 8137c478bd9Sstevel@tonic-gate 81445916cd2Sjpk static int 8157c478bd9Sstevel@tonic-gate docd() 8167c478bd9Sstevel@tonic-gate { 8177c478bd9Sstevel@tonic-gate DIR *dirp; 8187c478bd9Sstevel@tonic-gate struct dirent *dep; /* directory entry pointer */ 81945916cd2Sjpk int i, j; 8207c478bd9Sstevel@tonic-gate char *nm; /* name/device of special device */ 8217c478bd9Sstevel@tonic-gate char linkvalue[2048]; /* symlink value */ 8227c478bd9Sstevel@tonic-gate struct stat stat; /* determine if it's a symlink */ 8237c478bd9Sstevel@tonic-gate int sz; /* size of symlink value */ 8247c478bd9Sstevel@tonic-gate char *cp; /* pointer into string */ 8257c478bd9Sstevel@tonic-gate int id; /* disk id */ 8267c478bd9Sstevel@tonic-gate int ctrl; /* disk controller */ 8277c478bd9Sstevel@tonic-gate int ncd; /* max array size */ 82845916cd2Sjpk int cd_count = 0; 82945916cd2Sjpk int first = 0; 83045916cd2Sjpk char *dname, *dclean; 83145916cd2Sjpk da_args dargs; 83245916cd2Sjpk deventry_t *entry; 8337c478bd9Sstevel@tonic-gate 8347c478bd9Sstevel@tonic-gate ncd = DFLT_NCD; 8357c478bd9Sstevel@tonic-gate 8367c478bd9Sstevel@tonic-gate /* 8377c478bd9Sstevel@tonic-gate * look for sr* and rsr* 8387c478bd9Sstevel@tonic-gate */ 8397c478bd9Sstevel@tonic-gate 8407c478bd9Sstevel@tonic-gate if ((dirp = opendir("/dev")) == NULL) { 8417c478bd9Sstevel@tonic-gate perror(gettext("open /dev failure")); 8427c478bd9Sstevel@tonic-gate exit(1); 8437c478bd9Sstevel@tonic-gate } 8447c478bd9Sstevel@tonic-gate 8457c478bd9Sstevel@tonic-gate i = 0; 8467c478bd9Sstevel@tonic-gate while (dep = readdir(dirp)) { 8477c478bd9Sstevel@tonic-gate /* ignore if neither sr* nor rsr* */ 8487c478bd9Sstevel@tonic-gate if (strncmp(dep->d_name, "sr", SIZE_OF_SR) && 8497c478bd9Sstevel@tonic-gate strncmp(dep->d_name, "rsr", SIZE_OF_RSR)) 8507c478bd9Sstevel@tonic-gate continue; 8517c478bd9Sstevel@tonic-gate 8527c478bd9Sstevel@tonic-gate /* if array full, then expand it */ 8537c478bd9Sstevel@tonic-gate if (i == ncd) { 8547c478bd9Sstevel@tonic-gate /* will exit(1) if insufficient memory */ 8557c478bd9Sstevel@tonic-gate ncd = expandmem(i, (void **)&cd, sizeof (struct cd)); 8567c478bd9Sstevel@tonic-gate } 8577c478bd9Sstevel@tonic-gate 8587c478bd9Sstevel@tonic-gate /* save name (/dev + / + d_name + \0) */ 8597c478bd9Sstevel@tonic-gate nm = (char *)malloc(SIZE_OF_TMP + 1 + strlen(dep->d_name) + 1); 8607c478bd9Sstevel@tonic-gate if (nm == NULL) 8617c478bd9Sstevel@tonic-gate no_memory(); 8627c478bd9Sstevel@tonic-gate (void) strcpy(nm, "/dev/"); 8637c478bd9Sstevel@tonic-gate (void) strcat(nm, dep->d_name); 8647c478bd9Sstevel@tonic-gate cd[i].name = nm; 8657c478bd9Sstevel@tonic-gate 8667c478bd9Sstevel@tonic-gate /* ignore if not symbolic link (note i not incremented) */ 8677c478bd9Sstevel@tonic-gate if (lstat(cd[i].name, &stat) < 0) { 8687c478bd9Sstevel@tonic-gate perror(gettext("stat(2) failed ")); 8697c478bd9Sstevel@tonic-gate exit(1); 8707c478bd9Sstevel@tonic-gate } 8717c478bd9Sstevel@tonic-gate if ((stat.st_mode & S_IFMT) != S_IFLNK) 8727c478bd9Sstevel@tonic-gate continue; 8737c478bd9Sstevel@tonic-gate 8747c478bd9Sstevel@tonic-gate /* get name from symbolic link */ 8757c478bd9Sstevel@tonic-gate if ((sz = readlink(cd[i].name, linkvalue, sizeof (linkvalue))) < 8767c478bd9Sstevel@tonic-gate 0) 8777c478bd9Sstevel@tonic-gate continue; 87845916cd2Sjpk 8797c478bd9Sstevel@tonic-gate nm = (char *)malloc(sz + 1); 8807c478bd9Sstevel@tonic-gate if (nm == NULL) 8817c478bd9Sstevel@tonic-gate no_memory(); 8827c478bd9Sstevel@tonic-gate (void) strncpy(nm, linkvalue, sz); 8837c478bd9Sstevel@tonic-gate nm[sz] = '\0'; 8847c478bd9Sstevel@tonic-gate cd[i].device = nm; 8857c478bd9Sstevel@tonic-gate 8867c478bd9Sstevel@tonic-gate cp = strrchr(cd[i].device, '/'); 8877c478bd9Sstevel@tonic-gate cp++; /* advance to device # */ 8887c478bd9Sstevel@tonic-gate (void) sscanf(cp, "c%dt%d", &cd[i].controller, &cd[i].number); 8891bf2a5e5Saj cd[i].id = cd[i].number; 8907c478bd9Sstevel@tonic-gate 8917c478bd9Sstevel@tonic-gate i++; 8927c478bd9Sstevel@tonic-gate } 89345916cd2Sjpk cd_count = i; 8947c478bd9Sstevel@tonic-gate 8957c478bd9Sstevel@tonic-gate (void) closedir(dirp); 8967c478bd9Sstevel@tonic-gate 8977c478bd9Sstevel@tonic-gate /* 8987c478bd9Sstevel@tonic-gate * scan /dev/dsk for cd devices 8997c478bd9Sstevel@tonic-gate */ 9007c478bd9Sstevel@tonic-gate 9017c478bd9Sstevel@tonic-gate if ((dirp = opendir("/dev/dsk")) == NULL) { 9027c478bd9Sstevel@tonic-gate perror("gettext(open /dev/dsk failure)"); 9037c478bd9Sstevel@tonic-gate exit(1); 9047c478bd9Sstevel@tonic-gate } 9057c478bd9Sstevel@tonic-gate 9067c478bd9Sstevel@tonic-gate while (dep = readdir(dirp)) { 9077c478bd9Sstevel@tonic-gate /* skip . .. etc... */ 9087c478bd9Sstevel@tonic-gate if (strncmp(dep->d_name, ".", 1) == NULL) 9097c478bd9Sstevel@tonic-gate continue; 9107c478bd9Sstevel@tonic-gate 9117c478bd9Sstevel@tonic-gate /* get device # (disk #) */ 9127c478bd9Sstevel@tonic-gate if (sscanf(dep->d_name, "c%dt%d", &ctrl, &id) <= 0) 9137c478bd9Sstevel@tonic-gate continue; 9147c478bd9Sstevel@tonic-gate 9157c478bd9Sstevel@tonic-gate /* see if this is one of the cd special devices */ 91645916cd2Sjpk for (j = 0; j < cd_count; j++) { 9177c478bd9Sstevel@tonic-gate if (cd[j].number == id && cd[j].controller == ctrl) 9187c478bd9Sstevel@tonic-gate goto found; 9197c478bd9Sstevel@tonic-gate } 9207c478bd9Sstevel@tonic-gate continue; 9217c478bd9Sstevel@tonic-gate 9227c478bd9Sstevel@tonic-gate /* add new entry to table (/dev/dsk + / + d_name + \0) */ 9237c478bd9Sstevel@tonic-gate found: 9247c478bd9Sstevel@tonic-gate /* if array full, then expand it */ 9257c478bd9Sstevel@tonic-gate if (i == ncd) { 9267c478bd9Sstevel@tonic-gate /* will exit(1) if insufficient memory */ 9277c478bd9Sstevel@tonic-gate ncd = expandmem(i, (void **)&cd, sizeof (struct cd)); 9287c478bd9Sstevel@tonic-gate } 9297c478bd9Sstevel@tonic-gate 9307c478bd9Sstevel@tonic-gate nm = (char *)malloc(SIZE_OF_DSK + 1 + strlen(dep->d_name) + 1); 9317c478bd9Sstevel@tonic-gate if (nm == NULL) 9327c478bd9Sstevel@tonic-gate no_memory(); 9337c478bd9Sstevel@tonic-gate (void) strcpy(nm, "/dev/dsk/"); 9347c478bd9Sstevel@tonic-gate (void) strcat(nm, dep->d_name); 9357c478bd9Sstevel@tonic-gate cd[i].name = nm; 9367c478bd9Sstevel@tonic-gate 9377c478bd9Sstevel@tonic-gate cd[i].id = cd[j].id; 9387c478bd9Sstevel@tonic-gate 9397c478bd9Sstevel@tonic-gate cd[i].device = ""; 9407c478bd9Sstevel@tonic-gate 9417c478bd9Sstevel@tonic-gate cd[i].number = id; 9427c478bd9Sstevel@tonic-gate 9437c478bd9Sstevel@tonic-gate i++; 9447c478bd9Sstevel@tonic-gate } 9457c478bd9Sstevel@tonic-gate 9467c478bd9Sstevel@tonic-gate (void) closedir(dirp); 9477c478bd9Sstevel@tonic-gate 9487c478bd9Sstevel@tonic-gate /* 9497c478bd9Sstevel@tonic-gate * scan /dev/rdsk for cd devices 9507c478bd9Sstevel@tonic-gate */ 9517c478bd9Sstevel@tonic-gate 9527c478bd9Sstevel@tonic-gate if ((dirp = opendir("/dev/rdsk")) == NULL) { 9537c478bd9Sstevel@tonic-gate perror(gettext("open /dev/dsk failure")); 9547c478bd9Sstevel@tonic-gate exit(1); 9557c478bd9Sstevel@tonic-gate } 9567c478bd9Sstevel@tonic-gate 9577c478bd9Sstevel@tonic-gate while (dep = readdir(dirp)) { 9587c478bd9Sstevel@tonic-gate /* skip . .. etc... */ 9597c478bd9Sstevel@tonic-gate if (strncmp(dep->d_name, ".", 1) == NULL) 9607c478bd9Sstevel@tonic-gate continue; 9617c478bd9Sstevel@tonic-gate 9627c478bd9Sstevel@tonic-gate /* get device # (disk #) */ 9637c478bd9Sstevel@tonic-gate if (sscanf(dep->d_name, "c%dt%d", &ctrl, &id) != 2) 9647c478bd9Sstevel@tonic-gate continue; 9657c478bd9Sstevel@tonic-gate 9667c478bd9Sstevel@tonic-gate /* see if this is one of the cd special devices */ 96745916cd2Sjpk for (j = 0; j < cd_count; j++) { 9687c478bd9Sstevel@tonic-gate if (cd[j].number == id && cd[j].controller == ctrl) 9697c478bd9Sstevel@tonic-gate goto found1; 9707c478bd9Sstevel@tonic-gate } 9717c478bd9Sstevel@tonic-gate continue; 9727c478bd9Sstevel@tonic-gate 9737c478bd9Sstevel@tonic-gate /* add new entry to table (/dev/rdsk + / + d_name + \0) */ 9747c478bd9Sstevel@tonic-gate found1: 9757c478bd9Sstevel@tonic-gate /* if array full, then expand it */ 9767c478bd9Sstevel@tonic-gate if (i == ncd) { 9777c478bd9Sstevel@tonic-gate /* will exit(1) if insufficient memory */ 9787c478bd9Sstevel@tonic-gate ncd = expandmem(i, (void **)&cd, sizeof (struct cd)); 9797c478bd9Sstevel@tonic-gate } 9807c478bd9Sstevel@tonic-gate 9817c478bd9Sstevel@tonic-gate nm = (char *)malloc(SIZE_OF_RDSK + 1 + strlen(dep->d_name) + 1); 9827c478bd9Sstevel@tonic-gate if (nm == NULL) 9837c478bd9Sstevel@tonic-gate no_memory(); 9847c478bd9Sstevel@tonic-gate (void) strcpy(nm, "/dev/rdsk/"); 9857c478bd9Sstevel@tonic-gate (void) strcat(nm, dep->d_name); 9867c478bd9Sstevel@tonic-gate cd[i].name = nm; 9877c478bd9Sstevel@tonic-gate 9887c478bd9Sstevel@tonic-gate cd[i].id = cd[j].id; 9897c478bd9Sstevel@tonic-gate 9907c478bd9Sstevel@tonic-gate cd[i].device = ""; 9917c478bd9Sstevel@tonic-gate 9927c478bd9Sstevel@tonic-gate cd[i].number = id; 9937c478bd9Sstevel@tonic-gate 9947c478bd9Sstevel@tonic-gate cd[i].controller = ctrl; 9957c478bd9Sstevel@tonic-gate 9967c478bd9Sstevel@tonic-gate i++; 9977c478bd9Sstevel@tonic-gate } 9987c478bd9Sstevel@tonic-gate 9997c478bd9Sstevel@tonic-gate (void) closedir(dirp); 10007c478bd9Sstevel@tonic-gate 100145916cd2Sjpk cd_count = i; 10027c478bd9Sstevel@tonic-gate 100345916cd2Sjpk if (system_labeled) { 100445916cd2Sjpk dname = DA_CD_NAME; 100545916cd2Sjpk dclean = DA_DEFAULT_DISK_CLEAN; 100645916cd2Sjpk } else { 100745916cd2Sjpk dname = "sr"; 100845916cd2Sjpk dclean = CD_CLEAN; 100945916cd2Sjpk } 10107c478bd9Sstevel@tonic-gate for (i = 0; i < 8; i++) { 101145916cd2Sjpk for (j = 0; j < cd_count; j++) { 101245916cd2Sjpk if (cd[j].id != i) 101345916cd2Sjpk continue; 101445916cd2Sjpk if (do_files) { 101545916cd2Sjpk (void) da_add_list(&devlist, cd[j].name, i, 101645916cd2Sjpk DA_CD); 101745916cd2Sjpk } else if (do_devalloc) { 101845916cd2Sjpk /* print device_allocate for cd devices */ 101945916cd2Sjpk if (system_labeled) { 102045916cd2Sjpk (void) printf("%s%d%s\\\n", 102145916cd2Sjpk dname, i, KV_DELIMITER); 102245916cd2Sjpk (void) printf("\t%s%s\\\n", 102345916cd2Sjpk DA_CD_TYPE, KV_DELIMITER); 102445916cd2Sjpk (void) printf("\t%s%s\\\n", 102545916cd2Sjpk DA_RESERVED, KV_DELIMITER); 102645916cd2Sjpk (void) printf("\t%s%s\\\n", 102745916cd2Sjpk DA_RESERVED, KV_DELIMITER); 102845916cd2Sjpk (void) printf("\t%s%s\\\n", 102945916cd2Sjpk DEFAULT_DEV_ALLOC_AUTH, 103045916cd2Sjpk KV_DELIMITER); 103145916cd2Sjpk (void) printf("\t%s\n\n", dclean); 103245916cd2Sjpk } else { 10337c478bd9Sstevel@tonic-gate (void) printf( 10347c478bd9Sstevel@tonic-gate "sr%d;sr;reserved;reserved;%s;", 10357c478bd9Sstevel@tonic-gate i, DEFAULT_DEV_ALLOC_AUTH); 103645916cd2Sjpk (void) printf("%s%s\n", SECLIB, 103745916cd2Sjpk "/sr_clean"); 103845916cd2Sjpk } 103945916cd2Sjpk break; 104045916cd2Sjpk } else if (do_devmaps) { 104145916cd2Sjpk /* print device_maps for cd devices */ 104245916cd2Sjpk if (first) { 104345916cd2Sjpk (void) printf(" "); 104445916cd2Sjpk } else { 104545916cd2Sjpk if (system_labeled) { 104645916cd2Sjpk (void) printf("%s%d%s\\\n", 104745916cd2Sjpk dname, i, KV_TOKEN_DELIMIT); 104845916cd2Sjpk (void) printf("\t%s%s\\\n", 104945916cd2Sjpk DA_CD_TYPE, 105045916cd2Sjpk KV_TOKEN_DELIMIT); 105145916cd2Sjpk (void) printf("\t"); 105245916cd2Sjpk } else { 105345916cd2Sjpk (void) printf("sr%d:\\\n", i); 105445916cd2Sjpk (void) printf("\tsr:\\\n"); 105545916cd2Sjpk (void) printf("\t"); 105645916cd2Sjpk } 105745916cd2Sjpk first++; 105845916cd2Sjpk } 105945916cd2Sjpk (void) printf("%s", cd[j].name); 106045916cd2Sjpk } 106145916cd2Sjpk } 106245916cd2Sjpk if (do_devmaps && first) { 106345916cd2Sjpk (void) printf("\n\n"); 106445916cd2Sjpk first = 0; 106545916cd2Sjpk } 106645916cd2Sjpk } 106745916cd2Sjpk if (do_files && cd_count) { 106845916cd2Sjpk dargs.rootdir = NULL; 106945916cd2Sjpk dargs.devnames = NULL; 107045916cd2Sjpk dargs.optflag = DA_ADD; 107145916cd2Sjpk for (entry = devlist.cd; entry != NULL; entry = entry->next) { 107245916cd2Sjpk dargs.devinfo = &(entry->devinfo); 107345916cd2Sjpk (void) da_update_device(&dargs); 107445916cd2Sjpk } 107545916cd2Sjpk } 107645916cd2Sjpk 107745916cd2Sjpk return (cd_count); 107845916cd2Sjpk } 107945916cd2Sjpk 108045916cd2Sjpk static void 108145916cd2Sjpk dormdisk(int cd_count) 108245916cd2Sjpk { 108345916cd2Sjpk DIR *dirp; 108445916cd2Sjpk struct dirent *dep; /* directory entry pointer */ 108545916cd2Sjpk int i, j; 108645916cd2Sjpk char *nm; /* name/device of special device */ 108745916cd2Sjpk int id; /* disk id */ 108845916cd2Sjpk int ctrl; /* disk controller */ 108945916cd2Sjpk int nrmdisk; /* max array size */ 109045916cd2Sjpk int fd = -1; 109145916cd2Sjpk int rmdisk_count; 109245916cd2Sjpk int first = 0; 109345916cd2Sjpk int is_cd; 109445916cd2Sjpk int checked; 109545916cd2Sjpk int removable; 109645916cd2Sjpk char path[MAXPATHLEN]; 109745916cd2Sjpk da_args dargs; 109845916cd2Sjpk deventry_t *entry; 109945916cd2Sjpk 110045916cd2Sjpk nrmdisk = DFLT_RMDISK; 110145916cd2Sjpk i = rmdisk_count = 0; 110245916cd2Sjpk 110345916cd2Sjpk /* 110445916cd2Sjpk * scan /dev/dsk for rmdisk devices 110545916cd2Sjpk */ 110645916cd2Sjpk if ((dirp = opendir("/dev/dsk")) == NULL) { 110745916cd2Sjpk perror("gettext(open /dev/dsk failure)"); 110845916cd2Sjpk exit(1); 110945916cd2Sjpk } 111045916cd2Sjpk 111145916cd2Sjpk while (dep = readdir(dirp)) { 111245916cd2Sjpk is_cd = 0; 111345916cd2Sjpk checked = 0; 111445916cd2Sjpk removable = 0; 111545916cd2Sjpk /* skip . .. etc... */ 111645916cd2Sjpk if (strncmp(dep->d_name, ".", 1) == NULL) 111745916cd2Sjpk continue; 111845916cd2Sjpk 111945916cd2Sjpk /* get device # (disk #) */ 112045916cd2Sjpk if (sscanf(dep->d_name, "c%dt%d", &ctrl, &id) <= 0) 112145916cd2Sjpk continue; 112245916cd2Sjpk 112345916cd2Sjpk /* see if we've already examined this device */ 112445916cd2Sjpk for (j = 0; j < i; j++) { 112545916cd2Sjpk if (id == rmdisk[j].id && 112645916cd2Sjpk ctrl == rmdisk[j].controller && 112745916cd2Sjpk (strcmp(dep->d_name, rmdisk[j].name) == 0)) { 112845916cd2Sjpk checked = 1; 11297c478bd9Sstevel@tonic-gate break; 11307c478bd9Sstevel@tonic-gate } 113145916cd2Sjpk if (id == rmdisk[j].id && ctrl != rmdisk[j].controller) 113245916cd2Sjpk /* 113345916cd2Sjpk * c2t0d0s0 is a different rmdisk than c3t0d0s0. 113445916cd2Sjpk */ 113545916cd2Sjpk id = rmdisk[j].id + 1; 113645916cd2Sjpk } 113745916cd2Sjpk if (checked) 113845916cd2Sjpk continue; 113945916cd2Sjpk 114045916cd2Sjpk /* ignore if this is a cd */ 114145916cd2Sjpk for (j = 0; j < cd_count; j++) { 11421bf2a5e5Saj if (id == cd[j].id && ctrl == cd[j].controller) { 114345916cd2Sjpk is_cd = 1; 114445916cd2Sjpk break; 114545916cd2Sjpk } 114645916cd2Sjpk } 114745916cd2Sjpk if (is_cd) 114845916cd2Sjpk continue; 114945916cd2Sjpk 115045916cd2Sjpk /* see if device is removable */ 115145916cd2Sjpk (void) snprintf(path, sizeof (path), "%s%s", "/dev/rdsk/", 115245916cd2Sjpk dep->d_name); 115345916cd2Sjpk if ((fd = open(path, O_RDONLY | O_NONBLOCK)) < 0) 115445916cd2Sjpk continue; 115545916cd2Sjpk (void) ioctl(fd, DKIOCREMOVABLE, &removable); 115645916cd2Sjpk (void) close(fd); 115745916cd2Sjpk if (removable == 0) 115845916cd2Sjpk continue; 115945916cd2Sjpk 116045916cd2Sjpk /* 116145916cd2Sjpk * add new entry to table (/dev/dsk + / + d_name + \0) 116245916cd2Sjpk * if array full, then expand it 116345916cd2Sjpk */ 116445916cd2Sjpk if (i == nrmdisk) { 116545916cd2Sjpk /* will exit(1) if insufficient memory */ 116645916cd2Sjpk nrmdisk = expandmem(i, (void **)&rmdisk, 116745916cd2Sjpk sizeof (struct rmdisk)); 116845916cd2Sjpk } 116945916cd2Sjpk nm = (char *)malloc(SIZE_OF_DSK + 1 + strlen(dep->d_name) + 1); 117045916cd2Sjpk if (nm == NULL) 117145916cd2Sjpk no_memory(); 117245916cd2Sjpk (void) strcpy(nm, "/dev/dsk/"); 117345916cd2Sjpk (void) strcat(nm, dep->d_name); 117445916cd2Sjpk rmdisk[i].name = nm; 117545916cd2Sjpk rmdisk[i].id = id; 117645916cd2Sjpk rmdisk[i].controller = ctrl; 117745916cd2Sjpk rmdisk[i].device = ""; 117845916cd2Sjpk rmdisk[i].number = id; 117945916cd2Sjpk rmdisk_r[i].name = strdup(path); 118045916cd2Sjpk i++; 118145916cd2Sjpk } 118245916cd2Sjpk 118345916cd2Sjpk rmdisk_count = i; 118445916cd2Sjpk (void) closedir(dirp); 118545916cd2Sjpk 118645916cd2Sjpk for (i = 0, j = rmdisk_count; i < rmdisk_count; i++, j++) { 118745916cd2Sjpk if (j == nrmdisk) { 118845916cd2Sjpk /* will exit(1) if insufficient memory */ 118945916cd2Sjpk nrmdisk = expandmem(j, (void **)&rmdisk, 119045916cd2Sjpk sizeof (struct rmdisk)); 119145916cd2Sjpk } 119245916cd2Sjpk rmdisk[j].name = rmdisk_r[i].name; 119345916cd2Sjpk rmdisk[j].id = rmdisk[i].id; 119445916cd2Sjpk rmdisk[j].controller = rmdisk[i].controller; 119545916cd2Sjpk rmdisk[j].device = rmdisk[i].device; 119645916cd2Sjpk rmdisk[j].number = rmdisk[i].number; 119745916cd2Sjpk } 119845916cd2Sjpk rmdisk_count = j; 119945916cd2Sjpk 120045916cd2Sjpk for (i = 0; i < 8; i++) { 120145916cd2Sjpk for (j = 0; j < rmdisk_count; j++) { 120245916cd2Sjpk if (rmdisk[j].id != i) 120345916cd2Sjpk continue; 120445916cd2Sjpk if (do_files) { 120545916cd2Sjpk (void) da_add_list(&devlist, rmdisk[j].name, i, 120645916cd2Sjpk DA_RMDISK); 120745916cd2Sjpk } else if (do_devalloc) { 120845916cd2Sjpk /* print device_allocate for rmdisk devices */ 120945916cd2Sjpk (void) printf("%s%d%s\\\n", 121045916cd2Sjpk DA_RMDISK_NAME, i, KV_DELIMITER); 121145916cd2Sjpk (void) printf("\t%s%s\\\n", 121245916cd2Sjpk DA_RMDISK_TYPE, KV_DELIMITER); 121345916cd2Sjpk (void) printf("\t%s%s\\\n", 121445916cd2Sjpk DA_RESERVED, KV_DELIMITER); 121545916cd2Sjpk (void) printf("\t%s%s\\\n", 121645916cd2Sjpk DA_RESERVED, KV_DELIMITER); 121745916cd2Sjpk (void) printf("\t%s%s\\\n", 121845916cd2Sjpk DEFAULT_DEV_ALLOC_AUTH, KV_DELIMITER); 121945916cd2Sjpk (void) printf("\t%s\n", DA_DEFAULT_DISK_CLEAN); 122045916cd2Sjpk break; 122145916cd2Sjpk } else if (do_devmaps) { 122245916cd2Sjpk /* print device_maps for rmdisk devices */ 122345916cd2Sjpk if (first) { 122445916cd2Sjpk (void) printf(" "); 122545916cd2Sjpk } else { 122645916cd2Sjpk (void) printf("%s%d%s\\\n", 122745916cd2Sjpk DA_RMDISK_NAME, i, 122845916cd2Sjpk KV_TOKEN_DELIMIT); 122945916cd2Sjpk (void) printf("\t%s%s\\\n", 123045916cd2Sjpk DA_RMDISK_TYPE, KV_TOKEN_DELIMIT); 123145916cd2Sjpk (void) printf("\t"); 123245916cd2Sjpk first++; 123345916cd2Sjpk } 123445916cd2Sjpk (void) printf("%s", rmdisk[j].name); 123545916cd2Sjpk } 123645916cd2Sjpk } 123745916cd2Sjpk if (do_devmaps && first) { 123845916cd2Sjpk (void) printf("\n\n"); 123945916cd2Sjpk first = 0; 124045916cd2Sjpk } 124145916cd2Sjpk } 124245916cd2Sjpk if (do_files && rmdisk_count) { 124345916cd2Sjpk dargs.rootdir = NULL; 124445916cd2Sjpk dargs.devnames = NULL; 124545916cd2Sjpk dargs.optflag = DA_ADD; 124645916cd2Sjpk for (entry = devlist.rmdisk; entry != NULL; 124745916cd2Sjpk entry = entry->next) { 124845916cd2Sjpk dargs.devinfo = &(entry->devinfo); 124945916cd2Sjpk (void) da_update_device(&dargs); 12507c478bd9Sstevel@tonic-gate } 12517c478bd9Sstevel@tonic-gate } 12527c478bd9Sstevel@tonic-gate } 12537c478bd9Sstevel@tonic-gate 12547c478bd9Sstevel@tonic-gate /* set default array sizes */ 12557c478bd9Sstevel@tonic-gate static void 12567c478bd9Sstevel@tonic-gate initmem() 12577c478bd9Sstevel@tonic-gate { 12587c478bd9Sstevel@tonic-gate tape = (struct tape *)calloc(DFLT_NTAPE, sizeof (struct tape)); 12597c478bd9Sstevel@tonic-gate audio = (struct audio *)calloc(DFLT_NAUDIO, sizeof (struct audio)); 12607c478bd9Sstevel@tonic-gate cd = (struct cd *)calloc(DFLT_NCD, sizeof (struct cd)); 12617c478bd9Sstevel@tonic-gate fp = (struct fp *)calloc(DFLT_NFP, sizeof (struct fp)); 126245916cd2Sjpk if (system_labeled) { 126345916cd2Sjpk rmdisk = (struct rmdisk *)calloc(DFLT_RMDISK, 126445916cd2Sjpk sizeof (struct rmdisk)); 126545916cd2Sjpk if (rmdisk == NULL) 126645916cd2Sjpk no_memory(); 126745916cd2Sjpk rmdisk_r = (struct rmdisk *)calloc(DFLT_RMDISK, 126845916cd2Sjpk sizeof (struct rmdisk)); 126945916cd2Sjpk if (rmdisk_r == NULL) 127045916cd2Sjpk no_memory(); 127145916cd2Sjpk } 12727c478bd9Sstevel@tonic-gate 12737c478bd9Sstevel@tonic-gate if (tape == NULL || audio == NULL || cd == NULL || fp == NULL) 12747c478bd9Sstevel@tonic-gate no_memory(); 127545916cd2Sjpk 127645916cd2Sjpk devlist.audio = devlist.cd = devlist.floppy = devlist.rmdisk = 127745916cd2Sjpk devlist.tape = NULL; 12787c478bd9Sstevel@tonic-gate } 12797c478bd9Sstevel@tonic-gate 12807c478bd9Sstevel@tonic-gate /* note n will be # elments in array (and could be 0) */ 12817c478bd9Sstevel@tonic-gate static int 12827c478bd9Sstevel@tonic-gate expandmem(int n, void **array, int size) 12837c478bd9Sstevel@tonic-gate { 12847c478bd9Sstevel@tonic-gate void *old = *array; 12857c478bd9Sstevel@tonic-gate void *new; 12867c478bd9Sstevel@tonic-gate 12877c478bd9Sstevel@tonic-gate /* get new array space (n + DELTA) */ 12887c478bd9Sstevel@tonic-gate new = (void *)calloc(n + DELTA, size); 12897c478bd9Sstevel@tonic-gate 12907c478bd9Sstevel@tonic-gate if (new == NULL) { 12917c478bd9Sstevel@tonic-gate perror("memory allocation failed"); 12927c478bd9Sstevel@tonic-gate exit(1); 12937c478bd9Sstevel@tonic-gate } 12947c478bd9Sstevel@tonic-gate 12957c478bd9Sstevel@tonic-gate /* copy old array into new space */ 12967c478bd9Sstevel@tonic-gate bcopy(old, new, n * size); 12977c478bd9Sstevel@tonic-gate 12987c478bd9Sstevel@tonic-gate /* now release old arrary */ 12997c478bd9Sstevel@tonic-gate free(old); 13007c478bd9Sstevel@tonic-gate 13017c478bd9Sstevel@tonic-gate *array = new; 13027c478bd9Sstevel@tonic-gate 13037c478bd9Sstevel@tonic-gate return (n + DELTA); 13047c478bd9Sstevel@tonic-gate } 13057c478bd9Sstevel@tonic-gate 13067c478bd9Sstevel@tonic-gate static void 13077c478bd9Sstevel@tonic-gate no_memory(void) 13087c478bd9Sstevel@tonic-gate { 13097c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "%s: %s\n", "mkdevalloc", 13107c478bd9Sstevel@tonic-gate gettext("out of memory")); 13117c478bd9Sstevel@tonic-gate exit(1); 13127c478bd9Sstevel@tonic-gate /* NOT REACHED */ 13137c478bd9Sstevel@tonic-gate } 1314