⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 util.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
字号:
/*  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 *.    20000621   Richard Gooch <rgooch@atnf.csiro.au>               Changed interface to <devfs_register_series>.    20000622   Richard Gooch <rgooch@atnf.csiro.au>               Took account of interface change to <devfs_mk_symlink>.               Took account of interface change to <devfs_mk_dir>.*/#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  *//** *	_devfs_convert_name - 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. */static void __init _devfs_convert_name (char *new, const char *old, int disc){    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  *//** *	devfs_make_root - Create the root FS device entry if required. *	@name: The name of the root FS device, as passed by "root=". */void __init devfs_make_root (const char *name){    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, DEVFS_FL_DEFAULT, dest, NULL, NULL);}   /*  End Function devfs_make_root  *//** *	devfs_register_tape - Register a tape device in the "/dev/tapes" hierarchy. *	@de: Any tape device entry in the device directory. */void devfs_register_tape (devfs_handle_t de){    int pos;    devfs_handle_t parent, slave;    char name[16], dest[64];    static unsigned int tape_counter;    static devfs_handle_t tape_dir;    if (tape_dir == NULL) tape_dir = devfs_mk_dir (NULL, "tapes", 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, DEVFS_FL_DEFAULT, dest + pos,		      &slave, NULL);    devfs_auto_unregister (de, slave);}   /*  End Function devfs_register_tape  */EXPORT_SYMBOL(devfs_register_tape);/** *	devfs_register_series - 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. *	@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). */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, void *ops, void *info){    unsigned int count;    char devname[128];    for (count = 0; count < num_entries; ++count)    {	sprintf (devname, format, count);	devfs_register (dir, devname, flags, major, minor_start + count,			mode, ops, info);    }}   /*  End Function devfs_register_series  */EXPORT_SYMBOL(devfs_register_series);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -