| Configuring The Device Cache File Path | |
| Contents | |
| A. Introduction and History | |
| B. Device Cache File Format | |
| 1. Integrity Checks | |
| 2. The Setgid and Setuid-root States | |
| C. Device Cache File Path Options | |
| 1. Path Named by ``-D'' | |
| 2. Path Named in Environment Variable | |
| 3. Default System-wide Path | |
| a. Build Procedure | |
| 4. Default Personal Path | |
| 5. Modified Default Personal Path | |
| D. Displaying the Default Path | |
| Appendix A, Unix Dialects Without a Device Cache | |
| Appendix B, Lsof Dialects and Their Permissions | |
| 1. Setuid-root Lsof Dialects | |
| 2. Setgid Lsof Dialects That Surrender Setgid | |
| Permission | |
| A. Introduction and History | |
| =========================== | |
| Lsof writes a file of information about the contents of the nodes | |
| in /dev (or /devices) to reduce its startup overhead on later calls. | |
| It does this for all Unix dialects, except those noted in Appendix A. | |
| This file, called the device cache file, enables lsof to avoid | |
| calling the kernel stat(2) function on every node in /dev (or | |
| /devices) from which it builds a table of correspondence between | |
| major/minor device numbers and device names. | |
| A full scan of /dev (or /devices) on some systems may involve | |
| calling the sometimes-slow stat(2) function 10,000 times or more. | |
| Furthermore, each stat(2) call consumes space in the kernel's name | |
| cache, forcing from it path name components that would be more | |
| useful when lsof tries to associate them with open files. | |
| While it's hard to question the usefulness of the device cache, | |
| it's also hard to decide where it should be written. When the | |
| feature was first added, the device cache file was written to /tmp, | |
| and its ownership was set to that of the real user ID (UID) under | |
| which the creating lsof process was run. However, to enable any | |
| process to update it when /dev (or /devices) changed, lsof set its | |
| modes to 0666, thus allowing anyone to read or write it. | |
| The writing of a world-readable and world-writable device cache | |
| file to any place has security weaknesses. A clever intruder who | |
| carefully preserves the integrity of the file might be able to | |
| remove devices that would prevent lsof from observing the intruder's | |
| files. A clever intruder might also be able to put a symbolic link | |
| in place and trick lsof into writing to the link's destination with | |
| its effective permissions, thus bypassing the real user's (possibly | |
| weaker) permissions. | |
| Later the location of the device cache file was changed. It was | |
| converted to a personal file, located in the home directory of each | |
| real UID that executed lsof, and owned by that UID. Thus it was | |
| no longer possible for one user to affect lsof's access to the | |
| device cache file, nor was it possible for a user to mount a symbolic | |
| link attack on a restricted file, but the result was that each lsof | |
| user had a private copy of the device cache file. | |
| The device cache file feature has undergone some further refinements | |
| in path name formation to reach its present state. This documentation | |
| describes the path name formation options open to the lsof builder | |
| and user after those refinements, and how lsof attempts to insure | |
| that none of the options presents a security risk. | |
| B. Device Cache File Format | |
| =========================== | |
| The device cache file is a flat file of ASCII text. It has an | |
| initial statement of how many sections the file might contain -- | |
| the possible sections are character devices, block devices, clone | |
| devices, pseudo devices, and checksum. The character devices and | |
| checksum sections are always present. | |
| Each section has a header that numbers the entries in the section. | |
| The last section is a checksum section that contains a 16 bit cyclic | |
| redundancy (CRC) checksum of everything in the file but the checksum | |
| section itself. | |
| Lsof always sets the permission modes of the device cache file to | |
| 0600, and the owner to the real UID of the process that executes | |
| lsof; the group, the real group ID (GID) of the lsof process. | |
| Setting the permission modes to 0600 means that a system-wide device | |
| cache file won't be usable unless the procedure that builds it | |
| changes the modes after lsof has written it. A suitable procedure | |
| for building a system-wide device cache that shows how to adjust | |
| these inadequate permission modes is given in the Default System-wide | |
| Path section. | |
| B.1. Integrity Checks | |
| ===================== | |
| When lsof opens the device cache file it makes these integrity | |
| checks: | |
| 1. Lsof must gain permission from access(2) to be able to | |
| open the file for reading. If lsof is writing the file, | |
| it usually cedes permission control to the applicable | |
| directory and file modes and ownerships. (Some additional | |
| checks apply and they're described in the sections on path | |
| options.) | |
| By explicit design lsof never writes to the system-wide | |
| device cache file, even when the real UID of its process | |
| is root. The system-wide device cache file must be written | |
| with a root-owned procedure via the ``-D[b|u<path>'' options | |
| -- i.e., under the system administrator's control. (See | |
| the Build Procedure sub-section of the Default System-wide | |
| Path section.) | |
| 2. The device cache file's modes must be 0600 (0644 if lsof | |
| is reading a system-wide device cache file) and its size | |
| must be non-zero. | |
| 3. There must be a correctly formatted section count line | |
| at the beginning of the file. | |
| 4. Each section must have a header line with a count that | |
| properly numbers the lines in the section. The first words | |
| of legal section titles are "device", "block", "clone", | |
| "pseudo", and "CRC". | |
| 5. The lines of a section must have the proper format. | |
| 6. All lines are included in a 16 bit CRC, and it is recorded | |
| in a non-checksummed section line at the end of the file. | |
| 7. The checksum computed when the file is read must match the | |
| checksum recorded when the file was written. | |
| 8. The checksum section line must be followed by end-of- | |
| information. | |
| 9. Lsof must be able to get matching results from stat(2) | |
| on a randomly chosen entry of the device section. | |
| B.2. The Setgid and Setuid-root States | |
| ====================================== | |
| There are two fundamental ways in which lsof is granted access to | |
| restricted system resources. Both access methods are related to the | |
| effective permissions given the lsof binary or executable. | |
| The first and preferable way to grant lsof access to system resources | |
| through the permissions endowed on its executable is the giving of | |
| set group ID (setgid) permission. The group is the one that has | |
| permission to read the kernel memory and swap devices -- e.g., /dev/kmem, | |
| /dev/mem, /dev/swap, etc. | |
| This method of granting access is called setgid mode because it | |
| enables lsof to run with an effective group ID set to the one | |
| granted by the permissions of its executable file and by the group | |
| that owns the executable file. See the getegid(2) man page for a | |
| further discussion of effective group ID. | |
| Usually lsof only needs setgid permission to open access to the | |
| kernel memory files. After they're open, lsof drops its setgid | |
| permission. | |
| The second and least preferable way to grant lsof access to system | |
| resources through the permissions endowed on its executable is the | |
| giving of set user ID to root (setuid-root) permission. This is | |
| much too strong a permission, but necessary: to use the -X option | |
| fully for the version of lsof for AIX 5 and above; to use the | |
| version of lsof for HP-UX 11.11 and above; and to use the version | |
| of lsof for Linux 2.1.72 and above. These lsof implementations | |
| require setuid-root permission to be able to access restricted | |
| resources -- e.g., the individual files of the /proc file system. | |
| (But note that the setuid-root Linux lsof doesn't need and has no | |
| device cache support.) | |
| Lsof never drops setuid-root permission, because it needs that | |
| power throughout its execution. However, when the lsof process is | |
| setuid-root, lsof disallows these device cache file path options: | |
| 1. It ignores the ``-D[b|r|u]<path>'' options. It accepts | |
| only the ``-Di'' and ``-Dr'' options. | |
| 2. It refuses to recognize a path supplied via an environment | |
| variable. | |
| 3. It refuses to accept an additional path component from an | |
| environment variable to be inserted in the middle of a | |
| personal device cache file path. | |
| Each restriction is imposed because setuid-root power might allow | |
| a malicious user to form a device cache file path that would give | |
| read access to a normally inaccessible place (That's bad enough.), | |
| or write access to a critical system file (That's the worst case.) | |
| There is one further state that lsof can enter that is slightly | |
| different from the setuid-root and setgid states. That state occurs | |
| when lsof is being run from a root shell -- i.e., the lsof real | |
| user ID is root. To avoid accidental complications, when lsof is | |
| in this state, it ignores all environment variable options. | |
| In the rest of this document you will find more detailed discussion | |
| of the special restrictions caused by the type of permission that | |
| has been given the lsof executable. | |
| C. Device Cache File Path Options | |
| ================================= | |
| Lsof offers five options for constructing the path to the device | |
| cache file. Each has special conditions and safeguards that | |
| surround its use. The options are: | |
| 1. A device cache file that is named in the <path> component | |
| of the parameters of lsof's ``-D'' option. | |
| ========================================================= | |
| * This is a default option of the lsof distribution. * | |
| * * | |
| * Paths specified with this option are read-only unless * | |
| * the real UID of the lsof process is root (0), or the * | |
| * lsof process is able to surrender setgid permission * | |
| * (See Appendix B) and it is not setuid-root. * | |
| ========================================================= | |
| 2. A device cache file whose name is specified by an environment | |
| variable. | |
| ========================================================= | |
| * This is a default option of the lsof distribution. * | |
| * * | |
| * This option is enabled when the lsof dialect is able * | |
| * to surrender setgid permission (See Appendix B.), and * | |
| * the lsof process is not setuid-root. * | |
| * * | |
| * The environment variable path is read-only if the * | |
| * lsof process does not surrender setgid permission * | |
| * (See Appendix B.) * | |
| ========================================================= | |
| 3. A system-wide default device cache file, located at a path | |
| determined by the builder of lsof. The lsof builder is also | |
| responsible for building the device cache file, using a | |
| different lsof path formation option at a suitable time -- | |
| e.g., when the system is booted. | |
| ========================================================= | |
| * This is option is disabled by default in the lsof * | |
| * distribution. * | |
| * * | |
| * The path specified with this option is read-only. * | |
| ========================================================= | |
| 4. A default personal device cache file, located in the UID's | |
| home directory. | |
| ========================================================= | |
| * This is a default option of the lsof distribution. * | |
| ========================================================= | |
| 5. A personal device cache file whose name is modified by an | |
| environment variable. | |
| ========================================================= | |
| * This is a default option of the lsof distribution. * | |
| * * | |
| * The modified personal path is read-only if the lsof * | |
| * process does not surrender setgid permission. * | |
| * * | |
| * This option is disabled when the lsof process is * | |
| * setuid-root or its real UID is root (0). * | |
| ========================================================= | |
| When there are multiple choices for the device cache file path, | |
| lsof chooses from the above list in the order the list is given, | |
| subject to restrictions based on the effective group and user IDs | |
| that are in effect. | |
| Each possible path name is discussed in a later section that | |
| describes the restrictions that apply to it and the method for | |
| building lsof to use it. | |
| In one special case lsof will use two paths in order. When a | |
| system-wide device cache file is enabled, and lsof finds that it | |
| doesn't exist, lsof will attempt to use a personal device cache | |
| file. | |
| C.1. Path Named by ``-D'' | |
| ========================= | |
| The ``-D[b|r|u]<path>'' option can name a path for the device cache | |
| file where it is unconditionally built (`b'); read, but never | |
| rebuilt (`r'); and read and rebuilt, if necessary (`u'). | |
| If the lsof process is setuid-root, no path may be specified with | |
| the ``-D'' option -- i.e., only the `i' function is accepted. The | |
| `r' option may be used if it doesn't have a path argument. | |
| If the lsof process is not setuid-root, nor is the real UID of the | |
| lsof process root, a path may accompany the `b', `r', and `u' | |
| functions if the lsof process surrenders setgid permission. (See | |
| Appendix B.) If the process doesn't surrender setgid permission, | |
| then a path may accompany only `r'. | |
| Lsof's permission to access a device cache file at a path specified | |
| with ``-D[b|r|u]<path>'' depends completely on the permission modes | |
| and ownerships of the file and its directory components. | |
| When the real UID of the lsof process is root (0), paths may be | |
| specified with ``-D[b|r|u]''. | |
| ==================================================================== | |
| * * | |
| * The ``-D[b|r|u]<path>'' option is enabled by default in the lsof * | |
| * distribution by the following definition in the dialect's * | |
| * machine.h header file: * | |
| * * | |
| * #define HASDCACHE 1 * | |
| * * | |
| * To disable all device cache file options, including all ``-D'' * | |
| * forms, change the above line in the dialect's machine.h file to: * | |
| * * | |
| * /* #define HASDCACHE 1 */ * | |
| * * | |
| * or remove it. * | |
| * * | |
| * The ``-D[b|r|u]<path>'' options are disabled when the lsof * | |
| * process is setuid-root. If the lsof process isn't setuid-root, * | |
| * nor is its real UID root (0), and if the lsof process surrenders * | |
| * setgid permission, ``-D[b|r|u]'' may be accompanied by a path. * | |
| * * | |
| * A path may accompany ``-D[b|u]'' when the real UID of the lsof * | |
| * process is root. * | |
| * * | |
| * ``-Dr'' without a path name argument is always acceptable. * | |
| * * | |
| ==================================================================== | |
| C.2. Path Named in Environment Variable | |
| ======================================= | |
| A device cache file path may be declared in an environment variable. | |
| This option is defined in the dialect's machine.h header file with | |
| the HASENVDC definition. The value of the HASENVDC definition is | |
| the environment variable's name. | |
| Lsof will use the value of the environment variable named by HASENVDC | |
| for the device cache file path unless either of the following | |
| conditions apply: | |
| 1. The lsof process is in the setuid-root state. | |
| or | |
| 2. The effective and real UIDs of the lsof process are root | |
| (0). | |
| Lsof uses the value of the HASENVDC environment variable as the | |
| device cache file path after it senses there is no path declared by | |
| a ``-D'' option. | |
| A path from an environment variable is read-only unless the lsof | |
| process surrenders setgid permission. (See Appendix B.) | |
| ==================================================================== | |
| * * | |
| * The path name environment variable option is enabled by default, * | |
| * and the environment variable is named LSOFDEVCACHE in the lsof * | |
| * distribution by the following definition in the dialect's * | |
| * machine.h header file: * | |
| * * | |
| * #define HASENVDC "LSOFDEVCACHE" * | |
| * * | |
| * To disable the path name environment variable option, change * | |
| * the above line in the dialect's machine.h header file to: * | |
| * * | |
| * /* #define HASENVDC "LSOFDEVCACHE" */ * | |
| * * | |
| * or remove it. To change the name of the environment variable, * | |
| * change the quoted value of the HASENVDC definition -- e.g., this * | |
| * form changes the environment variable name to "FOOBAR": * | |
| * * | |
| * #define HASENVDC "FOOBAR" * | |
| * * | |
| * You can disable the path name environment option by disabling * | |
| * all device cache file processing when you remove or by disabling * | |
| * the HASDCACHE definition in the dialect's machine.h header file. * | |
| * * | |
| * The path name environment option is disabled when the lsof * | |
| * process is setuid-root or when the real UID of the lsof process * | |
| * is root (0). * | |
| * * | |
| * The path named in an environment variable is read-only unless * | |
| * the lsof process surrenders setgid permission. (See Appendix * | |
| * B.) * | |
| * * | |
| ==================================================================== | |
| C.3. Default System-wide Path | |
| ============================= | |
| When a default system-wide device cache file path is defined (It's | |
| not enabled by default in the lsof distribution.), lsof will use | |
| it after it discovers no path has been specified by a ``-D'' option | |
| and no path has been specified in the environment variable named | |
| in the string #define HASENVDC of the dialect's machine.h header | |
| file. | |
| Lsof must be able to open the system-wide device cache file -- | |
| i.e., it must have read access to the file and search access to | |
| the directories that lead it. As part of its integrity checks, | |
| lsof requires that the system-wide device cache file's permission | |
| modes be 0644. | |
| When lsof discovers that the named system-wide device cache file | |
| doesn't exist, it will attempt to open a personal device cache file | |
| should that path formation option be enabled. This is the *only* | |
| case where lsof will attempt to use two device cache file paths. | |
| The system-wide device cache file is read-only; lsof will never | |
| attempt to write to it. However, when the real UID of the lsof | |
| process is root, that process may name the system-wide device | |
| cache file with ``-D[b|u]<path>''. | |
| ==================================================================== | |
| * * | |
| * The system-wide file path option is disabled by default in the * | |
| * lsof distribution. This place-marking definition in a dialect's * | |
| * machine.h header file may be altered to enable a system-wide * | |
| * device cache file path: * | |
| * * | |
| * /* #define HASSYSDC "/your/choice/of/path" */ * | |
| * * | |
| * To enable the system-wide name option, declaring that its path * | |
| * is ``/foo/bar/lsof.dc'', change the above line in the dialect's * | |
| * machine.h header file to: * | |
| * * | |
| * #define HASSYSDC "/foo/bar/lsof.dc" * | |
| * * | |
| * or change the quoted string of the definition to the path of * | |
| * your choice. * | |
| * * | |
| * You can disable the path name environment option by disabling * | |
| * all device cache file processing when you remove or disable the * | |
| * HASDCACHE definition in the dialect's machine.h header file. * | |
| * * | |
| * The system-wide device cache file is read-only. * | |
| * * | |
| ==================================================================== | |
| C.3.a. Build Procedure | |
| ====================== | |
| The system administrator must build the system-wide device cache | |
| file at an appropriate time -- e.g., each time the system is booted, | |
| and each time a node is added, deleted or modified in /dev (or | |
| /devices). The procedure that builds the system-wide device cache | |
| file must use lsof's ``-D[b|u]<path>'' options to build the file, | |
| and must change the file's permission modes to 0644 after it has | |
| been built. | |
| Here's a simple shell script procedure to build a system-wide device | |
| cache file. It assumes: | |
| 1. The Unix dialect's kernel supports the interpreter script | |
| execution option -- i.e., a script whose first line has | |
| the form ``#!<path_to_interpreter>''. | |
| 2. The chmod, echo, rm, sh, and test programs are located | |
| in ``/bin''. | |
| 3. The string value of the HASSYSDC definition in the dialect's | |
| machine.h header file is the path ``/your/choice/of/path''. | |
| 4. The lsof executable is located in ``/usr/local/etc''. | |
| #!/bin/sh | |
| # | |
| # Simple script to build a system-wide device cache file | |
| # for lsof. | |
| HASSYSDC=/your/choice/of/path | |
| /bin/rm -f $HASSYSDC | |
| /usr/local/etc/lsof -Du$HASSYSDC > /dev/null 2>&1 | |
| if /bin/test $? -ne 0 | |
| then | |
| /bin/echo "WARNING: failed to create $HASSYSDC" | |
| exit 1 | |
| fi | |
| /bin/chmod 0644 $HASSYSDC | |
| exit 0 | |
| The invocation of lsof uses the ``-Du$HASSYSDC'' option to read | |
| the device cache file and recreate it if necessary. The invocation | |
| can be made more efficient if a known process PID -- e.g., ``-p1'' | |
| -- can be specified. However, if that PID is not always active | |
| when lsof is called, lsof might set its exit code non-zero, causing | |
| the subsequent test to believe that the lsof call failed. When in | |
| doubt, omit the PID specification and accept the extra lsof processing | |
| time for reporting and discarding all open file information. | |
| C.4. Default Personal Path | |
| ========================== | |
| The default personal path option is defined by default in the lsof | |
| distribution. The path is formed of the home directory of the real | |
| UID of the lsof process, followed optionally by the contents of | |
| the HASPERSDCPATH environment variable, followed by ``.lsof_'', | |
| followed by the first component (characters up to the first period) | |
| of the name returned by gethostname(2). | |
| If gethostname(2) returns nothing, then nothing will follow the | |
| ``.lsof_'' string. If the first character of what gethostname(2) | |
| returns is a `.', then all the gethostname(2) value will follow | |
| the ``/lsof_'' string. (See the ``%l'' conversion for a way to | |
| make lsof include the entire host name in the path.) | |
| ==================================================================== | |
| * * | |
| * The personal path option is enabled by default in the lsof * | |
| * distribution. The HASPERSDC #define in a dialect's machine.h * | |
| * header is a format specification that tells lsof how to form the * | |
| * personal device cache file path. The conversions in the format * | |
| * specification begin with `%' , ala the printf(3) function of the * | |
| * standard I/O library. These conversions are supported: * | |
| * * | |
| * ``%%'' causes a single `%' to appear in the path. * | |
| * * | |
| * ``%0'' is a separator that marks the beginning of a path * | |
| * for a setuid-root lsof process or one whose real * | |
| * UID is 0. When lsof reaches this conversion and * | |
| * the process is setuid-root or has a real UID of * | |
| * root, it erases any previously formed path and * | |
| * restarts with the next HASPERSDC format character. * | |
| * If lsof reaches this conversion and the process is * | |
| * not setuid-root and its real UID is not root, path * | |
| * formation is ended. * | |
| * * | |
| * ``%h'' causes the home directory of the real UID of the * | |
| * lsof process to appear in the path. * | |
| * * | |
| * ``%l'' causes the full name returned by gethostname(2) to * | |
| * appear in the path. * | |
| * * | |
| * ``%L'' causes the first component of the name returned by * | |
| * gethostname(2) to appear in the path. The first * | |
| * component is defined to be what appears to the * | |
| * left of the first `.'. If nothing appears to the * | |
| * left then everything will appear in the path. * | |
| * * | |
| * ``%p'' causes the value of (HASPERSDCPATH) from the * | |
| * process environment to appear in the path. If the * | |
| * (HASPERSDCPATH) value doesn't end in a '/', one * | |
| * will be added. * | |
| * * | |
| * ``%u'' causes the login name associated with the real UID * | |
| * of the lsof process to appear in the path. * | |
| * * | |
| * ``%U'' causes the real UID of the lsof process, converted * | |
| * to a decimal string, to appear in the path. * | |
| * * | |
| * All other characters are copied from the format to the * | |
| * path. CAUTION: THINK VERY CAREFULLY ABOUT THE EFFECT OF * | |
| * USING CHARACTERS THAT FORM AN ABSOLUTE COMPONENT LIKE * | |
| * ``/tmp'' IN THE FORMAT. Consider what power your dialect * | |
| * might have (e.g., if it is setuid-root) when lsof must * | |
| * create a device cache file at the path. Consider using a * | |
| * ``%0'' conversion to declare an alternate path for lsof * | |
| * processes that are setuid-root or whose real uid is root. * | |
| * See the "How do I put the personal device cache file in * | |
| * /tmp?" question and answer in 00FAQ for an explanation of * | |
| * this example: * | |
| * * | |
| * #define HASPERSDC "/tmp/.lsof_%u_%l_pers%0%h/.lsof_%L" * | |
| * * | |
| * This is the format specification that appears in the machine.h * | |
| * header files of the lsof distribution: * | |
| * * | |
| * #define HASPERSDC "%h/%p.lsof_%L" * | |
| * * | |
| * It causes the path to be formed from the home directory of the * | |
| * real UID of the lsof process (``%h''), followed by `/', followed * | |
| * by the contents of the environment variable named by * | |
| * HASPERSDCPATH and a trailing `/', as needed (``%p''), followed * | |
| * by the string ``.lsof_'', and terminated with the first * | |
| * component of the host's name (``%L''). * | |
| * * | |
| * To change the personal path option, change the HASPERSDC string * | |
| * and recompile lsof. To disable the personal path option, remove * | |
| * or disable HASPERSDC. The personal path option is disabled when * | |
| * HASDCACHE is not defined. * | |
| * * | |
| ==================================================================== | |
| C.5. Modified Default Personal Path | |
| =================================== | |
| The modified default personal path form is a special case of the | |
| default personal path. In this form the value of the environment | |
| variable named by the HASPERSDCPATH #define is inserted in the | |
| personal path when the ``%p'' conversion appears in the HASPERSDC | |
| format specification. | |
| This allows, for example, the lsof user to move personal device | |
| cache files to another branch of the home directory, perhaps to a | |
| sub-directory where multiple device cache files may appear from | |
| different machines that use the same NFS- mounted home directory. | |
| The HASPERSDCPATH definition of the dialect's machine.h header file | |
| names the environment variable. By default in the lsof distribution | |
| it is LSOFPERSDCPATH. | |
| The modified personal path component is ignored when lsof process | |
| is setuid-root is root, lest it be maliciously or accidentally used in | |
| some convoluted form to access paths the real UID cannot. The | |
| modified personal path component is also ignored when the real UID | |
| of the lsof process is root (0), so that lsof will not accidentally | |
| use a personal environment value. | |
| If the lsof process surrenders setgid permission (See Appendix B.), | |
| lsof can read from and write to the modified personal path. If, | |
| however, the lsof process doesn't surrender setgid permission, the | |
| modified personal path is read-only. | |
| If your dialect runs setuid-root or doesn't surrender its setgid | |
| permission, and you want to use the LSOFPERSDCPATH environment | |
| variable to address a collection of device cache files in a | |
| subdirectory, you will have to gather the collection in the | |
| subdirectory yourself with shell copy or move commands. | |
| ==================================================================== | |
| * * | |
| * The modified personal path option is enabled by default in the * | |
| * lsof distribution with these definitions in the dialect's * | |
| * machine.h header file: * | |
| * * | |
| * #define HASPERSDCPATH "LSOFPERSDCPATH" * | |
| * and * | |
| * #define HASPERSDC "%h/%p.lsof_%L" * | |
| * * | |
| * The value of the definition is the name of the environment * | |
| * variable that contains the modified personal path name * | |
| * component that is inserted in the personal path when ``%p'' * | |
| * appears in HASPERSDC. See the Default Personal Path section * | |
| * for a complete description of the ``%p'' conversion. * | |
| * * | |
| * To disable the modified personal path name component, disable * | |
| * the HASPERSDCPATH definition in the dialect's machine.h header * | |
| * file -- e.g., change it to: * | |
| * * | |
| * /* #define HASPERSDCPATH "LSOFPERSDCPATH" */ * | |
| * * | |
| * or remove the definition altogether. If you do this, don't * | |
| * forget to remove any ``%p'' conversion from HASPERSDC. * | |
| * * | |
| * The modified personal path option is disabled when HASDCACHE is * | |
| * not defined. * | |
| * * | |
| * The modified personal path environment variable value is ignored * | |
| * when the lsof process is setuid-root or when the real UID of * | |
| * the lsof process is root (0). * | |
| * * | |
| * The modified personal path is read-only when the lsof process * | |
| * doesn't surrender its setgid permission. * | |
| * * | |
| ==================================================================== | |
| D. Displaying the Default Path | |
| ============================== | |
| Whatever device cache file path formation options you decide to | |
| use, remember that the lsof help output, displayed in response to | |
| its ``-h'' or ``-?'' help options, will display the read-mode | |
| default (the highest numbered) path that lsof has been enabled to | |
| form from which it will read. | |
| Since some paths are read-only, the path displayed in help option | |
| output may not be the one to which lsof will write, should that | |
| become necessary. To see the read-only and write device cache file | |
| paths, environment variable names, and the personal device cache | |
| file format specification (HASPERSDC), use the -D? option. | |
| Appendix A, Unix Dialects Without a Device Cache | |
| ================================================ | |
| Linux lsof implementations that obtain their information from files | |
| in the /proc file system do not have device cache support. Generally | |
| lsof for Linux versions 2.1.72 and greater are /proc based. | |
| Appendix B, Lsof Dialects and Their Permissions | |
| =============================================== | |
| These are the permissions recommended in the lsof distribution. | |
| Appendix B.1 Setuid-root Lsof Dialects | |
| ====================================== | |
| These dialect versions of lsof need root permission. For general | |
| use they may have to be installed setuid-root. | |
| Apple Darwin 9 and Mac OS X 10.[56] | |
| HP-UX 11.11 and 11.23 | |
| Linux (no device cache support needed) | |
| Appendix B.2 Setgid Lsof Dialects That Surrender Setgid Permission | |
| ================================================================== | |
| Lsof versions for these dialects have WILLDROPGID defined in their | |
| machine.h header files. | |
| AIX 5.[12] and 5.3-ML1 | |
| FreeBSD 4.x, 4.1x, 5.x and [6789].x for x86-based systems | |
| FreeBSD 5.x and [6789].x for Alpha, AMD64 and Sparc64-based | |
| systems | |
| HP-UX 11.00 | |
| NetBSD 1.[456], 2.x and 3.x for Alpha, x86, and SPARC-based | |
| systems | |
| NEXTSTEP 3.[13] | |
| OpenBSD 2.[89] and 3.[0-9] for x86-based systems | |
| OPENSTEP 4.x | |
| SCO OpenServer Release 5.0.4 for x86-based systems | |
| SCO|Caldera UnixWare 7.1.4 for x86-based systems | |
| Solaris 2.6, 8, 9 and 10 | |
| Tru64 UNIX 5.1 | |
| Vic Abell <abe@purdue.edu> | |
| September 27, 2011 |