patch-2.3.46 linux/fs/devfs/util.c
Next file: linux/fs/filesystems.c
Previous file: linux/fs/devfs/base.c
Back to the patch index
Back to the overall index
- Lines: 161
- Date:
Wed Feb 16 15:42:06 2000
- Orig file:
v2.3.45/linux/fs/devfs/util.c
- Orig date:
Wed Dec 31 16:00:00 1969
diff -u --recursive --new-file v2.3.45/linux/fs/devfs/util.c linux/fs/devfs/util.c
@@ -0,0 +1,160 @@
+/* devfs (Device FileSystem) utilities.
+
+ Copyright (C) 1999-2000 Richard Gooch
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ Richard Gooch may be reached by email at rgooch@atnf.csiro.au
+ The postal address is:
+ Richard Gooch, c/o ATNF, P. O. Box 76, Epping, N.S.W., 2121, Australia.
+
+ ChangeLog
+
+ 19991031 Richard Gooch <rgooch@atnf.csiro.au>
+ Created.
+ 19991103 Richard Gooch <rgooch@atnf.csiro.au>
+ Created <_devfs_convert_name> and supported SCSI and IDE CD-ROMs
+ 20000203 Richard Gooch <rgooch@atnf.csiro.au>
+ Changed operations pointer type to void *.
+*/
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/locks.h>
+#include <linux/kdev_t.h>
+#include <linux/devfs_fs_kernel.h>
+
+
+/* Private functions follow */
+
+static void __init _devfs_convert_name (char *new, const char *old, int disc)
+/* [SUMMARY] Convert from an old style location-based name to new style.
+ <new> The new name will be written here.
+ <old> The old name.
+ <disc> If true, disc partitioning information should be processed.
+ [RETURNS] Nothing.
+*/
+{
+ int host, bus, target, lun;
+ char *ptr;
+ char part[8];
+
+ /* Decode "c#b#t#u#" */
+ if (old[0] != 'c') return;
+ host = simple_strtol (old + 1, &ptr, 10);
+ if (ptr[0] != 'b') return;
+ bus = simple_strtol (ptr + 1, &ptr, 10);
+ if (ptr[0] != 't') return;
+ target = simple_strtol (ptr + 1, &ptr, 10);
+ if (ptr[0] != 'u') return;
+ lun = simple_strtol (ptr + 1, &ptr, 10);
+ if (disc)
+ {
+ /* Decode "p#" */
+ if (ptr[0] == 'p') sprintf (part, "part%s", ptr + 1);
+ else strcpy (part, "disc");
+ }
+ else part[0] = '\0';
+ sprintf (new, "/host%d/bus%d/target%d/lun%d/%s",
+ host, bus, target, lun, part);
+} /* End Function _devfs_convert_name */
+
+
+/* Public functions follow */
+
+/*PUBLIC_FUNCTION*/
+void __init devfs_make_root (const char *name)
+/* [SUMMARY] Create the root FS device entry if required.
+ <name> The name of the root FS device, as passed by "root=".
+ [RETURNS] Nothing.
+*/
+{
+ char dest[64];
+
+ if ( (strncmp (name, "sd/", 3) == 0) || (strncmp (name, "sr/", 3) == 0) )
+ {
+ strcpy (dest, "../scsi");
+ _devfs_convert_name (dest + 7, name + 3, (name[1] == 'd') ? 1 : 0);
+ }
+ else if ( (strncmp (name, "ide/hd/", 7) == 0) ||
+ (strncmp (name, "ide/cd/", 7) == 0) )
+ {
+ strcpy (dest, "..");
+ _devfs_convert_name (dest + 2, name + 7, (name[4] == 'h') ? 1 : 0);
+ }
+ else return;
+ devfs_mk_symlink (NULL, name, 0, DEVFS_FL_DEFAULT, dest, 0, NULL,NULL);
+} /* End Function devfs_make_root */
+
+/*PUBLIC_FUNCTION*/
+void devfs_register_tape (devfs_handle_t de)
+/* [SUMMARY] Register a tape device in the "/dev/tapes" hierarchy.
+ <de> Any tape device entry in the device directory.
+ [RETURNS] Nothing.
+*/
+{
+ int pos;
+ devfs_handle_t parent, slave;
+ char name[16], dest[64];
+ static unsigned int tape_counter = 0;
+ static devfs_handle_t tape_dir = NULL;
+
+ if (tape_dir == NULL) tape_dir = devfs_mk_dir (NULL, "tapes", 5, NULL);
+ parent = devfs_get_parent (de);
+ pos = devfs_generate_path (parent, dest + 3, sizeof dest - 3);
+ if (pos < 0) return;
+ strncpy (dest + pos, "../", 3);
+ sprintf (name, "tape%u", tape_counter++);
+ devfs_mk_symlink (tape_dir, name, 0, DEVFS_FL_DEFAULT, dest + pos, 0,
+ &slave, NULL);
+ devfs_auto_unregister (de, slave);
+} /* End Function devfs_register_tape */
+EXPORT_SYMBOL(devfs_register_tape);
+
+/*PUBLIC_FUNCTION*/
+void devfs_register_series (devfs_handle_t dir, const char *format,
+ unsigned int num_entries, unsigned int flags,
+ unsigned int major, unsigned int minor_start,
+ umode_t mode, uid_t uid, gid_t gid,
+ void *ops, void *info)
+/* [SUMMARY] Register a sequence of device entries.
+ <dir> The handle to the parent devfs directory entry. If this is NULL the
+ new names are relative to the root of the devfs.
+ <format> The printf-style format string. A single "%u" is allowed.
+ <flags> A set of bitwise-ORed flags (DEVFS_FL_*).
+ <major> The major number. Not needed for regular files.
+ <minor_start> The starting minor number. Not needed for regular files.
+ <mode> The default file mode.
+ <uid> The default UID of the file.
+ <guid> The default GID of the file.
+ <ops> The <<file_operations>> or <<block_device_operations>> structure.
+ This must not be externally deallocated.
+ <info> An arbitrary pointer which will be written to the <<private_data>>
+ field of the <<file>> structure passed to the device driver. You can set
+ this to whatever you like, and change it once the file is opened (the next
+ file opened will not see this change).
+ [RETURNS] Nothing.
+*/
+{
+ unsigned int count;
+ char devname[128];
+
+ for (count = 0; count < num_entries; ++count)
+ {
+ sprintf (devname, format, count);
+ devfs_register (dir, devname, 0, flags, major, minor_start + count,
+ mode, uid, gid, ops, info);
+ }
+} /* End Function devfs_register_series */
+EXPORT_SYMBOL(devfs_register_series);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)