root@relay.eu.net (06/05/90)
Here is my "makedev.sh". First off, I changed the order in the C-sourse, since the compiler issued the well-known "NULL" warning. Then I generated it with the "mkmakedev" program, and finally I hand-added the indents and comments. The resulting list of devices is the one found on my "minixug" machine, which uses COM1:-COM4: (simple trick in rs2.x) and a modified version of the VC-driver. This is why you will find tty and tty0..tty8 in the list... Hope this helps, Fred van Kempen MINIX User group Holland ------------------------------------------------------------------------ #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive" # Contents: # mkmakedev.c makedev.sh # # Wrapped by root@minixug on Mon Jun 4 14:35:20 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'mkmakedev.c' -a "${1}" != "-c" then echo "$0: Will not overwrite existing file: 'mkmakedev.c'" else echo "x - mkmakedev.c (5940 characters)" sed 's/^X//' <<\END_OF_SHAR >mkmakedev.c X/* X * mkmakedev.c X * X * Goes through the named directory and builds a shell script X * on standard output which, when run, will create appropriate X * special files. X * X * Usage: X * mkmakedev /dev >makedev.sh X * For the paranoid, before sending this out, do: X * mkdir /dev2 X * sh makedev.sh (use full pathname) X * ls -lR /dev >/tmp/dev X * ls -lR /dev2 >/tmp/dev2 X * paste /tmp/dev /tmp/dev2 >/tmp/dev.both X * tr '\011' '\012' </tmp/dev.both | more X * This last line will show pairs of lines. Both lines should be X * identical with the exception of the date. As a last step, don't X * forget to "rm /tmp/dev /tmp/dev2 /tmp/dev.both. (This procedure X * assumes that there are no "regular" files in /dev.) X * X * To use the resulting script: X * su (commands need root permissions) X * cd /dev X * sh makedev.sh X * The "cd" command is optional so that the receiver of the file X * can try out the script in some "safe" directory, and look at the X * results. If it looks OK, then the user can try it in "/dev". X * X * This could probably be written as a clever shell file. However, X * I couldn't see an easy way to do it, so I hacked this simple program X * together. X * X * "Tar" also does this job, but not in a "clear text" fashion. X * X * Several routines are "borrowed" from the ls.c. The rest is written X * by me, and is public domain. X * X * Dave Regan 2 June 1990 X * PO Box 601 regan@jacobs.cs.orst.edu X * Corvallis OR 97339 USA X */ X X/* X * Known bugs (feel free to fix): X * ------------------------------ X * X * The code that deals with linking a special device to another X * will fail if the two files involved are not in the same directory. X * So far, it appears that most minix "/dev" directories are flat, X * so this shouldn't be much of a problem. X * X * The indentation style matches my style, not "Minix Normal". Sorry. X * If I have to maintain it, I like it my way. X * X * FIX 06/04/90 Fred van Kempen: Moved <stdio.h> downwards to get rid X * of the NULL problem. X */ X X#include <ctype.h> X#include <stdlib.h> X#include <string.h> X#include <sys/types.h> X#include <sys/stat.h> X#include <dirent.h> X#include <pwd.h> X#include <grp.h> X#include <time.h> X#include <stdio.h> X X#define VERSION "0.2" X X#define major(x) ( (x>>8) & 0377) X#define minor(x) (x & 0377) X Xextern void dofile( /* fname, buf, type */ ); Xextern void dowork( /* char *dir_name */ ); Xextern void dofile( /* */ ); Xextern char *check_link( /* fname, buf */ ); X Xextern char *owner( /* int uid */ ); Xextern char *groupname( /* int gid */ ); X Xstruct linktab X { X struct linktab *next; X ino_t ino; X char fname[1]; X }; X Xstruct linktab *Root = (struct linktab *) NULL; X Xmain(argc, argv) X int argc; X char *argv[]; X { X time_t time_val; X X if (argv[1] != (char *) NULL) X chdir(argv[1]); X X time(&time_val); X printf("# Script built by \"mkmakedev\" v%s on %s", X VERSION, ctime(&time_val)); X dowork("."); X exit(0); X } X Xvoid Xdowork(dir_name) X char *dir_name; X { X struct stat buf; X DIR *dir; X struct dirent *dp; X X /* Open up the directory and read entries */ X if ((dir = opendir(dir_name)) == (DIR *) NULL) X { X fprintf(stderr, "Cannot open directory \"%s\"\n", dir_name); X exit(1); X } X X chdir(dir_name); X X while ((dp = readdir(dir)) != (struct dirent *) NULL) X { X if (strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0) X continue; X if (stat(dp->d_name, &buf) < 0) X continue; X switch (buf.st_mode & S_IFMT) X { X case S_IFDIR: X printf("mkdir %s\n", dp->d_name); X printf("chmod %03o %s\n", buf.st_mode & 0777, dp->d_name); X printf("chown %s %s\n", owner(buf.st_uid), dp->d_name); X printf("chgrp %s %s\n", groupname(buf.st_gid), dp->d_name); X printf("cd %s\n", dp->d_name); X dowork(dp->d_name); X printf("cd ..\n"); X break; X X case S_IFCHR: X dofile(dp->d_name, &buf, 'c'); X break; X X case S_IFBLK: X dofile(dp->d_name, &buf, 'b'); X break; X X default: X /* ignore */ X break; X } X } X closedir(dir); X chdir(".."); X } X X Xvoid Xdofile(fname, buf, type) X char *fname; X struct stat *buf; X char type; X { X char *cptr; X X if ((cptr = check_link(fname, buf)) != (char *) NULL) X printf("ln %s %s\n", cptr, fname); X else X { X printf("mknod %s %c %d %d", X fname, type, major(buf->st_rdev), minor(buf->st_rdev)); X if (type == 'b') X printf(" %ld", (long) buf->st_size / 1024); X printf("\n"); X printf("chmod %03o %s\n", buf->st_mode & 0777, fname); X printf("chown %s %s\n", owner(buf->st_uid), fname); X printf("chgrp %s %s\n", groupname(buf->st_gid), fname); X } X } X X Xchar * Xcheck_link(fname, buf) X char *fname; X struct stat *buf; X { X struct linktab *item; X X if (buf->st_nlink == 1) X return ((char *) NULL); X for (item = Root; item != (struct linktab *) NULL; item = item->next) X { X if (item->ino == buf->st_ino) X return (item->fname); X } X item = (struct linktab *) malloc(sizeof(struct linktab) + strlen(fname)); X if (item != (struct linktab *) NULL) X { X item->next = Root; X Root = item; X item->ino = buf->st_ino; X strcpy(item->fname, fname); X } X return ((char *) NULL); X } X X X/*** Lifted from ls.c */ X X/*@*User and group id's. X * |owner()| and |groupname()| are used to translate user and group X * id's to names for the long-format listing. The last id translated X * is cached. X */ Xchar *owner(uid) Xint uid; X{ X static int ouid = -1; X static char uname[16]; X struct passwd *pw, *getpwuid( /* int uid */ ); X X if (uid == ouid) return uname; X X if ((pw = getpwuid(uid)) == (struct passwd *) NULL) X sprintf(uname, "%d", uid); X else X strcpy(uname, pw->pw_name); X X return uname; X} X Xchar *groupname(gid) Xint gid; X{ X static int ogid = -1; X static char gname[16]; X struct group *gr, *getgrgid( /* int gid */ ); X X if (gid == ogid) return gname; X X if ((gr = getgrgid(gid)) == (struct group *) NULL) X sprintf(gname, "%d", gid); X else X strcpy(gname, gr->gr_name); X X return gname; X} END_OF_SHAR if test 5940 -ne `wc -c <'mkmakedev.c'` then echo "$0: unpacked with wrong size: mkmakedev.c" fi fi if test -f 'makedev.sh' -a "${1}" != "-c" then echo "$0: Will not overwrite existing file: 'makedev.sh'" else echo "x - makedev.sh (5373 characters)" sed 's/^X//' <<\END_OF_SHAR >makedev.sh X# X# Script built by "mkmakedev" v0.2 on Mon Jun 4 13:56:18 1990 X# X# Hand-edited by Fred van Kempen, waltje@minixug.hobby.nl X# These are the entries in /dev on the 'minixug' machine. Note, X# that this system uses 4 serial ports (COM1: through COM4:), X# plus the Virtual Console driver with 4 consoles. X# Also note, that this directory contains the "format" devices X# for most of the disks, which are used only by the "/etc/format" X# program. If you don't have that, or don't want it, you may X# remove the "FORMAT" entries in this list. X# Xmknod PS0 b 2 28 1440 # 3.5" 1.44Mbyte, drive 0 X chmod 600 PS0 X chown bin PS0 X chgrp sys PS0 Xmknod PS1 b 2 29 1440 # 3.5" 1.44Mbyte, drive 1 X chmod 600 PS1 X chown bin PS1 X chgrp sys PS1 Xmknod at0 b 2 8 1200 # 5.25" 1.2Mbyte, drive 0 X chmod 600 at0 X chown bin at0 X chgrp sys at0 Xmknod at0f b 2 136 0 # 5.25" 1.2Mbyte FORMAT, drive 0 X chmod 600 at0f X chown bin at0f X chgrp sys at0f Xmknod at1 b 2 9 1200 # 5.25" 1.2Mbyte, drive 1 X chmod 600 at1 X chown bin at1 X chgrp sys at1 Xmknod at1f b 2 137 0 # 5.25" 1.2Mbyte FORMAT, drive 1 X chmod 600 at1f X chown bin at1f X chgrp sys at1f Xmknod cmos b 7 0 0 # CMOS device (NLMUG specific) X chmod 600 cmos X chown bin cmos X chgrp sys cmos Xmknod fd0 b 2 0 0 # Floppy drive 0 (auto-density) X chmod 600 fd0 X chown bin fd0 X chgrp sys fd0 Xmknod fd0f b 2 148 0 # 5.25" 360K in 1.2Mb in FORMAT drive 0 X chmod 600 fd0f X chown bin fd0f X chgrp sys fd0f Xmknod fd1 b 2 1 0 # Floppy drive 1 (auto-density) X chmod 600 fd1 X chown bin fd1 X chgrp sys fd1 Xmknod fd1f b 2 149 0 # 5.25" 360K in 1.2Mb in FORMAT drive 1 X chmod 600 fd1f X chown bin fd1f X chgrp sys fd1f Xmknod hd0 b 3 0 0 # Hard Disk 0 (entire disk, for FDISK) X chmod 600 hd0 X chown bin hd0 X chgrp sys hd0 Xmknod hd1 b 3 1 0 # HD0 partition 1 X chmod 600 hd1 X chown bin hd1 X chgrp sys hd1 Xmknod hd2 b 3 2 0 # HD0 partition 2 X chmod 600 hd2 X chown bin hd2 X chgrp sys hd2 Xmknod hd3 b 3 3 0 # HD0 partition 3 X chmod 600 hd3 X chown bin hd3 X chgrp sys hd3 Xmknod hd4 b 3 4 0 # HD0 partition 4 X chmod 600 hd4 X chown bin hd4 X chgrp sys hd4 Xmknod hd5 b 3 5 0 # Hard Disk 1 (entire disk, for FDISK) X chmod 600 hd5 X chown bin hd5 X chgrp sys hd5 Xmknod hd6 b 3 6 0 # HD1 partition 1 X chmod 600 hd6 X chown bin hd6 X chgrp sys hd6 Xmknod hd7 b 3 7 0 # HD1 partition 2 X chmod 600 hd7 X chown bin hd7 X chgrp sys hd7 Xmknod hd8 b 3 8 0 # HD1 partition 3 X chmod 600 hd8 X chown bin hd8 X chgrp sys hd8 Xmknod hd9 b 3 9 0 # HD1 partition 4 X chmod 600 hd9 X chown bin hd9 X chgrp sys hd9 Xmknod kmem c 1 2 # KERNEL MEMORY, for PS X chmod 644 kmem X chown bin kmem X chgrp sys kmem Xmknod lp c 6 0 # Parallel printer X chmod 600 lp X chown lp lp X chgrp daemon lp Xmknod mem c 1 1 # SYSTEM MEMORY, for PS X chmod 644 mem X chown bin mem X chgrp sys mem Xmknod null c 1 3 # General NULL device X chmod 666 null X chown bin null X chgrp sys null Xmknod pat0 b 2 20 360 # 5.25" 360Kb in 1.2Mb AT drive, drive 0 X chmod 600 pat0 X chown bin pat0 X chgrp sys pat0 Xmknod pat1 b 2 21 360 # 5.25" 360Kb in 1.2Mb AT drive, drive 1 X chmod 600 pat1 X chown bin pat1 X chgrp sys pat1 Xmknod pc0 b 2 4 360 # 5.25" 360Kbyte, drive 0 X chmod 600 pc0 X chown bin pc0 X chgrp sys pc0 Xmknod pc0f b 2 132 0 # 5.25" 360Kbyte FORMAT, drive 0 X chmod 600 pc0f X chown bin pc0f X chgrp sys pc0f Xmknod pc1 b 2 5 360 # 5.25" 360Kbyte, drive 1 X chmod 600 pc1 X chown bin pc1 X chgrp sys pc1 Xmknod pc1f b 2 133 0 # 5.25" 360Kbyte FORMAT, drive 1 X chmod 600 pc1f X chown bin pc1f X chgrp sys pc1f Xmknod port b 1 4 0 # INTEL PORT I/O X chmod 600 port X chown bin port X chgrp sys port Xmknod ps0 b 2 16 720 # 3.5" 720Kbyte, drive 0 X chmod 600 ps0 X chown bin ps0 X chgrp sys ps0 Xmknod ps0f b 2 144 0 # 3.5" 720Kbyte FORMAT, drive 0 X chmod 600 ps0f X chown bin ps0f X chgrp sys ps0f Xmknod ps1 b 2 17 720 # 3.5" 720Kbyte, drive 1 X chmod 600 ps1 X chown bin ps1 X chgrp sys ps1 Xmknod ps1f b 2 145 0 # 3.5" 720Kbyte FORMAT, drive 1 X chmod 600 ps1f X chown bin ps1f X chgrp sys ps1f Xmknod ram b 1 0 0 # RAM disk X chmod 600 ram X chown bin ram X chgrp sys ram Xmknod tty c 5 0 # Default terminal X chmod 666 tty X chown bin tty X chgrp sys tty Xmknod tty0 c 4 0 # Terminal 0 (default console) X chmod 622 tty0 X chown bin tty0 X chgrp sys tty0 Xmknod tty1 c 4 1 # Terminal 1 (virtual console 1 or COM1: ) X chmod 622 tty1 X chown bin tty1 X chgrp sys tty1 Xmknod tty2 c 4 2 # Terminal 2 (virtual console 2 or COM2: ) X chmod 622 tty2 X chown bin tty2 X chgrp sys tty2 Xmknod tty3 c 4 3 # Terminal 3 (virtual console 3 or COM3: ) X chmod 622 tty3 X chown bin tty3 X chgrp sys tty3 Xmknod tty4 c 4 4 # Terminal 4 (virtual console 4 or COM4: ) X chmod 622 tty4 X chown bin tty4 X chgrp sys tty4 Xmknod tty5 c 4 5 # Terminal 5 (COM1: ) X chmod 622 tty5 X chown uucp tty5 X chgrp uucp tty5 Xmknod tty6 c 4 6 # Terminal 6 (COM2: ) X chmod 622 tty6 X chown uucp tty6 X chgrp uucp tty6 Xmknod tty7 c 4 7 # Terminal 7 (COM3: ) X chmod 622 tty7 X chown uucp tty7 X chgrp uucp tty7 Xmknod tty8 c 4 8 # Terminal 8 (COM4: ) X chmod 622 tty8 X chown uucp tty8 X chgrp uucp tty8 X X# Now, for the various links. Xln tty0 console # Tty0 is a bit old-fashioned... X X# These links are for use with the "dos{read,write,dir} program. X# Just make sure it matches your system configuration. Xln at0 dosA # A: is 1.2Mbyte 5.25" Xln PS1 dosB # B: is 1.44Mbyte 3.5" Xln pat0 dosE # E: is 360Kbyte 5.25" Xln ps1 dosF # F: is 720Kbyte 3.5" Xln hd1 dosC # C: is the MS-DOS partition C: X END_OF_SHAR if test 5373 -ne `wc -c <'makedev.sh'` then echo "$0: unpacked with wrong size: makedev.sh" fi fi echo " End of archive" exit 0 # +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+ | MINIX User Group Holland UUCP: waltje@minixug.hobby.nl | | c/o Fred van Kempen, or: hp4nl!minixug!waltje | | Hoefbladhof 27 | | 2215 DV VOORHOUT | | The Netherlands "A good programmer knows his Sources" | +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+