Remove the lustre/liblustre and libsysio subdirectories.
Signed-off-by: John L. Hammond <john.hammond@intel.com>
Change-Id: I53c06b8c76955519a33a7b1292b0d87495105607
Reviewed-on: http://review.whamcloud.com/10657
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Bob Glossman <bob.glossman@intel.com>
Reviewed-by: Dmitry Eremin <dmitry.eremin@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
#
# and autoMakefile.am:
#
-# if LIBLUSTRE
-# <liblustre rules>
-# endif
-#
# if MODULES
# modulefs_DATA = <module-name>$(KMODEXT)
# endif
+++ /dev/null
-/aclocal.m4
-/autom4te.cache
-/lib
-/Makefile.in
-/INSTALL
+++ /dev/null
-Lee Ward <lee@sandia.gov>
-
-Various folks at:
-
-Cluster File Systems Incorporated. (www.clusterfs.com)
-Cray Incorporated (www.cray.com)
+++ /dev/null
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-\f
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-\f
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-\f
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-\f
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-\f
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-\f
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-\f
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-\f
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-\f
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
+++ /dev/null
-Sat Feb 22 10:32:10 EST 2003
- Created <lee@sandia.gov>
----
-
-*Added mount() api call to support sub-mounts.
-
-*Added rudimentary automounts per the namespace chapter in the "Lustre
-Architecture Reference". Note, full URI support is not implemented. See
-the README for details.
-
-Think I have it going for simultaneous 32/64 bit support. Together with
-the nagging build for test_stat.
-
-*Miscellaneous bugs fixed.
-
----
-Lee -- Sat Mar 22 15:01:45 EST 2003
-
-*Added "incore" file system. An in-memory file system solving boot-strap
-and other annoying little chicken-and-the-egg problems.
-
-*Added support for devices
-
-*Added support for accessing the pre-opened standard file descriptors 0, 1,
-and 2 via the stdfd device driver (major number 0, minor 0, 1, and 2).
-
----
-Lee -- Mon Jan 26 11:26:14 EST 2004
-
-*Altered the internal interface to pass the xtvec (see .../include/xtio.h) in
-order to support strided-io.
+++ /dev/null
-Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
-Foundation, Inc.
-
- This file is free documentation; the Free Software Foundation gives
-unlimited permission to copy, distribute and modify it.
-
-Basic Installation
-==================
-
- These are generic installation instructions.
-
- The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation. It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions. Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
-
- It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring. (Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.)
-
- If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release. If you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
-may remove or edit it.
-
- The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'. You only need
-`configure.ac' if you want to change it or regenerate `configure' using
-a newer version of `autoconf'.
-
-The simplest way to compile this package is:
-
- 1. `cd' to the directory containing the package's source code and type
- `./configure' to configure the package for your system. If you're
- using `csh' on an old version of System V, you might need to type
- `sh ./configure' instead to prevent `csh' from trying to execute
- `configure' itself.
-
- Running `configure' takes awhile. While running, it prints some
- messages telling which features it is checking for.
-
- 2. Type `make' to compile the package.
-
- 3. Optionally, type `make check' to run any self-tests that come with
- the package.
-
- 4. Type `make install' to install the programs and any data files and
- documentation.
-
- 5. You can remove the program binaries and object files from the
- source code directory by typing `make clean'. To also remove the
- files that `configure' created (so you can compile the package for
- a different kind of computer), type `make distclean'. There is
- also a `make maintainer-clean' target, but that is intended mainly
- for the package's developers. If you use it, you may have to get
- all sorts of other programs in order to regenerate files that came
- with the distribution.
-
-Compilers and Options
-=====================
-
- Some systems require unusual options for compilation or linking that
-the `configure' script does not know about. Run `./configure --help'
-for details on some of the pertinent environment variables.
-
- You can give `configure' initial values for configuration parameters
-by setting variables in the command line or in the environment. Here
-is an example:
-
- ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
-
- *Note Defining Variables::, for more details.
-
-Compiling For Multiple Architectures
-====================================
-
- You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory. To do this, you must use a version of `make' that
-supports the `VPATH' variable, such as GNU `make'. `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script. `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.
-
- If you have to use a `make' that does not support the `VPATH'
-variable, you have to compile the package for one architecture at a
-time in the source code directory. After you have installed the
-package for one architecture, use `make distclean' before reconfiguring
-for another architecture.
-
-Installation Names
-==================
-
- By default, `make install' will install the package's files in
-`/usr/local/bin', `/usr/local/man', etc. You can specify an
-installation prefix other than `/usr/local' by giving `configure' the
-option `--prefix=PATH'.
-
- You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files. If you
-give `configure' the option `--exec-prefix=PATH', the package will use
-PATH as the prefix for installing programs and libraries.
-Documentation and other data files will still use the regular prefix.
-
- In addition, if you use an unusual directory layout you can give
-options like `--bindir=PATH' to specify different values for particular
-kinds of files. Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.
-
- If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-Optional Features
-=================
-
- Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System). The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
- For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
-Specifying the System Type
-==========================
-
- There may be some features `configure' cannot figure out
-automatically, but needs to determine by the type of machine the package
-will run on. Usually, assuming the package is built to be run on the
-_same_ architectures, `configure' can figure that out, but if it prints
-a message saying it cannot guess the machine type, give it the
-`--build=TYPE' option. TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
-
- CPU-COMPANY-SYSTEM
-
-where SYSTEM can have one of these forms:
-
- OS KERNEL-OS
-
- See the file `config.sub' for the possible values of each field. If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the machine type.
-
- If you are _building_ compiler tools for cross-compiling, you should
-use the `--target=TYPE' option to select the type of system they will
-produce code for.
-
- If you want to _use_ a cross compiler, that generates code for a
-platform different from the build platform, you should specify the
-"host" platform (i.e., that on which the generated programs will
-eventually be run) with `--host=TYPE'.
-
-Sharing Defaults
-================
-
- If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists. Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Defining Variables
-==================
-
- Variables not defined in a site shell script can be set in the
-environment passed to `configure'. However, some packages may run
-configure again during the build, and the customized values of these
-variables may be lost. In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'. For example:
-
- ./configure CC=/usr/local2/bin/gcc
-
-will cause the specified gcc to be used as the C compiler (unless it is
-overridden in the site shell script).
-
-`configure' Invocation
-======================
-
- `configure' recognizes the following options to control how it
-operates.
-
-`--help'
-`-h'
- Print a summary of the options to `configure', and exit.
-
-`--version'
-`-V'
- Print the version of Autoconf used to generate the `configure'
- script, and exit.
-
-`--cache-file=FILE'
- Enable the cache: use and save the results of the tests in FILE,
- traditionally `config.cache'. FILE defaults to `/dev/null' to
- disable caching.
-
-`--config-cache'
-`-C'
- Alias for `--cache-file=config.cache'.
-
-`--quiet'
-`--silent'
-`-q'
- Do not print messages saying which checks are being made. To
- suppress all normal output, redirect it to `/dev/null' (any error
- messages will still be shown).
-
-`--srcdir=DIR'
- Look for the package's source code in directory DIR. Usually
- `configure' can determine that directory automatically.
-
-`configure' also accepts some other, not widely useful, options. Run
-`configure --help' for more details.
-
+++ /dev/null
-AUTOMAKE_OPTIONS=1.6
-
-if WITH_TESTS
-TESTDIR = tests
-else
-TESTDIR =
-endif
-
-include $(top_srcdir)/src/module.mk
-include $(top_srcdir)/include/module.mk
-include $(top_srcdir)/tests/module.mk
-include $(top_srcdir)/dev/stdfd/module.mk
-include $(top_srcdir)/drivers/incore/module.mk
-include $(top_srcdir)/drivers/native/module.mk
-include $(top_srcdir)/drivers/yod/module.mk
-include $(top_srcdir)/drivers/sockets/module.mk
-
-lib_LIBRARIES = ${LIBBUILD_DIR}/libsysio.a
-
-if WITH_STDFD_DEV
-OPTIONAL_STDFD_SRCS = $(STDFD_SRCS)
-else
-OPTIONAL_STDFD_SRCS =
-endif
-
-if WITH_INCORE_DRIVER
-OPTIONAL_INCORE_SRCS = $(INCORE_SRCS)
-else
-OPTIONAL_INCORE_SRCS =
-endif
-
-if WITH_NATIVE_DRIVER
-OPTIONAL_NATIVE_SRCS = $(NATIVE_SRCS)
-else
-OPTIONAL_NATIVE_SRCS =
-endif
-
-if WITH_SOCKETS_DRIVER
-OPTIONAL_SOCKETS_SRCS = $(SOCKETS_SRCS)
-else
-OPTIONAL_SOCKETS_SRCS =
-endif
-
-if WITH_CPLANT_YOD
-OPTIONAL_YOD_SRCS = $(YOD_SRCS)
-else
-OPTIONAL_YOD_SRCS =
-endif
-
-if WITH_LUSTRE_HACK
-# it would be better that let configure script check this
-OPTIONAL_LUSTRE_CFLAGS = -fPIC
-endif
-
-AM_CFLAGS = $(OPTIONAL_LUSTRE_CFLAGS)
-
-__LIBBUILD_DIR__libsysio_a_SOURCES = \
- $(SRCDIR_SRCS) \
- $(OPTIONAL_STDFD_SRCS) \
- $(OPTIONAL_INCORE_SRCS) \
- $(OPTIONAL_SOCKETS_SRCS) \
- $(OPTIONAL_NATIVE_SRCS) \
- $(OPTIONAL_YOD_SRCS)
-
-include $(top_srcdir)/Rules.make
-
-EXTRA_DIST = Rules.make misc/init-env.sh $(TESTS_EXTRA) $(SRCDIR_EXTRA) \
- $(INCLUDE_EXTRA) $(STDFD_EXTRA) $(INCORE_EXTRA) \
- $(SOCKETS_EXTRA) $(NATIVE_EXTRA) $(YOD_EXTRA)
-
-AM_CPPFLAGS += ${YOD_DRIVER_FLAGS}
-
-really-clean: testsclean maintainer-clean
- -rm -rf autom4te-2.53.cache
- -rm -rf .deps
- -rm -f Makefile.in
- -rm -f compile depcomp INSTALL install-sh missing mkinstalldirs \
- configure aclocal.m4
- -rm -f config.guess config.sub
- -rm -rf $(LIBBUILD_DIR)
- -rm -f libsysio*.tar.gz
- cd $(TESTDIR); rm -rf Makefile Makefile.in .deps
-
-tests: $(lib_LIBRARIES) FORCE
- cd $(TESTDIR); ${MAKE}
-testsclean: FORCE
- cd $(TESTDIR); ${MAKE} clean
-clean: testsclean clean-am
-FORCE:
+++ /dev/null
-Build
------
-
-To bootstrap configuration:
-
-sh autogen.sh
-./configure [options]
-
-Without the supported "--with" options only the core sysio library is
-built.
-
-Option --with-native-driver=yes will cause the "native" host name space test
-driver to be enabled and made available in drivers/native/libsysio_native.a
-when built. This is set by default; Use "no" to disable.
-
-Option --with-tests=yes will cause the test programs in the tests directory
-to be enabled. This is set by default; Use "no" to disable.
-
-Option --with-automount=<automount-file-name> will cause automount support
-to be included. If <automount-file-name> is not supplied, a default value
-of ".mount" will be used, matching the Lustre documentation.
-
-To build:
-
-Just `make' it.
-
-Automounts
-----------
-
-For a full description of this see the "Lustre Book" at:
- <http://www.lustre.org/docs/lustre.pdf>
-
-In short, though, whenever a component is being looked up in a directory and
-that directory has the "set-UID" bit set, then the directory is
-searched for a special file. By default, that file is called ".mount" but
-you may set it to any name using the --with-automount option described
-earlier.
-
-If the content of that file has something formatted, exactly:
-
-<file-system-type>:<source>
-
-Then the <source> description is mounted on the directory containing the
-special automount file and being used as the parent in the lookup. If the
-mount is successful, the parent is replaced with the newly mounted directory
-and processing continues. If the mount fails, or the automount file
-does not exist or cannot be read, everything continues as though the operation
-had never been attempted.
-
-File systems, or volumes, or file-sets, or whatever they are called, that
-have been automounted may also be automatically unmounted when resource
-is required. They are not on a timer, unless the file system driver implements
-one for them. They just disappear as resource is needed elsewhere. As they
-were automatically mounted to begin with, they should re-establish as needed,
-transparently.
-
-REDSTORM
---------
-
-The following works for me:
-
-#!/bin/sh
-
-export CFLAGS="-DREDSTORM -nostdinc -isystem /home/lee/REDSTORM/catamount/computeincs/i386 -isystem /home/lee/REDSTORM/catamount/include -g -W -Wall -ansi"
-
-sh configure --with-autmount=".mount" --with-native=yes --with-incore-yes --with-stdfd=yes --with-tests=yes
+++ /dev/null
-if WITH_STDFD_DEV
-STDFD_DEV_CPPFLAGS =-DSTDFD_DEV=1 -I$(top_srcdir)/dev/stdfd
-else
-STFD_DEV_CPPFLAGS =
-endif
-
-if WITH_SOCKETS_DRIVER
-SOCKETS_CPPFLAGS=-DWITH_SOCKETS=1
-else
-SOCKETS_CPPFLAGS=
-endif
-
-DEV_CPPFLAGS = $(STDFD_DEV_CPPFLAGS)
-
-AM_CPPFLAGS = \
- $(TRACING) \
- $(AUTOMOUNT) $(ZERO_SUM_MEMORY) $(DEV_CPPFLAGS) $(SOCKETS_CPPFLAGS) \
- $(DEFER_INIT_CWD) $(SYSIO_LABEL_NAMES) -I$(top_srcdir)/include
+++ /dev/null
-#!/bin/sh
-
-${ACLOCAL:-aclocal} &&
-${AUTOMAKE:-automake} --add-missing --copy &&
-${AUTOCONF:-autoconf}
+++ /dev/null
-#! /bin/sh
-
-# Wrapper for compilers which do not understand `-c -o'.
-
-# Copyright 1999, 2000 Free Software Foundation, Inc.
-# Written by Tom Tromey <tromey@cygnus.com>.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# This program 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 General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Usage:
-# compile PROGRAM [ARGS]...
-# `-o FOO.o' is removed from the args passed to the actual compile.
-
-prog=$1
-shift
-
-ofile=
-cfile=
-args=
-while test $# -gt 0; do
- case "$1" in
- -o)
- # configure might choose to run compile as `compile cc -o foo foo.c'.
- # So we do something ugly here.
- ofile=$2
- shift
- case "$ofile" in
- *.o | *.obj)
- ;;
- *)
- args="$args -o $ofile"
- ofile=
- ;;
- esac
- ;;
- *.c)
- cfile=$1
- args="$args $1"
- ;;
- *)
- args="$args $1"
- ;;
- esac
- shift
-done
-
-if test -z "$ofile" || test -z "$cfile"; then
- # If no `-o' option was seen then we might have been invoked from a
- # pattern rule where we don't need one. That is ok -- this is a
- # normal compilation that the losing compiler can handle. If no
- # `.c' file was seen then we are probably linking. That is also
- # ok.
- exec "$prog" $args
-fi
-
-# Name of file we expect compiler to create.
-cofile=`echo $cfile | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
-
-# Create the lock directory.
-# Note: use `[/.-]' here to ensure that we don't use the same name
-# that we are using for the .o file. Also, base the name on the expected
-# object file name, since that is what matters with a parallel build.
-lockdir=`echo $cofile | sed -e 's|[/.-]|_|g'`.d
-while true; do
- if mkdir $lockdir > /dev/null 2>&1; then
- break
- fi
- sleep 1
-done
-# FIXME: race condition here if user kills between mkdir and trap.
-trap "rmdir $lockdir; exit 1" 1 2 15
-
-# Run the compile.
-"$prog" $args
-status=$?
-
-if test -f "$cofile"; then
- mv "$cofile" "$ofile"
-fi
-
-rmdir $lockdir
-exit $status
+++ /dev/null
-#! /bin/sh
-# Attempt to guess a canonical system name.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-# 2011 Free Software Foundation, Inc.
-
-timestamp='2011-11-11'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program 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
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner. Please send patches (context
-# diff format) to <config-patches@gnu.org> and include a ChangeLog
-# entry.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub. If it succeeds, it prints the system name on stdout, and
-# exits with 0. Otherwise, it exits with 1.
-#
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free
-Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit ;;
- --version | -v )
- echo "$version" ; exit ;;
- --help | --h* | -h )
- echo "$usage"; exit ;;
- -- ) # Stop option processing
- shift; break ;;
- - ) # Use stdin as input.
- break ;;
- -* )
- echo "$me: invalid option $1$help" >&2
- exit 1 ;;
- * )
- break ;;
- esac
-done
-
-if test $# != 0; then
- echo "$me: too many arguments$help" >&2
- exit 1
-fi
-
-trap 'exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,) echo "int x;" > $dummy.c ;
- for c in cc gcc c89 c99 ; do
- if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
- CC_FOR_BUILD="$c"; break ;
- fi ;
- done ;
- if test x"$CC_FOR_BUILD" = x ; then
- CC_FOR_BUILD=no_compiler_found ;
- fi
- ;;
- ,,*) CC_FOR_BUILD=$CC ;;
- ,*,*) CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
- PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-# Detect uclibc systems.
-
-LIBC="gnu"
-if [ -f /usr/include/bits/uClibc_config.h ]
-then
- LIBC=uclibc
- if [ -n `grep "#define __UCLIBC_CONFIG_VERSION__" /usr/include/bits/uClibc_config.h` ]
- then
- UCLIBC_SUBVER=`sed -n "/#define __UCLIBC_CONFIG_VERSION__ /s///p" /usr/include/bits/uClibc_config.h`
- LIBC=$LIBC$UCLIBC_SUBVER
- fi
-fi
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
- *:NetBSD:*:*)
- # NetBSD (nbsd) targets should (where applicable) match one or
- # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
- # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
- # switched to ELF, *-*-netbsd* would select the old
- # object file format. This provides both forward
- # compatibility and a consistent mechanism for selecting the
- # object file format.
- #
- # Note: NetBSD doesn't particularly care about the vendor
- # portion of the name. We always set it to "unknown".
- sysctl="sysctl -n hw.machine_arch"
- UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
- /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
- case "${UNAME_MACHINE_ARCH}" in
- armeb) machine=armeb-unknown ;;
- arm*) machine=arm-unknown ;;
- sh3el) machine=shl-unknown ;;
- sh3eb) machine=sh-unknown ;;
- sh5el) machine=sh5le-unknown ;;
- *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
- esac
- # The Operating System including object format, if it has switched
- # to ELF recently, or will in the future.
- case "${UNAME_MACHINE_ARCH}" in
- arm*|i386|m68k|ns32k|sh3*|sparc|vax)
- eval $set_cc_for_build
- if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ELF__
- then
- # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
- # Return netbsd for either. FIX?
- os=netbsd
- else
- os=netbsdelf
- fi
- ;;
- *)
- os=netbsd
- ;;
- esac
- # The OS release
- # Debian GNU/NetBSD machines have a different userland, and
- # thus, need a distinct triplet. However, they do not need
- # kernel version information, so it can be replaced with a
- # suitable tag, in the style of linux-gnu.
- case "${UNAME_VERSION}" in
- Debian*)
- release='-gnu'
- ;;
- *)
- release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
- ;;
- esac
- # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
- # contains redundant information, the shorter form:
- # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
- echo "${machine}-${os}${release}"
- exit ;;
- *:OpenBSD:*:*)
- UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
- echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
- exit ;;
- *:ekkoBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
- exit ;;
- *:SolidBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
- exit ;;
- macppc:MirBSD:*:*)
- echo powerpc-unknown-mirbsd${UNAME_RELEASE}
- exit ;;
- *:MirBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
- exit ;;
- alpha:OSF1:*:*)
- case $UNAME_RELEASE in
- *4.0)
- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
- ;;
- *5.*)
- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
- ;;
- esac
- # According to Compaq, /usr/sbin/psrinfo has been available on
- # OSF/1 and Tru64 systems produced since 1995. I hope that
- # covers most systems running today. This code pipes the CPU
- # types through head -n 1, so we only detect the type of CPU 0.
- ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
- case "$ALPHA_CPU_TYPE" in
- "EV4 (21064)")
- UNAME_MACHINE="alpha" ;;
- "EV4.5 (21064)")
- UNAME_MACHINE="alpha" ;;
- "LCA4 (21066/21068)")
- UNAME_MACHINE="alpha" ;;
- "EV5 (21164)")
- UNAME_MACHINE="alphaev5" ;;
- "EV5.6 (21164A)")
- UNAME_MACHINE="alphaev56" ;;
- "EV5.6 (21164PC)")
- UNAME_MACHINE="alphapca56" ;;
- "EV5.7 (21164PC)")
- UNAME_MACHINE="alphapca57" ;;
- "EV6 (21264)")
- UNAME_MACHINE="alphaev6" ;;
- "EV6.7 (21264A)")
- UNAME_MACHINE="alphaev67" ;;
- "EV6.8CB (21264C)")
- UNAME_MACHINE="alphaev68" ;;
- "EV6.8AL (21264B)")
- UNAME_MACHINE="alphaev68" ;;
- "EV6.8CX (21264D)")
- UNAME_MACHINE="alphaev68" ;;
- "EV6.9A (21264/EV69A)")
- UNAME_MACHINE="alphaev69" ;;
- "EV7 (21364)")
- UNAME_MACHINE="alphaev7" ;;
- "EV7.9 (21364A)")
- UNAME_MACHINE="alphaev79" ;;
- esac
- # A Pn.n version is a patched version.
- # A Vn.n version is a released version.
- # A Tn.n version is a released field test version.
- # A Xn.n version is an unreleased experimental baselevel.
- # 1.2 uses "1.2" for uname -r.
- echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
- exitcode=$?
- trap '' 0
- exit $exitcode ;;
- Alpha\ *:Windows_NT*:*)
- # How do we know it's Interix rather than the generic POSIX subsystem?
- # Should we change UNAME_MACHINE based on the output of uname instead
- # of the specific Alpha model?
- echo alpha-pc-interix
- exit ;;
- 21064:Windows_NT:50:3)
- echo alpha-dec-winnt3.5
- exit ;;
- Amiga*:UNIX_System_V:4.0:*)
- echo m68k-unknown-sysv4
- exit ;;
- *:[Aa]miga[Oo][Ss]:*:*)
- echo ${UNAME_MACHINE}-unknown-amigaos
- exit ;;
- *:[Mm]orph[Oo][Ss]:*:*)
- echo ${UNAME_MACHINE}-unknown-morphos
- exit ;;
- *:OS/390:*:*)
- echo i370-ibm-openedition
- exit ;;
- *:z/VM:*:*)
- echo s390-ibm-zvmoe
- exit ;;
- *:OS400:*:*)
- echo powerpc-ibm-os400
- exit ;;
- arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
- echo arm-acorn-riscix${UNAME_RELEASE}
- exit ;;
- arm:riscos:*:*|arm:RISCOS:*:*)
- echo arm-unknown-riscos
- exit ;;
- SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
- echo hppa1.1-hitachi-hiuxmpp
- exit ;;
- Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
- # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
- if test "`(/bin/universe) 2>/dev/null`" = att ; then
- echo pyramid-pyramid-sysv3
- else
- echo pyramid-pyramid-bsd
- fi
- exit ;;
- NILE*:*:*:dcosx)
- echo pyramid-pyramid-svr4
- exit ;;
- DRS?6000:unix:4.0:6*)
- echo sparc-icl-nx6
- exit ;;
- DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
- case `/usr/bin/uname -p` in
- sparc) echo sparc-icl-nx7; exit ;;
- esac ;;
- s390x:SunOS:*:*)
- echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4H:SunOS:5.*:*)
- echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
- echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
- echo i386-pc-auroraux${UNAME_RELEASE}
- exit ;;
- i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
- eval $set_cc_for_build
- SUN_ARCH="i386"
- # If there is a compiler, see if it is configured for 64-bit objects.
- # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
- # This test works for both compilers.
- if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
- if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- SUN_ARCH="x86_64"
- fi
- fi
- echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4*:SunOS:6*:*)
- # According to config.sub, this is the proper way to canonicalize
- # SunOS6. Hard to guess exactly what SunOS6 will be like, but
- # it's likely to be more like Solaris than SunOS4.
- echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4*:SunOS:*:*)
- case "`/usr/bin/arch -k`" in
- Series*|S4*)
- UNAME_RELEASE=`uname -v`
- ;;
- esac
- # Japanese Language versions have a version number like `4.1.3-JL'.
- echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
- exit ;;
- sun3*:SunOS:*:*)
- echo m68k-sun-sunos${UNAME_RELEASE}
- exit ;;
- sun*:*:4.2BSD:*)
- UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
- test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
- case "`/bin/arch`" in
- sun3)
- echo m68k-sun-sunos${UNAME_RELEASE}
- ;;
- sun4)
- echo sparc-sun-sunos${UNAME_RELEASE}
- ;;
- esac
- exit ;;
- aushp:SunOS:*:*)
- echo sparc-auspex-sunos${UNAME_RELEASE}
- exit ;;
- # The situation for MiNT is a little confusing. The machine name
- # can be virtually everything (everything which is not
- # "atarist" or "atariste" at least should have a processor
- # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
- # to the lowercase version "mint" (or "freemint"). Finally
- # the system name "TOS" denotes a system which is actually not
- # MiNT. But MiNT is downward compatible to TOS, so this should
- # be no problem.
- atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
- exit ;;
- atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
- exit ;;
- *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
- exit ;;
- milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
- echo m68k-milan-mint${UNAME_RELEASE}
- exit ;;
- hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
- echo m68k-hades-mint${UNAME_RELEASE}
- exit ;;
- *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
- echo m68k-unknown-mint${UNAME_RELEASE}
- exit ;;
- m68k:machten:*:*)
- echo m68k-apple-machten${UNAME_RELEASE}
- exit ;;
- powerpc:machten:*:*)
- echo powerpc-apple-machten${UNAME_RELEASE}
- exit ;;
- RISC*:Mach:*:*)
- echo mips-dec-mach_bsd4.3
- exit ;;
- RISC*:ULTRIX:*:*)
- echo mips-dec-ultrix${UNAME_RELEASE}
- exit ;;
- VAX*:ULTRIX*:*:*)
- echo vax-dec-ultrix${UNAME_RELEASE}
- exit ;;
- 2020:CLIX:*:* | 2430:CLIX:*:*)
- echo clipper-intergraph-clix${UNAME_RELEASE}
- exit ;;
- mips:*:*:UMIPS | mips:*:*:RISCos)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h> /* for printf() prototype */
- int main (int argc, char *argv[]) {
-#else
- int main (argc, argv) int argc; char *argv[]; {
-#endif
- #if defined (host_mips) && defined (MIPSEB)
- #if defined (SYSTYPE_SYSV)
- printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
- #endif
- #if defined (SYSTYPE_SVR4)
- printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
- #endif
- #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
- printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
- #endif
- #endif
- exit (-1);
- }
-EOF
- $CC_FOR_BUILD -o $dummy $dummy.c &&
- dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
- SYSTEM_NAME=`$dummy $dummyarg` &&
- { echo "$SYSTEM_NAME"; exit; }
- echo mips-mips-riscos${UNAME_RELEASE}
- exit ;;
- Motorola:PowerMAX_OS:*:*)
- echo powerpc-motorola-powermax
- exit ;;
- Motorola:*:4.3:PL8-*)
- echo powerpc-harris-powermax
- exit ;;
- Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
- echo powerpc-harris-powermax
- exit ;;
- Night_Hawk:Power_UNIX:*:*)
- echo powerpc-harris-powerunix
- exit ;;
- m88k:CX/UX:7*:*)
- echo m88k-harris-cxux7
- exit ;;
- m88k:*:4*:R4*)
- echo m88k-motorola-sysv4
- exit ;;
- m88k:*:3*:R3*)
- echo m88k-motorola-sysv3
- exit ;;
- AViiON:dgux:*:*)
- # DG/UX returns AViiON for all architectures
- UNAME_PROCESSOR=`/usr/bin/uname -p`
- if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
- then
- if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
- [ ${TARGET_BINARY_INTERFACE}x = x ]
- then
- echo m88k-dg-dgux${UNAME_RELEASE}
- else
- echo m88k-dg-dguxbcs${UNAME_RELEASE}
- fi
- else
- echo i586-dg-dgux${UNAME_RELEASE}
- fi
- exit ;;
- M88*:DolphinOS:*:*) # DolphinOS (SVR3)
- echo m88k-dolphin-sysv3
- exit ;;
- M88*:*:R3*:*)
- # Delta 88k system running SVR3
- echo m88k-motorola-sysv3
- exit ;;
- XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
- echo m88k-tektronix-sysv3
- exit ;;
- Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
- echo m68k-tektronix-bsd
- exit ;;
- *:IRIX*:*:*)
- echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
- exit ;;
- ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
- echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
- exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
- i*86:AIX:*:*)
- echo i386-ibm-aix
- exit ;;
- ia64:AIX:*:*)
- if [ -x /usr/bin/oslevel ] ; then
- IBM_REV=`/usr/bin/oslevel`
- else
- IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
- fi
- echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
- exit ;;
- *:AIX:2:3)
- if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #include <sys/systemcfg.h>
-
- main()
- {
- if (!__power_pc())
- exit(1);
- puts("powerpc-ibm-aix3.2.5");
- exit(0);
- }
-EOF
- if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
- then
- echo "$SYSTEM_NAME"
- else
- echo rs6000-ibm-aix3.2.5
- fi
- elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
- echo rs6000-ibm-aix3.2.4
- else
- echo rs6000-ibm-aix3.2
- fi
- exit ;;
- *:AIX:*:[4567])
- IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
- if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
- IBM_ARCH=rs6000
- else
- IBM_ARCH=powerpc
- fi
- if [ -x /usr/bin/oslevel ] ; then
- IBM_REV=`/usr/bin/oslevel`
- else
- IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
- fi
- echo ${IBM_ARCH}-ibm-aix${IBM_REV}
- exit ;;
- *:AIX:*:*)
- echo rs6000-ibm-aix
- exit ;;
- ibmrt:4.4BSD:*|romp-ibm:BSD:*)
- echo romp-ibm-bsd4.4
- exit ;;
- ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
- echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
- exit ;; # report: romp-ibm BSD 4.3
- *:BOSX:*:*)
- echo rs6000-bull-bosx
- exit ;;
- DPX/2?00:B.O.S.:*:*)
- echo m68k-bull-sysv3
- exit ;;
- 9000/[34]??:4.3bsd:1.*:*)
- echo m68k-hp-bsd
- exit ;;
- hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
- echo m68k-hp-bsd4.4
- exit ;;
- 9000/[34678]??:HP-UX:*:*)
- HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
- case "${UNAME_MACHINE}" in
- 9000/31? ) HP_ARCH=m68000 ;;
- 9000/[34]?? ) HP_ARCH=m68k ;;
- 9000/[678][0-9][0-9])
- if [ -x /usr/bin/getconf ]; then
- sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
- sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
- case "${sc_cpu_version}" in
- 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
- 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
- 532) # CPU_PA_RISC2_0
- case "${sc_kernel_bits}" in
- 32) HP_ARCH="hppa2.0n" ;;
- 64) HP_ARCH="hppa2.0w" ;;
- '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
- esac ;;
- esac
- fi
- if [ "${HP_ARCH}" = "" ]; then
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
-
- #define _HPUX_SOURCE
- #include <stdlib.h>
- #include <unistd.h>
-
- int main ()
- {
- #if defined(_SC_KERNEL_BITS)
- long bits = sysconf(_SC_KERNEL_BITS);
- #endif
- long cpu = sysconf (_SC_CPU_VERSION);
-
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
- case CPU_PA_RISC2_0:
- #if defined(_SC_KERNEL_BITS)
- switch (bits)
- {
- case 64: puts ("hppa2.0w"); break;
- case 32: puts ("hppa2.0n"); break;
- default: puts ("hppa2.0"); break;
- } break;
- #else /* !defined(_SC_KERNEL_BITS) */
- puts ("hppa2.0"); break;
- #endif
- default: puts ("hppa1.0"); break;
- }
- exit (0);
- }
-EOF
- (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
- test -z "$HP_ARCH" && HP_ARCH=hppa
- fi ;;
- esac
- if [ ${HP_ARCH} = "hppa2.0w" ]
- then
- eval $set_cc_for_build
-
- # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
- # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
- # generating 64-bit code. GNU and HP use different nomenclature:
- #
- # $ CC_FOR_BUILD=cc ./config.guess
- # => hppa2.0w-hp-hpux11.23
- # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
- # => hppa64-hp-hpux11.23
-
- if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
- grep -q __LP64__
- then
- HP_ARCH="hppa2.0w"
- else
- HP_ARCH="hppa64"
- fi
- fi
- echo ${HP_ARCH}-hp-hpux${HPUX_REV}
- exit ;;
- ia64:HP-UX:*:*)
- HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
- echo ia64-hp-hpux${HPUX_REV}
- exit ;;
- 3050*:HI-UX:*:*)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #include <unistd.h>
- int
- main ()
- {
- long cpu = sysconf (_SC_CPU_VERSION);
- /* The order matters, because CPU_IS_HP_MC68K erroneously returns
- true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
- results, however. */
- if (CPU_IS_PA_RISC (cpu))
- {
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
- case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
- default: puts ("hppa-hitachi-hiuxwe2"); break;
- }
- }
- else if (CPU_IS_HP_MC68K (cpu))
- puts ("m68k-hitachi-hiuxwe2");
- else puts ("unknown-hitachi-hiuxwe2");
- exit (0);
- }
-EOF
- $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
- { echo "$SYSTEM_NAME"; exit; }
- echo unknown-hitachi-hiuxwe2
- exit ;;
- 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
- echo hppa1.1-hp-bsd
- exit ;;
- 9000/8??:4.3bsd:*:*)
- echo hppa1.0-hp-bsd
- exit ;;
- *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
- echo hppa1.0-hp-mpeix
- exit ;;
- hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
- echo hppa1.1-hp-osf
- exit ;;
- hp8??:OSF1:*:*)
- echo hppa1.0-hp-osf
- exit ;;
- i*86:OSF1:*:*)
- if [ -x /usr/sbin/sysversion ] ; then
- echo ${UNAME_MACHINE}-unknown-osf1mk
- else
- echo ${UNAME_MACHINE}-unknown-osf1
- fi
- exit ;;
- parisc*:Lites*:*:*)
- echo hppa1.1-hp-lites
- exit ;;
- C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
- echo c1-convex-bsd
- exit ;;
- C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
- if getsysinfo -f scalar_acc
- then echo c32-convex-bsd
- else echo c2-convex-bsd
- fi
- exit ;;
- C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
- echo c34-convex-bsd
- exit ;;
- C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
- echo c38-convex-bsd
- exit ;;
- C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
- echo c4-convex-bsd
- exit ;;
- CRAY*Y-MP:*:*:*)
- echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*[A-Z]90:*:*:*)
- echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
- | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
- -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
- -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*TS:*:*:*)
- echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*T3E:*:*:*)
- echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*SV1:*:*:*)
- echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- *:UNICOS/mp:*:*)
- echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
- FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
- FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
- 5000:UNIX_System_V:4.*:*)
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
- FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
- echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
- i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
- echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
- exit ;;
- sparc*:BSD/OS:*:*)
- echo sparc-unknown-bsdi${UNAME_RELEASE}
- exit ;;
- *:BSD/OS:*:*)
- echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
- exit ;;
- *:FreeBSD:*:*)
- UNAME_PROCESSOR=`/usr/bin/uname -p`
- case ${UNAME_PROCESSOR} in
- amd64)
- echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
- *)
- echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
- esac
- exit ;;
- i*:CYGWIN*:*)
- echo ${UNAME_MACHINE}-pc-cygwin
- exit ;;
- *:MINGW*:*)
- echo ${UNAME_MACHINE}-pc-mingw32
- exit ;;
- i*:MSYS*:*)
- echo ${UNAME_MACHINE}-pc-msys
- exit ;;
- i*:windows32*:*)
- # uname -m includes "-pc" on this system.
- echo ${UNAME_MACHINE}-mingw32
- exit ;;
- i*:PW*:*)
- echo ${UNAME_MACHINE}-pc-pw32
- exit ;;
- *:Interix*:*)
- case ${UNAME_MACHINE} in
- x86)
- echo i586-pc-interix${UNAME_RELEASE}
- exit ;;
- authenticamd | genuineintel | EM64T)
- echo x86_64-unknown-interix${UNAME_RELEASE}
- exit ;;
- IA64)
- echo ia64-unknown-interix${UNAME_RELEASE}
- exit ;;
- esac ;;
- [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
- echo i${UNAME_MACHINE}-pc-mks
- exit ;;
- 8664:Windows_NT:*)
- echo x86_64-pc-mks
- exit ;;
- i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
- # How do we know it's Interix rather than the generic POSIX subsystem?
- # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
- # UNAME_MACHINE based on the output of uname instead of i386?
- echo i586-pc-interix
- exit ;;
- i*:UWIN*:*)
- echo ${UNAME_MACHINE}-pc-uwin
- exit ;;
- amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
- echo x86_64-unknown-cygwin
- exit ;;
- p*:CYGWIN*:*)
- echo powerpcle-unknown-cygwin
- exit ;;
- prep*:SunOS:5.*:*)
- echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- *:GNU:*:*)
- # the GNU system
- echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
- exit ;;
- *:GNU/*:*:*)
- # other systems with GNU libc and userland
- echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
- exit ;;
- i*86:Minix:*:*)
- echo ${UNAME_MACHINE}-pc-minix
- exit ;;
- alpha:Linux:*:*)
- case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
- EV5) UNAME_MACHINE=alphaev5 ;;
- EV56) UNAME_MACHINE=alphaev56 ;;
- PCA56) UNAME_MACHINE=alphapca56 ;;
- PCA57) UNAME_MACHINE=alphapca56 ;;
- EV6) UNAME_MACHINE=alphaev6 ;;
- EV67) UNAME_MACHINE=alphaev67 ;;
- EV68*) UNAME_MACHINE=alphaev68 ;;
- esac
- objdump --private-headers /bin/sh | grep -q ld.so.1
- if test "$?" = 0 ; then LIBC="gnulibc1" ; else LIBC="" ; fi
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- arm*:Linux:*:*)
- eval $set_cc_for_build
- if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ARM_EABI__
- then
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- else
- if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ARM_PCS_VFP
- then
- echo ${UNAME_MACHINE}-unknown-linux-gnueabi
- else
- echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
- fi
- fi
- exit ;;
- avr32*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- cris:Linux:*:*)
- echo cris-axis-linux-${LIBC}
- exit ;;
- crisv32:Linux:*:*)
- echo crisv32-axis-linux-${LIBC}
- exit ;;
- frv:Linux:*:*)
- echo frv-unknown-linux-${LIBC}
- exit ;;
- hexagon:Linux:*:*)
- echo hexagon-unknown-linux-${LIBC}
- exit ;;
- i*86:Linux:*:*)
- LIBC=gnu
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #ifdef __dietlibc__
- LIBC=dietlibc
- #endif
-EOF
- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
- echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
- exit ;;
- ia64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- m32r*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- m68*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- mips:Linux:*:* | mips64:Linux:*:*)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #undef CPU
- #undef ${UNAME_MACHINE}
- #undef ${UNAME_MACHINE}el
- #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
- CPU=${UNAME_MACHINE}el
- #else
- #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
- CPU=${UNAME_MACHINE}
- #else
- CPU=
- #endif
- #endif
-EOF
- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
- test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
- ;;
- or32:Linux:*:*)
- echo or32-unknown-linux-${LIBC}
- exit ;;
- padre:Linux:*:*)
- echo sparc-unknown-linux-${LIBC}
- exit ;;
- parisc64:Linux:*:* | hppa64:Linux:*:*)
- echo hppa64-unknown-linux-${LIBC}
- exit ;;
- parisc:Linux:*:* | hppa:Linux:*:*)
- # Look for CPU level
- case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
- PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
- PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
- *) echo hppa-unknown-linux-${LIBC} ;;
- esac
- exit ;;
- ppc64:Linux:*:*)
- echo powerpc64-unknown-linux-${LIBC}
- exit ;;
- ppc:Linux:*:*)
- echo powerpc-unknown-linux-${LIBC}
- exit ;;
- s390:Linux:*:* | s390x:Linux:*:*)
- echo ${UNAME_MACHINE}-ibm-linux
- exit ;;
- sh64*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- sh*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- sparc:Linux:*:* | sparc64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- tile*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- vax:Linux:*:*)
- echo ${UNAME_MACHINE}-dec-linux-${LIBC}
- exit ;;
- x86_64:Linux:*:* | [lk]1om:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- xtensa*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- i*86:DYNIX/ptx:4*:*)
- # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
- # earlier versions are messed up and put the nodename in both
- # sysname and nodename.
- echo i386-sequent-sysv4
- exit ;;
- i*86:UNIX_SV:4.2MP:2.*)
- # Unixware is an offshoot of SVR4, but it has its own version
- # number series starting with 2...
- # I am not positive that other SVR4 systems won't match this,
- # I just have to hope. -- rms.
- # Use sysv4.2uw... so that sysv4* matches it.
- echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
- exit ;;
- i*86:OS/2:*:*)
- # If we were able to find `uname', then EMX Unix compatibility
- # is probably installed.
- echo ${UNAME_MACHINE}-pc-os2-emx
- exit ;;
- i*86:XTS-300:*:STOP)
- echo ${UNAME_MACHINE}-unknown-stop
- exit ;;
- i*86:atheos:*:*)
- echo ${UNAME_MACHINE}-unknown-atheos
- exit ;;
- i*86:syllable:*:*)
- echo ${UNAME_MACHINE}-pc-syllable
- exit ;;
- i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
- echo i386-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- i*86:*DOS:*:*)
- echo ${UNAME_MACHINE}-pc-msdosdjgpp
- exit ;;
- i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
- UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
- if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
- echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
- else
- echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
- fi
- exit ;;
- i*86:*:5:[678]*)
- # UnixWare 7.x, OpenUNIX and OpenServer 6.
- case `/bin/uname -X | grep "^Machine"` in
- *486*) UNAME_MACHINE=i486 ;;
- *Pentium) UNAME_MACHINE=i586 ;;
- *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
- esac
- echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
- exit ;;
- i*86:*:3.2:*)
- if test -f /usr/options/cb.name; then
- UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
- echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
- elif /bin/uname -X 2>/dev/null >/dev/null ; then
- UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
- (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
- (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
- && UNAME_MACHINE=i586
- (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
- && UNAME_MACHINE=i686
- (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
- && UNAME_MACHINE=i686
- echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
- else
- echo ${UNAME_MACHINE}-pc-sysv32
- fi
- exit ;;
- pc:*:*:*)
- # Left here for compatibility:
- # uname -m prints for DJGPP always 'pc', but it prints nothing about
- # the processor, so we play safe by assuming i586.
- # Note: whatever this is, it MUST be the same as what config.sub
- # prints for the "djgpp" host, or else GDB configury will decide that
- # this is a cross-build.
- echo i586-pc-msdosdjgpp
- exit ;;
- Intel:Mach:3*:*)
- echo i386-pc-mach3
- exit ;;
- paragon:*:*:*)
- echo i860-intel-osf1
- exit ;;
- i860:*:4.*:*) # i860-SVR4
- if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
- echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
- else # Add other i860-SVR4 vendors below as they are discovered.
- echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
- fi
- exit ;;
- mini*:CTIX:SYS*5:*)
- # "miniframe"
- echo m68010-convergent-sysv
- exit ;;
- mc68k:UNIX:SYSTEM5:3.51m)
- echo m68k-convergent-sysv
- exit ;;
- M680?0:D-NIX:5.3:*)
- echo m68k-diab-dnix
- exit ;;
- M68*:*:R3V[5678]*:*)
- test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
- 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
- OS_REL=''
- test -r /etc/.relid \
- && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
- && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
- 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4; exit; } ;;
- NCR*:*:4.2:* | MPRAS*:*:4.2:*)
- OS_REL='.3'
- test -r /etc/.relid \
- && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
- && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
- && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
- m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
- echo m68k-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- mc68030:UNIX_System_V:4.*:*)
- echo m68k-atari-sysv4
- exit ;;
- TSUNAMI:LynxOS:2.*:*)
- echo sparc-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- rs6000:LynxOS:2.*:*)
- echo rs6000-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
- echo powerpc-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- SM[BE]S:UNIX_SV:*:*)
- echo mips-dde-sysv${UNAME_RELEASE}
- exit ;;
- RM*:ReliantUNIX-*:*:*)
- echo mips-sni-sysv4
- exit ;;
- RM*:SINIX-*:*:*)
- echo mips-sni-sysv4
- exit ;;
- *:SINIX-*:*:*)
- if uname -p 2>/dev/null >/dev/null ; then
- UNAME_MACHINE=`(uname -p) 2>/dev/null`
- echo ${UNAME_MACHINE}-sni-sysv4
- else
- echo ns32k-sni-sysv
- fi
- exit ;;
- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
- # says <Richard.M.Bartel@ccMail.Census.GOV>
- echo i586-unisys-sysv4
- exit ;;
- *:UNIX_System_V:4*:FTX*)
- # From Gerald Hewes <hewes@openmarket.com>.
- # How about differentiating between stratus architectures? -djm
- echo hppa1.1-stratus-sysv4
- exit ;;
- *:*:*:FTX*)
- # From seanf@swdc.stratus.com.
- echo i860-stratus-sysv4
- exit ;;
- i*86:VOS:*:*)
- # From Paul.Green@stratus.com.
- echo ${UNAME_MACHINE}-stratus-vos
- exit ;;
- *:VOS:*:*)
- # From Paul.Green@stratus.com.
- echo hppa1.1-stratus-vos
- exit ;;
- mc68*:A/UX:*:*)
- echo m68k-apple-aux${UNAME_RELEASE}
- exit ;;
- news*:NEWS-OS:6*:*)
- echo mips-sony-newsos6
- exit ;;
- R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
- if [ -d /usr/nec ]; then
- echo mips-nec-sysv${UNAME_RELEASE}
- else
- echo mips-unknown-sysv${UNAME_RELEASE}
- fi
- exit ;;
- BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
- echo powerpc-be-beos
- exit ;;
- BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
- echo powerpc-apple-beos
- exit ;;
- BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
- echo i586-pc-beos
- exit ;;
- BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
- echo i586-pc-haiku
- exit ;;
- SX-4:SUPER-UX:*:*)
- echo sx4-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-5:SUPER-UX:*:*)
- echo sx5-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-6:SUPER-UX:*:*)
- echo sx6-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-7:SUPER-UX:*:*)
- echo sx7-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-8:SUPER-UX:*:*)
- echo sx8-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-8R:SUPER-UX:*:*)
- echo sx8r-nec-superux${UNAME_RELEASE}
- exit ;;
- Power*:Rhapsody:*:*)
- echo powerpc-apple-rhapsody${UNAME_RELEASE}
- exit ;;
- *:Rhapsody:*:*)
- echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
- exit ;;
- *:Darwin:*:*)
- UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
- case $UNAME_PROCESSOR in
- i386)
- eval $set_cc_for_build
- if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
- if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- UNAME_PROCESSOR="x86_64"
- fi
- fi ;;
- unknown) UNAME_PROCESSOR=powerpc ;;
- esac
- echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
- exit ;;
- *:procnto*:*:* | *:QNX:[0123456789]*:*)
- UNAME_PROCESSOR=`uname -p`
- if test "$UNAME_PROCESSOR" = "x86"; then
- UNAME_PROCESSOR=i386
- UNAME_MACHINE=pc
- fi
- echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
- exit ;;
- *:QNX:*:4*)
- echo i386-pc-qnx
- exit ;;
- NEO-?:NONSTOP_KERNEL:*:*)
- echo neo-tandem-nsk${UNAME_RELEASE}
- exit ;;
- NSE-?:NONSTOP_KERNEL:*:*)
- echo nse-tandem-nsk${UNAME_RELEASE}
- exit ;;
- NSR-?:NONSTOP_KERNEL:*:*)
- echo nsr-tandem-nsk${UNAME_RELEASE}
- exit ;;
- *:NonStop-UX:*:*)
- echo mips-compaq-nonstopux
- exit ;;
- BS2000:POSIX*:*:*)
- echo bs2000-siemens-sysv
- exit ;;
- DS/*:UNIX_System_V:*:*)
- echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
- exit ;;
- *:Plan9:*:*)
- # "uname -m" is not consistent, so use $cputype instead. 386
- # is converted to i386 for consistency with other x86
- # operating systems.
- if test "$cputype" = "386"; then
- UNAME_MACHINE=i386
- else
- UNAME_MACHINE="$cputype"
- fi
- echo ${UNAME_MACHINE}-unknown-plan9
- exit ;;
- *:TOPS-10:*:*)
- echo pdp10-unknown-tops10
- exit ;;
- *:TENEX:*:*)
- echo pdp10-unknown-tenex
- exit ;;
- KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
- echo pdp10-dec-tops20
- exit ;;
- XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
- echo pdp10-xkl-tops20
- exit ;;
- *:TOPS-20:*:*)
- echo pdp10-unknown-tops20
- exit ;;
- *:ITS:*:*)
- echo pdp10-unknown-its
- exit ;;
- SEI:*:*:SEIUX)
- echo mips-sei-seiux${UNAME_RELEASE}
- exit ;;
- *:DragonFly:*:*)
- echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
- exit ;;
- *:*VMS:*:*)
- UNAME_MACHINE=`(uname -p) 2>/dev/null`
- case "${UNAME_MACHINE}" in
- A*) echo alpha-dec-vms ; exit ;;
- I*) echo ia64-dec-vms ; exit ;;
- V*) echo vax-dec-vms ; exit ;;
- esac ;;
- *:XENIX:*:SysV)
- echo i386-pc-xenix
- exit ;;
- i*86:skyos:*:*)
- echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
- exit ;;
- i*86:rdos:*:*)
- echo ${UNAME_MACHINE}-pc-rdos
- exit ;;
- i*86:AROS:*:*)
- echo ${UNAME_MACHINE}-pc-aros
- exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
- /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
- I don't know.... */
- printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
- printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
- "4"
-#else
- ""
-#endif
- ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
- printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
- printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
- int version;
- version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
- if (version < 4)
- printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
- else
- printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
- exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
- printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
- printf ("ns32k-encore-mach\n"); exit (0);
-#else
- printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
- printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
- printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
- printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
- struct utsname un;
-
- uname(&un);
-
- if (strncmp(un.version, "V2", 2) == 0) {
- printf ("i386-sequent-ptx2\n"); exit (0);
- }
- if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
- printf ("i386-sequent-ptx1\n"); exit (0);
- }
- printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-# include <sys/param.h>
-# if defined (BSD)
-# if BSD == 43
- printf ("vax-dec-bsd4.3\n"); exit (0);
-# else
-# if BSD == 199006
- printf ("vax-dec-bsd4.3reno\n"); exit (0);
-# else
- printf ("vax-dec-bsd\n"); exit (0);
-# endif
-# endif
-# else
- printf ("vax-dec-bsd\n"); exit (0);
-# endif
-# else
- printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
- printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
- exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
- { echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
- case `getsysinfo -f cpu_type` in
- c1*)
- echo c1-convex-bsd
- exit ;;
- c2*)
- if getsysinfo -f scalar_acc
- then echo c32-convex-bsd
- else echo c2-convex-bsd
- fi
- exit ;;
- c34*)
- echo c34-convex-bsd
- exit ;;
- c38*)
- echo c38-convex-bsd
- exit ;;
- c4*)
- echo c4-convex-bsd
- exit ;;
- esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
- http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-and
- http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo = `(hostinfo) 2>/dev/null`
-/bin/universe = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
+++ /dev/null
-#! /bin/sh
-# Configuration validation subroutine script.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-# 2011 Free Software Foundation, Inc.
-
-timestamp='2011-11-11'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine. It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program 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 General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches@gnu.org>. Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support. The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
- $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free
-Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit ;;
- --version | -v )
- echo "$version" ; exit ;;
- --help | --h* | -h )
- echo "$usage"; exit ;;
- -- ) # Stop option processing
- shift; break ;;
- - ) # Use stdin as input.
- break ;;
- -* )
- echo "$me: invalid option $1$help"
- exit 1 ;;
-
- *local*)
- # First pass through any local machine types.
- echo $1
- exit ;;
-
- * )
- break ;;
- esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
- exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
- exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
- nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
- linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
- knetbsd*-gnu* | netbsd*-gnu* | \
- kopensolaris*-gnu* | \
- storm-chaos* | os2-emx* | rtmk-nova*)
- os=-$maybe_os
- basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
- ;;
- *)
- basic_machine=`echo $1 | sed 's/-[^-]*$//'`
- if [ $basic_machine != $1 ]
- then os=`echo $1 | sed 's/.*-/-/'`
- else os=; fi
- ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work. We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
- -sun*os*)
- # Prevent following clause from handling this invalid input.
- ;;
- -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
- -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
- -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
- -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
- -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
- -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
- -apple | -axis | -knuth | -cray | -microblaze)
- os=
- basic_machine=$1
- ;;
- -bluegene*)
- os=-cnk
- ;;
- -sim | -cisco | -oki | -wec | -winbond)
- os=
- basic_machine=$1
- ;;
- -scout)
- ;;
- -wrs)
- os=-vxworks
- basic_machine=$1
- ;;
- -chorusos*)
- os=-chorusos
- basic_machine=$1
- ;;
- -chorusrdb)
- os=-chorusrdb
- basic_machine=$1
- ;;
- -hiux*)
- os=-hiuxwe2
- ;;
- -sco6)
- os=-sco5v6
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco5)
- os=-sco3.2v5
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco4)
- os=-sco3.2v4
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco3.2.[4-9]*)
- os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco3.2v[4-9]*)
- # Don't forget version if it is 3.2v4 or newer.
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco5v6*)
- # Don't forget version if it is 3.2v4 or newer.
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco*)
- os=-sco3.2v2
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -udk*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -isc)
- os=-isc2.2
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -clix*)
- basic_machine=clipper-intergraph
- ;;
- -isc*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -lynx*)
- os=-lynxos
- ;;
- -ptx*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
- ;;
- -windowsnt*)
- os=`echo $os | sed -e 's/windowsnt/winnt/'`
- ;;
- -psos*)
- os=-psos
- ;;
- -mint | -mint[0-9]*)
- basic_machine=m68k-atari
- os=-mint
- ;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
- # Recognize the basic CPU types without company name.
- # Some are omitted here because they have special meanings below.
- 1750a | 580 \
- | a29k \
- | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
- | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
- | am33_2.0 \
- | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
- | be32 | be64 \
- | bfin \
- | c4x | clipper \
- | d10v | d30v | dlx | dsp16xx \
- | epiphany \
- | fido | fr30 | frv \
- | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
- | hexagon \
- | i370 | i860 | i960 | ia64 \
- | ip2k | iq2000 \
- | [lk]1om \
- | le32 | le64 \
- | lm32 \
- | m32c | m32r | m32rle | m68000 | m68k | m88k \
- | maxq | mb | microblaze | mcore | mep | metag \
- | mips | mipsbe | mipseb | mipsel | mipsle \
- | mips16 \
- | mips64 | mips64el \
- | mips64octeon | mips64octeonel \
- | mips64orion | mips64orionel \
- | mips64r5900 | mips64r5900el \
- | mips64vr | mips64vrel \
- | mips64vr4100 | mips64vr4100el \
- | mips64vr4300 | mips64vr4300el \
- | mips64vr5000 | mips64vr5000el \
- | mips64vr5900 | mips64vr5900el \
- | mipsisa32 | mipsisa32el \
- | mipsisa32r2 | mipsisa32r2el \
- | mipsisa64 | mipsisa64el \
- | mipsisa64r2 | mipsisa64r2el \
- | mipsisa64sb1 | mipsisa64sb1el \
- | mipsisa64sr71k | mipsisa64sr71kel \
- | mipstx39 | mipstx39el \
- | mn10200 | mn10300 \
- | moxie \
- | mt \
- | msp430 \
- | nds32 | nds32le | nds32be \
- | nios | nios2 \
- | ns16k | ns32k \
- | open8 \
- | or32 \
- | pdp10 | pdp11 | pj | pjl \
- | powerpc | powerpc64 | powerpc64le | powerpcle \
- | pyramid \
- | rl78 | rx \
- | score \
- | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
- | sh64 | sh64le \
- | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
- | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
- | spu \
- | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
- | ubicom32 \
- | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
- | we32k \
- | x86 | xc16x | xstormy16 | xtensa \
- | z8k | z80)
- basic_machine=$basic_machine-unknown
- ;;
- c54x)
- basic_machine=tic54x-unknown
- ;;
- c55x)
- basic_machine=tic55x-unknown
- ;;
- c6x)
- basic_machine=tic6x-unknown
- ;;
- m6811 | m68hc11 | m6812 | m68hc12 | picochip)
- # Motorola 68HC11/12.
- basic_machine=$basic_machine-unknown
- os=-none
- ;;
- m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
- ;;
- ms1)
- basic_machine=mt-unknown
- ;;
-
- strongarm | thumb | xscale)
- basic_machine=arm-unknown
- ;;
-
- xscaleeb)
- basic_machine=armeb-unknown
- ;;
-
- xscaleel)
- basic_machine=armel-unknown
- ;;
-
- # We use `pc' rather than `unknown'
- # because (1) that's what they normally are, and
- # (2) the word "unknown" tends to confuse beginning users.
- i*86 | x86_64)
- basic_machine=$basic_machine-pc
- ;;
- # Object if more than one company name word.
- *-*-*)
- echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
- exit 1
- ;;
- # Recognize the basic CPU types with company name.
- 580-* \
- | a29k-* \
- | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
- | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
- | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
- | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
- | avr-* | avr32-* \
- | be32-* | be64-* \
- | bfin-* | bs2000-* \
- | c[123]* | c30-* | [cjt]90-* | c4x-* \
- | clipper-* | craynv-* | cydra-* \
- | d10v-* | d30v-* | dlx-* \
- | elxsi-* \
- | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
- | h8300-* | h8500-* \
- | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
- | hexagon-* \
- | i*86-* | i860-* | i960-* | ia64-* \
- | ip2k-* | iq2000-* \
- | [lk]1om-* \
- | le32-* | le64-* \
- | lm32-* \
- | m32c-* | m32r-* | m32rle-* \
- | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
- | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
- | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
- | mips16-* \
- | mips64-* | mips64el-* \
- | mips64octeon-* | mips64octeonel-* \
- | mips64orion-* | mips64orionel-* \
- | mips64r5900-* | mips64r5900el-* \
- | mips64vr-* | mips64vrel-* \
- | mips64vr4100-* | mips64vr4100el-* \
- | mips64vr4300-* | mips64vr4300el-* \
- | mips64vr5000-* | mips64vr5000el-* \
- | mips64vr5900-* | mips64vr5900el-* \
- | mipsisa32-* | mipsisa32el-* \
- | mipsisa32r2-* | mipsisa32r2el-* \
- | mipsisa64-* | mipsisa64el-* \
- | mipsisa64r2-* | mipsisa64r2el-* \
- | mipsisa64sb1-* | mipsisa64sb1el-* \
- | mipsisa64sr71k-* | mipsisa64sr71kel-* \
- | mipstx39-* | mipstx39el-* \
- | mmix-* \
- | mt-* \
- | msp430-* \
- | nds32-* | nds32le-* | nds32be-* \
- | nios-* | nios2-* \
- | none-* | np1-* | ns16k-* | ns32k-* \
- | open8-* \
- | orion-* \
- | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
- | pyramid-* \
- | rl78-* | romp-* | rs6000-* | rx-* \
- | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
- | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
- | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
- | sparclite-* \
- | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
- | tahoe-* \
- | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
- | tile*-* \
- | tron-* \
- | ubicom32-* \
- | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
- | vax-* \
- | we32k-* \
- | x86-* | x86_64-* | xc16x-* | xps100-* \
- | xstormy16-* | xtensa*-* \
- | ymp-* \
- | z8k-* | z80-*)
- ;;
- # Recognize the basic CPU types without company name, with glob match.
- xtensa*)
- basic_machine=$basic_machine-unknown
- ;;
- # Recognize the various machine names and aliases which stand
- # for a CPU type and a company and sometimes even an OS.
- 386bsd)
- basic_machine=i386-unknown
- os=-bsd
- ;;
- 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
- basic_machine=m68000-att
- ;;
- 3b*)
- basic_machine=we32k-att
- ;;
- a29khif)
- basic_machine=a29k-amd
- os=-udi
- ;;
- abacus)
- basic_machine=abacus-unknown
- ;;
- adobe68k)
- basic_machine=m68010-adobe
- os=-scout
- ;;
- alliant | fx80)
- basic_machine=fx80-alliant
- ;;
- altos | altos3068)
- basic_machine=m68k-altos
- ;;
- am29k)
- basic_machine=a29k-none
- os=-bsd
- ;;
- amd64)
- basic_machine=x86_64-pc
- ;;
- amd64-*)
- basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- amdahl)
- basic_machine=580-amdahl
- os=-sysv
- ;;
- amiga | amiga-*)
- basic_machine=m68k-unknown
- ;;
- amigaos | amigados)
- basic_machine=m68k-unknown
- os=-amigaos
- ;;
- amigaunix | amix)
- basic_machine=m68k-unknown
- os=-sysv4
- ;;
- apollo68)
- basic_machine=m68k-apollo
- os=-sysv
- ;;
- apollo68bsd)
- basic_machine=m68k-apollo
- os=-bsd
- ;;
- aros)
- basic_machine=i386-pc
- os=-aros
- ;;
- aux)
- basic_machine=m68k-apple
- os=-aux
- ;;
- balance)
- basic_machine=ns32k-sequent
- os=-dynix
- ;;
- blackfin)
- basic_machine=bfin-unknown
- os=-linux
- ;;
- blackfin-*)
- basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
- os=-linux
- ;;
- bluegene*)
- basic_machine=powerpc-ibm
- os=-cnk
- ;;
- c54x-*)
- basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- c55x-*)
- basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- c6x-*)
- basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- c90)
- basic_machine=c90-cray
- os=-unicos
- ;;
- cegcc)
- basic_machine=arm-unknown
- os=-cegcc
- ;;
- convex-c1)
- basic_machine=c1-convex
- os=-bsd
- ;;
- convex-c2)
- basic_machine=c2-convex
- os=-bsd
- ;;
- convex-c32)
- basic_machine=c32-convex
- os=-bsd
- ;;
- convex-c34)
- basic_machine=c34-convex
- os=-bsd
- ;;
- convex-c38)
- basic_machine=c38-convex
- os=-bsd
- ;;
- cray | j90)
- basic_machine=j90-cray
- os=-unicos
- ;;
- craynv)
- basic_machine=craynv-cray
- os=-unicosmp
- ;;
- cr16 | cr16-*)
- basic_machine=cr16-unknown
- os=-elf
- ;;
- crds | unos)
- basic_machine=m68k-crds
- ;;
- crisv32 | crisv32-* | etraxfs*)
- basic_machine=crisv32-axis
- ;;
- cris | cris-* | etrax*)
- basic_machine=cris-axis
- ;;
- crx)
- basic_machine=crx-unknown
- os=-elf
- ;;
- da30 | da30-*)
- basic_machine=m68k-da30
- ;;
- decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
- basic_machine=mips-dec
- ;;
- decsystem10* | dec10*)
- basic_machine=pdp10-dec
- os=-tops10
- ;;
- decsystem20* | dec20*)
- basic_machine=pdp10-dec
- os=-tops20
- ;;
- delta | 3300 | motorola-3300 | motorola-delta \
- | 3300-motorola | delta-motorola)
- basic_machine=m68k-motorola
- ;;
- delta88)
- basic_machine=m88k-motorola
- os=-sysv3
- ;;
- dicos)
- basic_machine=i686-pc
- os=-dicos
- ;;
- djgpp)
- basic_machine=i586-pc
- os=-msdosdjgpp
- ;;
- dpx20 | dpx20-*)
- basic_machine=rs6000-bull
- os=-bosx
- ;;
- dpx2* | dpx2*-bull)
- basic_machine=m68k-bull
- os=-sysv3
- ;;
- ebmon29k)
- basic_machine=a29k-amd
- os=-ebmon
- ;;
- elxsi)
- basic_machine=elxsi-elxsi
- os=-bsd
- ;;
- encore | umax | mmax)
- basic_machine=ns32k-encore
- ;;
- es1800 | OSE68k | ose68k | ose | OSE)
- basic_machine=m68k-ericsson
- os=-ose
- ;;
- fx2800)
- basic_machine=i860-alliant
- ;;
- genix)
- basic_machine=ns32k-ns
- ;;
- gmicro)
- basic_machine=tron-gmicro
- os=-sysv
- ;;
- go32)
- basic_machine=i386-pc
- os=-go32
- ;;
- h3050r* | hiux*)
- basic_machine=hppa1.1-hitachi
- os=-hiuxwe2
- ;;
- h8300hms)
- basic_machine=h8300-hitachi
- os=-hms
- ;;
- h8300xray)
- basic_machine=h8300-hitachi
- os=-xray
- ;;
- h8500hms)
- basic_machine=h8500-hitachi
- os=-hms
- ;;
- harris)
- basic_machine=m88k-harris
- os=-sysv3
- ;;
- hp300-*)
- basic_machine=m68k-hp
- ;;
- hp300bsd)
- basic_machine=m68k-hp
- os=-bsd
- ;;
- hp300hpux)
- basic_machine=m68k-hp
- os=-hpux
- ;;
- hp3k9[0-9][0-9] | hp9[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hp9k2[0-9][0-9] | hp9k31[0-9])
- basic_machine=m68000-hp
- ;;
- hp9k3[2-9][0-9])
- basic_machine=m68k-hp
- ;;
- hp9k6[0-9][0-9] | hp6[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hp9k7[0-79][0-9] | hp7[0-79][0-9])
- basic_machine=hppa1.1-hp
- ;;
- hp9k78[0-9] | hp78[0-9])
- # FIXME: really hppa2.0-hp
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
- # FIXME: really hppa2.0-hp
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[0-9][13679] | hp8[0-9][13679])
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[0-9][0-9] | hp8[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hppa-next)
- os=-nextstep3
- ;;
- hppaosf)
- basic_machine=hppa1.1-hp
- os=-osf
- ;;
- hppro)
- basic_machine=hppa1.1-hp
- os=-proelf
- ;;
- i370-ibm* | ibm*)
- basic_machine=i370-ibm
- ;;
-# I'm not sure what "Sysv32" means. Should this be sysv3.2?
- i*86v32)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv32
- ;;
- i*86v4*)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv4
- ;;
- i*86v)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv
- ;;
- i*86sol2)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-solaris2
- ;;
- i386mach)
- basic_machine=i386-mach
- os=-mach
- ;;
- i386-vsta | vsta)
- basic_machine=i386-unknown
- os=-vsta
- ;;
- iris | iris4d)
- basic_machine=mips-sgi
- case $os in
- -irix*)
- ;;
- *)
- os=-irix4
- ;;
- esac
- ;;
- isi68 | isi)
- basic_machine=m68k-isi
- os=-sysv
- ;;
- m68knommu)
- basic_machine=m68k-unknown
- os=-linux
- ;;
- m68knommu-*)
- basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
- os=-linux
- ;;
- m88k-omron*)
- basic_machine=m88k-omron
- ;;
- magnum | m3230)
- basic_machine=mips-mips
- os=-sysv
- ;;
- merlin)
- basic_machine=ns32k-utek
- os=-sysv
- ;;
- microblaze)
- basic_machine=microblaze-xilinx
- ;;
- mingw32)
- basic_machine=i386-pc
- os=-mingw32
- ;;
- mingw32ce)
- basic_machine=arm-unknown
- os=-mingw32ce
- ;;
- miniframe)
- basic_machine=m68000-convergent
- ;;
- *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
- basic_machine=m68k-atari
- os=-mint
- ;;
- mips3*-*)
- basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
- ;;
- mips3*)
- basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
- ;;
- monitor)
- basic_machine=m68k-rom68k
- os=-coff
- ;;
- morphos)
- basic_machine=powerpc-unknown
- os=-morphos
- ;;
- msdos)
- basic_machine=i386-pc
- os=-msdos
- ;;
- ms1-*)
- basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
- ;;
- msys)
- basic_machine=i386-pc
- os=-msys
- ;;
- mvs)
- basic_machine=i370-ibm
- os=-mvs
- ;;
- nacl)
- basic_machine=le32-unknown
- os=-nacl
- ;;
- ncr3000)
- basic_machine=i486-ncr
- os=-sysv4
- ;;
- netbsd386)
- basic_machine=i386-unknown
- os=-netbsd
- ;;
- netwinder)
- basic_machine=armv4l-rebel
- os=-linux
- ;;
- news | news700 | news800 | news900)
- basic_machine=m68k-sony
- os=-newsos
- ;;
- news1000)
- basic_machine=m68030-sony
- os=-newsos
- ;;
- news-3600 | risc-news)
- basic_machine=mips-sony
- os=-newsos
- ;;
- necv70)
- basic_machine=v70-nec
- os=-sysv
- ;;
- next | m*-next )
- basic_machine=m68k-next
- case $os in
- -nextstep* )
- ;;
- -ns2*)
- os=-nextstep2
- ;;
- *)
- os=-nextstep3
- ;;
- esac
- ;;
- nh3000)
- basic_machine=m68k-harris
- os=-cxux
- ;;
- nh[45]000)
- basic_machine=m88k-harris
- os=-cxux
- ;;
- nindy960)
- basic_machine=i960-intel
- os=-nindy
- ;;
- mon960)
- basic_machine=i960-intel
- os=-mon960
- ;;
- nonstopux)
- basic_machine=mips-compaq
- os=-nonstopux
- ;;
- np1)
- basic_machine=np1-gould
- ;;
- neo-tandem)
- basic_machine=neo-tandem
- ;;
- nse-tandem)
- basic_machine=nse-tandem
- ;;
- nsr-tandem)
- basic_machine=nsr-tandem
- ;;
- op50n-* | op60c-*)
- basic_machine=hppa1.1-oki
- os=-proelf
- ;;
- openrisc | openrisc-*)
- basic_machine=or32-unknown
- ;;
- os400)
- basic_machine=powerpc-ibm
- os=-os400
- ;;
- OSE68000 | ose68000)
- basic_machine=m68000-ericsson
- os=-ose
- ;;
- os68k)
- basic_machine=m68k-none
- os=-os68k
- ;;
- pa-hitachi)
- basic_machine=hppa1.1-hitachi
- os=-hiuxwe2
- ;;
- paragon)
- basic_machine=i860-intel
- os=-osf
- ;;
- parisc)
- basic_machine=hppa-unknown
- os=-linux
- ;;
- parisc-*)
- basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
- os=-linux
- ;;
- pbd)
- basic_machine=sparc-tti
- ;;
- pbb)
- basic_machine=m68k-tti
- ;;
- pc532 | pc532-*)
- basic_machine=ns32k-pc532
- ;;
- pc98)
- basic_machine=i386-pc
- ;;
- pc98-*)
- basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentium | p5 | k5 | k6 | nexgen | viac3)
- basic_machine=i586-pc
- ;;
- pentiumpro | p6 | 6x86 | athlon | athlon_*)
- basic_machine=i686-pc
- ;;
- pentiumii | pentium2 | pentiumiii | pentium3)
- basic_machine=i686-pc
- ;;
- pentium4)
- basic_machine=i786-pc
- ;;
- pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
- basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentiumpro-* | p6-* | 6x86-* | athlon-*)
- basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
- basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentium4-*)
- basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pn)
- basic_machine=pn-gould
- ;;
- power) basic_machine=power-ibm
- ;;
- ppc | ppcbe) basic_machine=powerpc-unknown
- ;;
- ppc-* | ppcbe-*)
- basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppcle | powerpclittle | ppc-le | powerpc-little)
- basic_machine=powerpcle-unknown
- ;;
- ppcle-* | powerpclittle-*)
- basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppc64) basic_machine=powerpc64-unknown
- ;;
- ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppc64le | powerpc64little | ppc64-le | powerpc64-little)
- basic_machine=powerpc64le-unknown
- ;;
- ppc64le-* | powerpc64little-*)
- basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ps2)
- basic_machine=i386-ibm
- ;;
- pw32)
- basic_machine=i586-unknown
- os=-pw32
- ;;
- rdos)
- basic_machine=i386-pc
- os=-rdos
- ;;
- rom68k)
- basic_machine=m68k-rom68k
- os=-coff
- ;;
- rm[46]00)
- basic_machine=mips-siemens
- ;;
- rtpc | rtpc-*)
- basic_machine=romp-ibm
- ;;
- s390 | s390-*)
- basic_machine=s390-ibm
- ;;
- s390x | s390x-*)
- basic_machine=s390x-ibm
- ;;
- sa29200)
- basic_machine=a29k-amd
- os=-udi
- ;;
- sb1)
- basic_machine=mipsisa64sb1-unknown
- ;;
- sb1el)
- basic_machine=mipsisa64sb1el-unknown
- ;;
- sde)
- basic_machine=mipsisa32-sde
- os=-elf
- ;;
- sei)
- basic_machine=mips-sei
- os=-seiux
- ;;
- sequent)
- basic_machine=i386-sequent
- ;;
- sh)
- basic_machine=sh-hitachi
- os=-hms
- ;;
- sh5el)
- basic_machine=sh5le-unknown
- ;;
- sh64)
- basic_machine=sh64-unknown
- ;;
- sparclite-wrs | simso-wrs)
- basic_machine=sparclite-wrs
- os=-vxworks
- ;;
- sps7)
- basic_machine=m68k-bull
- os=-sysv2
- ;;
- spur)
- basic_machine=spur-unknown
- ;;
- st2000)
- basic_machine=m68k-tandem
- ;;
- stratus)
- basic_machine=i860-stratus
- os=-sysv4
- ;;
- strongarm-* | thumb-*)
- basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- sun2)
- basic_machine=m68000-sun
- ;;
- sun2os3)
- basic_machine=m68000-sun
- os=-sunos3
- ;;
- sun2os4)
- basic_machine=m68000-sun
- os=-sunos4
- ;;
- sun3os3)
- basic_machine=m68k-sun
- os=-sunos3
- ;;
- sun3os4)
- basic_machine=m68k-sun
- os=-sunos4
- ;;
- sun4os3)
- basic_machine=sparc-sun
- os=-sunos3
- ;;
- sun4os4)
- basic_machine=sparc-sun
- os=-sunos4
- ;;
- sun4sol2)
- basic_machine=sparc-sun
- os=-solaris2
- ;;
- sun3 | sun3-*)
- basic_machine=m68k-sun
- ;;
- sun4)
- basic_machine=sparc-sun
- ;;
- sun386 | sun386i | roadrunner)
- basic_machine=i386-sun
- ;;
- sv1)
- basic_machine=sv1-cray
- os=-unicos
- ;;
- symmetry)
- basic_machine=i386-sequent
- os=-dynix
- ;;
- t3e)
- basic_machine=alphaev5-cray
- os=-unicos
- ;;
- t90)
- basic_machine=t90-cray
- os=-unicos
- ;;
- tile*)
- basic_machine=$basic_machine-unknown
- os=-linux-gnu
- ;;
- tx39)
- basic_machine=mipstx39-unknown
- ;;
- tx39el)
- basic_machine=mipstx39el-unknown
- ;;
- toad1)
- basic_machine=pdp10-xkl
- os=-tops20
- ;;
- tower | tower-32)
- basic_machine=m68k-ncr
- ;;
- tpf)
- basic_machine=s390x-ibm
- os=-tpf
- ;;
- udi29k)
- basic_machine=a29k-amd
- os=-udi
- ;;
- ultra3)
- basic_machine=a29k-nyu
- os=-sym1
- ;;
- v810 | necv810)
- basic_machine=v810-nec
- os=-none
- ;;
- vaxv)
- basic_machine=vax-dec
- os=-sysv
- ;;
- vms)
- basic_machine=vax-dec
- os=-vms
- ;;
- vpp*|vx|vx-*)
- basic_machine=f301-fujitsu
- ;;
- vxworks960)
- basic_machine=i960-wrs
- os=-vxworks
- ;;
- vxworks68)
- basic_machine=m68k-wrs
- os=-vxworks
- ;;
- vxworks29k)
- basic_machine=a29k-wrs
- os=-vxworks
- ;;
- w65*)
- basic_machine=w65-wdc
- os=-none
- ;;
- w89k-*)
- basic_machine=hppa1.1-winbond
- os=-proelf
- ;;
- xbox)
- basic_machine=i686-pc
- os=-mingw32
- ;;
- xps | xps100)
- basic_machine=xps100-honeywell
- ;;
- xscale-* | xscalee[bl]-*)
- basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
- ;;
- ymp)
- basic_machine=ymp-cray
- os=-unicos
- ;;
- z8k-*-coff)
- basic_machine=z8k-unknown
- os=-sim
- ;;
- z80-*-coff)
- basic_machine=z80-unknown
- os=-sim
- ;;
- none)
- basic_machine=none-none
- os=-none
- ;;
-
-# Here we handle the default manufacturer of certain CPU types. It is in
-# some cases the only manufacturer, in others, it is the most popular.
- w89k)
- basic_machine=hppa1.1-winbond
- ;;
- op50n)
- basic_machine=hppa1.1-oki
- ;;
- op60c)
- basic_machine=hppa1.1-oki
- ;;
- romp)
- basic_machine=romp-ibm
- ;;
- mmix)
- basic_machine=mmix-knuth
- ;;
- rs6000)
- basic_machine=rs6000-ibm
- ;;
- vax)
- basic_machine=vax-dec
- ;;
- pdp10)
- # there are many clones, so DEC is not a safe bet
- basic_machine=pdp10-unknown
- ;;
- pdp11)
- basic_machine=pdp11-dec
- ;;
- we32k)
- basic_machine=we32k-att
- ;;
- sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
- basic_machine=sh-unknown
- ;;
- sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
- basic_machine=sparc-sun
- ;;
- cydra)
- basic_machine=cydra-cydrome
- ;;
- orion)
- basic_machine=orion-highlevel
- ;;
- orion105)
- basic_machine=clipper-highlevel
- ;;
- mac | mpw | mac-mpw)
- basic_machine=m68k-apple
- ;;
- pmac | pmac-mpw)
- basic_machine=powerpc-apple
- ;;
- *-unknown)
- # Make sure to match an already-canonicalized machine name.
- ;;
- *)
- echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
- exit 1
- ;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
- *-digital*)
- basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
- ;;
- *-commodore*)
- basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
- ;;
- *)
- ;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
- # First match some system type aliases
- # that might get confused with valid system types.
- # -solaris* is a basic system type, with this one exception.
- -auroraux)
- os=-auroraux
- ;;
- -solaris1 | -solaris1.*)
- os=`echo $os | sed -e 's|solaris1|sunos4|'`
- ;;
- -solaris)
- os=-solaris2
- ;;
- -svr4*)
- os=-sysv4
- ;;
- -unixware*)
- os=-sysv4.2uw
- ;;
- -gnu/linux*)
- os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
- ;;
- # First accept the basic system types.
- # The portable systems comes first.
- # Each alternative MUST END IN A *, to match a version number.
- # -sysv* is not here because it comes later, after sysvr4.
- -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
- | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
- | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
- | -sym* | -kopensolaris* \
- | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
- | -aos* | -aros* \
- | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
- | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
- | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
- | -openbsd* | -solidbsd* \
- | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
- | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
- | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
- | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
- | -chorusos* | -chorusrdb* | -cegcc* \
- | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
- | -mingw32* | -linux-gnu* | -linux-android* \
- | -linux-newlib* | -linux-uclibc* \
- | -uxpv* | -beos* | -mpeix* | -udk* \
- | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
- | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
- | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
- | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
- | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
- | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
- | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
- # Remember, each alternative MUST END IN *, to match a version number.
- ;;
- -qnx*)
- case $basic_machine in
- x86-* | i*86-*)
- ;;
- *)
- os=-nto$os
- ;;
- esac
- ;;
- -nto-qnx*)
- ;;
- -nto*)
- os=`echo $os | sed -e 's|nto|nto-qnx|'`
- ;;
- -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
- | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
- | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
- ;;
- -mac*)
- os=`echo $os | sed -e 's|mac|macos|'`
- ;;
- -linux-dietlibc)
- os=-linux-dietlibc
- ;;
- -linux*)
- os=`echo $os | sed -e 's|linux|linux-gnu|'`
- ;;
- -sunos5*)
- os=`echo $os | sed -e 's|sunos5|solaris2|'`
- ;;
- -sunos6*)
- os=`echo $os | sed -e 's|sunos6|solaris3|'`
- ;;
- -opened*)
- os=-openedition
- ;;
- -os400*)
- os=-os400
- ;;
- -wince*)
- os=-wince
- ;;
- -osfrose*)
- os=-osfrose
- ;;
- -osf*)
- os=-osf
- ;;
- -utek*)
- os=-bsd
- ;;
- -dynix*)
- os=-bsd
- ;;
- -acis*)
- os=-aos
- ;;
- -atheos*)
- os=-atheos
- ;;
- -syllable*)
- os=-syllable
- ;;
- -386bsd)
- os=-bsd
- ;;
- -ctix* | -uts*)
- os=-sysv
- ;;
- -nova*)
- os=-rtmk-nova
- ;;
- -ns2 )
- os=-nextstep2
- ;;
- -nsk*)
- os=-nsk
- ;;
- # Preserve the version number of sinix5.
- -sinix5.*)
- os=`echo $os | sed -e 's|sinix|sysv|'`
- ;;
- -sinix*)
- os=-sysv4
- ;;
- -tpf*)
- os=-tpf
- ;;
- -triton*)
- os=-sysv3
- ;;
- -oss*)
- os=-sysv3
- ;;
- -svr4)
- os=-sysv4
- ;;
- -svr3)
- os=-sysv3
- ;;
- -sysvr4)
- os=-sysv4
- ;;
- # This must come after -sysvr4.
- -sysv*)
- ;;
- -ose*)
- os=-ose
- ;;
- -es1800*)
- os=-ose
- ;;
- -xenix)
- os=-xenix
- ;;
- -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
- os=-mint
- ;;
- -aros*)
- os=-aros
- ;;
- -kaos*)
- os=-kaos
- ;;
- -zvmoe)
- os=-zvmoe
- ;;
- -dicos*)
- os=-dicos
- ;;
- -nacl*)
- ;;
- -none)
- ;;
- *)
- # Get rid of the `-' at the beginning of $os.
- os=`echo $os | sed 's/[^-]*-//'`
- echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
- exit 1
- ;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system. Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
- score-*)
- os=-elf
- ;;
- spu-*)
- os=-elf
- ;;
- *-acorn)
- os=-riscix1.2
- ;;
- arm*-rebel)
- os=-linux
- ;;
- arm*-semi)
- os=-aout
- ;;
- c4x-* | tic4x-*)
- os=-coff
- ;;
- tic54x-*)
- os=-coff
- ;;
- tic55x-*)
- os=-coff
- ;;
- tic6x-*)
- os=-coff
- ;;
- # This must come before the *-dec entry.
- pdp10-*)
- os=-tops20
- ;;
- pdp11-*)
- os=-none
- ;;
- *-dec | vax-*)
- os=-ultrix4.2
- ;;
- m68*-apollo)
- os=-domain
- ;;
- i386-sun)
- os=-sunos4.0.2
- ;;
- m68000-sun)
- os=-sunos3
- # This also exists in the configure program, but was not the
- # default.
- # os=-sunos4
- ;;
- m68*-cisco)
- os=-aout
- ;;
- mep-*)
- os=-elf
- ;;
- mips*-cisco)
- os=-elf
- ;;
- mips*-*)
- os=-elf
- ;;
- or32-*)
- os=-coff
- ;;
- *-tti) # must be before sparc entry or we get the wrong os.
- os=-sysv3
- ;;
- sparc-* | *-sun)
- os=-sunos4.1.1
- ;;
- *-be)
- os=-beos
- ;;
- *-haiku)
- os=-haiku
- ;;
- *-ibm)
- os=-aix
- ;;
- *-knuth)
- os=-mmixware
- ;;
- *-wec)
- os=-proelf
- ;;
- *-winbond)
- os=-proelf
- ;;
- *-oki)
- os=-proelf
- ;;
- *-hp)
- os=-hpux
- ;;
- *-hitachi)
- os=-hiux
- ;;
- i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
- os=-sysv
- ;;
- *-cbm)
- os=-amigaos
- ;;
- *-dg)
- os=-dgux
- ;;
- *-dolphin)
- os=-sysv3
- ;;
- m68k-ccur)
- os=-rtu
- ;;
- m88k-omron*)
- os=-luna
- ;;
- *-next )
- os=-nextstep
- ;;
- *-sequent)
- os=-ptx
- ;;
- *-crds)
- os=-unos
- ;;
- *-ns)
- os=-genix
- ;;
- i370-*)
- os=-mvs
- ;;
- *-next)
- os=-nextstep3
- ;;
- *-gould)
- os=-sysv
- ;;
- *-highlevel)
- os=-bsd
- ;;
- *-encore)
- os=-bsd
- ;;
- *-sgi)
- os=-irix
- ;;
- *-siemens)
- os=-sysv4
- ;;
- *-masscomp)
- os=-rtu
- ;;
- f30[01]-fujitsu | f700-fujitsu)
- os=-uxpv
- ;;
- *-rom68k)
- os=-coff
- ;;
- *-*bug)
- os=-coff
- ;;
- *-apple)
- os=-macos
- ;;
- *-atari*)
- os=-mint
- ;;
- *)
- os=-none
- ;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer. We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
- *-unknown)
- case $os in
- -riscix*)
- vendor=acorn
- ;;
- -sunos*)
- vendor=sun
- ;;
- -cnk*|-aix*)
- vendor=ibm
- ;;
- -beos*)
- vendor=be
- ;;
- -hpux*)
- vendor=hp
- ;;
- -mpeix*)
- vendor=hp
- ;;
- -hiux*)
- vendor=hitachi
- ;;
- -unos*)
- vendor=crds
- ;;
- -dgux*)
- vendor=dg
- ;;
- -luna*)
- vendor=omron
- ;;
- -genix*)
- vendor=ns
- ;;
- -mvs* | -opened*)
- vendor=ibm
- ;;
- -os400*)
- vendor=ibm
- ;;
- -ptx*)
- vendor=sequent
- ;;
- -tpf*)
- vendor=ibm
- ;;
- -vxsim* | -vxworks* | -windiss*)
- vendor=wrs
- ;;
- -aux*)
- vendor=apple
- ;;
- -hms*)
- vendor=hitachi
- ;;
- -mpw* | -macos*)
- vendor=apple
- ;;
- -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
- vendor=atari
- ;;
- -vos*)
- vendor=stratus
- ;;
- esac
- basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
- ;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
+++ /dev/null
-AC_INIT(libsysio, 1.2)
-
-AC_CANONICAL_SYSTEM
-
-case "$host_os" in
- aix*)
- ;;
- linux*)
- ;;
- *)
- AC_MSG_WARN('***' ${host_os}: Unsupported OS target)
- ;;
-esac
-
-AM_INIT_AUTOMAKE([subdir-objects 1.9 tar-ustar])
-AM_MAINTAINER_MODE([enable])
-AC_PROG_CC
-AM_PROG_CC_C_O
-AC_PROG_RANLIB
-AC_CHECK_TOOL(CC, gcc, [no])
-AC_CHECK_TOOL(LD, ld, [no])
-AC_CHECK_TOOL(AR, ar, [no])
-AC_CHECK_TOOL(OBJDUMP, objdump, [no])
-AC_CHECK_TOOL(STRIP, strip, [no])
-AC_PROG_MAKE_SET
-AC_HEADER_STDC
-AC_HEADER_STAT
-AC_HEADER_TIME
-
-AS_IF([test "x$cross_compiling" = xyes],
- [case $host_vendor in
- # The K1OM architecture is an extension of the x86 architecture
- # and in MPSS 2.1 it's defined in $host_vendor. But in MPSS 3.x
- # it's defined in $host_arch. So, try to support both case.
- k1om | mpss)
- AC_MSG_RESULT([Intel(R) Xeon Phi(TM)])
- CC_TARGET_ARCH=`$CC -v 2>&1 | grep Target: | sed -e 's/Target: //'`
- if test \( $CC_TARGET_ARCH != x86_64-k1om-linux \
- -a $CC_TARGET_ARCH != k1om-mpss-linux \)
- then
- AC_MSG_ERROR([Cross compiler not found in PATH.])
- fi
- CCAS=$CC
- ;;
- *)
- ;;
- esac]
-)
-
-if test ${target_cpu} == "powerpc64"; then
- AC_MSG_WARN([set compiler with -m64])
- CC="$CC -m64"
-fi
-
-have_lib_dir=yes;
-AC_ARG_WITH(lib-dir,
- AC_HELP_STRING([--with-lib-dir=<sysio lib build directory>],
- [directory for sysio library]),
- [ case "${withval}" in
- "yes"|"no"|"") have_lib_dir=no ;;
- *) LIBBUILD_DIR=${withval};
- test -d ${LIBBUILD_DIR} || mkdir ${LIBBUILD_DIR} ||
- have_lib_dir=no;;
- esac;],
- [ LIBBUILD_DIR=`pwd`/lib;
- test -d ${LIBBUILD_DIR} || mkdir ${LIBBUILD_DIR} || have_lib_dir=no;])
-if test x${have_lib_dir} = xyes; then
- echo "Using sysio library directory ${LIBBUILD_DIR}"
-else
- AC_MSG_ERROR(Need writeable path to sysio library directory ${LIBBUILD_DIR})
-fi
-AC_SUBST(LIBBUILD_DIR)
-
-AC_ARG_WITH(native_driver,
- AC_HELP_STRING([--with-native-driver],[build native test driver]),
- [ case "${withval}" in
- yes) ;;
- no) ;;
- *) AC_MSG_ERROR(bad value ${withval} for --with-native-driver) ;;
- esac;],
- [with_native_driver=yes;])
-AM_CONDITIONAL(WITH_NATIVE_DRIVER, test x$with_native_driver = xyes)
-
-AC_ARG_WITH(incore-driver,
- AC_HELP_STRING([--with-incore-driver],[build incore test driver]),
- [ case "${withval}" in
- yes) ;;
- no) ;;
- *) AC_MSG_ERROR(bad value ${withval} for --with-incore-driver) ;;
- esac],
- [with_incore_driver=yes])
-AM_CONDITIONAL(WITH_INCORE_DRIVER, test x$with_incore_driver = xyes)
-
-AC_ARG_WITH(tests,
- AC_HELP_STRING([--with-tests],[build tests]),
- [ case "${withval}" in
- yes) ;;
- no) ;;
- *) AC_MSG_ERROR(bad value ${withval} for --with-tests) ;;
- esac],
- [with_tests=yes])
-AM_CONDITIONAL(WITH_TESTS, test x$with_tests = xyes)
-
-AC_ARG_WITH(automount,
- AC_HELP_STRING([--with-automount@<:@=<automount-file-name>@:>@],
- [with automounts @<:@<automount-file-name>=.mount@:>@]),
- [ if test x${withval} = xyes; then
- AUTOMOUNT=-DAUTOMOUNT_FILE_NAME="\\\".mount\\\""
- elif test x${withval} != x; then
- AUTOMOUNT=-DAUTOMOUNT_FILE_NAME="\\\"${withval}\\\""
- fi])
-AC_SUBST(AUTOMOUNT)
-
-AC_ARG_WITH(stdfd-dev,
- AC_HELP_STRING([--with-stdfd-dev],
- [build standard file descriptors pseudo-driver]),
- [ case "${withval}" in
- yes) ;;
- no) ;;
- *) AC_MSG_ERROR(bad value ${withval} for --with-stdfd-dev) ;;
- esac],
- [with_stdfd_dev=yes])
-AM_CONDITIONAL(WITH_STDFD_DEV, test x$with_stdfd_dev = xyes)
-
-AC_ARG_WITH(zero-sum-memory,
- AC_HELP_STRING([--with-zero-sum-memory],
- [free all dynamically allocated memory at the end -- useful for debugging]),
- [ case "${withval}" in
- yes) ZERO_SUM_MEMORY=-DZERO_SUM_MEMORY=1 ;;
- no) ;;
- *) AC_MSG_ERROR(bad value ${withval} for --with-zero-sum-memory) ;;
- esac],
- [with_zero_sum_memory=no])
-AC_SUBST(ZERO_SUM_MEMORY)
-
-AC_ARG_WITH(defer-init-cwd,
- AC_HELP_STRING([--with-defer-init-cwd],
- [defer initialization of current working directory]),
- [ case "${withval}" in
- yes) DEFER_INIT_CWD=-DDEFER_INIT_CWD=1 ;;
- no) ;;
- *) AC_MSG_ERROR(bad value ${withval} for --with-defer-init-cwd) ;;
- esac],
- [with_defer_init_cwd=no])
-AC_SUBST(DEFER_INIT_CWD)
-
-AC_ARG_WITH(tracing,
- AC_HELP_STRING([--with-tracing],
- [enable tracing support]),
- [ case "${withval}" in
- yes) TRACING=-DSYSIO_TRACING=1 ;;
- no) ;;
- *) AC_MSG_ERROR(bad value ${withval} for --with-tracing) ;;
- esac],
- [TRACING=-DSYSIO_TRACING=1])
-AC_SUBST(TRACING)
-
-AC_ARG_WITH(cplant_yod,
- AC_HELP_STRING([--with-cplant-yod],[build cplant yod I/O driver]),
- [ case "${withval}" in
- yes) if test x${with_stdfd_dev} != xyes; then
- with_stdfd_dev=yes
- AM_CONDITIONAL(WITH_STDFD_DEV, test x$with_stdfd_dev = xyes)
- fi ;;
- no) ;;
- *) AC_MSG_ERROR(bad value ${withval} for --with-cplant-yod);;
- esac],
- [with_cplant_yod=no])
-AM_CONDITIONAL(WITH_CPLANT_YOD, test x$with_cplant_yod = xyes)
-
-AC_ARG_WITH(cplant_tests,
- AC_HELP_STRING([--with-cplant-tests=<cplant-build-path>],
- [build libsysio tests for cplant platform]),
- [ case "${withval}" in
- yes) AC_MSG_ERROR(need path to compiler for --with-cplant-tests);;
- no) with_cplant_tests=no;;
- *) CC=${withval}
- CCDEPMODE=${CC}
- CPP="${CC} -E"
- AC_CHECK_FILE(${CC},
- [ if test x${with_cplant_yod} != xyes; then
- with_cplant_yod=yes
- AM_CONDITIONAL(WITH_CPLANT_YOD, test x$with_cplant_yod = xyes)
- fi],
- [ AC_MSG_ERROR(path not found ${CC} for --with-cplant-tests) ]);;
- esac],
- [with_cplant_tests=no])
-AM_CONDITIONAL(WITH_CPLANT_TESTS, test x$with_cplant_tests != xno)
-
-AC_ARG_WITH(sockets,
- AC_HELP_STRING([--with-sockets],
- [build sockets interface driver (EXPERIMENTAL)]),
- [ case "${withval}" in
- yes) ;;
- no) ;;
- *) AC_MSG_ERROR(bad value ${withval} for --with-sockets) ;;
- esac],
- [with_sockets=no])
-AM_CONDITIONAL(WITH_SOCKETS_DRIVER, test x$with_sockets = xyes)
-
-AC_ARG_WITH(lustre-hack,
- AC_HELP_STRING([--with-lustre-hack],
- [have hacking code which needed to support liblustre driver (EXPERIMENTAL)]),
- [ case "${withval}" in
- yes) ;;
- no) ;;
- *) AC_MSG_ERROR(bad value ${withval} for --with-lustre-hack) ;;
- esac],
- [with_lustre_hack=no])
-AM_CONDITIONAL(WITH_LUSTRE_HACK, test x$with_lustre_hack = xyes)
-if test x$with_lustre_hack = xyes; then
- AC_DEFINE(HAVE_LUSTRE_HACK)
-fi
-
-AC_ARG_WITH(alternate-symbols,
- AC_HELP_STRING([--with-alternate-symbols@<:@=<qualifier>@:>@],
- [Prepend standard, public, symbols with a unique qualifer]),
- [ case "${withval}" in
- yes) SYSIO_LABEL_NAMES=-DSYSIO_LABEL_NAMES=sysio_ ;;
- no) ;;
- *) SYSIO_LABEL_NAMES=-DSYSIO_LABEL_NAMES="${withval}" ;;
- esac])
-AC_SUBST(SYSIO_LABEL_NAMES)
-
-# We keep the original values in `$config_*' and never modify them, so we
-# can write them unchanged into config.make. Everything else uses
-# $machine, $vendor, and $os, and changes them whenever convenient.
-config_machine=$host_cpu config_vendor=$host_vendor config_os=$host_os
-
-# Don't allow vendor == "unknown"
-test "$config_vendor" = unknown && config_vendor=
-config_os="`echo $config_os | sed 's/^unknown-//'`"
-
-# Some configurations imply other options.
-case "$host_os" in
- gnu* | linux* | bsd4.4* | netbsd* | freebsd*)
- # These systems always use GNU tools.
- gnu_ld=yes gnu_as=yes ;;
-esac
-case "$host_os" in
- # i586-linuxaout is mangled into i586-pc-linux-gnuaout
- linux*ecoff* | linux*aout* | gnu*aout* | gnu*ecoff*)
- ;;
- gnu* | linux* | freebsd* | netbsd* | sysv4* | solaris2* | irix6*)
- # These systems (almost) always use the ELF format.
- elf=yes
- ;;
- aix*)
- # These systems are always xcoff
- xcoff=yes
- elf=no
- ;;
-esac
-
-machine=$config_machine
-vendor=$config_vendor
-os=$config_os
-
-# config.guess on some IBM machines says `rs6000' instead of `powerpc'.
-# Unify this here.
-if test "$machine" = rs6000; then
- machine="powerpc"
-fi
-
-case "$host_os" in
- gnu* | linux*)
- AC_DEFINE(_XOPEN_SOURCE, 600)
- ;;
- aix*)
- # ... and always needed...
- AC_DEFINE(__USE_LARGEFILE64)
- AC_DEFINE(_LARGE_FILES)
- AC_DEFINE(_LARGE_FILE_API)
- AC_DEFINE(_ALL_SOURCE)
- AC_DEFINE(_XOPEN_SOURCE_EXTENDED)
- ;;
-esac
-
-AC_MSG_CHECKING(for symlink support)
-AC_TRY_COMPILE([
-#include <sys/types.h>
-#include <sys/stat.h>
-],[
-#ifndef S_ISLNK
-#error
-#endif
-],
- symlink_support="yes",
- symlink_support="no"
-)
-AC_MSG_RESULT($symlink_support)
-
-if test x$symlink_support = xyes; then
- AC_MSG_CHECKING(if readlink returns int)
- AC_TRY_COMPILE([
-#include <unistd.h>
- ],[
- extern int readlink(const char *, char *, size_t);
- ],
- readlink_returns_int="yes",
- readlink_returns_int="no"
- )
- AC_MSG_RESULT($readlink_returns_int)
- if test x$readlink_returns_int = no; then
- AC_DEFINE(HAVE_POSIX_1003_READLINK,
- 1,
- [readlink returns ssize_t])
- fi
-fi
-
-AC_MSG_CHECKING(if readlink returns ssize_t)
-AC_TRY_COMPILE([
- #include <unistd.h>
-],[
- ssize_t readlink(const char *, char *, size_t);
-],[
- AC_MSG_RESULT([yes])
- AC_DEFINE(HAVE_POSIX_1003_READLINK, 1, [readlink returns ssize_t])
-],[
- AC_MSG_RESULT([no])
-])
-
-# If we can't provoke the declaration of stat64 then we assume the
-# environment supports 64-bit file support naturally. Beware!
-AC_MSG_CHECKING(whether _LARGEFILE64_SOURCE definition is required)
-AC_TRY_COMPILE([
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>], [
-struct stat64 st64;],
-sysio_largefile64_source_required=no,
-sysio_largefile64_source_required=maybe)
-if test x$sysio_largefile64_source_required = xmaybe; then
- AC_TRY_COMPILE([
-#define _LARGEFILE64_SOURCE
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>], [
-struct stat64 st64;],
- sysio_largefile64_source_required=yes,
- sysio_largefile64_source_required=no)
-fi
-AC_MSG_RESULT($sysio_largefile64_source_required)
-if test x$sysio_largefile64_source_required = xyes; then
- AC_DEFINE(_LARGEFILE64_SOURCE)
-fi
-
-# Alpha linux defines
-#
-AC_MSG_CHECKING(for alpha linux)
-alpha_linux_env=no
-if test `expr ${machine} : "alpha"` = 5 && \
- test `expr ${os} : "linux"` = 5; then
- alpha_linux_env=yes
- AC_DEFINE(ALPHA_LINUX)
-fi
-AC_MSG_RESULT($alpha_linux_env)
-AM_CONDITIONAL(TEST_ALPHA_ARG, test x$alpha_linux_env = xyes)
-
-# Check for __st_ino
-#
-AC_MSG_CHECKING(for __st_ino)
-AC_TRY_COMPILE([
-#include <sys/stat.h>],
-[struct stat st;
-st.__st_ino = 0;],
- have__st_ino=yes,
- have__st_ino=no)
-AC_MSG_RESULT($have__st_ino)
-if test x$have__st_ino = xyes; then
- AC_DEFINE(HAVE__ST_INO)
-fi
-
-# Check for st_gen
-#
-AC_MSG_CHECKING(for st_gen)
-AC_TRY_COMPILE([
-#include <sys/stat.h>],
-[struct stat st;
-st.st_gen = 0;],
- have_st_gen=yes,
- have_st_gen=no)
-AC_MSG_RESULT($have_st_gen)
-if test x$have_st_gen = xyes; then
- AC_DEFINE(HAVE_GENERATION)
-fi
-
-AC_MSG_CHECKING(for POSIX 2008 preadv)
-tmp_flags="$CFLAGS"
-CFLAGS="$CFLAGS -Wall -Werror"
-AC_TRY_COMPILE([
-#include <sys/uio.h>
-ssize_t preadv (int __fd, const struct iovec *__iovec,
- int __count, off_t off)
-{
- return 0;
-}
-],[
-],[
-AC_DEFINE(HAVE_POSIX2008_PREADV, 1, [POSIX 2008 preadv])
-AC_MSG_RESULT(yes)
-],[
-AC_MSG_RESULT(no)
-])
-CFLAGS="$tmp_flags"
-
-AC_MSG_CHECKING(for POSIX 2008 scandir)
-tmp_flags="$CFLAGS"
-CFLAGS="$CFLAGS -Wall -Werror"
-AC_TRY_COMPILE([
-#define _BSD_SOURCE
-
-#include <stdio.h>
-#include <dirent.h>
-
-int scandir(const char *dir,
- struct dirent ***namelist,
- int(*filter)(const struct dirent *),
- int(*compar)(const struct dirent **,
- const struct dirent **)
- );
-
-],[
-], [
-AC_DEFINE(HAVE_POSIX2008_SCANDIR, 1, [POSIX 2008 scandir])
-AC_MSG_RESULT(yes)
-],[
-AC_MSG_RESULT(no)
-])
-CFLAGS="$tmp_flags"
-
-
-AC_MSG_CHECKING(for POSIX 2008 preadv)
-tmp_flags="$CFLAGS"
-CFLAGS="$CFLAGS -Wall -Werror"
-AC_TRY_COMPILE([
-#include <sys/uio.h>
-ssize_t preadv (int __fd, const struct iovec *__iovec,
- int __count, off_t off)
-{
- return 0;
-}
-],[
-],[
-AC_DEFINE(HAVE_POSIX2008_PREADV, 1, [POSIX 2008 preadv])
-AC_MSG_RESULT(yes)
-],[
-AC_MSG_RESULT(no)
-])
-CFLAGS="$tmp_flags"
-
-AC_MSG_CHECKING(for POSIX 2008 scandir)
-tmp_flags="$CFLAGS"
-CFLAGS="$CFLAGS -Wall -Werror"
-AC_TRY_COMPILE([
-#define _BSD_SOURCE
-
-#include <stdio.h>
-#include <dirent.h>
-
-int scandir(const char *dir,
- struct dirent ***namelist,
- int(*filter)(const struct dirent *),
- int(*compar)(const struct dirent **,
- const struct dirent **)
- );
-
-],[
-], [
-AC_DEFINE(HAVE_POSIX2008_SCANDIR, 1, [POSIX 2008 scandir])
-AC_MSG_RESULT(yes)
-],[
-AC_MSG_RESULT(no)
-])
-CFLAGS="$tmp_flags"
-
-
-AC_MSG_CHECKING(whether .text pseudo-op must be used)
-AC_CACHE_VAL(am_cv_sysio_asm_dot_text, [dnl
-cat > conftest.s <<EOF
- .text
-EOF
- am_cv_sysio_asm_dot_text=
- if ${CC-cc} $CFLAGS -c conftest.s 2>/dev/null; then
- am_cv_sysio_asm_dot_text=.text
- fi
- rm -f conftest*])
-if test -z "$am_cv_sysio_asm_dot_text"; then
- AC_MSG_RESULT(no)
-else
- AC_MSG_RESULT(yes)
-fi
-
-AC_CACHE_CHECK(for assembler global-symbol directive,
- am_cv_sysio_asm_global_directive, [dnl
-am_cv_sysio_asm_global_directive=UNKNOWN
-for ac_globl in .globl .global .EXPORT; do
- cat > conftest.s <<EOF
- ${am_cv_sysio_asm_dot_text}
- ${ac_globl} foo
-foo:
-EOF
- if ${CC-cc} $CFLAGS -c conftest.s 2>/dev/null; then
- am_cv_sysio_asm_global_directive=${ac_globl}
- fi
- rm -f conftest*
- test $am_cv_sysio_asm_global_directive != UNKNOWN && break
-done])
-if test $am_cv_sysio_asm_global_directive = UNKNOWN; then
- AC_MSG_ERROR(cannot determine asm global directive)
-#else
-# AC_DEFINE_UNQUOTED(ASM_GLOBAL_DIRECTIVE, ${am_cv_sysio_asm_global_directive})
-fi
-
-AC_CACHE_CHECK(for .set assembler directive,
- am_cv_sysio_asm_set_directive, [dnl
-cat > conftest.s<<EOF
-${am_cv_sysio_asm_dot_text}
-foo:
-.set bar, foo
-${am_cv_sysio_asm_global_directive} bar
-EOF
- # The alpha-dec-osf1 assembler gives only a warning for `.set'
- # (but it doesn't work), so we must do a linking check to be sure.
-cat > conftest1.c <<EOF
-extern int bar;
-main () { printf ("%d\n", bar); }
-EOF
- if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
- -o conftest conftest.s conftest1.c 1>&AC_FD_CC 2>&AC_FD_CC; then
- am_cv_sysio_asm_set_directive=yes
- else
- am_cv_sysio_asm_set_directive=no
- fi
- rm -f conftest*])
-#if test $am_cv_sysio_asm_set_directive = yes; then
-# AC_DEFINE(HAVE_ASM_SET_DIRECTIVE)
-#fi
-
-AC_CACHE_CHECK(for assembler .weak directive, am_cv_sysio_asm_weak_directive,
- [dnl
-cat > conftest.s <<EOF
-${am_cv_sysio_asm_dot_text}
-foo:
-.weak foo
-EOF
- if ${CC-cc} $CFLAGS -c conftest.s 2>/dev/null; then
- am_cv_sysio_asm_weak_directive=yes
- else
- am_cv_sysio_asm_weak_directive=no
- fi
- rm -f conftest*])
-
-if test $am_cv_sysio_asm_weak_directive = no; then
- AC_CACHE_CHECK(for assembler .weakext directive,
- am_cv_sysio_asm_weakext_directive, [dnl
-cat > conftest.s <<EOF
-${am_cv_sysio_asm_dot_text}
-${am_cv_sysio_asm_global_directive} foo
-foo:
-.weakext bar foo
-.weakext baz
-${am_cv_sysio_asm_global_directive} baz
-baz:
-EOF
- if ${CC-cc} $CFLAGS -c conftest.s 2>/dev/null; then
- am_cv_sysio_asm_weakext_directive=yes
- else
- am_cv_sysio_asm_weakext_directive=no
- fi
- rm -f conftest*])
-fi # no .weak
-
-if test x$am_cv_sysio_asm_weak_directive = xyes; then
- AC_DEFINE(HAVE_ASM_WEAK_DIRECTIVE)
-fi
-if test x$am_cv_sysio_asm_weakext_directive = xyes; then
- AC_DEFINE(HAVE_ASM_WEAKEXT_DIRECTIVE)
-fi
-
-AC_OUTPUT(
- Makefile
- tests/Makefile)
+++ /dev/null
-#! /bin/sh
-# depcomp - compile a program generating dependencies as side-effects
-
-scriptversion=2011-12-04.11; # UTC
-
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
-# 2011 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program 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 General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
-
-case $1 in
- '')
- echo "$0: No command. Try \`$0 --help' for more information." 1>&2
- exit 1;
- ;;
- -h | --h*)
- cat <<\EOF
-Usage: depcomp [--help] [--version] PROGRAM [ARGS]
-
-Run PROGRAMS ARGS to compile a file, generating dependencies
-as side-effects.
-
-Environment variables:
- depmode Dependency tracking mode.
- source Source file read by `PROGRAMS ARGS'.
- object Object file output by `PROGRAMS ARGS'.
- DEPDIR directory where to store dependencies.
- depfile Dependency file to output.
- tmpdepfile Temporary file to use when outputting dependencies.
- libtool Whether libtool is used (yes/no).
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
- exit $?
- ;;
- -v | --v*)
- echo "depcomp $scriptversion"
- exit $?
- ;;
-esac
-
-if test -z "$depmode" || test -z "$source" || test -z "$object"; then
- echo "depcomp: Variables source, object and depmode must be set" 1>&2
- exit 1
-fi
-
-# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
-depfile=${depfile-`echo "$object" |
- sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
-tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
-
-rm -f "$tmpdepfile"
-
-# Some modes work just like other modes, but use different flags. We
-# parameterize here, but still list the modes in the big case below,
-# to make depend.m4 easier to write. Note that we *cannot* use a case
-# here, because this file can only contain one case statement.
-if test "$depmode" = hp; then
- # HP compiler uses -M and no extra arg.
- gccflag=-M
- depmode=gcc
-fi
-
-if test "$depmode" = dashXmstdout; then
- # This is just like dashmstdout with a different argument.
- dashmflag=-xM
- depmode=dashmstdout
-fi
-
-cygpath_u="cygpath -u -f -"
-if test "$depmode" = msvcmsys; then
- # This is just like msvisualcpp but w/o cygpath translation.
- # Just convert the backslash-escaped backslashes to single forward
- # slashes to satisfy depend.m4
- cygpath_u='sed s,\\\\,/,g'
- depmode=msvisualcpp
-fi
-
-if test "$depmode" = msvc7msys; then
- # This is just like msvc7 but w/o cygpath translation.
- # Just convert the backslash-escaped backslashes to single forward
- # slashes to satisfy depend.m4
- cygpath_u='sed s,\\\\,/,g'
- depmode=msvc7
-fi
-
-case "$depmode" in
-gcc3)
-## gcc 3 implements dependency tracking that does exactly what
-## we want. Yay! Note: for some reason libtool 1.4 doesn't like
-## it if -MD -MP comes after the -MF stuff. Hmm.
-## Unfortunately, FreeBSD c89 acceptance of flags depends upon
-## the command line argument order; so add the flags where they
-## appear in depend2.am. Note that the slowdown incurred here
-## affects only configure: in makefiles, %FASTDEP% shortcuts this.
- for arg
- do
- case $arg in
- -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
- *) set fnord "$@" "$arg" ;;
- esac
- shift # fnord
- shift # $arg
- done
- "$@"
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile"
- exit $stat
- fi
- mv "$tmpdepfile" "$depfile"
- ;;
-
-gcc)
-## There are various ways to get dependency output from gcc. Here's
-## why we pick this rather obscure method:
-## - Don't want to use -MD because we'd like the dependencies to end
-## up in a subdir. Having to rename by hand is ugly.
-## (We might end up doing this anyway to support other compilers.)
-## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-## -MM, not -M (despite what the docs say).
-## - Using -M directly means running the compiler twice (even worse
-## than renaming).
- if test -z "$gccflag"; then
- gccflag=-MD,
- fi
- "$@" -Wp,"$gccflag$tmpdepfile"
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile"
- exit $stat
- fi
- rm -f "$depfile"
- echo "$object : \\" > "$depfile"
- alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
- sed -e 's/^[^:]*: / /' \
- -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
-## The problem is that when a header file which appears in a .P file
-## is deleted, the dependency causes make to die (because there is
-## typically no way to rebuild the header). We avoid this by adding
-## dummy dependencies for each header file. Too bad gcc doesn't do
-## this for us directly.
- tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'. On the theory
-## that the space means something, we add a space to the output as
-## well. hp depmode also adds that space, but also prefixes the VPATH
-## to the object. Take care to not repeat it in the output.
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly. Breaking it into two sed invocations is a workaround.
- sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
- | sed -e 's/$/ :/' >> "$depfile"
- rm -f "$tmpdepfile"
- ;;
-
-hp)
- # This case exists only to let depend.m4 do its work. It works by
- # looking at the text of this script. This case will never be run,
- # since it is checked for above.
- exit 1
- ;;
-
-sgi)
- if test "$libtool" = yes; then
- "$@" "-Wp,-MDupdate,$tmpdepfile"
- else
- "$@" -MDupdate "$tmpdepfile"
- fi
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile"
- exit $stat
- fi
- rm -f "$depfile"
-
- if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
- echo "$object : \\" > "$depfile"
-
- # Clip off the initial element (the dependent). Don't try to be
- # clever and replace this with sed code, as IRIX sed won't handle
- # lines with more than a fixed number of characters (4096 in
- # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
- # the IRIX cc adds comments like `#:fec' to the end of the
- # dependency line.
- tr ' ' '
-' < "$tmpdepfile" \
- | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
- tr '
-' ' ' >> "$depfile"
- echo >> "$depfile"
-
- # The second pass generates a dummy entry for each header file.
- tr ' ' '
-' < "$tmpdepfile" \
- | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
- >> "$depfile"
- else
- # The sourcefile does not contain any dependencies, so just
- # store a dummy comment line, to avoid errors with the Makefile
- # "include basename.Plo" scheme.
- echo "#dummy" > "$depfile"
- fi
- rm -f "$tmpdepfile"
- ;;
-
-aix)
- # The C for AIX Compiler uses -M and outputs the dependencies
- # in a .u file. In older versions, this file always lives in the
- # current directory. Also, the AIX compiler puts `$object:' at the
- # start of each line; $object doesn't have directory information.
- # Version 6 uses the directory in both cases.
- dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
- test "x$dir" = "x$object" && dir=
- base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
- if test "$libtool" = yes; then
- tmpdepfile1=$dir$base.u
- tmpdepfile2=$base.u
- tmpdepfile3=$dir.libs/$base.u
- "$@" -Wc,-M
- else
- tmpdepfile1=$dir$base.u
- tmpdepfile2=$dir$base.u
- tmpdepfile3=$dir$base.u
- "$@" -M
- fi
- stat=$?
-
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
- exit $stat
- fi
-
- for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
- do
- test -f "$tmpdepfile" && break
- done
- if test -f "$tmpdepfile"; then
- # Each line is of the form `foo.o: dependent.h'.
- # Do two passes, one to just change these to
- # `$object: dependent.h' and one to simply `dependent.h:'.
- sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
- # That's a tab and a space in the [].
- sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
- else
- # The sourcefile does not contain any dependencies, so just
- # store a dummy comment line, to avoid errors with the Makefile
- # "include basename.Plo" scheme.
- echo "#dummy" > "$depfile"
- fi
- rm -f "$tmpdepfile"
- ;;
-
-icc)
- # Intel's C compiler understands `-MD -MF file'. However on
- # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
- # ICC 7.0 will fill foo.d with something like
- # foo.o: sub/foo.c
- # foo.o: sub/foo.h
- # which is wrong. We want:
- # sub/foo.o: sub/foo.c
- # sub/foo.o: sub/foo.h
- # sub/foo.c:
- # sub/foo.h:
- # ICC 7.1 will output
- # foo.o: sub/foo.c sub/foo.h
- # and will wrap long lines using \ :
- # foo.o: sub/foo.c ... \
- # sub/foo.h ... \
- # ...
-
- "$@" -MD -MF "$tmpdepfile"
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile"
- exit $stat
- fi
- rm -f "$depfile"
- # Each line is of the form `foo.o: dependent.h',
- # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
- # Do two passes, one to just change these to
- # `$object: dependent.h' and one to simply `dependent.h:'.
- sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
- # Some versions of the HPUX 10.20 sed can't process this invocation
- # correctly. Breaking it into two sed invocations is a workaround.
- sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
- sed -e 's/$/ :/' >> "$depfile"
- rm -f "$tmpdepfile"
- ;;
-
-hp2)
- # The "hp" stanza above does not work with aCC (C++) and HP's ia64
- # compilers, which have integrated preprocessors. The correct option
- # to use with these is +Maked; it writes dependencies to a file named
- # 'foo.d', which lands next to the object file, wherever that
- # happens to be.
- # Much of this is similar to the tru64 case; see comments there.
- dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
- test "x$dir" = "x$object" && dir=
- base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
- if test "$libtool" = yes; then
- tmpdepfile1=$dir$base.d
- tmpdepfile2=$dir.libs/$base.d
- "$@" -Wc,+Maked
- else
- tmpdepfile1=$dir$base.d
- tmpdepfile2=$dir$base.d
- "$@" +Maked
- fi
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile1" "$tmpdepfile2"
- exit $stat
- fi
-
- for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
- do
- test -f "$tmpdepfile" && break
- done
- if test -f "$tmpdepfile"; then
- sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
- # Add `dependent.h:' lines.
- sed -ne '2,${
- s/^ *//
- s/ \\*$//
- s/$/:/
- p
- }' "$tmpdepfile" >> "$depfile"
- else
- echo "#dummy" > "$depfile"
- fi
- rm -f "$tmpdepfile" "$tmpdepfile2"
- ;;
-
-tru64)
- # The Tru64 compiler uses -MD to generate dependencies as a side
- # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
- # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
- # dependencies in `foo.d' instead, so we check for that too.
- # Subdirectories are respected.
- dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
- test "x$dir" = "x$object" && dir=
- base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
- if test "$libtool" = yes; then
- # With Tru64 cc, shared objects can also be used to make a
- # static library. This mechanism is used in libtool 1.4 series to
- # handle both shared and static libraries in a single compilation.
- # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
- #
- # With libtool 1.5 this exception was removed, and libtool now
- # generates 2 separate objects for the 2 libraries. These two
- # compilations output dependencies in $dir.libs/$base.o.d and
- # in $dir$base.o.d. We have to check for both files, because
- # one of the two compilations can be disabled. We should prefer
- # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
- # automatically cleaned when .libs/ is deleted, while ignoring
- # the former would cause a distcleancheck panic.
- tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
- tmpdepfile2=$dir$base.o.d # libtool 1.5
- tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
- tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
- "$@" -Wc,-MD
- else
- tmpdepfile1=$dir$base.o.d
- tmpdepfile2=$dir$base.d
- tmpdepfile3=$dir$base.d
- tmpdepfile4=$dir$base.d
- "$@" -MD
- fi
-
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
- exit $stat
- fi
-
- for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
- do
- test -f "$tmpdepfile" && break
- done
- if test -f "$tmpdepfile"; then
- sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
- # That's a tab and a space in the [].
- sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
- else
- echo "#dummy" > "$depfile"
- fi
- rm -f "$tmpdepfile"
- ;;
-
-msvc7)
- if test "$libtool" = yes; then
- showIncludes=-Wc,-showIncludes
- else
- showIncludes=-showIncludes
- fi
- "$@" $showIncludes > "$tmpdepfile"
- stat=$?
- grep -v '^Note: including file: ' "$tmpdepfile"
- if test "$stat" = 0; then :
- else
- rm -f "$tmpdepfile"
- exit $stat
- fi
- rm -f "$depfile"
- echo "$object : \\" > "$depfile"
- # The first sed program below extracts the file names and escapes
- # backslashes for cygpath. The second sed program outputs the file
- # name when reading, but also accumulates all include files in the
- # hold buffer in order to output them again at the end. This only
- # works with sed implementations that can handle large buffers.
- sed < "$tmpdepfile" -n '
-/^Note: including file: *\(.*\)/ {
- s//\1/
- s/\\/\\\\/g
- p
-}' | $cygpath_u | sort -u | sed -n '
-s/ /\\ /g
-s/\(.*\)/ \1 \\/p
-s/.\(.*\) \\/\1:/
-H
-$ {
- s/.*/ /
- G
- p
-}' >> "$depfile"
- rm -f "$tmpdepfile"
- ;;
-
-msvc7msys)
- # This case exists only to let depend.m4 do its work. It works by
- # looking at the text of this script. This case will never be run,
- # since it is checked for above.
- exit 1
- ;;
-
-#nosideeffect)
- # This comment above is used by automake to tell side-effect
- # dependency tracking mechanisms from slower ones.
-
-dashmstdout)
- # Important note: in order to support this mode, a compiler *must*
- # always write the preprocessed file to stdout, regardless of -o.
- "$@" || exit $?
-
- # Remove the call to Libtool.
- if test "$libtool" = yes; then
- while test "X$1" != 'X--mode=compile'; do
- shift
- done
- shift
- fi
-
- # Remove `-o $object'.
- IFS=" "
- for arg
- do
- case $arg in
- -o)
- shift
- ;;
- $object)
- shift
- ;;
- *)
- set fnord "$@" "$arg"
- shift # fnord
- shift # $arg
- ;;
- esac
- done
-
- test -z "$dashmflag" && dashmflag=-M
- # Require at least two characters before searching for `:'
- # in the target name. This is to cope with DOS-style filenames:
- # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
- "$@" $dashmflag |
- sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
- rm -f "$depfile"
- cat < "$tmpdepfile" > "$depfile"
- tr ' ' '
-' < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly. Breaking it into two sed invocations is a workaround.
- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
- rm -f "$tmpdepfile"
- ;;
-
-dashXmstdout)
- # This case only exists to satisfy depend.m4. It is never actually
- # run, as this mode is specially recognized in the preamble.
- exit 1
- ;;
-
-makedepend)
- "$@" || exit $?
- # Remove any Libtool call
- if test "$libtool" = yes; then
- while test "X$1" != 'X--mode=compile'; do
- shift
- done
- shift
- fi
- # X makedepend
- shift
- cleared=no eat=no
- for arg
- do
- case $cleared in
- no)
- set ""; shift
- cleared=yes ;;
- esac
- if test $eat = yes; then
- eat=no
- continue
- fi
- case "$arg" in
- -D*|-I*)
- set fnord "$@" "$arg"; shift ;;
- # Strip any option that makedepend may not understand. Remove
- # the object too, otherwise makedepend will parse it as a source file.
- -arch)
- eat=yes ;;
- -*|$object)
- ;;
- *)
- set fnord "$@" "$arg"; shift ;;
- esac
- done
- obj_suffix=`echo "$object" | sed 's/^.*\././'`
- touch "$tmpdepfile"
- ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
- rm -f "$depfile"
- # makedepend may prepend the VPATH from the source file name to the object.
- # No need to regex-escape $object, excess matching of '.' is harmless.
- sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
- sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly. Breaking it into two sed invocations is a workaround.
- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
- rm -f "$tmpdepfile" "$tmpdepfile".bak
- ;;
-
-cpp)
- # Important note: in order to support this mode, a compiler *must*
- # always write the preprocessed file to stdout.
- "$@" || exit $?
-
- # Remove the call to Libtool.
- if test "$libtool" = yes; then
- while test "X$1" != 'X--mode=compile'; do
- shift
- done
- shift
- fi
-
- # Remove `-o $object'.
- IFS=" "
- for arg
- do
- case $arg in
- -o)
- shift
- ;;
- $object)
- shift
- ;;
- *)
- set fnord "$@" "$arg"
- shift # fnord
- shift # $arg
- ;;
- esac
- done
-
- "$@" -E |
- sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
- -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
- sed '$ s: \\$::' > "$tmpdepfile"
- rm -f "$depfile"
- echo "$object : \\" > "$depfile"
- cat < "$tmpdepfile" >> "$depfile"
- sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
- rm -f "$tmpdepfile"
- ;;
-
-msvisualcpp)
- # Important note: in order to support this mode, a compiler *must*
- # always write the preprocessed file to stdout.
- "$@" || exit $?
-
- # Remove the call to Libtool.
- if test "$libtool" = yes; then
- while test "X$1" != 'X--mode=compile'; do
- shift
- done
- shift
- fi
-
- IFS=" "
- for arg
- do
- case "$arg" in
- -o)
- shift
- ;;
- $object)
- shift
- ;;
- "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
- set fnord "$@"
- shift
- shift
- ;;
- *)
- set fnord "$@" "$arg"
- shift
- shift
- ;;
- esac
- done
- "$@" -E 2>/dev/null |
- sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
- rm -f "$depfile"
- echo "$object : \\" > "$depfile"
- sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
- echo " " >> "$depfile"
- sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
- rm -f "$tmpdepfile"
- ;;
-
-msvcmsys)
- # This case exists only to let depend.m4 do its work. It works by
- # looking at the text of this script. This case will never be run,
- # since it is checked for above.
- exit 1
- ;;
-
-none)
- exec "$@"
- ;;
-
-*)
- echo "Unknown depmode $depmode" 1>&2
- exit 1
- ;;
-esac
-
-exit 0
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
+++ /dev/null
-/.dirstamp
+++ /dev/null
-STDFD_SRCS = dev/stdfd/stdfd.c
-STDFD_EXTRA = dev/stdfd/stdfd.h dev/stdfd/module.mk
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#ifdef __linux__
-#define _BSD_SOURCE
-#endif
-
-#include <errno.h>
-#include <stdarg.h>
-#include <sys/syscall.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "xtio.h"
-#include "native.h"
-#include "inode.h"
-#include "dev.h"
-
-#include "stdfd.h"
-
-#ifdef CPLANT_YOD
-#include <sys/statfs.h>
-#include "cplant-yod.h"
-#define dowrite(f, b, n) write_yod(f, b, n)
-#define doread(f, b, n) read_yod(f, b, n)
-#else
-#define dowrite(f, b, n) syscall(SYSIO_SYS_write, f, b, n)
-#define doread(f, b, n) syscall(SYSIO_SYS_read, f, b, n)
-#endif
-
-/*
- * Pre-opened standard file descriptors driver.
- */
-
-static int stdfd_open(struct pnode *pno, int flags, mode_t mode);
-static int stdfd_close(struct inode *ino);
-static int stdfd_read(struct inode *ino, struct ioctx *ioctx);
-static int stdfd_write(struct inode *ino, struct ioctx *ioctx);
-static int stdfd_iodone(struct ioctx *ioctx);
-static int stdfd_datasync(struct inode *ino);
-static int stdfd_fcntl(struct inode *ino, int cmd, va_list ap, int *rtn);
-static int stdfd_ioctl(struct inode *ino,
- unsigned long int request,
- va_list ap);
-
-int
-_sysio_stdfd_init()
-{
- struct inode_ops stdfd_operations;
-
- stdfd_operations = _sysio_nodev_ops;
- stdfd_operations.inop_open = stdfd_open;
- stdfd_operations.inop_close = stdfd_close;
- stdfd_operations.inop_read = stdfd_read;
- stdfd_operations.inop_write = stdfd_write;
- stdfd_operations.inop_iodone = stdfd_iodone;
- stdfd_operations.inop_fcntl = stdfd_fcntl;
- stdfd_operations.inop_datasync = stdfd_datasync;
- stdfd_operations.inop_ioctl = stdfd_ioctl;
-
- return _sysio_char_dev_register(SYSIO_C_STDFD_MAJOR,
- "stdfd",
- &stdfd_operations);
-}
-
-static int
-stdfd_open(struct pnode *pno __IS_UNUSED,
- int flags __IS_UNUSED,
- mode_t mode __IS_UNUSED)
-{
-
- return 0;
-}
-
-static int
-stdfd_close(struct inode *ino __IS_UNUSED)
-{
-
- return 0;
-}
-
-static int
-doio(ssize_t (*f)(void *, size_t, _SYSIO_OFF_T, struct inode *),
- struct inode *ino,
- struct ioctx *ioctx)
-{
-
- if (ioctx->ioctx_xtvlen != 1) {
- /*
- * No scatter/gather to "file" address space (we're not
- * seekable) and "nowhere" makes no sense.
- */
- return -EINVAL;
- }
- ioctx->ioctx_cc =
- _sysio_doio(ioctx->ioctx_xtv, ioctx->ioctx_xtvlen,
- ioctx->ioctx_iov, ioctx->ioctx_iovlen,
- (ssize_t (*)(void *, size_t, _SYSIO_OFF_T, void *))f,
- ino);
- if (ioctx->ioctx_cc < 0) {
- ioctx->ioctx_errno = -ioctx->ioctx_cc;
- ioctx->ioctx_cc = -1;
- }
- return 0;
-}
-
-static ssize_t
-stdfd_read_simple(void *buf,
- size_t nbytes,
- _SYSIO_OFF_T off __IS_UNUSED,
- struct inode *ino)
-{
- int fd = SYSIO_MINOR_DEV(ino->i_stbuf.st_rdev);
- int cc;
-
- cc = doread(fd, buf, nbytes);
- if (cc < 0)
- cc = -errno;
- return cc;
-}
-
-static int
-stdfd_read(struct inode *ino, struct ioctx *ioctx)
-{
-
- return doio(stdfd_read_simple, ino, ioctx);
-}
-
-static ssize_t
-stdfd_write_simple(const void *buf,
- size_t nbytes,
- _SYSIO_OFF_T off __IS_UNUSED,
- struct inode *ino)
-{
- int fd = SYSIO_MINOR_DEV(ino->i_stbuf.st_rdev);
- int cc;
-
- cc = dowrite(fd, buf, nbytes);
- if (cc < 0)
- cc = -errno;
- return cc;
-}
-
-static int
-stdfd_write(struct inode *ino, struct ioctx *ioctx)
-{
-
- return doio((ssize_t (*)(void *,
- size_t,
- _SYSIO_OFF_T,
- struct inode *))stdfd_write_simple,
- ino,
- ioctx);
-}
-
-static int
-stdfd_iodone(struct ioctx *iocp __IS_UNUSED)
-{
-
- /*
- * It's always done in this driver. It completed when posted.
- */
- return 1;
-}
-
-static int
-stdfd_fcntl(struct inode *ino,
- int cmd,
- va_list ap,
- int *rtn)
-{
- int err;
- int fd = SYSIO_MINOR_DEV(ino->i_stbuf.st_rdev);
- long arg;
-
- err = 0;
- switch (cmd) {
- case F_GETFL:
- *rtn = syscall(SYS_fcntl, fd, cmd);
- if (*rtn == -1)
- err = -errno;
- break;
- case F_SETFL:
- arg = va_arg(ap, long);
- *rtn = syscall(SYS_fcntl, fd, cmd, arg);
- if (*rtn == -1)
- err = -errno;
- va_end(ap);
- break;
- default:
- *rtn = -1;
- err = -EINVAL;
- }
- return err;
-}
-
-static int
-stdfd_datasync(struct inode *ino __IS_UNUSED)
-{
-
- /*
- * We don't buffer, so nothing to do.
- */
- return 0;
-}
-
-static int
-stdfd_ioctl(struct inode *ino __IS_UNUSED,
- unsigned long int request __IS_UNUSED,
- va_list ap __IS_UNUSED)
-{
-
- return -ENOTTY;
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-/*
- * Std{in,out,err} pseudo-device-driver support.
- */
-
-#define SYSIO_C_STDFD_MAJOR 0
-
-extern int _sysio_stdfd_init(void);
+++ /dev/null
-/.dirstamp
+++ /dev/null
-This "incore" file system driver is a self-contained file system. It does
-not use any resource external to the node.
-
-It is primarily intended for enabling an efficient compute-node bootstrap. It
-might also be useful for a very small scratch file system, holding device
-files, and the like.
-
-The root directory i-node is manufactured on the fly. The source specification
-for the mount() call should be something like:
-
- <perms>+<uid>+<gid>
-
-Where:
- <perms> are the directory permissions masked by 0777
- Note -- no umask is applied.
- <uid> should be the owner's uid
- <gid> should be the owner's gid
-
-Most operations are supported, with the notable exception of symbolic
-links.
-
-In the implementation, the driver is really set up to export most
-useful symbols without polluting the name space or contending with
-other public symbols. However, the symbols are not yet exported. If
-we ever require a proc-fs style file system, this could be very useful
-provided a little extra work is done to allow other drivers to overload
-some operations. Particularly the file ops, I would think.
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#ifdef __linux__
-#define _BSD_SOURCE
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <time.h>
-#include <limits.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/uio.h>
-#include <sys/types.h>
-#include <dirent.h>
-#include <sys/stat.h>
-#ifdef _HAVE_STATVFS
-#include <sys/statvfs.h>
-#endif
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "xtio.h"
-#include "fs.h"
-#include "mount.h"
-#include "inode.h"
-#include "dev.h"
-
-#include "fs_incore.h"
-
-
-/*
- * In-core file system pseudo-driver.
- */
-
-/*
- * Pseudo-blocksize.
- */
-#define INCORE_BLKSIZE (8192)
-
-/*
- * Format of an incore inode.
- */
-struct incore_inode {
- LIST_ENTRY(incore_inode) ici_link; /* i-nodes list link */
- struct intnl_stat ici_st; /* attrs */
- struct file_identifier ici_fileid; /* file ID */
- void *ici_data; /* file data */
-};
-
-/*
- * Given pointer to inode, return pointer to incore-inode.
- */
-#define I2IC(ino) ((struct incore_inode *)(ino)->i_private)
-
-struct incore_filesys {
- LIST_HEAD(, incore_inode) icfs_icinodes; /* all i-nodes list */
-};
-
-/*
- * Given pointer to filesys, return pointer to incore-filesys.
- */
-#define FS2ICFS(fs) ((struct incore_filesys *)(fs)->fs_private)
-
-static int _sysio_incore_fsswop_mount(const char *source,
- unsigned flags,
- const void *data,
- struct pnode *tocover,
- struct mount **mntp);
-
-static struct fssw_ops incore_fssw_ops = {
- _sysio_incore_fsswop_mount
-};
-
-static void _sysio_incore_fsop_gone(struct filesys *fs);
-
-static struct filesys_ops incore_fs_ops = {
- _sysio_incore_fsop_gone,
-};
-
-static int _sysio_incore_dirop_lookup(struct pnode *pno,
- struct inode **inop,
- struct intent *intnt,
- const char *path);
-static int _sysio_incore_inop_getattr(struct pnode *pno,
- struct inode *ino,
- struct intnl_stat *stbuf);
-static int _sysio_incore_inop_setattr(struct pnode *pno,
- struct inode *ino,
- unsigned mask,
- struct intnl_stat *stbuf);
-static ssize_t _sysio_incore_dirop_filldirentries(struct inode *ino,
- _SYSIO_OFF_T *posp,
- char *buf,
- size_t nbytes);
-static int _sysio_incore_dirop_mkdir(struct pnode *pno, mode_t mode);
-static int _sysio_incore_dirop_rmdir(struct pnode *pno);
-static int _sysio_incore_inop_open(struct pnode *pno, int flags, mode_t mode);
-static int _sysio_incore_inop_close(struct inode *ino);
-static int _sysio_incore_dirop_link(struct pnode *old, struct pnode *new);
-static int _sysio_incore_dirop_unlink(struct pnode *pno);
-static int _sysio_incore_dirop_rename(struct pnode *old, struct pnode *new);
-static int _sysio_incore_filop_read(struct inode *ino, struct ioctx *ioctx);
-static int _sysio_incore_filop_write(struct inode *ino, struct ioctx *ioctx);
-static _SYSIO_OFF_T _sysio_incore_filop_pos(struct inode *ino,
- _SYSIO_OFF_T off);
-static int _sysio_incore_filop_iodone(struct ioctx *ioctx);
-static int _sysio_incore_filop_fcntl(struct inode *ino,
- int cmd, va_list ap, int *rtn);
-static int _sysio_incore_inop_sync(struct inode *ino);
-static int _sysio_incore_filop_ioctl(struct inode *ino,
- unsigned long int request,
- va_list ap);
-static int _sysio_incore_dirop_mknod(struct pnode *pno, mode_t mode, dev_t dev);
-#ifdef _HAVE_STATVFS
-static int _sysio_incore_inop_statvfs(struct pnode *pno,
- struct inode *ino,
- struct intnl_statvfs *buf);
-#endif
-static void _sysio_incore_inop_gone(struct inode *ino);
-
-#define _sysio_incore_dirop_symlink \
- (int (*)(struct pnode *, const char *))_sysio_do_enosys
-#define _sysio_incore_dirop_readlink \
- (int (*)(struct pnode *, char *, size_t))_sysio_do_enosys
-#define _sysio_incore_dirop_read \
- (int (*)(struct inode *, \
- struct ioctx *))_sysio_do_eisdir
-#define _sysio_incore_dirop_write \
- (int (*)(struct inode *, \
- struct ioctx *))_sysio_do_eisdir
-#define _sysio_incore_dirop_pos \
- (_SYSIO_OFF_T (*)(struct inode *, \
- _SYSIO_OFF_T))_sysio_do_eisdir
-#define _sysio_incore_dirop_iodone \
- (int (*)(struct ioctx *))_sysio_do_illop
-#define _sysio_incore_dirop_fcntl \
- (int (*)(struct inode *, int, va_list, int *))_sysio_do_eisdir
-#define _sysio_incore_dirop_ioctl \
- (int (*)(struct inode *, \
- unsigned long int, \
- va_list))_sysio_do_eisdir
-
-static struct inode_ops _sysio_incore_dir_ops = {
- _sysio_incore_dirop_lookup,
- _sysio_incore_inop_getattr,
- _sysio_incore_inop_setattr,
- _sysio_incore_dirop_filldirentries,
- _sysio_incore_dirop_mkdir,
- _sysio_incore_dirop_rmdir,
- _sysio_incore_dirop_symlink,
- _sysio_incore_dirop_readlink,
- _sysio_incore_inop_open,
- _sysio_incore_inop_close,
- _sysio_incore_dirop_link,
- _sysio_incore_dirop_unlink,
- _sysio_incore_dirop_rename,
- _sysio_incore_dirop_read,
- _sysio_incore_dirop_write,
- _sysio_incore_dirop_pos,
- _sysio_incore_dirop_iodone,
- _sysio_incore_dirop_fcntl,
- _sysio_incore_inop_sync,
- _sysio_incore_inop_sync,
- _sysio_incore_dirop_ioctl,
- _sysio_incore_dirop_mknod,
-#ifdef _HAVE_STATVFS
- _sysio_incore_inop_statvfs,
-#endif
- _sysio_incore_inop_gone
-};
-
-#define _sysio_incore_filop_lookup \
- (int (*)(struct pnode *, \
- struct inode **, \
- struct intent *, \
- const char *))_sysio_do_illop
-#define _sysio_incore_filop_filldirentries \
- (ssize_t (*)(struct inode *, \
- _SYSIO_OFF_T *, \
- char *, \
- size_t))_sysio_do_illop
-#define _sysio_incore_filop_mkdir \
- (int (*)(struct pnode *, mode_t))_sysio_do_illop
-#define _sysio_incore_filop_rmdir \
- (int (*)(struct pnode *))_sysio_do_illop
-#define _sysio_incore_filop_symlink \
- (int (*)(struct pnode *, const char *))_sysio_do_illop
-#define _sysio_incore_symlinkop_readlink \
- (int (*)(struct pnode *, char *, size_t))_sysio_do_illop
-#define _sysio_incore_filop_link \
- (int (*)(struct pnode *old, struct pnode *new))_sysio_do_illop
-#define _sysio_incore_filop_unlink \
- (int (*)(struct pnode *pno))_sysio_do_illop
-#define _sysio_incore_filop_rename \
- (int (*)(struct pnode *old, struct pnode *new))_sysio_do_illop
-#define _sysio_incore_filop_mknod \
- (int (*)(struct pnode *pno, mode_t, dev_t))_sysio_do_illop
-
-static struct inode_ops _sysio_incore_file_ops = {
- _sysio_incore_filop_lookup,
- _sysio_incore_inop_getattr,
- _sysio_incore_inop_setattr,
- _sysio_incore_filop_filldirentries,
- _sysio_incore_filop_mkdir,
- _sysio_incore_filop_rmdir,
- _sysio_incore_filop_symlink,
- _sysio_incore_symlinkop_readlink,
- _sysio_incore_inop_open,
- _sysio_incore_inop_close,
- _sysio_incore_filop_link,
- _sysio_incore_filop_unlink,
- _sysio_incore_filop_rename,
- _sysio_incore_filop_read,
- _sysio_incore_filop_write,
- _sysio_incore_filop_pos,
- _sysio_incore_filop_iodone,
- _sysio_incore_filop_fcntl,
- _sysio_incore_inop_sync,
- _sysio_incore_inop_sync,
- _sysio_incore_filop_ioctl,
- _sysio_incore_filop_mknod,
-#ifdef _HAVE_STATVFS
- _sysio_incore_inop_statvfs,
-#endif
- _sysio_incore_inop_gone
-};
-
-static struct inode_ops _sysio_incore_dev_ops = {
- _sysio_incore_filop_lookup,
- _sysio_incore_inop_getattr,
- _sysio_incore_inop_setattr,
- _sysio_incore_filop_filldirentries,
- _sysio_incore_filop_mkdir,
- _sysio_incore_filop_rmdir,
- _sysio_incore_filop_symlink,
- _sysio_incore_symlinkop_readlink,
- _sysio_nodev_inop_open,
- _sysio_nodev_inop_close,
- _sysio_incore_filop_link,
- _sysio_incore_filop_unlink,
- _sysio_incore_filop_rename,
- _sysio_nodev_inop_read,
- _sysio_nodev_inop_write,
- _sysio_nodev_inop_pos,
- _sysio_nodev_inop_iodone,
- _sysio_incore_filop_fcntl,
- _sysio_incore_inop_sync,
- _sysio_nodev_inop_sync,
- _sysio_nodev_inop_ioctl,
- _sysio_incore_filop_mknod,
-#ifdef _HAVE_STATVFS
- _sysio_incore_inop_statvfs,
-#endif
- _sysio_incore_inop_gone
-};
-
-typedef void *(*probe_ty)(void *data, size_t len, void *arg);
-
-/*
- * Lookup data argument bundle record.
- */
-struct lookup_data {
- struct qstr *name; /* desired entry name */
- struct intnl_dirent *de; /* last dirent */
- size_t minsiz; /* min hole needed */
- struct {
- void *p; /* best hole */
- size_t len; /* best hole len */
- } hole;
-};
-
-/*
- * Initialize lookup data argument bundle.
- */
-#define INCORE_LD_INIT(ld, minsz, qs) \
- do { \
- (ld)->name = (qs); \
- (ld)->de = NULL; \
- (ld)->minsiz = (minsz); \
- (ld)->hole.p = NULL; \
- (ld)->hole.len = 0; \
- } while (0)
-
-/*
- * Calculate size of a directory entry given length of the entry name.
- */
-#define INCORE_D_RECLEN(namlen) \
- (((size_t )&((struct intnl_dirent *)0)->d_name + \
- (namlen) + 1 + sizeof(void *)) & \
- ~(sizeof(void *) - 1))
-
-/*
- * Given mode bits, return directory entry type code.
- */
-#define INCORE_D_TYPEOF(m) (((m) & S_IFMT) >> 12)
-#define INCORE_D_TEMPLATE_LEN (INCORE_D_RECLEN(1) + INCORE_D_RECLEN(2))
-
-char *incore_dir_template;
-#if 0
-static struct intnl_dirent incore_dir_template[] = {
- {
- 0,
- INCORE_D_RECLEN(1),
- INCORE_D_RECLEN(1),
- INCORE_D_TYPEOF(S_IFDIR),
- { '.', '\0' }
- },
- {
- 0,
- INCORE_D_RECLEN(1) + INCORE_D_RECLEN(2),
- INCORE_D_RECLEN(2),
- INCORE_D_TYPEOF(S_IFDIR),
- { '.', '.', '\0' }
- }
-};
-#endif
-
-/*
- * Initialize this driver.
- */
-int
-_sysio_incore_init()
-{
- struct intnl_dirent *de;
- off_t off;
-
- /*
- * Fill in the directory template.
- */
- incore_dir_template = calloc(1, INCORE_D_TEMPLATE_LEN);
- if (incore_dir_template == NULL)
- return -ENOMEM;
- de = (struct intnl_dirent *)incore_dir_template;
-#ifdef _DIRENT_HAVE_D_OFF
- de->d_off =
-#endif
- off = de->d_reclen = INCORE_D_RECLEN(1);
- de->d_type = INCORE_D_TYPEOF(S_IFDIR);
- de->d_name[0] = '.';
-#ifdef _DIRENT_HAVE_D_NAMLEN
- de->d_namlen = 1;
-#endif
- /*
- * Move to entry for `..'
- */
- de = (struct intnl_dirent *)((char *)de + off);
- de->d_reclen = INCORE_D_RECLEN(2);
-#ifdef _DIRENT_HAVE_D_NAMLEN
- de->d_namlen = 2;
-#endif
-#ifdef _DIRENT_HAVE_D_OFF
- de->d_off =
-#endif
- off += de->d_reclen;
- de->d_type = INCORE_D_TYPEOF(S_IFDIR);
- de->d_name[0] = de->d_name[1] = '.';
- de->d_name[2] = ' ';
-
- return _sysio_fssw_register("incore", &incore_fssw_ops);
-}
-
-static ino_t
-incore_inum_alloc()
-{
- static ino_t nxtnum = 1;
-
- assert(nxtnum);
- return nxtnum++;
-}
-
-static struct incore_inode *
-incore_i_alloc(struct incore_filesys *icfs, struct intnl_stat *st)
-{
- struct incore_inode *icino;
-
- assert(st->st_ino);
- assert(!st->st_size);
-
- icino = malloc(sizeof(struct incore_inode));
- if (!icino)
- return NULL;
- icino->ici_st = *st;
- icino->ici_fileid.fid_data = &icino->ici_st.st_ino;
- icino->ici_fileid.fid_len = sizeof(icino->ici_st.st_ino);
- icino->ici_data = NULL;
-
- LIST_INSERT_HEAD(&icfs->icfs_icinodes, icino, ici_link);
-
- return icino;
-}
-
-static int
-incore_trunc(struct incore_inode *icino, _SYSIO_OFF_T size, int clear)
-{
- _SYSIO_OFF_T n;
- void *p;
-
- if (size < 0)
- return -EINVAL;
- n = size;
- if (!size) {
- if (icino->ici_data) {
- free(icino->ici_data);
- icino->ici_data = NULL;
- }
- n = 0;
- goto out;
- }
- p = realloc(icino->ici_data, (size_t )n);
- if (!p)
- return -ENOSPC;
- icino->ici_data = p;
- if (clear && n > icino->ici_st.st_size)
- (void )memset((char *)icino->ici_data + icino->ici_st.st_size,
- 0,
- (size_t )(n - icino->ici_st.st_size));
-out:
- icino->ici_st.st_size = n;
- icino->ici_st.st_blocks =
- (n + icino->ici_st.st_blksize - 1) / icino->ici_st.st_blksize;
- icino->ici_st.st_mtime = time(NULL);
- return 0;
-}
-
-static void
-incore_i_destroy(struct incore_inode *icino)
-{
-
- LIST_REMOVE(icino, ici_link);
- (void )incore_trunc(icino, 0, 0);
- free(icino);
-}
-
-static struct incore_inode *
-incore_directory_new(struct incore_filesys *icfs,
- struct incore_inode *parent,
- struct intnl_stat *st)
-{
- struct incore_inode *icino;
- int err;
- struct intnl_dirent *de;
-
- icino = incore_i_alloc(icfs, st);
- if (!icino)
- return NULL;
-
- if (!parent)
- parent = icino; /* root */
-
- /*
- * Allocate and init directory data.
- */
- err = incore_trunc(icino, INCORE_D_TEMPLATE_LEN, 1);
- if (err) {
- incore_i_destroy(icino);
- return NULL;
- }
- (void )memcpy(icino->ici_data,
- &incore_dir_template,
- INCORE_D_TEMPLATE_LEN);
- de = icino->ici_data;
- de->d_ino = st->st_ino;
- de =
- (struct intnl_dirent *)((char *)de +
-#ifdef _DIRENT_HAVE_D_OFF
- de->d_off
-#else
- de->d_reclen
-#endif
- );
- de->d_ino = parent->ici_st.st_ino;
-
- /*
- * Set creation time to modify time set by truncate.
- */
- st->st_ctime = st->st_mtime;
-
- return icino;
-}
-
-static int
-_sysio_incore_fsswop_mount(const char *source,
- unsigned flags,
- const void *data __IS_UNUSED,
- struct pnode *tocover,
- struct mount **mntp)
-{
- char *cp;
- unsigned long ul;
- long l;
- mode_t mode;
- uid_t uid;
- gid_t gid;
- int err;
- dev_t dev;
- struct intnl_stat stat;
- struct incore_filesys *icfs;
- ino_t inum;
- struct incore_inode *icino;
- struct filesys *fs;
- struct inode *rooti;
- struct pnode_base *rootpb;
- struct mount *mnt;
- static struct qstr noname = { NULL, 0, 0 };
-
- /*
- * Source is a specification for the root attributes of this
- * new file system in the format:
- *
- * <permissions>[+<owner>][-<group>]
- */
- ul = strtoul(source, &cp, 0);
- mode = (mode_t )ul & 07777;
- uid = getuid(); /* default */
- gid = getgid(); /* default */
- if (*cp != '\0') {
- /*
- * Get user and/or group.
- */
- if (*cp != '+' ||
- (ul == ULONG_MAX && errno == ERANGE) ||
- (unsigned long)mode != ul ||
- mode > 07777)
- return -EINVAL;
- source = cp;
- l = strtol(source, &cp, 0);
- uid = (uid_t )l;
- if (((l == LONG_MIN || l == LONG_MAX) &&
- errno == ERANGE) ||
- (long )uid != l)
- return -EINVAL;
- if (*cp != '+')
- return -EINVAL;
- source = cp;
- l = strtol(source, &cp, 0);
- gid = (gid_t )l;
- if (((l == LONG_MIN || l == LONG_MAX) &&
- errno == ERANGE) ||
- (long )gid != l)
- return -EINVAL;
- if (*cp != '\0')
- return -EINVAL;
- }
-
- err = 0;
-
- dev = _sysio_dev_alloc();
-
- mnt = NULL;
- rootpb = NULL;
- rooti = NULL;
- fs = NULL;
- icino = NULL;
- icfs = NULL;
-
- /*
- * Create new FS.
- */
- icfs = malloc(sizeof(struct incore_filesys));
- if (!icfs) {
- err = -ENOMEM;
- goto error;
- }
- (void )memset(icfs, 0, sizeof(struct incore_filesys));
- LIST_INIT(&icfs->icfs_icinodes);
-
- /*
- * Create root i-node.
- */
- (void )memset(&stat, 0, sizeof(stat));
- stat.st_dev = dev;
- inum = incore_inum_alloc();
-#ifdef HAVE__ST_INO
- stat.__st_ino = inum;
-#endif
- stat.st_mode = S_IFDIR | (mode & 07777);
- stat.st_nlink = 2;
- stat.st_uid = uid;
- stat.st_gid = gid;
- stat.st_size = 0;
- stat.st_blksize = INCORE_BLKSIZE;
- stat.st_blocks = 0;
- stat.st_ctime = stat.st_mtime = stat.st_atime = 0;
- stat.st_ino = inum;
- icino = incore_directory_new(icfs, NULL, &stat);
- if (!icino)
- return -ENOSPC;
- icino->ici_st.st_atime = icino->ici_st.st_mtime;
-
- fs =
- _sysio_fs_new(&incore_fs_ops,
- (flags & MOUNT_F_RO) ? FS_F_RO : 0,
- icfs);
- if (!fs) {
- err = -ENOMEM;
- goto error;
- }
-
- /*
- * Create root for system.
- *
- * Persistent across remounts because we ask for immunity.
- */
- rooti =
- _sysio_i_new(fs,
- &icino->ici_fileid,
- &icino->ici_st,
- 1,
- &_sysio_incore_dir_ops,
- icino);
- if (!rooti) {
- err = -ENOMEM;
- goto error;
- }
- rootpb = _sysio_pb_new(&noname, NULL, rooti);
- if (!rootpb) {
- err = -ENOMEM;
- goto error;
- }
-
- /*
- * Have path-node specified by the given source argument. Let the
- * system finish the job, now.
- */
- mnt = NULL;
- err =
- _sysio_do_mount(fs,
- rootpb,
- flags,
- tocover,
- &mnt);
- if (err)
- goto error;
-
- *mntp = mnt;
-
- goto out;
-
-error:
- if (mnt && _sysio_do_unmount(mnt) != 0)
- abort();
- if (rootpb) {
- _sysio_pb_gone(rootpb);
- rooti = NULL;
- }
- if (rooti)
- I_RELE(rooti);
- if (fs) {
- FS_RELE(fs);
- goto out;
- }
- if (icino) {
- incore_i_destroy(icino);
- goto out;
- }
- if (icfs) {
- free(icfs);
- goto out;
- }
-
-out:
- return err;
-}
-
-static void
-_sysio_incore_fsop_gone(struct filesys *fs)
-{
- struct incore_filesys *icfs;
- struct incore_inode *icino, *oicino;
-
- icfs = FS2ICFS(fs);
-
- /*
- * Free up i-node resource associated with this file system.
- */
- icino = icfs->icfs_icinodes.lh_first;
- while (icino) {
- oicino = icino;
- icino = icino->ici_link.le_next;
- incore_i_destroy(oicino);
- }
-
- /*
- * Free the FS record.
- */
- free(icfs);
-}
-
-/*
- * A directory search engine. Various functions are carried out by
- * supplying appropriate callback functions.
- *
- * The two arguments, entry and hole, are called, if not null, for each
- * directory entry and hole, respectively.
- */
-static void *
-incore_directory_probe(void *data,
- size_t siz,
- _SYSIO_OFF_T origin
-#ifndef _DIRENT_HAVE_D_OFF
- __IS_UNUSED
-#endif
- ,
- probe_ty entry,
- probe_ty hole,
- void *arg)
-{
- struct intnl_dirent *de;
- void *p;
- size_t n;
-
- de = data;
- for (;;) {
-#ifdef _DIRENT_HAVE_D_OFF
- assert(de->d_off);
-#else
- assert(de->d_reclen);
-#endif
- if (entry && (p = (*entry)(de, de->d_reclen, arg)))
- return p;
- n =
-#ifdef _DIRENT_HAVE_D_OFF
- de->d_off - origin;
-#else
- ((void *)de - data) + de->d_reclen;
-#endif
- if (hole) {
- p = (*hole)((void *)de, de->d_reclen, arg);
- if (p)
- return p;
- }
- if (n >= siz)
- break;
- de = (struct intnl_dirent *)((char *)data + n);
- }
-
- return NULL;
-}
-
-static struct intnl_dirent *
-incore_directory_match(struct intnl_dirent *de,
- size_t reclen,
- struct lookup_data *ld)
-{
- size_t len;
-
-#if defined(BSD) || defined(REDSTORM)
- if (IFTODT(de->d_type) == DT_WHT)
- return NULL;
-#endif
-#ifdef _DIRENT_HAVE_D_NAMLEN
- len = de->d_namlen;
-#else
- {
- const char *cp, *end;
-
- cp = de->d_name;
- end = (const char *)de + reclen;
- while (cp < end && *cp != '\0')
- cp++;
- len = cp - de->d_name;
- }
-#endif
- if (ld->name->len == len &&
- strncmp(de->d_name, ld->name->name, ld->name->len) == 0)
- return de;
- ld->de = de;
- return NULL;
-}
-
-static int
-_sysio_incore_dirop_lookup(struct pnode *pno,
- struct inode **inop,
- struct intent *intnt __IS_UNUSED,
- const char *path __IS_UNUSED)
-{
- struct inode *ino;
- struct intnl_dirent *de;
- struct incore_inode *icino;
- struct lookup_data lookup_data;
- struct file_identifier fileid;
-#ifdef notdef
- struct inode_ops *ops;
-#endif
-
- /*
- * Revalidate?
- */
- if (*inop) {
- icino = I2IC(*inop);
- assert(icino);
- (*inop)->i_stbuf = icino->ici_st;
- return 0;
- }
-
- ino = pno->p_parent->p_base->pb_ino;
- icino = I2IC(ino);
- INCORE_LD_INIT(&lookup_data,
- ULONG_MAX,
- &pno->p_base->pb_name);
- de =
- incore_directory_probe(icino->ici_data,
- icino->ici_st.st_size,
- 0,
- (probe_ty )incore_directory_match,
- NULL,
- &lookup_data);
- if (!de)
- return -ENOENT;
-
- fileid.fid_data = &de->d_ino;
- fileid.fid_len = sizeof(de->d_ino);
- ino =
- _sysio_i_find(ino->i_fs, &fileid);
-#ifdef notdef
- if (ino)
- goto out;
- icino->ici_fileid.fid_data = &icino->ici_st.st_ino;
- icino->ici_fileid.fid_len = sizeof(icino->ici_st.st_ino);
- ops = NULL;
- switch (icino->ici_st.st_mode & S_IFMT) {
- case S_IFDIR:
- ops = &_sysio_incore_dir_ops;
- break;
- case S_IFREG:
- ops = &_sysio_incore_file_ops;
- break;
- default:
- break;
- }
- if (!ops)
- abort();
- ino =
- _sysio_i_new(ino->i_fs,
- &icino->ici_fileid,
- &icino->ici_st
- 1,
- ops,
- icino);
-#endif
- if (!ino)
- return -ENOMEM;
-
-#ifdef notdef
-out:
-#endif
- *inop = ino;
- return 0;
-}
-
-static int
-_sysio_incore_inop_getattr(struct pnode *pno,
- struct inode *ino,
- struct intnl_stat *stbuf)
-{
- struct incore_inode *icino;
-
- if (!ino)
- ino = pno->p_base->pb_ino;
- icino = I2IC(ino);
- *stbuf = icino->ici_st;
- return 0;
-}
-
-static int
-_sysio_incore_inop_setattr(struct pnode *pno,
- struct inode *ino,
- unsigned mask,
- struct intnl_stat *stbuf)
-{
- struct incore_inode *icino;
- int err;
-
- if (!ino)
- ino = pno->p_base->pb_ino;
- if (!ino)
- return -EBADF;
- icino = I2IC(ino);
-
- err = 0;
- if (mask & SETATTR_LEN) {
- err = incore_trunc(icino, stbuf->st_size, 1);
- if (err)
- goto out;
- mask &= ~SETATTR_LEN;
- }
- if (mask & SETATTR_MODE) {
- icino->ici_st.st_mode =
- (icino->ici_st.st_mode & S_IFMT) | (stbuf->st_mode & 07777);
- }
- if (mask & SETATTR_MTIME)
- icino->ici_st.st_mtime = stbuf->st_mtime;
- if (mask & SETATTR_ATIME)
- icino->ici_st.st_atime = stbuf->st_atime;
- if (mask & SETATTR_UID)
- icino->ici_st.st_uid = stbuf->st_uid;
- if (mask & SETATTR_GID)
- icino->ici_st.st_gid = stbuf->st_gid;
- icino->ici_st.st_ctime = time(NULL);
-
- ino->i_stbuf = icino->ici_st;
-out:
- return err;
-}
-
-static void *
-incore_directory_position(struct intnl_dirent *de,
- size_t reclen __IS_UNUSED,
- void *p)
-{
-
- return (void *)de >= p ? de : NULL;
-}
-
-struct copy_info {
- void *data;
- size_t nbytes;
- unsigned count;
-};
-
-/*
- * Eumeration callback.
- *
- * Note:
- * Whiteout entries are never returned.
- */
-static void *
-incore_directory_enumerate(struct intnl_dirent *de,
- size_t reclen,
- struct copy_info *cinfo) {
-
-#ifdef DT_WHT
- if (de->d_type == DT_WHT) {
- /*
- * Keep going but skip the copy.
- */
- return NULL;
- }
-#endif
- cinfo->count++;
- if (reclen > cinfo->nbytes)
- return de;
- (void *)memcpy(cinfo->data, de, reclen);
- cinfo->data = (char *)cinfo->data + reclen;
- cinfo->nbytes -= reclen;
- return NULL;
-}
-
-static ssize_t
-_sysio_incore_dirop_filldirentries(struct inode *ino,
- _SYSIO_OFF_T *posp,
- char *buf,
- size_t nbytes)
-{
- struct incore_inode *icino = I2IC(ino);
- off_t off;
- struct intnl_dirent *de;
- struct copy_info copy_info;
-
- if (*posp >= icino->ici_st.st_size)
- return 0;
-
- de =
- incore_directory_probe(icino->ici_data,
- icino->ici_st.st_size,
- *posp,
- (probe_ty )incore_directory_position,
- NULL,
- (char *)icino->ici_data + *posp);
- if (!de) {
- /*
- * Past EOF.
- */
- return 0;
- }
-
- copy_info.data = buf;
- copy_info.nbytes = nbytes;
- copy_info.count = 0;
- off = (char *)de - (char *)icino->ici_data;
- de =
- incore_directory_probe(de,
- icino->ici_st.st_size - off,
- off,
- (probe_ty )incore_directory_enumerate,
- NULL,
- ©_info);
- icino->ici_st.st_atime = time(NULL);
- if (nbytes == copy_info.nbytes && copy_info.count)
- return -EINVAL;
- nbytes -= copy_info.nbytes;
-#if 0
- if (!nbytes)
- return -EOVERFLOW;
-#endif
- *posp += nbytes;
- return (ssize_t )nbytes;
-}
-
-static struct intnl_dirent *
-incore_directory_best_fit(void *data, size_t len, struct lookup_data *ld)
-{
-
- if (!ld->hole.len || len < ld->hole.len) {
- ld->hole.p = data;
- ld->hole.len = len;
- }
-
- return NULL;
-}
-
-static int
-incore_directory_insert(struct incore_inode *parent,
- struct qstr *name,
- ino_t inum,
- unsigned char type)
-{
- size_t reclen;
- struct lookup_data lookup_data;
- struct intnl_dirent *de;
- size_t xt;
- size_t n;
- size_t r;
-
- reclen = INCORE_D_RECLEN(name->len);
- INCORE_LD_INIT(&lookup_data, reclen, name);
- de =
- incore_directory_probe(parent->ici_data,
- parent->ici_st.st_size,
- 0,
- (probe_ty )incore_directory_match,
- (probe_ty )incore_directory_best_fit,
- &lookup_data);
- if (de)
- return -EEXIST;
- de = lookup_data.de;
- xt = (char *)lookup_data.de - (char *)parent->ici_data;
- n =
-#ifdef _DIRENT_HAVE_D_OFF
- de->d_off;
-#else
- xt + de->d_reclen;
-#endif
- r =
-#ifdef _DIRENT_HAVE_D_OFF
- de->d_reclen;
-#else
- INCORE_D_RECLEN(de->d_namlen);
-#endif
- if (!parent->ici_st.st_size ||
- xt + r + reclen > (size_t )parent->ici_st.st_size) {
- int err;
-
- err = incore_trunc(parent, xt + r + reclen, 1);
- if (err)
- return err;
- de = (struct intnl_dirent *)((char *)parent->ici_data + xt);
- n = parent->ici_st.st_size;
- }
-
-#ifdef _DIRENT_HAVE_D_OFF
- de->d_off = xt + r; /* trim */
-#else
- de->d_reclen = r;
-#endif
- de = (struct intnl_dirent *)((char *)de + r); /* reposition */
- xt += r;
-
-#ifndef _DIRENT_HAVE_D_OFF
- /*
- * Will we split this hole or use all of it?
- */
- if (lookup_data.hole.len - reclen &&
- lookup_data.hole.len - reclen <= INCORE_D_RECLEN(1))
- reclen = lookup_data.hole.len;
-#endif
-
- /*
- * Insert new.
- */
- de->d_ino = inum;
-#ifdef _DIRENT_HAVE_D_OFF
- de->d_off = n;
-#endif
- de->d_reclen = reclen;
- de->d_type = type;
- (void )memcpy(de->d_name, name->name, name->len);
-#ifdef _DIRENT_HAVE_D_NAMLEN
- de->d_namlen = name->len;
-#endif
-
-#ifndef _DIRENT_HAVE_D_OFF
- xt += reclen;
- if (n - xt) {
- /*
- * White-out remaining part of the hole.
- */
- (void *)de += reclen;
- de->d_ino = 0;
- de->d_reclen = n - xt;
- de->d_type = DT_WHT;
- de->d_namlen = 0;
- }
-#endif
-
- /*
- * Update attributes to reflect the new entry.
- */
- parent->ici_st.st_nlink++;
- assert(parent->ici_st.st_nlink);
- parent->ici_st.st_atime = parent->ici_st.st_mtime = time(NULL);
-
- return 0;
-}
-
-static int
-_sysio_incore_dirop_mkdir(struct pnode *pno, mode_t mode)
-{
- struct intnl_stat stat;
- struct incore_inode *icino, *parent;
- ino_t inum;
- int err;
- struct intnl_dirent *de = NULL;
- struct inode *ino;
-
- ino = pno->p_parent->p_base->pb_ino;
- parent = I2IC(ino);
-
- if (!S_ISDIR(parent->ici_st.st_mode))
- return -ENOTDIR;
-
- (void )memset(&stat, 0, sizeof(stat));
- stat.st_dev = pno->p_parent->p_base->pb_ino->i_fs->fs_dev;
- inum = incore_inum_alloc();
-#ifdef HAVE__ST_INO
- stat.__st_ino = inum;
-#endif
- stat.st_mode = S_IFDIR | (mode & 07777);
- stat.st_nlink = 2;
- stat.st_uid = getuid();
- stat.st_gid = getgid();
- stat.st_size = 0;
- stat.st_blksize = 4096;
- stat.st_blocks = 0;
- stat.st_ctime = stat.st_mtime = stat.st_atime = 0;
- stat.st_ino = inum;
- icino = incore_directory_new(FS2ICFS(ino->i_fs), parent, &stat);
- if (!icino)
- return -ENOSPC;
-
- /*
- * Tell the system about the new inode.
- *
- * Persistent across remounts because we ask for immunity.
- */
- ino =
- _sysio_i_new(pno->p_parent->p_base->pb_ino->i_fs,
- &icino->ici_fileid,
- &stat,
- 1,
- &_sysio_incore_dir_ops,
- icino);
- if (!ino) {
- incore_i_destroy(icino);
- return -ENOMEM;
- }
-
- /*
- * Insert into parent.
- */
- err =
- incore_directory_insert(parent,
- &pno->p_base->pb_name,
- stat.st_ino,
- INCORE_D_TYPEOF(S_IFDIR));
-
- if (err) {
- de->d_ino = 0; /* bad parent */
- I_RELE(ino);
- _sysio_i_gone(ino);
- return err;
- }
-
- pno->p_base->pb_ino = ino;
- return 0;
-}
-
-static int
-incore_unlink_entry(struct incore_inode *icino,
- struct qstr *name)
-{
- struct lookup_data lookup_data;
- struct intnl_dirent *de;
- size_t reclen;
-#ifdef _DIRENT_HAVE_D_OFF
- size_t off;
-#endif
-
- if (!S_ISDIR(icino->ici_st.st_mode))
- return -ENOTDIR;
-
- INCORE_LD_INIT(&lookup_data, 0, name);
- de =
- incore_directory_probe(icino->ici_data,
- icino->ici_st.st_size,
- 0,
- (probe_ty )incore_directory_match,
- NULL,
- &lookup_data);
- if (!de)
- return -ENOENT;
- assert((size_t )((char *)de - (char *)icino->ici_data) >=
- INCORE_D_TEMPLATE_LEN);
-#ifndef _DIRENT_HAVE_D_OFF
- reclen = de->d_reclen;
-#else
- off = de->d_off;
- reclen = off - ((char *)de - (char *)icino->ici_data);
-#endif
- (void )memset(de, 0, reclen);
-#ifndef _DIRENT_HAVE_D_OFF
- de->d_type = (__uint8_t )DTTOIF(DT_WHT);
- de->d_reclen = reclen;
-#else
- lookup_data.de->d_off = off;
-#endif
-
- /*
- * Adjust link count.
- */
- assert(icino->ici_st.st_nlink > 2);
- icino->ici_st.st_nlink--;
-
- return 0;
-}
-
-static int
-_sysio_incore_dirop_rmdir(struct pnode *pno)
-{
- struct inode *ino = pno->p_base->pb_ino;
- struct incore_inode *icino = I2IC(ino);
- int err;
-
- if (!pno->p_base->pb_name.len ||
- (pno->p_base->pb_name.name[0] == '.' &&
- (pno->p_base->pb_name.len == 1 ||
- (pno->p_base->pb_name.len == 2 &&
- pno->p_base->pb_name.name[1] == '.'))))
- return -EINVAL;
-
- if (!S_ISDIR(icino->ici_st.st_mode))
- return -ENOTDIR;
-
- if (icino->ici_st.st_nlink > 2)
- return -ENOTEMPTY;
-
- pno->p_base->pb_ino = NULL;
- err =
- incore_unlink_entry(I2IC(pno->p_parent->p_base->pb_ino),
- &pno->p_base->pb_name);
- return err;
-}
-
-static int
-incore_create(struct pnode *pno, struct intnl_stat *stat)
-{
- struct inode *dino, *ino;
- struct incore_inode *icino;
- int err;
-
- dino = pno->p_parent->p_base->pb_ino;
- assert(dino);
-
- icino = incore_i_alloc(FS2ICFS(dino->i_fs), stat);
- if (!icino)
- return -ENOSPC;
-
- /*
- * Tell the system about the new inode.
- */
- ino =
- _sysio_i_new(dino->i_fs,
- &icino->ici_fileid,
- stat,
- 1,
- S_ISREG(stat->st_mode)
- ? &_sysio_incore_file_ops
- : &_sysio_incore_dev_ops,
- icino);
- if (!ino) {
- incore_i_destroy(icino);
- return -ENOMEM;
- }
-
- /*
- * Insert into parent.
- */
- err =
- incore_directory_insert(I2IC(dino),
- &pno->p_base->pb_name,
- stat->st_ino,
- INCORE_D_TYPEOF(icino->ici_st.st_mode));
- if (err) {
- I_RELE(ino);
- _sysio_i_gone(ino);
- return err;
- }
-
- pno->p_base->pb_ino = ino;
- return 0;
-}
-
-static int
-_sysio_incore_inop_open(struct pnode *pno, int flags __IS_UNUSED, mode_t mode)
-{
- struct intnl_stat stat;
- ino_t inum;
-
- /*
- * File exists. Nothing to do.
- */
- if (pno->p_base->pb_ino)
- return 0;
-
- /*
- * Must create a new, regular, file.
- */
- (void )memset(&stat, 0, sizeof(stat));
- stat.st_dev = pno->p_parent->p_base->pb_ino->i_fs->fs_dev;
- inum = incore_inum_alloc();
-#ifdef HAVE__ST_INO
- stat.__st_ino = inum;
-#endif
- stat.st_mode = S_IFREG | (mode & 07777);
- stat.st_nlink = 1;
- stat.st_uid = getuid();
- stat.st_gid = getgid();
- stat.st_rdev = 0;
- stat.st_size = 0;
- stat.st_blksize = 4096;
- stat.st_blocks = 0;
- stat.st_ctime = stat.st_mtime = stat.st_atime = 0;
- stat.st_ino = inum;
-
- return incore_create(pno, &stat);
-}
-
-static int
-_sysio_incore_inop_close(struct inode *ino __IS_UNUSED)
-{
-
- return 0;
-}
-
-static int
-_sysio_incore_dirop_link(struct pnode *old, struct pnode *new)
-{
- struct incore_inode *icino = I2IC(old->p_base->pb_ino);
- int err;
-
- assert(!new->p_base->pb_ino);
- assert(!S_ISDIR(old->p_base->pb_ino->i_stbuf.st_mode));
-
- /*
- * Can bump the link count?
- */
- if (!(icino->ici_st.st_nlink + 1))
- return -EMLINK;
- /*
- * Insert into parent.
- */
- err =
- incore_directory_insert(I2IC(new->p_parent->p_base->pb_ino),
- &new->p_base->pb_name,
- icino->ici_st.st_ino,
- INCORE_D_TYPEOF(icino->ici_st.st_mode));
- if (err)
- return err;
- /*
- * Bump the link count.
- */
- icino->ici_st.st_nlink++;
-
- return 0;
-}
-
-static int
-_sysio_incore_dirop_rename(struct pnode *old, struct pnode *new)
-{
- int err;
- struct incore_inode *icino = I2IC(old->p_base->pb_ino);
-
- if (new->p_base->pb_ino) {
- /*
- * Have to kill off the target first.
- */
- if (S_ISDIR(I2IC(new->p_base->pb_ino)->ici_st.st_mode) &&
- I2IC(new->p_base->pb_ino)->ici_st.st_nlink > 2)
- return -ENOTEMPTY;
- err =
- incore_unlink_entry(I2IC(new->p_parent->p_base->pb_ino),
- &new->p_base->pb_name);
- if (err)
- return err;
- }
-
- /*
- * Insert into new parent.
- */
- err =
- incore_directory_insert(I2IC(new->p_parent->p_base->pb_ino),
- &new->p_base->pb_name,
- icino->ici_st.st_ino,
- INCORE_D_TYPEOF(icino->ici_st.st_mode));
- if (err)
- abort();
- /*
- * Remove from the old parent.
- */
- err =
- incore_unlink_entry(I2IC(old->p_parent->p_base->pb_ino),
- &old->p_base->pb_name);
- if (err)
- abort();
-
- if (S_ISDIR(icino->ici_st.st_mode)) {
- struct intnl_dirent *de;
-
- /*
- * We moved a directory. The entry for `..' must be corrected.
- */
- de = icino->ici_data;
- de++;
- assert(strcmp(de->d_name, "..") == 0);
- de->d_ino = I2IC(new->p_parent->p_base->pb_ino)->ici_st.st_ino;
- }
- return 0;
-}
-
-static int
-_sysio_incore_dirop_unlink(struct pnode *pno)
-{
- struct inode *ino = pno->p_base->pb_ino;
- struct incore_inode *icino = I2IC(ino);
- int err;
-
- if (S_ISDIR(icino->ici_st.st_mode))
- return -EISDIR;
-
- err =
- incore_unlink_entry(I2IC(pno->p_parent->p_base->pb_ino),
- &pno->p_base->pb_name);
- return err;
-}
-
-static int
-doio(ssize_t (*f)(void *, size_t, _SYSIO_OFF_T, struct incore_inode *),
- struct inode *ino,
- struct ioctx *ioctx)
-{
-
- ioctx->ioctx_cc =
- _sysio_doio(ioctx->ioctx_xtv, ioctx->ioctx_xtvlen,
- ioctx->ioctx_iov, ioctx->ioctx_iovlen,
- (ssize_t (*)(void *, size_t, _SYSIO_OFF_T, void *))f,
- I2IC(ino));
- if (ioctx->ioctx_cc < 0) {
- ioctx->ioctx_errno = -ioctx->ioctx_cc;
- ioctx->ioctx_cc = -1;
- }
- ioctx->ioctx_done = 1;
-
- return 0;
-}
-
-static ssize_t
-incore_read(void *buf, size_t nbytes,
- _SYSIO_OFF_T off,
- struct incore_inode *icino)
-{
- size_t n;
-
- if (off < 0)
- return -EINVAL;
- if (!nbytes || off > icino->ici_st.st_size)
- return 0;
- n = icino->ici_st.st_size - (size_t )off;
- if (n > nbytes)
- n = nbytes;
- (void )memcpy(buf, (char *)icino->ici_data + off, (size_t )n);
-
- return (ssize_t )n;
-}
-
-static int
-_sysio_incore_filop_read(struct inode *ino, struct ioctx *ioctx)
-{
-
-
- return doio(incore_read, ino, ioctx);
-}
-
-static ssize_t
-incore_write(const void *buf, size_t nbytes,
- _SYSIO_OFF_T off,
- struct incore_inode *icino)
-{
- _SYSIO_OFF_T pos;
-
- if (off < 0)
- return -EINVAL;
- if (!nbytes || off > icino->ici_st.st_size)
- return 0;
- pos = off + nbytes;
- if (off && pos <= off) {
- /*
- * It's all or nothing. We won't write just part of
- * the buffer.
- */
- return -EFBIG;
- }
- if (pos > icino->ici_st.st_size) {
- int err;
-
- err = incore_trunc(icino, (size_t )pos, 0);
- if (err)
- return err;
- }
- (void )memcpy((char *)icino->ici_data + off, buf, nbytes);
-
- return (ssize_t )nbytes;
-}
-
-static int
-_sysio_incore_filop_write(struct inode *ino, struct ioctx *ioctx)
-{
-
- return doio((ssize_t (*)(void *, size_t,
- _SYSIO_OFF_T,
- struct incore_inode *))incore_write,
- ino,
- ioctx);
-}
-
-static _SYSIO_OFF_T
-_sysio_incore_filop_pos(struct inode *ino __IS_UNUSED, _SYSIO_OFF_T off)
-{
-
- return off;
-}
-
-static int
-_sysio_incore_filop_iodone(struct ioctx *iocp __IS_UNUSED)
-{
-
- /*
- * It's always done in this driver. It completed when posted.
- */
- return 1;
-}
-
-static int
-_sysio_incore_filop_fcntl(struct inode *ino __IS_UNUSED,
- int cmd __IS_UNUSED,
- va_list ap __IS_UNUSED,
- int *rtn)
-{
-
- /*
- * No fcntl's supported.
- */
- *rtn = -1;
- return -ENOTTY;
-}
-
-static int
-_sysio_incore_inop_sync(struct inode *ino __IS_UNUSED)
-{
-
- /*
- * With what?
- */
- return 0;
-}
-
-static int
-_sysio_incore_filop_ioctl(struct inode *ino __IS_UNUSED,
- unsigned long int request __IS_UNUSED,
- va_list ap __IS_UNUSED)
-{
-
- /*
- * No ioctl's supported.
- */
- return -ENOTTY;
-}
-
-static int
-_sysio_incore_dirop_mknod(struct pnode *pno, mode_t mode, dev_t dev)
-{
- mode_t m;
- struct intnl_stat stat;
- ino_t inum;
-
- assert(!pno->p_base->pb_ino);
-
- m = mode & S_IFMT;
- if (S_ISCHR(m))
- m &= ~S_IFCHR;
- else if (S_ISFIFO(m))
- m &= ~S_IFIFO;
- else if (S_ISBLK(m))
- m &= ~S_IFCHR;
- else
- return -EINVAL;
- if (m)
- return -EINVAL;
-
- /*
- * Initialize attributes.
- */
- (void )memset(&stat, 0, sizeof(stat));
- stat.st_dev = pno->p_parent->p_base->pb_ino->i_fs->fs_dev;
- inum = incore_inum_alloc();
-#ifdef HAVE__ST_INO
- stat.__st_ino = inum;
-#endif
- stat.st_mode = mode;
- stat.st_nlink = 1;
- stat.st_uid = getuid();
- stat.st_gid = getgid();
- stat.st_rdev = dev;
- stat.st_size = 0;
- stat.st_blksize = 4096;
- stat.st_blocks = 0;
- stat.st_ctime = stat.st_mtime = stat.st_atime = 0;
- stat.st_ino = inum;
-
- return incore_create(pno, &stat);
-}
-
-#ifdef _HAVE_STATVFS
-static int
-_sysio_incore_inop_statvfs(struct pnode *pno,
- struct inode *ino,
- struct intnl_statvfs *buf)
-{
- struct filesys *fs;
-
- if (!ino)
- ino = pno->p_base->pb_ino;
- assert(ino);
-
- fs = pno->p_base->pb_ino->i_fs;
-
- (void )memset(buf, 0, sizeof(struct intnl_statvfs));
-
- /*
- * Mostly, we lie.
- */
- buf->f_bsize = fs->fs_bsize;
- buf->f_frsize = buf->f_bsize;
- buf->f_blocks = ~0;
- buf->f_blocks /= buf->f_bsize;
- buf->f_bfree = buf->f_blocks - 1;
- buf->f_bavail = buf->f_bfree;
- buf->f_files = buf->f_blocks;
- buf->f_ffree = buf->f_files - 1;
- buf->f_favail = buf->f_ffree;
- buf->f_fsid = fs->fs_id;
- buf->f_flag = 0;
- buf->f_namemax = ULONG_MAX;
-
- return 0;
-}
-#endif
-
-void
-_sysio_incore_inop_gone(struct inode *ino)
-{
- struct incore_inode *icino = I2IC(ino);
-
- incore_i_destroy(icino);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-/*
- * Native file system driver support.
- */
-
-extern int _sysio_incore_init(void);
+++ /dev/null
-INCORE_SRCS = drivers/incore/fs_incore.c
-INCORE_EXTRA = drivers/incore/fs_incore.h drivers/incore/module.mk
+++ /dev/null
-/.dirstamp
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2004 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#ifdef __linux__
-#define _BSD_SOURCE
-#endif
-
-#include <stdio.h> /* for NULL */
-#include <stdlib.h>
-#ifdef __linux__
-#include <string.h>
-#endif
-#include <unistd.h>
-#if !(defined(REDSTORM) || defined(MAX_IOVEC))
-#include <limits.h>
-#endif
-#include <errno.h>
-#include <assert.h>
-#include <sys/syscall.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/fcntl.h>
-#if 0
-#include <sys/vfs.h>
-#endif
-#ifdef _HAVE_STATVFS
-#include <sys/statvfs.h>
-#include <sys/statfs.h>
-#endif
-#include <utime.h>
-#include <sys/uio.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "xtio.h"
-#include "native.h"
-#include "fs.h"
-#include "mount.h"
-#include "inode.h"
-
-#include "fs_native.h"
-
-#ifdef REDSTORM
-#include <sys/uio.h>
-#endif
-
-#if defined(SYSIO_SYS_getdirentries)
-#define DIR_CVT_64 0
-#elif defined(SYSIO_SYS_getdents64)
-#define DIR_CVT_64 0
-#elif defined(SYSIO_SYS_getdents)
-#if defined(_LARGEFILE64_SOURCE)
-#define DIR_CVT_64 1
-/*
- * Kernel version of directory entry.
- */
-struct linux_dirent {
- unsigned long ld_ino;
- unsigned long ld_off;
- unsigned short ld_reclen;
- char ld_name[1];
-};
-#include <dirent.h>
-#else /* !defined(_LARGEFILE64_SOURCE) */
-#define DIR_CVT_64 0
-#endif /* defined(_LARGEFILE64_SOURCE) */
-#else /* catch-none */
-#error No usable directory fill entries interface available
-#endif
-
-/*
- * Native file system information we keep per FS.
- */
-struct native_filesystem {
- time_t nfs_atimo; /* attr timeout (sec) */
-};
-
-/*
- * Given fs, return driver private part.
- */
-#define FS2NFS(fs) \
- ((struct native_filesystem *)(fs)->fs_private)
-
-/*
- * Native file identifiers format.
- */
-struct native_inode_identifier {
- dev_t dev; /* device number */
- ino_t ino; /* i-number */
-#ifdef HAVE_GENERATION
- unsigned int gen; /* generation number */
-#endif
-};
-
-/*
- * Driver-private i-node information we keep about local host file
- * system objects.
- */
-struct native_inode {
- unsigned
- ni_seekok : 1, /* can seek? */
- ni_attrvalid : 1, /* cached attrs ok? */
- ni_resetfpos : 1; /* reset fpos? */
- struct native_inode_identifier ni_ident; /* unique identifier */
- struct file_identifier ni_fileid; /* ditto */
- int ni_fd; /* host fildes */
- int ni_oflags; /* flags, from open */
- unsigned ni_nopens; /* soft ref count */
- _SYSIO_OFF_T ni_fpos; /* current pos */
- time_t ni_attrtim; /* attrs expire time */
-};
-
-/*
- * Cached attributes usable?
- */
-#define NATIVE_ATTRS_VALID(nino, t) \
- ((nino)->ni_attrtim && (t) < (nino)->ni_attrtim)
-
-/*
- * Native IO path arguments.
- */
-struct native_io {
- char nio_op; /* 'r' or 'w' */
- struct native_inode *nio_nino; /* native ino */
-};
-
-static int native_inop_lookup(struct pnode *pno,
- struct inode **inop,
- struct intent *intnt,
- const char *path);
-static int native_inop_getattr(struct pnode *pno,
- struct inode *ino,
- struct intnl_stat *stbuf);
-static int native_inop_setattr(struct pnode *pno,
- struct inode *ino,
- unsigned mask,
- struct intnl_stat *stbuf);
-static ssize_t native_filldirentries(struct inode *ino,
- _SYSIO_OFF_T *posp,
- char *buf,
- size_t nbytes);
-static int native_inop_mkdir(struct pnode *pno, mode_t mode);
-static int native_inop_rmdir(struct pnode *pno);
-static int native_inop_symlink(struct pnode *pno, const char *data);
-static int native_inop_readlink(struct pnode *pno, char *buf, size_t bufsiz);
-static int native_inop_open(struct pnode *pno, int flags, mode_t mode);
-static int native_inop_close(struct inode *ino);
-static int native_inop_link(struct pnode *old, struct pnode *new);
-static int native_inop_unlink(struct pnode *pno);
-static int native_inop_rename(struct pnode *old, struct pnode *new);
-static int native_inop_read(struct inode *ino, struct ioctx *ioctx);
-static int native_inop_write(struct inode *ino, struct ioctx *ioctx);
-static _SYSIO_OFF_T native_inop_pos(struct inode *ino, _SYSIO_OFF_T off);
-static int native_inop_iodone(struct ioctx *ioctx);
-static int native_inop_fcntl(struct inode *ino, int cmd, va_list ap, int *rtn);
-static int native_inop_sync(struct inode *ino);
-static int native_inop_datasync(struct inode *ino);
-static int native_inop_ioctl(struct inode *ino,
- unsigned long int request,
- va_list ap);
-static int native_inop_mknod(struct pnode *pno, mode_t mode, dev_t dev);
-#ifdef _HAVE_STATVFS
-static int native_inop_statvfs(struct pnode *pno,
- struct inode *ino,
- struct intnl_statvfs *buf);
-#endif
-static void native_inop_gone(struct inode *ino);
-
-static struct inode_ops native_i_ops = {
- native_inop_lookup,
- native_inop_getattr,
- native_inop_setattr,
- native_filldirentries,
- native_inop_mkdir,
- native_inop_rmdir,
- native_inop_symlink,
- native_inop_readlink,
- native_inop_open,
- native_inop_close,
- native_inop_link,
- native_inop_unlink,
- native_inop_rename,
- native_inop_read,
- native_inop_write,
- native_inop_pos,
- native_inop_iodone,
- native_inop_fcntl,
- native_inop_sync,
- native_inop_datasync,
- native_inop_ioctl,
- native_inop_mknod,
-#ifdef _HAVE_STATVFS
- native_inop_statvfs,
-#endif
- native_inop_gone
-};
-
-static int native_fsswop_mount(const char *source,
- unsigned flags,
- const void *data,
- struct pnode *tocover,
- struct mount **mntp);
-
-static struct fssw_ops native_fssw_ops = {
- native_fsswop_mount
-};
-
-static void native_fsop_gone(struct filesys *fs);
-
-static struct filesys_ops native_inodesys_ops = {
- native_fsop_gone,
-};
-
-/*
- * This example driver plays a strange game. It maintains a private,
- * internal mount -- It's own separate, rooted, name space. The local
- * file system's entire name space is available via this tree.
- *
- * This simplifies the implementation. At mount time, we need to generate
- * a path-node to be used as a root. This allows us to look up the needed
- * node in the host name space and leverage a whole lot of support from
- * the system.
- */
-static struct mount *native_internal_mount = NULL;
-
-/*
- * Given i-node, return driver private part.
- */
-#define I2NI(ino) ((struct native_inode *)((ino)->i_private))
-
-/*
- * stat -- by path.
- */
-static int
-native_stat(const char *path,
- struct inode *ino,
- time_t t,
- struct intnl_stat *buf)
-{
- struct native_inode *nino;
- int err;
- struct _sysio_native_stat stbuf;
-
- nino = ino ? I2NI(ino) : NULL;
-
- if (path)
- err = syscall(SYSIO_SYS_stat, path, &stbuf);
- else if (nino && nino->ni_fd >= 0)
- err = syscall(SYSIO_SYS_fstat, nino->ni_fd, &stbuf);
- else
- abort();
- if (err) {
- if (nino)
- nino->ni_attrtim = 0;
- return -errno;
- }
- if (nino) {
- nino->ni_attrtim = t;
- SYSIO_COPY_STAT(&stbuf, &ino->i_stbuf);
- if (buf)
- *buf = ino->i_stbuf;
- return 0;
- }
- if (!buf)
- return 0;
- SYSIO_COPY_STAT(&stbuf, buf);
- return 0;
-}
-
-/*
- * Introduce an i-node to the system.
- */
-static struct inode *
-native_i_new(struct filesys *fs, time_t expiration, struct intnl_stat *buf)
-{
- struct native_inode *nino;
- struct inode *ino;
-
- nino = malloc(sizeof(struct native_inode));
- if (!nino)
- return NULL;
- bzero(&nino->ni_ident, sizeof(nino->ni_ident));
- nino->ni_seekok = 0;
- nino->ni_attrvalid = 0;
- nino->ni_resetfpos = 0;
- nino->ni_ident.dev = buf->st_dev;
- nino->ni_ident.ino = buf->st_ino;
-#ifdef HAVE_GENERATION
- nino->ni_ident.gen = buf->st_gen;
-#endif
- nino->ni_fileid.fid_data = &nino->ni_ident;
- nino->ni_fileid.fid_len = sizeof(nino->ni_ident);
- nino->ni_fd = -1;
- nino->ni_oflags = 0;
- nino->ni_nopens = 0;
- nino->ni_fpos = 0;
- nino->ni_attrtim = expiration;
- ino =
- _sysio_i_new(fs,
- &nino->ni_fileid,
- buf,
- 0,
- &native_i_ops,
- nino);
- if (!ino)
- free(nino);
- return ino;
-}
-
-/*
- * Initialize this driver.
- */
-int
-_sysio_native_init()
-{
-
- /*
- * Capture current process umask and reset our process umask to
- * zero. All permission bits to open/creat/setattr are absolute --
- * They've already had a umask applied, when appropriate.
- */
-#ifndef REDSTORM
- _sysio_umask = syscall(SYSIO_SYS_umask, 0);
- /*
- * For Red Storm, this functionality is handled in cstart.
- * The mask to be "captured" has been sent already.
- * This eliminates a system call from every node!
- */
-#endif /* REDSTORM */
-
- return _sysio_fssw_register("native", &native_fssw_ops);
-}
-
-/*
- * Create private, internal, view of the hosts name space.
- */
-static int
-create_internal_namespace(const void *data)
-{
- char *opts;
- ssize_t len;
- char *cp;
- struct native_filesystem *nfs;
- int err;
- struct mount *mnt;
- struct inode *rootino;
- struct pnode_base *rootpb;
- static struct qstr noname = { NULL, 0, 0 };
- struct filesys *fs;
- time_t t;
- struct intnl_stat stbuf;
- unsigned long ul;
- static struct option_value_info v[] = {
- { "atimo", "30" },
- { NULL, NULL }
- };
-
- if (native_internal_mount) {
- /*
- * Reentered!
- */
- abort();
- }
-
- /*
- * Get mount options.
- */
- opts = NULL;
- if (data && (len = strlen((char *)data))) {
- opts = malloc(len + 1);
- if (!opts)
- return -ENOMEM;
- (void )strcpy(opts, data);
- if (_sysio_get_args(opts, v) - opts != (ssize_t )len)
- return -EINVAL;
- }
- ul = strtoul(v[0].ovi_value, &cp, 0);
- if (*cp != '\0' || ul >= UINT_MAX)
- return -EINVAL;
- if (opts) {
- free(opts);
- opts = NULL;
- }
-
- /*
- * We maintain an artificial, internal, name space in order to
- * have access to fully qualified path names in the various routines.
- * Initialize that name space now.
- */
- fs = NULL;
- mnt = NULL;
- rootino = NULL;
- rootpb = NULL;
- /*
- * This really should be per-mount. Hmm, but that's best done
- * as proper sub-mounts in the core and not this driver. We reconcile
- * now, here, by putting the mount options on the file system. That
- * means they are global and only can be passed at the initial mount.
- *
- * Maybe do it right some day?
- */
- nfs = malloc(sizeof(struct native_filesystem));
- if (!nfs) {
- err = -ENOMEM;
- goto error;
- }
- nfs->nfs_atimo = ul;
- if ((unsigned long)nfs->nfs_atimo != ul) {
- err = -EINVAL;
- goto error;
- }
- fs = _sysio_fs_new(&native_inodesys_ops, 0, nfs);
- if (!fs) {
- err = -ENOMEM;
- goto error;
- }
-
- /*
- * Get root i-node.
- */
- t = _SYSIO_LOCAL_TIME();
- err = native_stat("/", NULL, 0, &stbuf);
- if (err)
- goto error;
- rootino = native_i_new(fs, t + FS2NFS(fs)->nfs_atimo, &stbuf);
- if (!rootino) {
- err = -ENOMEM;
- goto error;
- }
-
- /*
- * Generate base path-node for root.
- */
- rootpb = _sysio_pb_new(&noname, NULL, rootino);
- if (!rootpb) {
- err = -ENOMEM;
- goto error;
- }
-
- /*
- * Mount it. This name space is disconnected from the
- * rest of the system -- Only available within this driver.
- */
- err = _sysio_do_mount(fs, rootpb, 0, NULL, &mnt);
- if (err)
- goto error;
-
- native_internal_mount = mnt;
- return 0;
-error:
- if (mnt) {
- if (_sysio_do_unmount(mnt) != 0)
- abort();
- nfs = NULL;
- fs = NULL;
- rootpb = NULL;
- rootino = NULL;
- }
- if (rootpb)
- _sysio_pb_gone(rootpb);
- if (fs) {
- FS_RELE(fs);
- nfs = NULL;
- }
- if (nfs)
- free(nfs);
- if (opts)
- free(opts);
-
- return err;
-}
-
-static int
-native_fsswop_mount(const char *source,
- unsigned flags,
- const void *data,
- struct pnode *tocover,
- struct mount **mntp)
-{
- int err;
- struct nameidata nameidata;
- struct mount *mnt;
-
- /*
- * Caller must use fully qualified path names when specifying
- * the source.
- */
- if (*source != '/')
- return -ENOENT;
-
- if (!native_internal_mount) {
- err = create_internal_namespace(data);
- if (err)
- return err;
- } else if (data && *(char *)data)
- return -EINVAL;
-
- /*
- * Lookup the source in the internally maintained name space.
- */
- ND_INIT(&nameidata, 0, source, native_internal_mount->mnt_root, NULL);
- err = _sysio_path_walk(native_internal_mount->mnt_root, &nameidata);
- if (err)
- return err;
-
- /*
- * Have path-node specified by the given source argument. Let the
- * system finish the job, now.
- */
- err =
- _sysio_do_mount(native_internal_mount->mnt_fs,
- nameidata.nd_pno->p_base,
- flags,
- tocover,
- &mnt);
- /*
- * Release the internal name space pnode and clean up any
- * aliases we might have generated. We really don't need to cache them
- * as they are only used at mount time..
- */
- P_RELE(nameidata.nd_pno);
- (void )_sysio_p_prune(native_internal_mount->mnt_root);
-
- if (!err) {
- FS_REF(native_internal_mount->mnt_fs);
- *mntp = mnt;
- }
- return err;
-}
-
-static int
-native_i_invalid(struct inode *inop, struct intnl_stat *stat)
-{
- struct native_inode *nino;
-
- /*
- * Validate passed in inode against stat struct info
- */
- nino = I2NI(inop);
-
- if (!nino->ni_attrtim ||
- (nino->ni_ident.dev != stat->st_dev ||
- nino->ni_ident.ino != stat->st_ino ||
-#ifdef HAVE_GENERATION
- nino->ni_ident.gen != stat->st_gen ||
-#endif
- ((inop)->i_stbuf.st_mode & S_IFMT) != (stat->st_mode & S_IFMT)) ||
- (((inop)->i_stbuf.st_rdev != stat->st_rdev) &&
- (S_ISCHR((inop)->i_stbuf.st_mode) ||
- S_ISBLK((inop)->i_stbuf.st_mode)))) {
- nino->ni_attrtim = 0; /* invalidate attrs */
- return 1;
- }
- return 0;
-}
-
-static struct inode *
-native_iget(struct filesys *fs, time_t expire, struct intnl_stat *stbp)
-{
- struct inode *ino;
- struct native_inode_identifier ident;
- struct file_identifier fileid;
-
- bzero(&ident, sizeof(ident));
- ident.dev = stbp->st_dev;
- ident.ino = stbp->st_ino;
-#ifdef HAVE_GENERATION
- ident.gen = stbp->st_gen;
-#endif
- fileid.fid_data = &ident;
- fileid.fid_len = sizeof(ident);
- ino = _sysio_i_find(fs, &fileid);
- if (ino) {
- ino->i_stbuf = *stbp;
- I2NI(ino)->ni_attrtim = expire;
- return ino;
- }
- return native_i_new(fs, expire, stbp);
-}
-
-/*
- * Find, and validate, or create i-node by host-relative path. Returned i-node
- * is referenced.
- */
-static int
-native_ibind(struct filesys *fs,
- char *path,
- time_t t,
- struct inode **inop)
-{
- struct intnl_stat ostbuf, stbuf;
- int err;
- struct inode *ino;
-
- if (*inop)
- ostbuf = (*inop)->i_stbuf;
-
- err = native_stat(path, *inop, t, &stbuf);
- if (err)
- return err;
-
- /*
- * Validate?
- */
- if (*inop) {
- if (!native_i_invalid(*inop, &ostbuf))
- return 0;
- /*
- * Invalidate.
- */
- _sysio_i_undead(*inop);
- *inop = NULL;
- }
-
- if (!(ino = native_iget(fs, t + FS2NFS(fs)->nfs_atimo, &stbuf)))
- return -ENOMEM;
-
- *inop = ino;
- return 0;
-}
-
-static int
-native_inop_lookup(struct pnode *pno,
- struct inode **inop,
- struct intent *intnt __IS_UNUSED,
- const char *path __IS_UNUSED)
-{
- time_t t;
- char *fqpath;
- struct filesys *fs;
- int err;
-
- *inop = pno->p_base->pb_ino;
-
- /*
- * Try to use the cached attributes unless the intent
- * indicates we are looking up the last component and
- * caller wants attributes. In that case, force a refresh.
- */
- t = _SYSIO_LOCAL_TIME();
- if (*inop &&
- (path || !intnt || (intnt->int_opmask & INT_GETATTR) == 0) &&
- NATIVE_ATTRS_VALID(I2NI(*inop), t))
- return 0;
-
- /*
- * Don't have an inode yet. Because we translate everything back to
- * a single name space for the host, we will assume the object the
- * caller is looking for has no existing alias in our internal
- * name space. We don't see the same file on different mounts in the
- * underlying host FS as the same file.
- *
- * The file identifier *will* be unique. It's got to have a different
- * dev.
- */
- fqpath = _sysio_pb_path(pno->p_base, '/');
- if (!fqpath)
- return -ENOMEM;
- fs = pno->p_mount->mnt_fs;
- err = native_ibind(fs, fqpath, t + FS2NFS(fs)->nfs_atimo, inop);
- free(fqpath);
- if (err)
- *inop = NULL;
- return err;
-}
-
-static int
-native_inop_getattr(struct pnode *pno,
- struct inode *ino,
- struct intnl_stat *stat)
-{
- struct native_inode *nino;
- int err;
-
- /*
- * We just cannot use the cached attributes when getattr is
- * called. Had the caller felt those were sufficient then
- * they could have (would have?) simply used what was cached
- * after revalidating. In this case, there's a good chance the
- * caller is looking for the current time stamps and/or size. Something
- * pretty volatile anyway.
- */
- err = 0; /* compiler cookie */
- if (pno) {
- char *path;
- struct filesys *fs;
- time_t t;
-
- path = _sysio_pb_path(pno->p_base, '/');
- if (!path)
- return -ENOMEM;
- fs = pno->p_mount->mnt_fs;
- t = _SYSIO_LOCAL_TIME();
- err = native_stat(path, ino, t + FS2NFS(fs)->nfs_atimo, stat);
- free(path);
- } else if ((nino = I2NI(ino))->ni_fd >= 0)
- /*
- * Don't have access to the fs record anymore. Just
- * refresh but keep the current timeout.
- */
- err = native_stat(NULL, ino, nino->ni_attrtim, stat);
- else {
- /*
- * Dev inodes don't open in this driver. We won't have
- * a file descriptor with which to do the deed then. Satisfy
- * the request from the cached copy of the attributes.
- */
- (void )memcpy(stat,
- &ino->i_stbuf,
- sizeof(struct intnl_stat));
- err = 0;
- }
-
- return err;
-}
-
-#ifdef SYSIO_SYS_utime
-static int
-_ut(const char *path, time_t actime, time_t modtime)
-{
- struct utimbuf ut;
-
- ut.actime = actime;
- ut.modtime = modtime;
- return syscall(SYSIO_SYS_utime, path, &ut);
-}
-#else
-static int
-_ut(const char *path, time_t actime, time_t modtime)
-{
- struct timeval tv[2];
-
- tv[0].tv_sec = actime;
- tv[0].tv_usec = 0;
- tv[1].tv_sec = modtime;
- tv[1].tv_usec = 0;
- return syscall(SYSIO_SYS_utimes, path, &tv);
-}
-#endif
-
-static int
-native_inop_setattr(struct pnode *pno,
- struct inode *ino,
- unsigned mask,
- struct intnl_stat *stat)
-{
- char *path;
- struct native_inode *nino;
- int fd;
- int err;
-
- path = NULL;
- nino = ino ? I2NI(ino) : NULL;
- fd = -1;
- if (nino)
- fd = nino->ni_fd;
- if (fd < 0 || mask & (SETATTR_MTIME|SETATTR_ATIME)) {
- if (!pno)
- return -EEXIST;
- path = _sysio_pb_path(pno->p_base, '/');
- if (!path)
- return -ENOMEM;
- }
-
- /*
- * Get current status for undo.
- */
- err = native_stat(path, ino, 0, NULL);
- if (err)
- goto out;
-
- if (mask & SETATTR_MODE) {
- mode_t mode;
-
- /*
- * Alter permissions attribute.
- */
- mode = stat->st_mode & 07777;
- err =
- fd < 0
- ? syscall(SYSIO_SYS_chmod, path, mode)
- : syscall(SYSIO_SYS_fchmod, fd, mode);
- if (err)
- err = -errno;
- }
- if (err)
- mask &= ~SETATTR_MODE;
- else if (mask & (SETATTR_MTIME|SETATTR_ATIME)) {
- time_t actime, modtime;
-
- /*
- * Alter access and/or modify time attributes.
- */
- actime = ino->i_stbuf.st_atime;
- modtime = ino->i_stbuf.st_mtime;
- if (mask & SETATTR_ATIME)
- actime = stat->st_atime;
- if (mask & SETATTR_MTIME)
- modtime = stat->st_mtime;
- if (_ut(path, actime, modtime) != 0)
- return -errno;
- }
- if (err)
- mask &= ~(SETATTR_MTIME|SETATTR_ATIME);
- else if (mask & (SETATTR_UID|SETATTR_GID)) {
-
- /*
- * Alter owner and/or group identifiers.
- */
- err =
- fd < 0
- ? syscall(SYSIO_SYS_chown,
- path,
- mask & SETATTR_UID
- ? stat->st_uid
- : (uid_t )-1,
- mask & SETATTR_GID
- ? stat->st_gid
- : (gid_t )-1)
- : syscall(SYSIO_SYS_fchown,
- fd,
- mask & SETATTR_UID
- ? stat->st_uid
- : (uid_t )-1,
- mask & SETATTR_GID
- ? stat->st_gid
- : (gid_t )-1);
- if (err)
- err = -errno;
- }
- if (err)
- mask &= ~(SETATTR_UID|SETATTR_GID);
- else if (mask & SETATTR_LEN) {
- /*
- * Do the truncate last. It can't be undone.
- */
- err = fd < 0
- ? syscall(SYSIO_SYS_truncate, path, stat->st_size)
- : syscall(SYSIO_SYS_ftruncate, fd, stat->st_size);
- if (err)
- err = -errno;
- }
- if (!err)
- goto out;
- /*
- * Undo after error. Some or all of this might not work... We
- * can but try.
- */
- if (mask & (SETATTR_UID|SETATTR_GID)) {
- (void )(fd < 0
- ? syscall(SYSIO_SYS_chown,
- path,
- mask & SETATTR_UID
- ? ino->i_stbuf.st_uid
- : (uid_t )-1,
- mask & SETATTR_GID
- ? ino->i_stbuf.st_gid
- : (gid_t )-1)
- : syscall(SYSIO_SYS_fchown,
- fd,
- mask & SETATTR_UID
- ? ino->i_stbuf.st_uid
- : (uid_t )-1,
- mask & SETATTR_GID
- ? ino->i_stbuf.st_gid
- : (gid_t )-1));
- }
- if (mask & (SETATTR_MTIME|SETATTR_ATIME))
- (void )_ut(path, ino->i_stbuf.st_atime, ino->i_stbuf.st_mtime);
- if (mask & SETATTR_MODE) {
- fd < 0
- ? syscall(SYSIO_SYS_chmod, path, ino->i_stbuf.st_mode & 07777)
- : syscall(SYSIO_SYS_fchmod, ino->i_stbuf.st_mode & 07777);
- }
-out:
- /*
- * We must refresh the cached attributes.
- */
- if (!err && native_stat(path, ino, _SYSIO_LOCAL_TIME(), NULL) != 0)
- abort();
- if (path)
- free(path);
- return err;
-}
-
-static int
-native_pos(int fd, _SYSIO_OFF_T *offset, int whence)
-{
- _SYSIO_OFF_T off;
-
- assert(fd >= 0);
- assert(*offset >= 0);
-
- off = *offset;
-#if defined(_LARGEFILE64_SOURCE) && defined(SYSIO_SYS__llseek)
- {
- int err;
- err =
- syscall(SYSIO_SYS__llseek,
- (unsigned int)fd,
- (unsigned int)(off >> 32),
- (unsigned int)off,
- &off,
- whence);
- if (err == -1)
- return -errno;
- }
-#else
- off =
- syscall(SYSIO_SYS_lseek,
- fd,
- off,
- whence);
- if (off == -1)
- return -errno;
-#endif
- *offset = off;
-
- return 0;
-}
-
-static ssize_t
-native_ifilldirentries(struct native_inode *nino,
- _SYSIO_OFF_T *posp,
- char *buf,
- size_t nbytes)
-{
- int err;
- ssize_t cc;
-#if defined(SYSIO_SYS_getdirentries)
- _SYSIO_OFF_T waste=*posp;
-#endif
-
- if (*posp < 0)
- return -EINVAL;
-
- /*
- * Stream-oriented access requires that we reposition prior to the
- * fill call.
- */
- assert(nino->ni_seekok);
- if (*posp != nino->ni_fpos || nino->ni_resetfpos) {
- nino->ni_fpos = *posp;
- err = native_pos(nino->ni_fd, &nino->ni_fpos, SEEK_SET);
- if (err) {
- nino->ni_resetfpos = 1;
- return err;
- }
- nino->ni_resetfpos = 0;
- }
-
- cc =
-#if defined(SYSIO_SYS_getdirentries)
- syscall(SYSIO_SYS_getdirentries,
- nino->ni_fd,
- buf,
- nbytes,
- &waste);
-#elif defined(SYSIO_SYS_getdents64)
- syscall(SYSIO_SYS_getdents64, nino->ni_fd, buf, nbytes);
-#elif defined(SYSIO_SYS_getdents)
- syscall(SYSIO_SYS_getdents, nino->ni_fd, buf, nbytes);
-#endif
-
- if (cc < 0)
- return -errno;
- /*
- * Stream-oriented access requires that we discover where we are
- * after the call.
- */
- if ((err = native_pos(nino->ni_fd, &nino->ni_fpos, SEEK_CUR)) != 0) {
- /*
- * Leave the position at the old I suppose.
- */
- nino->ni_resetfpos = 1;
- return err;
- }
- *posp = nino->ni_fpos;
- return cc;
-}
-
-static ssize_t
-native_filldirentries(struct inode *ino,
- _SYSIO_OFF_T *posp,
- char *buf,
- size_t nbytes)
-{
- struct native_inode *nino = I2NI(ino);
-#if DIR_CVT_64
- char *bp;
- size_t count;
- struct linux_dirent *ldp;
- struct dirent64 *d64p;
- size_t namlen;
- size_t reclen;
-#else
-#define bp buf
-#define count nbytes
-#endif
- ssize_t cc;
-
- assert(nino->ni_fd >= 0);
-
-#if DIR_CVT_64
- count = nbytes;
- while (!(bp = malloc(count))) {
- count /= 2;
- if (count < sizeof(struct dirent))
- return -ENOMEM;
- }
-#endif
- cc = native_ifilldirentries(nino, posp, bp, count);
- if (cc < 0) {
-#if DIR_CVT_64
- free(bp);
-#endif
- return cc;
- }
-#if DIR_CVT_64
- ldp = (struct linux_dirent *)bp;
- d64p = (struct dirent64 *)buf;
- while (cc) {
- namlen = strlen(ldp->ld_name);
- reclen = sizeof(*d64p) - sizeof(d64p->d_name) + namlen;
- if (nbytes <= reclen)
- break;
- d64p->d_ino = ldp->ld_ino;
- d64p->d_off = nino->ni_fpos = ldp->ld_off;
- d64p->d_reclen =
- (((reclen + sizeof(long))) / sizeof(long)) * sizeof(long);
- if (nbytes < d64p->d_reclen)
- d64p->d_reclen = reclen + 1;
- d64p->d_type = DT_UNKNOWN; /* you lose -- sorry. */
- (void )memcpy(d64p->d_name, ldp->ld_name, namlen);
- /*
- * Zero pad the rest.
- */
- for (cp = d64p->d_name + namlen, n = d64p->d_reclen - reclen;
- n;
- n--)
- *cp++ = 0;
- cc -= ldp->ld_reclen;
- ldp = (struct linux_dirent *)((char *)ldp + ldp->ld_reclen);
- nbytes -= d64p->d_reclen;
- d64p = (struct dirent64 *)((char *)d64p + d64p->d_reclen);
- }
- free(bp);
- cc =
- (d64p == (struct dirent64 *)buf && cc)
- ? -EINVAL
- : (char *)d64p - buf;
-#else
-#undef bp
-#undef count
-#endif
- return cc;
-}
-
-static int
-native_inop_mkdir(struct pnode *pno, mode_t mode)
-{
- char *path;
- int err;
-
- path = _sysio_pb_path(pno->p_base, '/');
- if (!path)
- return -ENOMEM;
-
- err = syscall(SYSIO_SYS_mkdir, path, mode);
- if (err != 0)
- err = -errno;
- free(path);
- return err;
-}
-
-static int
-native_inop_rmdir(struct pnode *pno)
-{
- char *path;
- int err;
-
- path = _sysio_pb_path(pno->p_base, '/');
- if (!path)
- return -ENOMEM;
-
- err = syscall(SYSIO_SYS_rmdir, path);
- if (err != 0)
- err = -errno;
- free(path);
- return err;
-}
-
-static int
-native_inop_symlink(struct pnode *pno, const char *data)
-{
- char *path;
- int err;
-
- path = _sysio_pb_path(pno->p_base, '/');
- if (!path)
- return -ENOMEM;
-
- err = syscall(SYSIO_SYS_symlink, data, path);
- if (err != 0)
- err = -errno;
- free(path);
- return err;
-}
-
-static int
-native_inop_readlink(struct pnode *pno, char *buf, size_t bufsiz)
-{
- char *path;
- int i;
-
- path = _sysio_pb_path(pno->p_base, '/');
- if (!path)
- return -ENOMEM;
- i = syscall(SYSIO_SYS_readlink, path, buf, bufsiz);
- if (i < 0)
- i = -errno;
- free(path);
- return i;
-}
-
-static int
-native_inop_open(struct pnode *pno, int flags, mode_t mode)
-{
- struct native_inode *nino;
- char *path;
- int fd;
-
- path = _sysio_pb_path(pno->p_base, '/');
- if (!path)
- return -ENOMEM;
-
- /*
- * Whether the file is already open, or not, makes no difference.
- * Want to always give the host OS a chance to authorize in case
- * something has changed underneath us.
- */
- if (flags & O_WRONLY) {
- /*
- * Promote write-only attempt to RW.
- */
- flags &= ~O_WRONLY;
- flags |= O_RDWR;
- }
-#ifdef O_LARGEFILE
- flags |= O_LARGEFILE;
-#endif
- fd = syscall(SYSIO_SYS_open, path, flags, mode);
- if (!pno->p_base->pb_ino && fd >= 0) {
- struct filesys *fs;
- int err;
-
- /*
- * Success but we need to return an i-node.
- */
- fs = pno->p_mount->mnt_fs;
- err =
- native_ibind(fs,
- path,
- _SYSIO_LOCAL_TIME() + FS2NFS(fs)->nfs_atimo,
- &pno->p_base->pb_ino);
- if (err) {
- (void )syscall(SYSIO_SYS_close, fd);
- if (err == -EEXIST)
- abort();
- fd = err;
- }
- }
- free(path);
- if (fd < 0)
- return -errno;
-
- /*
- * Remember this new open.
- */
- nino = I2NI(pno->p_base->pb_ino);
- nino->ni_nopens++;
- assert(nino->ni_nopens);
-
- if (nino->ni_fd >= 0) {
- if ((nino->ni_oflags & O_RDWR) ||
- (flags & (O_RDONLY|O_WRONLY|O_RDWR)) == O_RDONLY) {
- /*
- * Keep existing.
- */
- (void )syscall(SYSIO_SYS_close, fd);
- return 0;
- }
- (void )syscall(SYSIO_SYS_close, nino->ni_fd);
- }
- /*
- * Invariant; First open. Must init.
- */
- nino->ni_resetfpos = 0;
- nino->ni_fpos = 0;
- nino->ni_fd = fd;
- /*
- * Need to know whether we can seek on this
- * descriptor.
- */
- nino->ni_seekok =
- native_pos(nino->ni_fd, &nino->ni_fpos, SEEK_CUR) != 0 ? 0 : 1;
-
- return 0;
-}
-
-static int
-native_inop_close(struct inode *ino)
-{
- struct native_inode *nino = I2NI(ino);
- int err;
-
- if (nino->ni_fd < 0)
- abort();
-
- assert(nino->ni_nopens);
- if (--nino->ni_nopens) {
- /*
- * Hmmm. We really don't need anything else. However, some
- * filesystems try to implement a sync-on-close semantic.
- * As this appears now, that is lost. Might want to change
- * it somehow in the future?
- */
- return 0;
- }
-
- err = syscall(SYSIO_SYS_close, nino->ni_fd);
- if (err)
- return -errno;
-
- nino->ni_fd = -1;
- nino->ni_resetfpos = 0;
- nino->ni_fpos = 0;
- return 0;
-}
-
-static int
-native_inop_link(struct pnode *old, struct pnode *new)
-{
- int err;
- char *opath, *npath;
-
- err = 0;
-
- opath = _sysio_pb_path(old->p_base, '/');
- npath = _sysio_pb_path(new->p_base, '/');
- if (!(opath && npath)) {
- err = -ENOMEM;
- goto out;
- }
-
- err = syscall(SYSIO_SYS_link, opath, npath);
- if (err != 0)
- err = -errno;
-
-out:
- if (opath)
- free(opath);
- if (npath)
- free(npath);
- return err;
-}
-
-static int
-native_inop_unlink(struct pnode *pno)
-{
- char *path;
- int err = 0;
-
- path = _sysio_pb_path(pno->p_base, '/');
- if (!path)
- return -ENOMEM;
-
- /*
- * For this driver, unlink is easy with open files. Since the
- * file remains open to the system, too, the descriptors are still
- * valid.
- *
- * Other drivers will have some difficulty here as the entry in the
- * file system name space must be removed without sacrificing access
- * to the file itself. In NFS this is done with a mechanism referred
- * to as a `silly delete'. The file is moved to a temporary name
- * (usually .NFSXXXXXX, where the X's are replaced by the PID and some
- * unique characters) in order to simulate the proper semantic.
- */
- if (syscall(SYSIO_SYS_unlink, path) != 0)
- err = -errno;
- free(path);
- return err;
-}
-
-static int
-native_inop_rename(struct pnode *old, struct pnode *new)
-{
- int err;
- char *opath, *npath;
-
- opath = _sysio_pb_path(old->p_base, '/');
- npath = _sysio_pb_path(new->p_base, '/');
- if (!(opath && npath)) {
- err = -ENOMEM;
- goto out;
- }
-
- err = syscall(SYSIO_SYS_rename, opath, npath);
- if (err != 0)
- err = -errno;
-
-out:
- if (opath)
- free(opath);
- if (npath)
- free(npath);
- return err;
-}
-
-static ssize_t
-dopio(void *buf, size_t count, _SYSIO_OFF_T off, struct native_io *nio)
-{
- ssize_t cc;
-
- if (!nio->nio_nino->ni_seekok) {
- if (off != nio->nio_nino->ni_fpos) {
- /*
- * They're trying to reposition. Can't
- * seek on this descriptor so we err out now.
- */
- errno = ESPIPE;
- return -1;
- }
- cc =
- syscall(nio->nio_op == 'r'
- ? SYSIO_SYS_read
- : SYSIO_SYS_write,
- nio->nio_nino->ni_fd,
- buf,
- count);
- if (cc > 0)
- nio->nio_nino->ni_fpos += cc;
- } else
- cc =
- syscall((nio->nio_op == 'r'
- ? SYSIO_SYS_pread
- : SYSIO_SYS_pwrite),
- nio->nio_nino->ni_fd,
- buf,
- count,
- off);
-
- return cc;
-}
-
-static ssize_t
-doiov(const struct iovec *iov,
- int count,
- _SYSIO_OFF_T off,
- ssize_t limit,
- struct native_io *nio)
-{
- ssize_t cc;
-
-#if !(defined(REDSTORM) || defined(MAX_IOVEC))
-#define MAX_IOVEC INT_MAX
-#endif
-
-
- if (count <= 0)
- return -EINVAL;
-
- /*
- * Avoid the reposition call if we're already at the right place.
- * Allows us to access pipes and fifos.
- */
- if (off != nio->nio_nino->ni_fpos) {
- int err;
-
- err = native_pos(nio->nio_nino->ni_fd, &off, SEEK_SET);
- if (err) {
- nio->nio_nino->ni_resetfpos = 1;
- return err;
- }
- nio->nio_nino->ni_resetfpos = 0;
- nio->nio_nino->ni_fpos = off;
- }
-
- /*
- * The {read,write}v is safe as this routine is only ever called
- * by _sysio_enumerate_extents() and that routine is exact. It never
- * passes iovectors including tails.
- */
- cc =
-#ifndef REDSTORM
- count <= MAX_IOVEC
- ? syscall(nio->nio_op == 'r' ? SYSIO_SYS_readv : SYSIO_SYS_writev,
- nio->nio_nino->ni_fd,
- iov,
- count)
- :
-#endif
- _sysio_enumerate_iovec(iov,
- count,
- off,
- limit,
- (ssize_t (*)(void *,
- size_t,
- _SYSIO_OFF_T,
- void *))dopio,
- nio);
- if (cc < 0)
- cc = -errno;
- else
- nio->nio_nino->ni_fpos += cc;
- return cc;
-
-#if !(defined(REDSTORM) || defined(MAX_IOVEC))
-#undef MAX_IOVEC
-#endif
-}
-
-#if 0
-static int
-lockop_all(struct native_inode *nino,
- struct intnl_xtvec *xtv,
- size_t count,
- short op)
-{
- struct flock flock;
- int err;
-
- if (!count)
- return -EINVAL;
- flock.l_type = op;
- flock.l_whence = SEEK_SET;
- while (count--) {
- flock.l_start = xtv->xtv_off;
- flock.l_len = xtv->xtv_len;
- xtv++;
- err =
- syscall(SYSIO_SYS_fcntl,
- nino->ni_fd,
- F_SETLK,
- &flock);
- if (err != 0)
- return -errno;
- }
- return 0;
-}
-
-static int
-order_xtv(const struct intnl_xtvec *xtv1, const struct intnl_xtvec *xtv2)
-{
-
- if (xtv1->xtv_off < xtv2->xtv_off)
- return -1;
- if (xtv1->xtv_off > xtv2->xtv_off)
- return 1;
- return 0;
-}
-#endif
-
-static int
-doio(char op, struct ioctx *ioctx)
-{
- struct native_inode *nino;
-#if 0
- int dolocks;
- struct intnl_xtvec *oxtv;
- int err;
-#endif
- struct native_io arguments;
- ssize_t cc;
-#if 0
- struct intnl_xtvec *front, *rear, tmp;
-#endif
-
- nino = I2NI(ioctx->ioctx_ino);
-#if 0
- dolocks = ioctx->ioctx_xtvlen > 1 && nino->ni_seekok;
- if (dolocks) {
- /*
- * Must lock the regions (in order!) since we can't do
- * strided-IO as a single atomic operation.
- */
- oxtv = malloc(ioctx->ioctx_xtvlen * sizeof(struct intnl_xtvec));
- if (!oxtv)
- return -ENOMEM;
- (void )memcpy(oxtv,
- ioctx->ioctx_xtv,
- ioctx->ioctx_xtvlen * sizeof(struct intnl_xtvec));
- qsort(oxtv,
- ioctx->ioctx_xtvlen,
- sizeof(struct intnl_xtvec),
- (int (*)(const void *, const void *))order_xtv);
- err =
- lockop_all(nino,
- oxtv, ioctx->ioctx_xtvlen,
- op == 'r' ? F_RDLCK : F_WRLCK);
- if (err) {
- free(oxtv);
- return err;
- }
- }
-#endif
- arguments.nio_op = op;
- arguments.nio_nino = nino;
- cc =
- _sysio_enumerate_extents(ioctx->ioctx_xtv, ioctx->ioctx_xtvlen,
- ioctx->ioctx_iov, ioctx->ioctx_iovlen,
- (ssize_t (*)(const struct iovec *,
- int,
- _SYSIO_OFF_T,
- ssize_t,
- void *))doiov,
- &arguments);
-#if 0
- if (dolocks) {
- /*
- * Must unlock in reverse order.
- */
- front = oxtv;
- rear = front + ioctx->ioctx_xtvlen - 1;
- while (front < rear) {
- tmp = *front;
- *front++ = *rear;
- *rear-- = tmp;
- }
- if (lockop_all(nino, oxtv, ioctx->ioctx_xtvlen, F_UNLCK) != 0)
- abort();
- free(oxtv);
- }
-#endif
- if ((ioctx->ioctx_cc = cc) < 0) {
- ioctx->ioctx_errno = -ioctx->ioctx_cc;
- ioctx->ioctx_cc = -1;
- }
- return 0;
-}
-
-static int
-native_inop_read(struct inode *ino __IS_UNUSED, struct ioctx *ioctx)
-{
-
- return doio('r', ioctx);
-}
-
-static int
-native_inop_write(struct inode *ino __IS_UNUSED, struct ioctx *ioctx)
-{
-
- return doio('w', ioctx);
-}
-
-static _SYSIO_OFF_T
-native_inop_pos(struct inode *ino, _SYSIO_OFF_T off)
-{
- struct native_inode *nino = I2NI(ino);
- int err;
-
- err = native_pos(nino->ni_fd, &off, SEEK_SET);
- return err < 0 ? err : off;
-}
-
-static int
-native_inop_iodone(struct ioctx *ioctxp __IS_UNUSED)
-{
-
- /*
- * It's always done in this driver. It completed when posted.
- */
- return 1;
-}
-
-static int
-native_inop_fcntl(struct inode *ino,
- int cmd,
- va_list ap,
- int *rtn)
-{
- struct native_inode *nino = I2NI(ino);
- long arg;
- int err;
-
- if (nino->ni_fd < 0)
- abort();
-
- err = 0;
- switch (cmd) {
- case F_GETFD:
- case F_GETFL:
-#ifdef F_GETOWN
- case F_GETOWN:
-#endif
- *rtn = syscall(SYSIO_SYS_fcntl, nino->ni_fd, cmd);
- if (*rtn == -1)
- err = -errno;
- break;
- case F_DUPFD:
- case F_SETFD:
- case F_SETFL:
- case F_GETLK:
- case F_SETLK:
- case F_SETLKW:
-#ifdef F_SETOWN
- case F_SETOWN:
-#endif
- arg = va_arg(ap, long);
- *rtn = syscall(SYSIO_SYS_fcntl, nino->ni_fd, cmd, arg);
- if (*rtn == -1)
- err = -errno;
- break;
- default:
- *rtn = -1;
- err = -EINVAL;
- }
- return err;
-}
-
-static int
-native_inop_mknod(struct pnode *pno __IS_UNUSED,
- mode_t mode __IS_UNUSED,
- dev_t dev __IS_UNUSED)
-{
-
- return -ENOSYS;
-}
-
-#ifdef _HAVE_STATVFS
-static int
-native_inop_statvfs(struct pnode *pno,
- struct inode *ino,
- struct intnl_statvfs *buf)
-{
- char *path;
- int rc;
- struct statfs fs;
-
- path = NULL;
- if (!ino || I2NI(ino)->ni_fd < 0) {
- path = _sysio_pb_path(pno->p_base, '/');
- if (!path)
- return -ENOMEM;
- }
-
- /*
- * The syscall interface does not support SYSIO_SYS_fstatvfs.
- * Should possibly return ENOSYS, but thought it
- * better to use SYSIO_SYS_fstatfs and fill in as much of
- * the statvfs structure as possible. This allows
- * for more of a test of the sysio user interface.
- */
- rc =
- path
- ? syscall(SYSIO_SYS_statfs, path, &fs)
- : syscall(SYSIO_SYS_fstatfs, I2NI(ino)->ni_fd, &fs);
- if (path)
- free(path);
- if (rc < 0)
- return -errno;
-
- buf->f_bsize = fs.f_bsize; /* file system block size */
- buf->f_frsize = fs.f_bsize; /* file system fundamental block size */
- buf->f_blocks = fs.f_blocks;
- buf->f_bfree = fs.f_bfree;
- buf->f_bavail = fs.f_bavail;
- buf->f_files = fs.f_files; /* Total number serial numbers */
- buf->f_ffree = fs.f_ffree; /* Number free serial numbers */
- buf->f_favail = fs.f_ffree; /* Number free ser num for non-privileged*/
- buf->f_fsid = fs.f_fsid.__val[1];
- buf->f_flag = 0; /* No equiv in statfs; maybe use type? */
- buf->f_namemax = fs.f_namelen;
- return 0;
-}
-#endif
-
-static int
-native_inop_sync(struct inode *ino)
-{
- int err;
-
- assert(I2NI(ino)->ni_fd >= 0);
-
- err = syscall(SYSIO_SYS_fsync, I2NI(ino)->ni_fd);
- if (err)
- err = -errno;
- return err;
-}
-
-static int
-native_inop_datasync(struct inode *ino)
-{
- struct native_inode *nino;
- int err;
-
- nino = I2NI(ino);
- assert(nino->ni_fd >= 0);
-
-#ifdef SYSIO_SYS_fdatasync
- err = syscall(SYSIO_SYS_fdatasync, I2NI(ino)->ni_fd);
-#else
-#if 0
-#warning No fdatasync system call -- Using fsync instead!
-#endif
- err = syscall(SYSIO_SYS_fsync, I2NI(ino)->ni_fd);
-#endif
- if (err)
- err = -errno;
- return err;
-}
-
-#ifdef HAVE_LUSTRE_HACK
-static int
-native_inop_ioctl(struct inode *ino,
- unsigned long int request,
- va_list ap)
-{
- struct native_inode *nino;
- long arg1, arg2, arg3, arg4;
- int rtn;
-
- nino = I2NI(ino);
- assert(nino->ni_fd >= 0);
- arg1 = va_arg(ap, long);
- arg2 = va_arg(ap, long);
- arg3 = va_arg(ap, long);
- arg4 = va_arg(ap, long);
-
- rtn =
- syscall(SYSIO_SYS_ioctl, I2NI(ino)->ni_fd, request,
- arg1, arg2, arg3, arg4);
- if (rtn < 0)
- rtn = -errno;
- return rtn;
-}
-#else
-static int
-native_inop_ioctl(struct inode *ino __IS_UNUSED,
- unsigned long int request __IS_UNUSED,
- va_list ap __IS_UNUSED)
-{
-
- /*
- * I'm lazy. Maybe implemented later.
- */
- return -ENOTTY;
-}
-#endif
-
-static void
-native_inop_gone(struct inode *ino)
-{
- struct native_inode *nino = I2NI(ino);
-
- if (nino->ni_fd >= 0)
- (void )syscall(SYSIO_SYS_close, nino->ni_fd);
-
- free(ino->i_private);
-}
-
-static void
-native_fsop_gone(struct filesys *fs __IS_UNUSED)
-{
-
- free(fs->fs_private);
- /*
- * Do nothing. There is no private part maintained for the
- * native file interface.
- */
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-/*
- * Native file system driver support.
- */
-
-extern int _sysio_native_init(void);
+++ /dev/null
-NATIVE_SRCS = drivers/native/fs_native.c
-NATIVE_EXTRA = drivers/native/fs_native.h drivers/native/module.mk
+++ /dev/null
-/.dirstamp
+++ /dev/null
-SOCKETS_SRCS = drivers/sockets/sockets.c
-SOCKETS_EXTRA = drivers/sockets/module.mk
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#ifdef __linux__
-#define _BSD_SOURCE
-#endif
-
-#include <stdio.h> /* for NULL */
-#include <stdlib.h>
-#ifdef __linux__
-#include <string.h>
-#endif
-#include <unistd.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/syscall.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/fcntl.h>
-#include <sys/syscall.h>
-#include <sys/socket.h>
-#ifdef __linux__
-#include <linux/net.h>
-#endif
-#include <sys/uio.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "xtio.h"
-#include "native.h"
-#include "fs.h"
-#include "inode.h"
-#include "file.h"
-#include "dev.h" /* _sysio_nodev_ops */
-
-/*
- * Sockets interface driver
- */
-
-/*
- * Sockets file identifiers format.
- */
-struct sockets_ino_identifier {
- ino_t inum; /* i-number */
-};
-
-/*
- * Driver-private i-node information we keep about in-use sockets.
- */
-struct socket_info {
- struct sockets_ino_identifier ski_ident; /* unique identifier */
- struct file_identifier ski_fileid; /* ditto */
- int ski_fd; /* host fildes */
-};
-
-static int sockets_inop_close(struct inode *ino);
-static int sockets_inop_read(struct inode *ino,
- struct ioctx *ioctx);
-static int sockets_inop_write(struct inode *ino,
- struct ioctx *ioctxp);
-static _SYSIO_OFF_T sockets_inop_pos(struct inode *ino,
- _SYSIO_OFF_T off);
-static int sockets_inop_iodone(struct ioctx *ioctx);
-static int sockets_inop_sync(struct inode *ino);
-static int sockets_inop_datasync(struct inode *ino);
-static int sockets_inop_fcntl(struct inode *ino, int cmd, va_list ap, int *rtn);
-static int sockets_inop_ioctl(struct inode *ino,
- unsigned long int request,
- va_list ap);
-static void sockets_inop_gone(struct inode *ino);
-static void sockets_illop(void);
-
-/*
- * Given i-node, return driver private part.
- */
-#define I2SKI(ino) ((struct socket_info *)((ino)->i_private))
-
-struct filesys_ops sockets_filesys_ops = {
- (void (*)(struct filesys *))sockets_illop
-};
-
-static struct filesys *sockets_fs = NULL;
-
-static struct inode_ops sockets_i_ops;
-
-/*
- * Initialize this driver.
- */
-int
-_sysio_sockets_init()
-{
-
- assert(!sockets_fs);
-
- sockets_i_ops = _sysio_nodev_ops;
- sockets_i_ops.inop_close = sockets_inop_close;
- sockets_i_ops.inop_read = sockets_inop_read;
- sockets_i_ops.inop_write = sockets_inop_write;
- sockets_i_ops.inop_pos = sockets_inop_pos;
- sockets_i_ops.inop_iodone = sockets_inop_iodone;
- sockets_i_ops.inop_fcntl = sockets_inop_fcntl;
- sockets_i_ops.inop_sync = sockets_inop_sync;
- sockets_i_ops.inop_datasync = sockets_inop_datasync;
- sockets_i_ops.inop_ioctl = sockets_inop_ioctl;
- sockets_i_ops.inop_gone = sockets_inop_gone;
-
- sockets_fs = _sysio_fs_new(&sockets_filesys_ops, 0, NULL);
- if (!sockets_fs)
- return -ENOMEM;
-
- return 0;
-}
-
-static int
-sockets_inop_close(struct inode *ino)
-{
- struct socket_info *ski = I2SKI(ino);
- int err;
-
- if (ski->ski_fd < 0)
- return -EBADF;
-
- err = syscall(SYSIO_SYS_close, ski->ski_fd);
- if (err)
- return -errno;
- ski->ski_fd = -1;
- return 0;
-}
-
-/*
- * A helper function performing the real IO operation work.
- *
- * We don't really have async IO. We'll just perform the function
- * now.
- */
-static int
-doio(ssize_t (*f)(int, const struct iovec *, int),
- struct inode *ino,
- struct ioctx *ioctx)
-{
- struct socket_info *ski = I2SKI(ino);
-
- assert(ski->ski_fd >= 0);
-
- /* XXX there's no way to check the position
- * here we only could ingore the extends
- */
- if (ioctx->ioctx_xtvlen != 1)
- return -EINVAL;
-
- if (ioctx->ioctx_iovlen && (int) ioctx->ioctx_iovlen < 0)
- return -EINVAL;
-
- /*
- * Call the appropriate (read/write) IO function to
- * transfer the data now.
- */
- ioctx->ioctx_cc =
- (*f)(ski->ski_fd, ioctx->ioctx_iov, ioctx->ioctx_iovlen);
- if (ioctx->ioctx_cc < 0)
- ioctx->ioctx_errno = errno;
-
- ioctx->ioctx_done = 1;
- return 0;
-}
-
-/*
- * Helper function passed to doio(), above, to accomplish a real readv.
- */
-static ssize_t
-_readv(int fd, const struct iovec *vector, int count)
-{
-
- return syscall(SYSIO_SYS_readv, fd, vector, count);
-}
-
-static int
-sockets_inop_read(struct inode *ino,
- struct ioctx *ioctx)
-{
-
- return doio(_readv, ino, ioctx);
-}
-
-/*
- * Helper function passed to doio(), above, to accomplish a real writev.
- */
-static ssize_t
-_writev(int fd, const struct iovec *vector, int count)
-{
-
- return syscall(SYSIO_SYS_writev, fd, vector, count);
-}
-
-static int
-sockets_inop_write(struct inode *ino,
- struct ioctx *ioctx)
-{
-
- return doio(_writev, ino, ioctx);
-}
-
-static _SYSIO_OFF_T
-sockets_inop_pos(struct inode *ino __IS_UNUSED, _SYSIO_OFF_T off __IS_UNUSED)
-{
- return -EINVAL;
-}
-
-static int
-sockets_inop_iodone(struct ioctx *ioctxp __IS_UNUSED)
-{
-
- /*
- * It's always done in this driver. It completed when posted.
- */
- return 1;
-}
-
-static int
-sockets_inop_fcntl(struct inode *ino __IS_UNUSED,
- int cmd __IS_UNUSED,
- va_list ap __IS_UNUSED,
- int *rtn)
-{
- long arg;
-
- assert(I2SKI(ino)->ski_fd >= 0);
-
- switch (cmd) {
- case F_GETFD:
- case F_GETFL:
- case F_GETOWN:
- *rtn = syscall(SYSIO_SYS_fcntl, I2SKI(ino)->ski_fd, cmd);
- break;
- case F_DUPFD:
- case F_SETFD:
- case F_SETFL:
- case F_GETLK:
- case F_SETLK:
- case F_SETLKW:
- case F_SETOWN:
- arg = va_arg(ap, long);
- *rtn = syscall(SYSIO_SYS_fcntl, I2SKI(ino)->ski_fd, cmd, arg);
- break;
- default:
- *rtn = -1;
- errno = EINVAL;
- }
- return *rtn == -1 ? -errno : 0;
-}
-
-static int
-sockets_inop_sync(struct inode *ino)
-{
-
- assert(I2SKI(ino)->ski_fd >= 0);
-
- return syscall(SYSIO_SYS_fsync, I2SKI(ino)->ski_fd);
-}
-
-static int
-sockets_inop_datasync(struct inode *ino)
-{
-
- assert(I2SKI(ino)->ski_fd >= 0);
-
- return syscall(SYSIO_SYS_fdatasync, I2SKI(ino)->ski_fd);
-}
-
-#ifdef HAVE_LUSTRE_HACK
-/*
- * we blindly extract 4 params and pass to host kernel, the stack
- * should be ok. hope no ioctl will consume more then 4 params...
- */
-static int
-sockets_inop_ioctl(struct inode *ino,
- unsigned long int request,
- va_list ap)
-{
- long arg1, arg2, arg3, arg4;
-
- assert(I2SKI(ino)->ski_fd >= 0);
-
- arg1 = va_arg(ap, long);
- arg2 = va_arg(ap, long);
- arg3 = va_arg(ap, long);
- arg4 = va_arg(ap, long);
-
- return syscall(SYSIO_SYS_ioctl, I2SKI(ino)->ski_fd, request,
- arg1, arg2, arg3, arg4);
-}
-#else
-static int
-sockets_inop_ioctl(struct inode *ino __IS_UNUSED,
- unsigned long int request __IS_UNUSED,
- va_list ap __IS_UNUSED)
-{
- /*
- * I'm lazy. Maybe implemented later.
- */
- return -ENOTTY;
-}
-#endif
-
-static void
-sockets_inop_gone(struct inode *ino)
-{
-
- (void )sockets_inop_close(ino);
- free(ino->i_private);
-}
-
-static void
-sockets_illop(void)
-{
-
- abort();
-}
-
-static struct inode *
-_sysio_sockets_inew()
-{
- static ino_t inum = 1;
- struct socket_info *ski;
- struct inode *ino;
- static struct intnl_stat zero_stat;
-
- ski = malloc(sizeof(struct socket_info));
- if (!ski)
- return NULL;
- ski->ski_ident.inum = inum++;
- ski->ski_fileid.fid_data = &ski->ski_ident;
- ski->ski_fileid.fid_len = sizeof(ski->ski_ident);
- ski->ski_fd = -1;
-
- ino =
- _sysio_i_new(sockets_fs,
- &ski->ski_fileid,
- &zero_stat,
- 0,
- &sockets_i_ops,
- ski);
- if (!ino)
- free(ski);
-
- return ino;
-}
-
-int
-SYSIO_INTERFACE_NAME(socket)(int domain, int type, int protocol)
-{
- int err;
- struct inode *ino;
- struct socket_info *ski;
- struct file *fil;
-
- err = 0;
- fil = NULL;
-
- ino = _sysio_sockets_inew();
- if (!ino) {
- err = -ENOMEM;
- goto error;
- }
-
- ski = I2SKI(ino);
-#ifndef SYSIO_SYS_socketcall
- ski->ski_fd = syscall(SYSIO_SYS_socket, domain, type, protocol);
-#else
- {
- unsigned long avec[3] = {domain, type, protocol};
- ski->ski_fd =
- syscall(SYSIO_SYS_socketcall, SYS_SOCKET, avec);
- }
-#endif
- if (ski->ski_fd < 0) {
- err = -errno;
- goto error;
- }
-
- fil = _sysio_fnew(ino, O_RDWR);
- if (!fil) {
- err = -ENOMEM;
- goto error;
- }
-
-#ifdef HAVE_LUSTRE_HACK
- err = _sysio_fd_set(fil, ski->ski_fd, 1);
-#else
- err = _sysio_fd_set(fil, -1, 0);
-#endif
- if (err < 0)
- goto error;
-
- return err;
-
-error:
- if (fil)
- F_RELE(fil);
- if (ino)
- I_RELE(ino);
-
- errno = -err;
- return -1;
-}
-
-int
-SYSIO_INTERFACE_NAME(accept)(int s, struct sockaddr *addr, socklen_t *addrlen)
-{
- int err;
- struct inode *ino;
- struct socket_info *ski;
- struct file *ofil, *nfil;
-
- err = 0;
- nfil = NULL;
- ino = NULL;
-
- ofil = _sysio_fd_find(s);
- if (!ofil) {
- err = -EBADF;
- goto error;
- }
-
- ino = _sysio_sockets_inew();
- if (!ino) {
- err = -ENOMEM;
- goto error;
- }
-
- nfil = _sysio_fnew(ino, O_RDWR);
- if (!nfil) {
- err = -ENOMEM;
- goto error;
- }
-
- ski = I2SKI(ino);
-#ifndef SYSIO_SYS_socketcall
- ski->ski_fd =
- syscall(SYSIO_SYS_accept,
- I2SKI(ofil->f_ino)->ski_fd,
- addr,
- addrlen);
-#else
- {
- unsigned long avec[3] = {
- (unsigned long) I2SKI(ofil->f_ino)->ski_fd,
- (unsigned long) addr,
- (unsigned long) addrlen};
- ski->ski_fd =
- syscall(SYSIO_SYS_socketcall, SYS_ACCEPT, avec);
- }
-#endif
- if (ski->ski_fd < 0) {
- err = -errno;
- goto error;
- }
-
-#ifdef HAVE_LUSTRE_HACK
- err = _sysio_fd_set(nfil, ski->ski_fd, 1);
-#else
- err = _sysio_fd_set(nfil, -1, 0);
-#endif
- if (err < 0)
- goto error;
-
- return err;
-
-error:
- if (nfil)
- F_RELE(nfil);
- if (ino)
- I_RELE(ino);
-
- errno = -err;
- return -1;
-}
-
-int
-SYSIO_INTERFACE_NAME(bind)(int sockfd,
- const struct sockaddr *my_addr,
- socklen_t addrlen)
-{
- int err;
- struct file *fil;
-#ifdef SYSIO_SYS_socketcall
- unsigned long avec[3];
-#endif
-
- err = 0;
-
- fil = _sysio_fd_find(sockfd);
- if (!fil) {
- err = -EBADF;
- goto out;
- }
-
-#ifndef SYSIO_SYS_socketcall
- if (syscall(SYSIO_SYS_bind,
- I2SKI(fil->f_ino)->ski_fd,
- my_addr,
- addrlen)) {
-#else
- avec[0] = I2SKI(fil->f_ino)->ski_fd;
- avec[1] = (unsigned long )my_addr;
- avec[2] = addrlen;
- if (syscall(SYSIO_SYS_socketcall, SYS_BIND, avec) != 0) {
-#endif
- err = -errno;
- goto out;
- }
-
- return 0;
-out:
- errno = -err;
- return -1;
-}
-
-int
-SYSIO_INTERFACE_NAME(listen)(int s, int backlog)
-{
- int err;
- struct file *fil;
-#ifdef SYSIO_SYS_socketcall
- unsigned long avec[2];
-#endif
-
- err = 0;
-
- fil = _sysio_fd_find(s);
- if (!fil) {
- err = -EBADF;
- goto out;
- }
-
-#ifndef SYSIO_SYS_socketcall
- if (syscall(SYSIO_SYS_listen,
- I2SKI(fil->f_ino)->ski_fd,
- backlog) != 0) {
-#else
- avec[0] = I2SKI(fil->f_ino)->ski_fd;
- avec[1] = backlog;
- if (syscall(SYSIO_SYS_socketcall, SYS_LISTEN, avec) != 0) {
-#endif
- err = -errno;
- goto out;
- }
-
- return 0;
-out:
- errno = -err;
- return -1;
-}
-
-int
-SYSIO_INTERFACE_NAME(connect)(int sockfd,
- const struct sockaddr *serv_addr,
- socklen_t addrlen)
-{
- int err;
- struct file *fil;
-#ifdef SYSIO_SYS_socketcall
- unsigned long avec[3];
-#endif
-
- err = 0;
-
- fil = _sysio_fd_find(sockfd);
- if (!fil) {
- err = -EBADF;
- goto out;
- }
-
-#ifndef SYSIO_SYS_socketcall
- if (syscall(SYSIO_SYS_connect,
- I2SKI(fil->f_ino)->ski_fd,
- serv_addr,
- addrlen) != 0) {
-#else
- avec[0] = I2SKI(fil->f_ino)->ski_fd;
- avec[1] = (unsigned long )serv_addr;
- avec[2] = addrlen;
- if (syscall(SYSIO_SYS_socketcall, SYS_CONNECT, avec) != 0) {
-#endif
- err = -errno;
- goto out;
- }
-
- return 0;
-out:
- errno = -err;
- return -1;
-}
+++ /dev/null
-/.dirstamp
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#ifdef __linux__
-#define _BSD_SOURCE
-#endif
-
-#include <stdio.h> /* for NULL */
-#include <stdlib.h>
-#ifdef __linux__
-#include <string.h>
-#endif
-#include <unistd.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/syscall.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/fcntl.h>
-#if 0
-#include <sys/vfs.h>
-#endif
-#ifdef _HAVE_STATVFS
-#include <sys/statvfs.h>
-#endif
-#include <utime.h>
-#include <sys/queue.h>
-
-#include "xtio.h"
-#include "sysio.h"
-#include "fs.h"
-#include "mount.h"
-#include "inode.h"
-
-#include "fs_yod.h"
-
-/*
- * Remote file system driver
- * calls are re-directed to the initiating yod
- */
-#include "cplant-yod.h"
-
-/* stat struct used by yod, which
- * is not compiled with __USE_FILE_OFFSET64
- */
-#define __yod_stat stat
-#ifdef ALPHA_LINUX
-#define COPY_STAT(src, dest) \
-do { \
- memset((dest), 0, sizeof((*dest))); \
- (dest)->st_dev = (src)->st_dev; \
- (dest)->st_ino = (src)->st_ino; \
- (dest)->st_mode = (src)->st_mode; \
- (dest)->st_nlink = (src)->st_nlink; \
- (dest)->st_uid = (src)->st_uid; \
- (dest)->st_gid = (src)->st_gid; \
- (dest)->st_rdev = (src)->st_rdev; \
- (dest)->st_size = (src)->st_size; \
- (dest)->st_atime = (src)->st_atime; \
- (dest)->st_mtime = (src)->st_mtime; \
- (dest)->st_ctime = (src)->st_ctime; \
- (dest)->st_blksize = (src)->st_blksize; \
- (dest)->st_blocks = (src)->st_blocks; \
- (dest)->st_flags = (src)->st_flags; \
- (dest)->st_gen = (src)->st_gen; \
-} while (0)
-#else
-#define COPY_STAT(src, dest) \
-do { \
- memset((dest), 0, sizeof((*dest))); \
- (dest)->st_dev = (src)->st_dev; \
- (dest)->st_ino = (src)->st_ino; \
- (dest)->st_mode = (src)->st_mode; \
- (dest)->st_nlink = (src)->st_nlink; \
- (dest)->st_uid = (src)->st_uid; \
- (dest)->st_gid = (src)->st_gid; \
- (dest)->st_rdev = (src)->st_rdev; \
- (dest)->st_size = (src)->st_size; \
- (dest)->st_atime = (src)->st_atime; \
- (dest)->st_mtime = (src)->st_mtime; \
- (dest)->st_ctime = (src)->st_ctime; \
- (dest)->st_blksize = (src)->st_blksize; \
- (dest)->st_blocks = (src)->st_blocks; \
-} while (0)
-#endif
-
-/*
- * Yod file identifiers format.
- */
-struct yod_inode_identifier {
- dev_t dev; /* device number */
- ino_t ino; /* i-number */
-#ifdef HAVE_GENERATION
- unsigned int gen; /* generation number */
-#endif
-};
-
-/*
- * Driver-private i-node information we keep about local host file
- * system objects.
- */
-struct yod_inode {
- unsigned ni_seekok : 1; /* can seek? */
- struct yod_inode_identifier ni_ident; /* unique identifier */
- struct file_identifier ni_fileid; /* ditto */
- int ni_fd; /* host fildes */
- int ni_oflags; /* flags, from open */
- unsigned ni_nopens; /* soft ref count */
- _SYSIO_OFF_T ni_fpos; /* current pos */
-};
-
-static int yod_inop_lookup(struct pnode *pno,
- struct inode **inop,
- struct intent *intnt,
- const char *path);
-static int yod_inop_getattr(struct pnode *pno,
- struct inode *ino,
- struct intnl_stat *stbuf);
-static int yod_inop_setattr(struct pnode *pno,
- struct inode *ino,
- unsigned mask,
- struct intnl_stat *stbuf);
-static ssize_t yod_filldirentries(struct inode *ino,
- off64_t *posp,
- char *buf,
- size_t nbytes);
-static int yod_inop_mkdir(struct pnode *pno, mode_t mode);
-static int yod_inop_rmdir(struct pnode *pno);
-static int yod_inop_symlink(struct pnode *pno, const char *data);
-static int yod_inop_readlink(struct pnode *pno, char *buf, size_t bufsiz);
-static int yod_inop_open(struct pnode *pno, int flags, mode_t mode);
-static int yod_inop_close(struct inode *ino);
-static int yod_inop_link(struct pnode *old, struct pnode *new);
-static int yod_inop_unlink(struct pnode *pno);
-static int yod_inop_rename(struct pnode *old, struct pnode *new);
-static _SYSIO_OFF_T yod_inop_pos (struct inode *ino, _SYSIO_OFF_T off);
-static int yod_inop_read(struct inode *ino, struct ioctx *ioctx);
-static int yod_inop_write(struct inode *ino, struct ioctx *ioctx);
-static int yod_inop_iodone(struct ioctx *ioctx);
-static int yod_inop_fcntl(struct inode *ino, int cmd, va_list ap, int *rtn);
-static int yod_inop_sync(struct inode *ino);
-static int yod_inop_datasync(struct inode *ino);
-static int yod_inop_ioctl(struct inode *ino,
- unsigned long int request,
- va_list ap);
-static int yod_inop_mknod(struct pnode *pno, mode_t mode, dev_t dev);
-#ifdef _HAVE_STATVFS
-static int yod_inop_statvfs(struct pnode *pno,
- struct inode *ino,
- struct intnl_statvfs *buf);
-#endif
-static void yod_inop_gone(struct inode *ino);
-
-static struct inode_ops yod_i_ops = {
- yod_inop_lookup,
- yod_inop_getattr,
- yod_inop_setattr,
- yod_filldirentries,
- yod_inop_mkdir,
- yod_inop_rmdir,
- yod_inop_symlink,
- yod_inop_readlink,
- yod_inop_open,
- yod_inop_close,
- yod_inop_link,
- yod_inop_unlink,
- yod_inop_rename,
- yod_inop_read,
- yod_inop_write,
- yod_inop_pos,
- yod_inop_iodone,
- yod_inop_fcntl,
- yod_inop_sync,
- yod_inop_datasync,
- yod_inop_ioctl,
- yod_inop_mknod,
-#ifdef _HAVE_STATVFS
- yod_inop_statvfs,
-#endif
- yod_inop_gone
-};
-
-static int yod_fsswop_mount(const char *source,
- unsigned flags,
- const void *data,
- struct pnode *tocover,
- struct mount **mntp);
-
-static struct fssw_ops yod_fssw_ops = {
- yod_fsswop_mount
-};
-
-static void yod_fsop_gone(struct filesys *fs);
-
-static struct filesys_ops yod_inodesys_ops = {
- yod_fsop_gone
-};
-
-/*
- * Placeholder internal mount as in native driver
- */
-static struct mount *yod_internal_mount = NULL;
-
-/*
- * Given i-node, return driver private part.
- */
-#define I2NI(ino) ((struct yod_inode *)((ino)->i_private))
-
-/*
- * stat -- by path.
- */
-static int
-yod_stat(const char *path, struct intnl_stat *buf)
-{
- int err;
- struct __yod_stat stbuf;
-
- err = stat_yod(path, &stbuf);
- if (err)
- err = -errno;
- COPY_STAT(&stbuf, buf);
-
- return err;
-}
-
-/*
- * stat -- by fildes
- */
-static int
-yod_fstat(int fd, struct intnl_stat *buf)
-{
- int err;
- struct __yod_stat stbuf;
-
- err = fstat_yod(fd, &stbuf);
- if (err)
- err = -errno;
- COPY_STAT(&stbuf, buf);
-
- return err;
-}
-
-/*
- * Introduce an i-node to the system.
- */
-static struct inode *
-yod_i_new(struct filesys *fs, struct intnl_stat *buf)
-{
- struct yod_inode *nino;
- struct inode *ino;
-
- nino = malloc(sizeof(struct yod_inode));
- if (!nino)
- return NULL;
- bzero(&nino->ni_ident, sizeof(nino->ni_ident));
- nino->ni_seekok = 0;
- nino->ni_ident.dev = buf->st_dev;
- nino->ni_ident.ino = buf->st_ino;
-#ifdef HAVE_GENERATION
- nino->ni_ident.gen = buf->st_gen;
-#endif
- nino->ni_fileid.fid_data = &nino->ni_ident;
- nino->ni_fileid.fid_len = sizeof(nino->ni_ident);
- nino->ni_fd = -1;
- nino->ni_oflags = 0;
- nino->ni_nopens = 0;
- nino->ni_fpos = 0;
- ino =
- _sysio_i_new(fs,
- &nino->ni_fileid,
- buf,
- 0,
- &yod_i_ops,
- nino);
- if (!ino)
- free(nino);
- return ino;
-}
-
-/*
- * Initialize this driver.
- */
-int
-_sysio_yod_init()
-{
-
- /*
- * Capture current process umask and reset our process umask to
- * zero. All permission bits to open/creat/setattr are absolute --
- * They've already had a umask applied, when appropriate.
- */
- _sysio_umask = syscall(SYS_umask, 0);
-
- return _sysio_fssw_register("yod", &yod_fssw_ops);
-}
-
-/*
- * Create private, internal, view of the hosts name space.
- */
-static int
-create_internal_namespace()
-{
- int err;
- struct mount *mnt;
- struct inode *rootino;
- struct pnode_base *rootpb;
- static struct qstr noname = { NULL, 0, 0 };
- struct filesys *fs;
- struct intnl_stat stbuf;
-
- if (yod_internal_mount) {
- /*
- * Reentered!
- */
- abort();
- }
-
- /*
- * We maintain an artificial, internal, name space in order to
- * have access to fully qualified path names in the various routines.
- * Initialize that name space now.
- */
- mnt = NULL;
- rootino = NULL;
- rootpb = NULL;
- fs = _sysio_fs_new(&yod_inodesys_ops, 0, NULL);
- if (!fs) {
- err = -ENOMEM;
- goto error;
- }
-
- /*
- * Get root i-node.
- */
- err = yod_stat("/", &stbuf);
- if (err)
- goto error;
- rootino = yod_i_new(fs, &stbuf);
- if (!rootino) {
- err = -ENOMEM;
- goto error;
- }
-
- /*
- * Generate base path-node for root.
- */
- rootpb = _sysio_pb_new(&noname, NULL, rootino);
- if (!rootpb) {
- err = -ENOMEM;
- goto error;
- }
-
- /*
- * Mount it. This name space is disconnected from the
- * rest of the system -- Only available within this driver.
- */
- err = _sysio_do_mount(fs, rootpb, 0, NULL, &mnt);
- if (err)
- goto error;
-
- yod_internal_mount = mnt;
- return 0;
-error:
- if (mnt) {
- if (_sysio_do_unmount(mnt) != 0)
- abort();
- fs = NULL;
- rootpb = NULL;
- rootino = NULL;
- }
- if (rootpb)
- _sysio_pb_gone(rootpb);
- if (fs) {
- FS_RELE(fs);
- }
-
- return err;
-}
-
-static int
-yod_fsswop_mount(const char *source,
- unsigned flags,
- const void *data __IS_UNUSED,
- struct pnode *tocover,
- struct mount **mntp)
-{
- int err;
- struct nameidata nameidata;
- struct mount *mnt;
-
- /*
- * Caller must use fully qualified path names when specifying
- * the source.
- */
- if (*source != '/')
- return -ENOENT;
-
- if (!yod_internal_mount) {
- err = create_internal_namespace();
- if (err)
- return err;
- }
-
- /*
- * Lookup the source in the internally maintained name space.
- */
- ND_INIT(&nameidata, 0, source, yod_internal_mount->mnt_root, NULL);
- err = _sysio_path_walk(yod_internal_mount->mnt_root, &nameidata);
- if (err)
- return err;
-
- /*
- * Have path-node specified by the given source argument. Let the
- * system finish the job, now.
- */
- err =
- _sysio_do_mount(yod_internal_mount->mnt_fs,
- nameidata.nd_pno->p_base,
- flags,
- tocover,
- &mnt);
- /*
- * Release the internal name space pnode and clean up any
- * aliases we might have generated. We really don't need to cache them
- * as they are only used at mount time..
- */
- P_RELE(nameidata.nd_pno);
- (void )_sysio_p_prune(yod_internal_mount->mnt_root);
-
- if (!err) {
- FS_REF(yod_internal_mount->mnt_fs);
- *mntp = mnt;
- }
- return err;
-}
-
-static int
-yod_i_invalid(struct inode *inop, struct intnl_stat *stat)
-{
- /*
- * Validate passed in inode against stat struct info
- */
- struct yod_inode *nino = I2NI(inop);
-
- if ((nino->ni_ident.dev != stat->st_dev ||
- nino->ni_ident.ino != stat->st_ino ||
-#ifdef HAVE_GENERATION
- nino->ni_ident.gen != stat->st_gen ||
-#endif
- ((inop)->i_stbuf.st_mode & S_IFMT) != (stat->st_mode & S_IFMT)) ||
- (((inop)->i_stbuf.st_rdev != stat->st_rdev) &&
- (S_ISCHR((inop)->i_stbuf.st_mode) ||
- S_ISBLK((inop)->i_stbuf.st_mode))))
- return 1;
-
- return 0;
-}
-
-/*
- * Find, and validate, or create i-node by host-relative path. Returned i-node
- * is referenced.
- */
-static int
-yod_iget(struct filesys *fs,
- const char *path,
- struct inode **inop,
- int forced)
-{
- int err;
- struct inode *ino;
- struct intnl_stat stbuf;
- struct yod_inode_identifier ident;
- struct file_identifier fileid;
-
- /*
- * Get file status.
- */
- err = yod_stat(path, &stbuf);
- if (err) {
- *inop = NULL;
- return err;
- }
-
- /*
- * Validate?
- */
- if (*inop) {
- if (!yod_i_invalid(*inop, &stbuf))
- return 0;
- /*
- * Invalidate.
- */
- *inop = NULL;
- }
-
- /*
- * I-node is not already known. Find or create it.
- */
- bzero(&ident, sizeof(ident));
- ident.dev = stbuf.st_dev;
- ident.ino = stbuf.st_ino;
-#ifdef HAVE_GENERATION
- ident.gen = stbuf.st_gen;
-#endif
- fileid.fid_data = &ident;
- fileid.fid_len = sizeof(ident);
- ino = _sysio_i_find(fs, &fileid);
- if (ino && forced) {
- /*
- * Insertion was forced but it's already present!
- */
- if (yod_i_invalid(ino, &stbuf)) {
- /*
- * Cached inode has stale attrs
- * make way for the new one
- */
- I_RELE(ino);
- _sysio_i_undead(ino);
- ino = NULL;
- } else
- /*
- * OK to reuse cached inode
- */
- goto out;
- }
-
- if (!ino) {
- ino = yod_i_new(fs, &stbuf);
- if (!ino)
- err = -ENOMEM;
- }
-out:
- if (!err)
- *inop = ino;
- return err;
-}
-
-/*
- * Look up named object in host's name space by path.
- */
-static int
-yod_path_lookup(struct filesys *fs, const char *path, struct inode **inop)
-{
-
- return yod_iget(fs, path, inop, 0);
-}
-
-/*
- * Look up object by it's path node.
- */
-static int
-yod_i_lookup(struct filesys *fs, struct pnode_base *pb, struct inode **inop)
-{
- int err;
- char *path;
-
- path = _sysio_pb_path(pb, '/');
- if (!path)
- return -ENOMEM;
- err = yod_path_lookup(fs, path, inop);
- free(path);
- return err;
-}
-
-static int
-yod_inop_lookup(struct pnode *pno,
- struct inode **inop,
- struct intent *intnt __IS_UNUSED,
- const char *path __IS_UNUSED)
-{
- int err;
-
- *inop = pno->p_base->pb_ino;
-
- /*
- * Don't have an inode yet. Because we translate everything back to
- * a single name space for the host, we will assume the object the
- * caller is looking for has no existing alias in our internal
- * name space. We don't see the same file on different mounts in the
- * underlying host FS as the same file.
- *
- * The file identifier *will* be unique. It's got to have a different
- * dev.
- */
- err = yod_i_lookup(pno->p_mount->mnt_fs, pno->p_base, inop);
- if (err)
- *inop = NULL;
- return err;
-}
-
-static int
-yod_inop_getattr(struct pnode *pno, struct inode *ino, struct intnl_stat *stbuf)
-{
- char *path;
- int err;
-
- path = NULL;
- if (!ino || I2NI(ino)->ni_fd < 0) {
- path = _sysio_pb_path(pno->p_base, '/');
- if (!path)
- return -ENOMEM;
- }
- err =
- path
- ? yod_stat(path, stbuf)
- : yod_fstat(I2NI(ino)->ni_fd, stbuf);
- if (path)
- free(path);
- return err;
-}
-
-static int
-yod_inop_setattr(struct pnode *pno,
- struct inode *ino,
- unsigned mask,
- struct intnl_stat *stbuf)
-{
- char *path;
- int fd;
- struct intnl_stat st;
- int err;
-
- path = NULL;
- fd = ino ? I2NI(ino)->ni_fd : -1;
- if (fd < 0 || mask & (SETATTR_MTIME|SETATTR_ATIME)) {
- if (!pno)
- return -EEXIST;
- path = _sysio_pb_path(pno->p_base, '/');
- if (!path)
- return -ENOMEM;
- }
-
- /*
- * Get current status for undo.
- */
- err =
- fd < 0
- ? yod_stat(path, &st)
- : yod_fstat(fd, &st);
- if (err)
- goto out;
-
- if (mask & SETATTR_MODE) {
- mode_t mode;
-
- /*
- * Alter permissions attribute.
- */
- mode = stbuf->st_mode & 07777;
- err = chmod_yod(path, mode);
- }
- if (err)
- mask &= ~SETATTR_MODE;
-
- if (mask & (SETATTR_UID|SETATTR_GID)) {
-
- /*
- * Alter owner and/or group identifiers.
- */
- err = chown_yod(path,
- mask & SETATTR_UID
- ? stbuf->st_uid
- : (uid_t )-1,
- mask & SETATTR_GID
- ? stbuf->st_gid
- : (gid_t )-1);
- }
- if (err)
- mask &= ~(SETATTR_UID|SETATTR_GID);
- else if (mask & SETATTR_LEN) {
- /*
- * Do the truncate last. It can't be undone.
- */
- (void )(fd < 0
- ? truncate_yod(path, stbuf->st_size)
- : ftruncate_yod(fd, stbuf->st_size));
- }
- if (!err)
- goto out;
- /*
- * Undo after error. Some or all of this might not work... We
- * can but try.
- */
- if (mask & (SETATTR_UID|SETATTR_GID)) {
- (void )chown_yod(path,
- mask & SETATTR_UID
- ? st.st_uid
- : (uid_t )-1,
- mask & SETATTR_GID
- ? st.st_gid
- : (gid_t )-1);
- }
- if (mask & SETATTR_MODE) {
- chmod_yod(path, st.st_mode & 07777);
- }
-out:
- if (path)
- free(path);
- return err;
-}
-
-static ssize_t
-yod_filldirentries(struct inode *ino,
- char *buf,
- _SYSIO_OFF_T *posp,
- size_t nbytes)
-{
- struct yod_inode *nino = I2NI(ino);
- _SYSIO_OFF_T result;
- ssize_t cc;
-
- assert(nino->ni_fd >= 0);
-
- result = *basep;
- if (*basep != nino->ni_fpos &&
- (result = lseek_yod(nino->ni_fd,
- *posp,
- SEEK_SET) == -1))
- return -errno;
- nino->ni_fpos = result;
- memset(buf, 0, nbytes);
- /*
- * This is almost certainly broken. The resulting position parameter
- * points to the block just filled, not the next.
- */
- cc = getdirentries_yod(nino->ni_fd, buf, nbytes, &result);
- if (cc < 0)
- return -errno;
- nino->ni_fpos = *posp = result;
- return cc;
-}
-
-static int
-yod_inop_mkdir(struct pnode *pno, mode_t mode)
-{
- char *path;
- int err;
-
- path = _sysio_pb_path(pno->p_base, '/');
- if (!path)
- return -ENOMEM;
-
- err = mkdir_yod(path, mode);
- free(path);
- return err;
-}
-
-static int
-yod_inop_rmdir(struct pnode *pno)
-{
- char *path;
- int err;
-
- path = _sysio_pb_path(pno->p_base, '/');
- if (!path)
- return -ENOMEM;
-
- err = rmdir_yod(path);
- free(path);
- return err;
-}
-
-static int
-yod_inop_symlink(struct pnode *pno, const char *data)
-{
- char *path;
- int err;
-
- path = _sysio_pb_path(pno->p_base, '/');
- if (!path)
- return -ENOMEM;
-
- err = symlink_yod(data, path);
- free(path);
- return err;
-}
-
-static int
-yod_inop_readlink(struct pnode *pno __IS_UNUSED,
- char *buf __IS_UNUSED,
- size_t bufsiz __IS_UNUSED)
-{
-
- return -ENOSYS;
-}
-
-static int
-yod_inop_open(struct pnode *pno, int flags, mode_t mode)
-{
- struct yod_inode *nino;
- char *path;
- int fd;
-
- path = _sysio_pb_path(pno->p_base, '/');
- if (!path)
- return -ENOMEM;
-
- /*
- * Whether the file is already open, or not, makes no difference.
- * Want to always give the host OS a chance to authorize in case
- * something has changed underneath us.
- */
- if (flags & O_WRONLY) {
- /*
- * Promote write-only attempt to RW.
- */
- flags &= ~O_WRONLY;
- flags |= O_RDWR;
- }
- fd = open_yod(path, flags, mode);
- if (!pno->p_base->pb_ino && fd >= 0) {
- int err;
-
- /*
- * Success but we need to return an i-node.
- */
- err =
- yod_iget(pno->p_mount->mnt_fs,
- path,
- &pno->p_base->pb_ino,
- 1);
- if (err) {
- (void )close_yod(fd);
- if (err == -EEXIST)
- abort();
- fd = err;
- }
- }
- free(path);
- if (fd < 0)
- return -errno;
-
- /*
- * Remember this new open.
- */
- nino = I2NI(pno->p_base->pb_ino);
- nino->ni_nopens++;
- assert(nino->ni_nopens);
-
- if (nino->ni_fd >= 0) {
- if ((nino->ni_oflags & O_RDWR) ||
- (flags & (O_RDONLY|O_WRONLY|O_RDWR)) == O_RDONLY) {
- /*
- * Keep existing.
- */
- (void )close_yod(fd);
- return 0;
- }
- (void )close_yod(nino->ni_fd);
- }
- /*
- * Invariant; First open. Must init.
- */
- nino->ni_fpos = 0;
- nino->ni_fd = fd;
-
- /*
- * Need to know whether we can seek on this
- * descriptor.
- */
- nino->ni_seekok =
- lseek_yod(nino->ni_fd, 0, SEEK_CUR) != 0 ? 0 : 1;
-
- return 0;
-}
-
-static int
-yod_inop_close(struct inode *ino)
-{
- struct yod_inode *nino = I2NI(ino);
- int err;
-
- if (nino->ni_fd < 0)
- abort();
-
- assert(nino->ni_nopens);
- if (--nino->ni_nopens)
- return 0;
-
- err = close_yod(nino->ni_fd);
- if (err)
- return -errno;
-
- nino->ni_fd = -1;
- nino->ni_fpos = 0;
- return 0;
-}
-
-static int
-yod_inop_link(struct pnode *old, struct pnode *new)
-{
- int err;
- char *opath, *npath;
-
- err = 0;
-
- opath = _sysio_pb_path(old->p_base, '/');
- npath = _sysio_pb_path(new->p_base, '/');
- if (!(opath && npath)) {
- err = -ENOMEM;
- goto out;
- }
-
- err = link_yod(opath, npath);
-
-out:
- if (opath)
- free(opath);
- if (npath)
- free(npath);
-
- return err;
-}
-
-static int
-yod_inop_unlink(struct pnode *pno)
-{
- char *path;
- int err = 0;
-
- path = _sysio_pb_path(pno->p_base, '/');
- if (!path)
- return -ENOMEM;
-
- /*
- * For this driver, unlink is easy with open files. Since the
- * file remains open to the system, too, the descriptors are still
- * valid.
- *
- * Other drivers will have some difficulty here as the entry in the
- * file system name space must be removed without sacrificing access
- * to the file itself. In NFS this is done with a mechanism referred
- * to as a `silly delete'. The file is moved to a temporary name
- * (usually .NFSXXXXXX, where the X's are replaced by the PID and some
- * unique characters) in order to simulate the proper semantic.
- */
- if (unlink_yod(path) != 0)
- err = -errno;
- free(path);
- return err;
-}
-
-/*
- * A helper function performing the real IO operation work.
- *
- * We don't really have async IO. We'll just perform the function
- * now.
- */
-static int
-doio(ssize_t (*f)(void *, size_t, _SYSIO_OFF_T, struct yod_inode *),
- struct ioctx *ioctx)
-{
- struct yod_inode *nino = I2NI(ioctx->ioctx_ino);
-
- ioctx->ioctx_cc =
- _sysio_doio(ioctx->ioctx_xtv, ioctx->ioctx_xtvlen,
- ioctx->ioctx_iov, ioctx->ioctx_iovlen,
- (ssize_t (*)(void *, size_t,
- _SYSIO_OFF_T, void *))f,
- nino);
- if (ioctx->ioctx_cc < 0) {
- ioctx->ioctx_errno = -ioctx->ioctx_cc;
- ioctx->ioctx_cc = -1;
- return -1;
- }
- nino->ni_fpos += ioctx->ioctx_cc;
- ioctx->ioctx_done = 1;
- return 0;
-}
-
-static ssize_t
-yod_read_simple(void *buf,
- size_t nbytes,
- _SYSIO_OFF_T off,
- struct yod_inode *nino)
-{
- if (off != nino->ni_fpos) {
- _SYSIO_OFF_T rtn;
-
- rtn = lseek_yod(nino->ni_fd, off, SEEK_SET);
- if (rtn < 0)
- return -1;
- nino->ni_fpos = rtn;
- }
- return read_yod(nino->ni_fd, buf, nbytes);
-}
-
-static int
-yod_inop_read(struct inode *ino __IS_UNUSED, struct ioctx *ioctx)
-{
-
- return doio(yod_read_simple, ioctx);
-}
-
-static int
-yod_inop_rename(struct pnode *old, struct pnode *new)
-{
- int err;
- char *opath, *npath;
-
- opath = _sysio_pb_path(old->p_base, '/');
- npath = _sysio_pb_path(new->p_base, '/');
- if (!(opath && npath)) {
- err = -ENOMEM;
- goto out;
- }
-
- err = rename_yod(opath, npath);
-
-out:
- if (opath)
- free(opath);
- if (npath)
- free(npath);
-
- return err;
-}
-
-static ssize_t
-yod_write_simple(void *buf,
- size_t nbytes,
- _SYSIO_OFF_T off,
- struct yod_inode *nino)
-{
-
- if (off != nino->ni_fpos) {
- _SYSIO_OFF_T rtn;
-
- rtn = lseek_yod(nino->ni_fd, off, SEEK_SET);
- if (rtn < 0)
- return -1;
- nino->ni_fpos = rtn;
- }
- return write_yod(nino->ni_fd, buf, nbytes);
-}
-
-static int
-yod_inop_write(struct inode *ino __IS_UNUSED, struct ioctx *ioctx)
-{
-
- return doio(yod_write_simple, ioctx);
-}
-
-static _SYSIO_OFF_T
-yod_inop_pos(struct inode *ino, _SYSIO_OFF_T off)
-{
- struct yod_inode *nino = I2NI(ino);
- int err;
-
- err = lseek_yod(nino->ni_fd, off, SEEK_SET);
- return err < 0 ? err : off;
-}
-
-static int
-yod_inop_iodone(struct ioctx *ioctxp __IS_UNUSED)
-{
-
- /*
- * It's always done in this driver. It completed when posted.
- */
- return 1;
-}
-
-static int
-yod_inop_fcntl(struct inode *ino, int cmd, va_list ap, int *rtn)
-{
- struct yod_inode *nino = I2NI(ino);
- long arg;
- int err;
-
- if (nino->ni_fd < 0)
- abort();
-
- err = 0;
- switch (cmd) {
- case F_GETFD:
- case F_GETFL:
-#ifdef F_GETOWN
- case F_GETOWN:
-#endif
- *rtn = syscall(SYS_fcntl, nino->ni_fd, cmd);
- if (*rtn == -1)
- err = -errno;
- break;
- case F_DUPFD:
- case F_SETFD:
- case F_SETFL:
- case F_GETLK:
- case F_SETLK:
- case F_SETLKW:
-#ifdef F_SETOWN
- case F_SETOWN:
-#endif
- arg = va_arg(ap, long);
- *rtn = syscall(SYS_fcntl, nino->ni_fd, cmd, arg);
- if (*rtn == -1)
- err = -errno;
- break;
- default:
- *rtn = -1;
- err = -EINVAL;
- }
- return err;
-}
-
-static int
-yod_inop_mknod(struct pnode *pno __IS_UNUSED,
- mode_t mode __IS_UNUSED,
- dev_t dev __IS_UNUSED)
-{
-
- return -ENOSYS;
-}
-
-#ifdef _HAVE_STATVFS
-static int
-yod_inop_statvfs(struct pnode *pno,
- struct inode *ino,
- struct intnl_statvfs *buf)
-{
- char *path;
- int rc;
- struct statfs fs;
-
- path = NULL;
- if (!ino || I2NI(ino)->ni_fd < 0) {
- path = _sysio_pb_path(pno->p_base, '/');
- if (!path)
- return -ENOMEM;
- }
-
- /*
- * The syscall interface does not support SYS_fstatvfs.
- * Should possibly return ENOSYS, but thought it
- * better to use SYS_fstatfs and fill in as much of
- * the statvfs structure as possible. This allows
- * for more of a test of the sysio user interface.
- */
- rc =
- path
- ? statfs_yod(path, &fs)
- : fstatfs_yod(I2NI(ino)->ni_fd, &fs);
- if (path)
- free(path);
- if (rc < 0)
- return -errno;
-
- buf->f_bsize = fs.f_bsize; /* file system block size */
- buf->f_frsize = fs.f_bsize; /* file system fundamental block size */
- buf->f_blocks = fs.f_blocks;
- buf->f_bfree = fs.f_bfree;
- buf->f_bavail = fs.f_bavail;
- buf->f_files = fs.f_files; /* Total number serial numbers */
- buf->f_ffree = fs.f_ffree; /* Number free serial numbers */
- buf->f_favail = fs.f_ffree; /* Number free ser num for non-privileged*/
- buf->f_fsid = fs.f_fsid.__val[1];
- buf->f_flag = 0; /* No equiv in statfs; maybe use type? */
- buf->f_namemax = fs.f_namelen;
- return 0;
-}
-#endif
-
-static int
-yod_inop_sync(struct inode *ino)
-{
-
- assert(I2NI(ino)->ni_fd >= 0);
-
- return fsync_yod(I2NI(ino)->ni_fd);
-}
-
-static int
-yod_inop_datasync(struct inode *ino)
-{
-
- assert(I2NI(ino)->ni_fd >= 0);
-
- return fsync_yod(I2NI(ino)->ni_fd);
-}
-
-static int
-yod_inop_ioctl(struct inode *ino __IS_UNUSED,
- unsigned long int request __IS_UNUSED,
- va_list ap __IS_UNUSED)
-{
-
- /*
- * I'm lazy. Maybe implemented later.
- */
- errno = ENOTTY;
- return -1;
-}
-
-static void
-yod_inop_gone(struct inode *ino)
-{
- struct yod_inode *nino = I2NI(ino);
-
- if (nino->ni_fd)
- (void )close(nino->ni_fd);
- free(ino->i_private);
-}
-
-static void
-yod_fsop_gone(struct filesys *fs __IS_UNUSED)
-{
-
- /*
- * Do nothing. There is no private part maintained for the
- * yod file interface.
- */
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-/*
- * Remote file system driver support.
- */
-
-extern int _sysio_yod_init();
+++ /dev/null
-if WITH_CPLANT_YOD
-YOD_SRCS = drivers/yod/fs_yod.c
-YOD_DRIVER_FLAGS = -DCPLANT_YOD
-else
-YOD_SRCS =
-YOD_DRIVER_FLAGS =
-endif
-
-# Bring yod files along in the distribution regardless
-YOD_EXTRA = include/cplant-yod.h drivers/yod/fs_yod.h drivers/yod/module.mk
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-/*
- * cplant yod I/O functions
- */
-extern int chmod_yod(const char* path, mode_t);
-extern int chown_yod(const char* path, uid_t, gid_t);
-extern int stat_yod(const char *path, struct stat *sbuf);
-extern int fstat_yod(int fd, struct stat *buf);
-#ifdef _HAVE_STATVFS
-extern int statfs_yod(const char *path, struct statfs *sbuf);
-extern int fstatfs_yod(int fd, struct statfs *buf);
-#endif
-extern int mkdir_yod(const char *path, mode_t mode);
-extern int rmdir_yod(const char *path);
-extern int getdirentries_yod(int fd, char *buf, size_t nbytes, loff_t *basep);
-extern int link_yod(const char *path1, const char *path2);
-extern int unlink_yod(const char *path);
-extern int symlink_yod(const char *path1, const char *path2 );
-extern int rename_yod( const char *path1, const char *path2 );
-extern int open_yod(const char *fname, int flags, mode_t mode);
-extern int close_yod(int);
-extern ssize_t write_yod(int fd, const void *buff, size_t nbytes);
-extern ssize_t read_yod(int fd, void *buff, size_t nbytes);
-extern int fsync_yod(int fd);
-extern int truncate_yod(const char *path, off_t length);
-extern int ftruncate_yod(int fd, long length);
-extern off_t lseek_yod(int fd, off_t offset, int whence);
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <unistd.h>
-
-#ifndef _CREDS_H_
-#define _CREDS_H_
-
-/*
- * Superuser's UID.
- */
-#define _SYSIO_ROOT_UID 0
-
-/*
- * Data structure for user credentials
- */
-
-struct creds {
- uid_t creds_uid;
- gid_t *creds_gids;
- int creds_ngids;
-};
-
-
-#ifdef _SYSIO_ROOT_UID
-/*
- * Is caller the superuser?
- */
-#define _sysio_is_root(_crp) \
- ((_crp)->creds_uid == _SYSIO_ROOT_UID)
-#endif
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-/*
- * Device support.
- */
-
-/*
- * Make a device number, composed of major and minor parts. We *assume* that
- * the system version of a dev_t is 16 bits or more.
- */
-#define SYSIO_MKDEV(major, minor) \
- ((((major) & 0xff) << 8) | ((minor) & 0xff))
-
-/*
- * Return major unit given dev number.
- */
-#define SYSIO_MAJOR_DEV(dev) \
- (((dev) >> 8) & 0xff)
-
-/*
- * Return minor unit given dev number.
- */
-#define SYSIO_MINOR_DEV(dev) \
- ((dev) & 0xff)
-
-extern const struct inode_ops _sysio_nodev_ops;
-
-#define _sysio_nodev_inop_lookup \
- (int (*)(struct pnode *, \
- struct inode **, \
- struct intent *, \
- const char *))_sysio_do_illop
-#define _sysio_nodev_inop_getattr \
- (int (*)(struct pnode *, \
- struct inode *, \
- struct intnl_stat *))_sysio_do_ebadf
-#define _sysio_nodev_inop_setattr \
- (int (*)(struct pnode *, \
- struct inode *, \
- unsigned , \
- struct intnl_stat *))_sysio_do_ebadf
-#define _sysio_nodev_filldirentries \
- (ssize_t (*)(struct inode *, \
- _SYSIO_OFF_T *, \
- char *, \
- size_t))_sysio_do_illop
-#define _sysio_nodev_inop_mkdir \
- (int (*)(struct pnode *, \
- mode_t))_sysio_do_illop
-#define _sysio_nodev_inop_rmdir \
- (int (*)(struct pnode *))_sysio_do_illop
-#define _sysio_nodev_inop_symlink \
- (int (*)(struct pnode *, \
- const char *))_sysio_do_illop
-#define _sysio_nodev_inop_readlink \
- (int (*)(struct pnode *, \
- char *, \
- size_t))_sysio_do_illop
-#define _sysio_nodev_inop_open \
- (int (*)(struct pnode *, \
- int, \
- mode_t))_sysio_do_enodev
-#define _sysio_nodev_inop_close \
- (int (*)(struct inode *))_sysio_do_ebadf
-#define _sysio_nodev_inop_link \
- (int (*)(struct pnode *, struct pnode *))_sysio_do_illop
-#define _sysio_nodev_inop_unlink \
- (int (*)(struct pnode *))_sysio_do_illop
-#define _sysio_nodev_inop_rename \
- (int (*)(struct pnode *, struct pnode *))_sysio_do_illop
-#define _sysio_nodev_inop_read \
- (int (*)(struct inode *, \
- struct ioctx *))_sysio_do_ebadf
-#define _sysio_nodev_inop_write \
- (int (*)(struct inode *, \
- struct ioctx *))_sysio_do_ebadf
-#define _sysio_nodev_inop_pos \
- (_SYSIO_OFF_T (*)(struct inode *, _SYSIO_OFF_T))_sysio_do_ebadf
-#define _sysio_nodev_inop_iodone \
- (int (*)(struct ioctx *))_sysio_do_einval
-#define _sysio_nodev_inop_fcntl \
- (int (*)(struct inode *, \
- int, \
- va_list, \
- int *))_sysio_do_ebadf
-#define _sysio_nodev_inop_sync \
- (int (*)(struct inode *))_sysio_do_ebadf
-#define _sysio_nodev_inop_datasync \
- (int (*)(struct inode *))_sysio_do_ebadf
-#define _sysio_nodev_inop_ioctl \
- (int (*)(struct inode *, \
- unsigned long int, \
- va_list))_sysio_do_ebadf
-#define _sysio_nodev_inop_mknod \
- (int (*)(struct pnode *, \
- mode_t, \
- dev_t))_sysio_do_illop
-#ifdef _HAVE_STATVFS
-#define _sysio_nodev_inop_statvfs \
- (int (*)(struct pnode *, \
- struct inode *, \
- struct intnl_statvfs *))_sysio_do_illop
-#endif
-#define _sysio_nodev_inop_gone \
- (void (*)(struct inode *ino))_sysio_do_noop
-
-extern int _sysio_dev_init(void);
-extern dev_t _sysio_dev_alloc(void);
-extern struct inode_ops *_sysio_dev_lookup(mode_t mode, dev_t dev);
-extern int _sysio_char_dev_register(int major,
- const char *name,
- struct inode_ops *ops);
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2006 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-/*
- * Open file support.
- */
-
-/*
- * Test whether large file support on this file.
- */
-#ifdef O_LARGEFILE
-#define _F_LARGEFILE(fil) \
- ((fil)->f_flags & O_LARGEFILE)
-#else
-#define _F_LARGEFILE(fil) \
- (1)
-#endif
-/*
- * Return max seek value for this file.
- */
-#define _SEEK_MAX(fil) \
- (_F_LARGEFILE(fil) ? _SYSIO_OFF_T_MAX : LONG_MAX)
-
-#ifdef _LARGEFILE64_SOURCE
-#define _SYSIO_FLOCK flock64
-#else
-#define _SYSIO_FLOCK flock
-#endif
-
-/*
- * A file record is maintained for each open file in the system. It holds
- * all the info necessary to track the context and parameters for the
- * operations that may be performed.
- */
-struct file {
- struct inode *f_ino; /* path node */
- _SYSIO_OFF_T f_pos; /* current stream pos */
- unsigned f_ref; /* ref count */
- int f_flags; /* open/fcntl flags */
-};
-
-/*
- * Reference a file record.
- */
-#define F_REF(fil) \
- do { \
- (fil)->f_ref++; \
- assert((fil)->f_ref); \
- } while (0)
-
-/*
- * Release reference to a file record.
- */
-#define F_RELE(fil) \
- do { \
- assert((fil)->f_ref); \
- (fil)->f_ref--; \
- if (!(fil)->f_ref) \
- _sysio_fgone(fil); \
- } while (0)
-
-/*
- * Init file record.
- *
- * NB: Don't forget to take a reference to the inode too!
- */
-#define _SYSIO_FINIT(fil, ino, flags) \
- do { \
- (fil)->f_ino = (ino); \
- (fil)->f_pos = 0; \
- (fil)->f_ref = 0; \
- (fil)->f_flags = (flags); \
- } while (0)
-
-/*
- * Determine if a file may be read/written.
- *
- * Given a ptr to an open file table entry and a flag indicating desired
- * access return non-zero if the file record indicates that the access is
- * permitted or zero, if not.
- *
- * 'r' for read access check
- * 'w' for write access check
- */
-
-#define F_CHKRW(_fil, _c) \
- (((_c) == 'r' && !((_fil)->f_flags & O_WRONLY)) || \
- ((_c) == 'w' && ((_fil)->f_flags & (O_WRONLY | O_RDWR))))
-
-struct ioctx;
-
-extern struct file *_sysio_fnew(struct inode *ino, int flags);
-extern void _sysio_fgone(struct file *fil);
-extern void _sysio_fcompletio(struct ioctx *ioctx, struct file *fil);
-extern int _sysio_fd_close(int fd);
-extern struct file *_sysio_fd_find(int fd);
-extern int _sysio_fd_set(struct file *fil, int fd, int force);
-extern int _sysio_fd_dup(int oldfd, int newfd, int force);
-extern int _sysio_fd_close_all(void);
-#ifdef ZERO_SUM_MEMORY
-extern void _sysio_fd_shutdown(void);
-#endif
-extern _SYSIO_OFF_T _sysio_lseek_prepare(struct file *fil,
- _SYSIO_OFF_T offset,
- int whence,
- _SYSIO_OFF_T max);
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-/*
- * File system or volume support.
- */
-#ifndef SYSIO_FS_H_
-#define SYSIO_FS_H_
-
-#include <sys/queue.h>
-
-struct filesys;
-
-struct pnode;
-struct mount;
-
-/*
- * File system switch operations.
- */
-struct fssw_ops {
- int (*fsswop_mount)(const char *source,
- unsigned flags,
- const void *data,
- struct pnode *tocover,
- struct mount **mntp);
-};
-
-/*
- * File system switch entry record.
- *
- * Each available file system or volume access driver is represented by
- * one of these switch entries in the switch.
- */
-struct fsswent {
- const char *fssw_name; /* entry name */
- LIST_ENTRY(fsswent) fssw_link; /* link to next */
- struct fssw_ops fssw_ops; /* operations */
-};
-
-/*
- * Init file system switch entry record.
- */
-#define FSSWENT_INIT(fsswent, name, ops) \
- do { \
- (fsswent)->fssw_name = (name); \
- (fsswent)->fssw_ops = (ops); \
- } while (0)
-
-struct inode;
-
-/*
- * File system operations.
- */
-struct filesys_ops {
- void (*fsop_gone)(struct filesys *);
-};
-
-/*
- * Define the desired size of the file system record's inode table. This should
- * probably be something fancy that tries to use up a system page, or the
- * like. I'm not feeling adventurous right now though. It is prime though.
- * That should help out the hash.
- */
-#ifndef FS_ITBLSIZ
-#define FS_ITBLSIZ 503
-#endif
-
-/*
- * Inode list head record.
- */
-LIST_HEAD(itable_entry, inode);
-
-/*
- * A filesys record is maintained for each active file system or volume.
- */
-struct filesys {
- dev_t fs_dev; /* device ID */
- unsigned fs_ref; /* soft ref count */
- unsigned fs_flags; /* flags (see below) */
- struct filesys_ops fs_ops; /* operations */
- void *fs_private; /* driver data */
- struct itable_entry fs_itbl[FS_ITBLSIZ]; /* inodes hash */
- unsigned long fs_id; /* ID */
- size_t fs_bsize; /* block size */
-};
-
-#define FS_F_RO 0x01 /* read-only */
-
-/*
- * Init file system record.
- */
-#define FS_INIT(fs, flags, ops, private) \
- do { \
- size_t __i; \
- struct itable_entry *__head; \
- \
- (fs)->fs_ref = 1; \
- (fs)->fs_flags = (flags); \
- (fs)->fs_ops = *(ops); \
- (fs)->fs_private = (private); \
- __i = FS_ITBLSIZ; \
- __head = (fs)->fs_itbl; \
- do { \
- LIST_INIT(__head); \
- __head++; \
- } while (--__i); \
- } while (0)
-
-/*
- * Reference file system record.
- */
-#define FS_REF(fs) \
- do { \
- ++(fs)->fs_ref; \
- assert((fs)->fs_ref); \
- } while (0)
-
-/*
- * Release reference to file system record.
- */
-#define FS_RELE(fs) \
- do { \
- assert((fs)->fs_ref); \
- if (!--(fs)->fs_ref) \
- _sysio_fs_gone(fs); \
- } while (0)
-
-extern struct fsswent *_sysio_fssw_lookup(const char *name);
-extern int _sysio_fssw_register(const char *name, struct fssw_ops *ops);
-extern char *incore_dir_template;
-extern struct filesys * _sysio_fs_new(struct filesys_ops *ops,
- unsigned mask,
- void *private);
-extern void _sysio_fs_gone(struct filesys *fs);
-#ifdef ZERO_SUM_MEMORY
-extern void _sysio_fssw_shutdown(void);
-#endif
-
-#endif /* SYSIO_FS_H_ */
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2006 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#if defined(AUTOMOUNT_FILE_NAME) && !defined(MAX_MOUNT_DEPTH)
-/*
- * Maximum number of automounts to attempt in path traversal.
- */
-#define MAX_MOUNT_DEPTH 64
-#endif
-
-/*
- * Each i-node is uniquely identified by a file identifier, supplied by
- * the relevant file system driver. The i-node number returned in the getattrs
- * call is not always enough.
- */
-struct file_identifier {
- void *fid_data;
- size_t fid_len;
-};
-
-struct pnode;
-struct inode;
-struct intent;
-struct intnl_dirent;
-struct intnl_stat;
-#ifdef _HAVE_STATVFS
-struct intnl_statvfs;
-#endif
-struct io_arguments;
-struct ioctx;
-
-/*
- * Operations on i-nodes.
- *
- * Should this be split up into file and name space operations?
- */
-struct inode_ops {
- int (*inop_lookup)(struct pnode *pno,
- struct inode **inop,
- struct intent *intnt,
- const char *path);
- int (*inop_getattr)(struct pnode *pno,
- struct inode *ino,
- struct intnl_stat *stbuf);
- int (*inop_setattr)(struct pnode *pno,
- struct inode *ino,
- unsigned mask,
- struct intnl_stat *stbuf);
- ssize_t (*inop_filldirentries)(struct inode *ino,
- _SYSIO_OFF_T *posp,
- char *buf,
- size_t nbytes);
- int (*inop_mkdir)(struct pnode *pno, mode_t mode);
- int (*inop_rmdir)(struct pnode *pno);
- int (*inop_symlink)(struct pnode *pno, const char *data);
- int (*inop_readlink)(struct pnode *pno, char *buf, size_t bufsiz);
- int (*inop_open)(struct pnode *pno, int flags, mode_t mode);
- int (*inop_close)(struct inode *ino);
- int (*inop_link)(struct pnode *old, struct pnode *new);
- int (*inop_unlink)(struct pnode *pno);
- int (*inop_rename)(struct pnode *old, struct pnode *new);
- int (*inop_read)(struct inode *ino, struct ioctx *ioctx);
- int (*inop_write)(struct inode *ino, struct ioctx *ioctx);
- _SYSIO_OFF_T (*inop_pos)(struct inode *ino, _SYSIO_OFF_T off);
- int (*inop_iodone)(struct ioctx *iocp);
- int (*inop_fcntl)(struct inode *ino, int cmd, va_list ap, int *rtn);
- int (*inop_sync)(struct inode *ino);
- int (*inop_datasync)(struct inode *ino);
- int (*inop_ioctl)(struct inode *ino, unsigned long int request, va_list ap);
- int (*inop_mknod)(struct pnode *pno, mode_t mode, dev_t dev);
-#ifdef _HAVE_STATVFS
- int (*inop_statvfs)(struct pnode *pno,
- struct inode *ino,
- struct intnl_statvfs *buf);
-#endif
- void (*inop_gone)(struct inode *ino);
-};
-
-/*
- * Values for the mask to inop_setattr.
- */
-#define SETATTR_MODE 0x01
-#define SETATTR_MTIME 0x02
-#define SETATTR_ATIME 0x04
-#define SETATTR_UID 0x08
-#define SETATTR_GID 0x10
-#define SETATTR_LEN 0x20
-
-/*
- * An i-node record is maintained for each file object in the system.
- */
-struct inode {
- LIST_ENTRY(inode) i_link; /* FS i-nodes link */
- unsigned
- i_immune : 1, /* immune from GC */
- i_zombie : 1; /* stale inode */
- unsigned i_ref; /* soft ref counter */
- struct inode_ops i_ops; /* operations */
- struct intnl_stat i_stbuf; /* attrs */
- struct filesys *i_fs; /* file system ptr */
- struct file_identifier *i_fid; /* file ident */
- void *i_private; /* driver data */
- TAILQ_ENTRY(inode) i_nodes; /* all i-nodes link */
-};
-
-/*
- * Init an i-node record.
- */
-#define I_INIT(ino, fs, stat, ops, fid, immunity, private) \
- do { \
- (ino)->i_immune = (immunity) ? 1 : 0; \
- (ino)->i_zombie = 0; \
- (ino)->i_ref = 0; \
- (ino)->i_ops = *(ops); \
- (ino)->i_stbuf = *(stat); \
- (ino)->i_fs = (fs); \
- (ino)->i_fid = (fid); \
- (ino)->i_private = (private); \
- } while (0)
-
-/*
- * Take soft reference to i-node.
- */
-#define I_REF(ino) \
- do { \
- TAILQ_REMOVE(&_sysio_inodes, (ino), i_nodes); \
- TAILQ_INSERT_TAIL(&_sysio_inodes, (ino), i_nodes); \
- (ino)->i_ref++; \
- assert((ino)->i_ref); \
- } while (0)
-
-/*
- * Release soft reference to i-node.
- */
-#define I_RELE(ino) \
- do { \
- assert((ino)->i_ref); \
- if (!--(ino)->i_ref && (ino)->i_zombie) \
- _sysio_i_gone(ino); \
- } while (0)
-
-/*
- * Attempt to kill an inode.
- */
-#define I_GONE(ino) \
- do { \
- _sysio_i_undead(ino); \
- I_RELE(ino); \
- } while (0)
-
-/*
- * The "quick string" record (inspired by the structure of the same name
- * from Linux) is used to pass a string without delimiters as well as useful
- * information about the string.
- */
-struct qstr {
- const char *name;
- size_t len;
- unsigned hashval;
-};
-
-/*
- * A path node is an entry in a directory. It may have many aliases, one
- * for each name space in which it occurs. This record holds the
- * common information.
- */
-struct pnode_base {
- struct qstr pb_name; /* entry name */
- struct inode *pb_ino; /* inode */
- LIST_HEAD(, pnode_base) pb_children; /* children if a dir */
- LIST_ENTRY(pnode_base) pb_sibs; /* links to siblings */
- LIST_ENTRY(pnode_base) pb_names; /* near names links */
- LIST_HEAD(, pnode) pb_aliases; /* aliases */
- struct pnode_base *pb_parent; /* parent */
-};
-
-/*
- * Since a file system may be multiply mounted, in different parts of the local
- * tree, a file system object may appear in different places. We handle that
- * with aliases. There is one pnode for every alias the system is tracking.
- *
- * Name space traversal depends heavily on the interpretation of many
- * of the fields in this structure. For that reason a detailed discussion
- * of the various fields is given.
- *
- * The reference field records soft references to the record. For instance,
- * it tracks file and directory opens. It does not track sibling references,
- * though, as those are hard references and can be found by examining the
- * aliases list in the base part of the node.
- *
- * The parent value points to the parent directory for this entry, in the
- * *system* name space -- Not the mounted volumes. If you want to examine
- * the moutned volume name space, use the base record.
- *
- * The base value points to the base path node information. It is info common
- * to all of the aliases.
- *
- * The mount value points to the mount record for the rooted name space in
- * which the alias is found. Notably, if a node is the root of a sub-tree then
- * the mount record, among other things, indicates another node
- * (in another sub-tree) that is covered by this one.
- *
- * Another sub-tree, mounted on this node, is indicated by a non-null cover.
- * The pnode pointed to, then, is the root of the mounted sub-tree.
- *
- * The links list entry holds pointers to other aliases for the base path
- * node entry.
- *
- * The nodes link is bookkeeping.
- */
-struct pnode {
- unsigned p_ref; /* soft ref count */
- struct pnode *p_parent; /* parent */
- struct pnode_base *p_base; /* base part */
- struct mount *p_mount; /* mount info */
- struct pnode *p_cover; /* covering pnode */
- LIST_ENTRY(pnode) p_links; /* other aliases */
- TAILQ_ENTRY(pnode) p_nodes; /* all nodes links */
-};
-
-/*
- * Reference path-tree node.
- */
-#define P_REF(pno) \
- do { \
- TAILQ_REMOVE(&_sysio_pnodes, (pno), p_nodes); \
- TAILQ_INSERT_TAIL(&_sysio_pnodes, (pno), p_nodes); \
- (pno)->p_ref++; \
- assert((pno)->p_ref); \
- } while (0)
-
-/*
- * Release reference to path-tree node.
- */
-#define P_RELE(pno) \
- do { \
- assert((pno)->p_ref); \
- --(pno)->p_ref; \
- } while (0)
-
-/*
- * An intent record allows callers of namei and lookup to pass some information
- * about what they want to accomplish in the end.
- */
-struct intent {
- unsigned int_opmask;
- void *int_arg1;
- void *int_arg2;
-};
-
-/*
- * Intent operations.
- */
-#define INT_GETATTR 0x01 /* get attrs */
-#define INT_SETATTR 0x02 /* set attrs */
-#define INT_UPDPARENT 0x04 /* insert/delete */
-#define INT_OPEN 0x08 /* open */
-#define INT_CREAT (INT_UPDPARENT|0x10) /* insert */
-#define INT_READLINK 0x12 /* readlink */
-
-#define INTENT_INIT(intnt, mask, arg1, arg2) \
- do { \
- (intnt)->int_opmask = (mask); \
- (intnt)->int_arg1 = (arg1); \
- (intnt)->int_arg2 = (arg2); \
- } while (0)
-
-/*
- * Bundled up arguments to _sysio_path_walk.
- */
-struct nameidata {
- unsigned nd_flags; /* flags (see below) */
- const char *nd_path; /* path arg */
- struct pnode *nd_pno; /* returned pnode */
- struct pnode *nd_root; /* system/user root */
- struct intent *nd_intent; /* intent (NULL ok) */
- unsigned nd_slicnt; /* symlink indirects */
-#ifdef AUTOMOUNT_FILE_NAME
- unsigned nd_amcnt; /* automounts */
-#endif
-};
-
-/*
- * Values for nameidata flags field.
- */
-#define ND_NOFOLLOW 0x01 /* no follow symlinks */
-#define ND_NEGOK 0x02 /* last missing is ok */
-#define ND_NOPERMCHECK 0x04 /* don't check perms */
-
-#ifdef AUTOMOUNT_FILE_NAME
-#define _ND_INIT_AUTOMOUNT(nd) ((nd)->nd_amcnt = 0)
-#else
-#define _ND_INIT_AUTOMOUNT(nd)
-#endif
-
-#define _ND_INIT_OTHERS(nd) \
- _ND_INIT_AUTOMOUNT(nd)
-
-/*
- * Init nameidata record.
- */
-#define ND_INIT(nd, flags, path, root, intnt) \
- do { \
- (nd)->nd_flags = (flags); \
- (nd)->nd_path = (path); \
- (nd)->nd_pno = NULL; \
- (nd)->nd_root = (root); \
- (nd)->nd_intent = (intnt); \
- (nd)->nd_slicnt = 0; \
- _ND_INIT_OTHERS(nd); \
- } while (0)
-
-/*
- * IO completion callback record.
- */
-struct ioctx_callback {
- TAILQ_ENTRY(ioctx_callback) iocb_next; /* list link */
- void (*iocb_f)(struct ioctx *, void *); /* cb func */
- void *iocb_data; /* cb data */
-};
-
-/*
- * All IO internally is done with an asynchronous mechanism. This record
- * holds the completion information. It's too big :-(
- */
-struct ioctx {
- LIST_ENTRY(ioctx) ioctx_link; /* AIO list link */
- unsigned
- ioctx_fast : 1, /* from stack space */
- ioctx_done : 1, /* transfer complete */
- ioctx_write : 1; /* op is a write */
- struct inode *ioctx_ino; /* i-node */
- const struct iovec *ioctx_iov; /* scatter/gather vec */
- size_t ioctx_iovlen; /* iovec length */
- const struct intnl_xtvec *ioctx_xtv; /* extents */
- size_t ioctx_xtvlen; /* xtv length */
- ssize_t ioctx_cc; /* rtn char count */
- int ioctx_errno; /* error number */
- TAILQ_HEAD(, ioctx_callback) ioctx_cbq; /* callback queue */
- void *ioctx_private; /* driver data */
-};
-
-/*
- * Init IO context record.
- */
-#define IOCTX_INIT(ioctx, fast, wr, ino, iov, iovlen, xtv, xtvlen) \
- do { \
- (ioctx)->ioctx_fast = (fast); \
- (ioctx)->ioctx_done = 0; \
- (ioctx)->ioctx_write = (wr) ? 1 : 0; \
- (ioctx)->ioctx_ino = (ino); \
- (ioctx)->ioctx_iov = (iov); \
- (ioctx)->ioctx_iovlen = (iovlen); \
- (ioctx)->ioctx_xtv = (xtv); \
- (ioctx)->ioctx_xtvlen = (xtvlen); \
- (ioctx)->ioctx_cc = 0; \
- (ioctx)->ioctx_errno = 0; \
- TAILQ_INIT(&(ioctx)->ioctx_cbq); \
- (ioctx)->ioctx_private = NULL; \
- } while (0)
-
-/*
- * Return whether access to a pnode is read-only.
- */
-#define IS_RDONLY(pno) \
- ((pno)->p_mount->mnt_flags & MOUNT_F_RO)
-
-extern struct pnode *_sysio_root;
-
-extern TAILQ_HEAD(inodes_head, inode) _sysio_inodes;
-extern TAILQ_HEAD(pnodes_head, pnode) _sysio_pnodes;
-
-extern int _sysio_i_init(void);
-#ifdef ZERO_SUM_MEMORY
-extern void _sysio_i_shutdown(void);
-#endif
-extern struct inode *_sysio_i_new(struct filesys *fs,
- struct file_identifier *fid,
- struct intnl_stat *stat,
- unsigned immunity,
- struct inode_ops *ops,
- void *private);
-extern struct inode *_sysio_i_find(struct filesys *fs,
- struct file_identifier *fid);
-extern void _sysio_i_gone(struct inode *ino);
-extern void _sysio_i_undead(struct inode *ino);
-extern int _sysio_p_find_alias(struct pnode *parent,
- struct qstr *name,
- struct pnode **pnop);
-extern int _sysio_p_validate(struct pnode *pno,
- struct intent *intnt,
- const char *path);
-extern struct pnode_base *_sysio_pb_new(struct qstr *name,
- struct pnode_base *parent,
- struct inode *ino);
-extern void _sysio_pb_gone(struct pnode_base *pb);
-extern struct pnode *_sysio_p_new_alias(struct pnode *parent,
- struct pnode_base *pb,
- struct mount *mnt);
-extern void _sysio_p_gone(struct pnode *pno);
-extern size_t _sysio_p_prune(struct pnode *root);
-extern int _sysio_p_kill_all(struct pnode *root);
-extern char *_sysio_pb_path(struct pnode_base *pb, char separator);
-extern int _sysio_setattr(struct pnode *pno,
- struct inode *ino,
- unsigned mask,
- struct intnl_stat *stbuf);
-extern void _sysio_do_noop(void);
-extern void _sysio_do_illop(void);
-extern int _sysio_do_ebadf(void);
-extern int _sysio_do_einval(void);
-extern int _sysio_do_enoent(void);
-extern int _sysio_do_enodev(void);
-extern int _sysio_do_espipe(void);
-extern int _sysio_do_eisdir(void);
-extern int _sysio_do_enosys(void);
-extern int _sysio_path_walk(struct pnode *parent, struct nameidata *nd);
-#ifdef AUTOMOUNT_FILE_NAME
-extern void _sysio_next_component(const char *path, struct qstr *name);
-#endif
-extern int _sysio_permitted(struct pnode *pno, int amode);
-extern int _sysio_namei(struct pnode *pno,
- const char *path,
- unsigned flags,
- struct intent *intnt,
- struct pnode **pnop);
-extern int _sysio_p_chdir(struct pnode *pno);
-extern int _sysio_ioctx_init(void);
-extern void _sysio_ioctx_enter(struct ioctx *ioctx);
-extern struct ioctx *_sysio_ioctx_new(struct inode *ino,
- int wr,
- const struct iovec *iov,
- size_t iovlen,
- const struct intnl_xtvec *xtv,
- size_t xtvlen);
-extern int _sysio_ioctx_cb(struct ioctx *ioctx,
- void (*f)(struct ioctx *, void *),
- void *data);
-extern void _sysio_ioctx_cb_free(struct ioctx_callback *cb);
-extern struct ioctx *_sysio_ioctx_find(void *id);
-extern int _sysio_ioctx_done(struct ioctx *ioctx);
-extern ssize_t _sysio_ioctx_wait(struct ioctx *ioctx);
-extern void _sysio_ioctx_complete(struct ioctx *ioctx);
-extern int _sysio_open(struct pnode *pno, int flags, mode_t mode);
-extern int _sysio_mkdir(struct pnode *where, mode_t mode);
-extern int _sysio_mknod(struct pnode *where, mode_t mode, dev_t dev);
+++ /dev/null
-INCLUDE_EXTRA = include/dev.h include/file.h include/fs.h \
- include/inode.h include/mount.h include/sysio.h include/sysio-cmn.h \
- include/sysio-symbols.h include/cplant-yod.h \
- include/module.mk include/xtio.h include/stddir.h \
- include/native.h include/creds.h
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-/*
- * Mount support.
- */
-
-struct filesys;
-struct pnode;
-
-/*
- * Each file system may be mounted multiple times and in various places
- * in the name space. The mount record maintains the binding information
- * between the system name space and the file system's.
- */
-struct mount {
- struct filesys *mnt_fs; /* file system */
- unsigned mnt_flags; /* flags (see below) */
- struct pnode *mnt_root; /* fs sub-tree root */
- struct pnode *mnt_covers; /* covered pnode */
- LIST_ENTRY(mount) mnt_link; /* link to next */
-};
-
-/*
- * Mount flags definitions.
- */
-#define MOUNT_F_RO 0x01 /* read-only */
-#ifdef AUTOMOUNT_FILE_NAME
-#define MOUNT_F_AUTO 0x02 /* automount enabled */
-#endif
-
-#ifdef AUTOMOUNT_FILE_NAME
-extern struct qstr _sysio_mount_file_name;
-#endif
-
-struct pnode_base;
-
-extern int _sysio_mount_init(void);
-extern int _sysio_do_mount(struct filesys *fs,
- struct pnode_base *rootpb,
- unsigned flags,
- struct pnode *tocover,
- struct mount **mntp);
-extern int _sysio_do_unmount(struct mount *fs);
-extern int _sysio_mount_root(const char *source,
- const char *type,
- unsigned flags,
- const void *data);
-extern int _sysio_mount(struct pnode *cwd,
- const char *source,
- const char *target,
- const char *filesystemtype,
- unsigned long mountflags,
- const void *data);
-extern int _sysio_unmount_all(void);
-#ifdef AUTOMOUNT_FILE_NAME
-extern int _sysio_automount(struct pnode *mntpno);
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2004 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-/*
- * Native file system support.
- */
-
-#if ALPHA_LINUX
-
-/*
- * stat struct from asm/stat.h, as returned
- * by alpha linux kernel
- */
-struct _sysio_native_stat {
- unsigned int st_dev;
- unsigned int st_ino;
- unsigned int st_mode;
- unsigned int st_nlink;
- unsigned int st_uid;
- unsigned int st_gid;
- unsigned int st_rdev;
- long st_size;
- unsigned long st_atime;
- unsigned long st_mtime;
- unsigned long st_ctime;
- unsigned int st_blksize;
- int st_blocks;
- unsigned int st_flags;
- unsigned int st_gen;
-};
-
-#define SYSIO_COPY_STAT(src, dest) \
-do { \
- memset((dest), 0, sizeof((*dest))); \
- (dest)->st_dev = (src)->st_dev; \
- (dest)->st_ino = (src)->st_ino; \
- (dest)->st_mode = (src)->st_mode; \
- (dest)->st_nlink = (src)->st_nlink; \
- (dest)->st_uid = (src)->st_uid; \
- (dest)->st_gid = (src)->st_gid; \
- (dest)->st_rdev = (src)->st_rdev; \
- (dest)->st_size = (src)->st_size; \
- (dest)->st_atime = (src)->st_atime; \
- (dest)->st_mtime = (src)->st_mtime; \
- (dest)->st_ctime = (src)->st_ctime; \
- (dest)->st_blksize = (src)->st_blksize; \
- (dest)->st_blocks = (src)->st_blocks; \
- (dest)->st_flags = (src)->st_flags; \
- (dest)->st_gen = (src)->st_gen; \
-} while (0)
-
-#else
-#define _sysio_native_stat intnl_stat
-#define SYSIO_COPY_STAT(src, dest) *(dest) = *(src)
-#endif
-
-/*
- * System calls.
- */
-#if defined(_LARGEFILE64_SOURCE) && defined(SYS_lstat64)
-#define SYSIO_SYS_stat SYS_lstat64
-#elif defined(SYS_lstat)
-#define SYSIO_SYS_stat SYS_lstat
-#endif
-#if defined(_LARGEFILE64_SOURCE) && defined(SYS_fstat64)
-#define SYSIO_SYS_fstat SYS_fstat64
-#elif defined(SYS_fstat)
-#define SYSIO_SYS_fstat SYS_fstat
-#endif
-#if defined(_LARGEFILE64_SOURCE) && defined(SYS_truncate64)
-#define SYSIO_SYS_truncate SYS_truncate64
-#elif defined(SYS_truncate)
-#define SYSIO_SYS_truncate SYS_truncate
-#endif
-#if defined(_LARGEFILE64_SOURCE) && defined(SYS_ftruncate64)
-#define SYSIO_SYS_ftruncate SYS_ftruncate64
-#elif defined(SYS_ftruncate)
-#define SYSIO_SYS_ftruncate SYS_ftruncate
-#endif
-#if defined(SYS_open)
-#define SYSIO_SYS_open SYS_open
-#endif
-#if defined(SYS_close)
-#define SYSIO_SYS_close SYS_close
-#endif
-#if defined(_LARGEFILE64_SOURCE) && defined(SYS_lseek64)
-#define SYSIO_SYS_lseek SYS_lseek64
-#elif defined(SYS_lseek)
-#define SYSIO_SYS_lseek SYS_lseek
-#endif
-#if defined(SYS__llseek)
-# if defined (__mips64__)
-# define SYSIO_SYS__llseek SYS_O32__llseek
-# else
-# define SYSIO_SYS__llseek SYS__llseek
-# endif
-#endif
-#if defined(SYS_read)
-#define SYSIO_SYS_read SYS_read
-#endif
-#if defined(SYS_write)
-#define SYSIO_SYS_write SYS_write
-#endif
-#if defined(SYS_readv)
-#define SYSIO_SYS_readv SYS_readv
-#endif
-#if defined(SYS_writev)
-#define SYSIO_SYS_writev SYS_writev
-#endif
-#if defined(_LARGEFILE64_SOURCE) && defined(SYS_pread64)
-#define SYSIO_SYS_pread SYS_pread64
-#elif defined(SYS_pread)
-#define SYSIO_SYS_pread SYS_pread
-#endif
-#if defined(_LARGEFILE64_SOURCE) && defined(SYS_pwrite64)
-#define SYSIO_SYS_pwrite SYS_pwrite64
-#elif defined(SYS_pwrite)
-#define SYSIO_SYS_pwrite SYS_pwrite
-#endif
-#if defined(_LARGEFILE64_SOURCE) && defined(SYS_fcntl64)
-#define SYSIO_SYS_fcntl SYS_fcntl64
-#elif defined(SYS_fcntl)
-#define SYSIO_SYS_fcntl SYS_fcntl
-#endif
-#if defined(SYS_fsync)
-#define SYSIO_SYS_fsync SYS_fsync
-#endif
-#if defined(ALPHA_LINUX) && defined(SYS_osf_fdatasync)
-#define SYSIO_SYS_fdatasync SYS_osf_fdatasync
-#elif defined(SYS_fdatasync)
-#define SYSIO_SYS_fdatasync SYS_fdatasync
-#endif
-#if defined(SYS_chmod)
-#define SYSIO_SYS_chmod SYS_chmod
-#endif
-#if defined(SYS_fchmod)
-#define SYSIO_SYS_fchmod SYS_fchmod
-#endif
-#if defined(SYS_chown)
-#define SYSIO_SYS_chown SYS_chown
-#endif
-#if defined(SYS_fchown)
-#define SYSIO_SYS_fchown SYS_fchown
-#endif
-#if defined(SYS_umask)
-#define SYSIO_SYS_umask SYS_umask
-#endif
-#if defined(SYS_mkdir)
-#define SYSIO_SYS_mkdir SYS_mkdir
-#endif
-#if defined(SYS_rmdir)
-#define SYSIO_SYS_rmdir SYS_rmdir
-#endif
-#if defined(SYS_getdirentries)
-#if defined(_LARGEFILE64_SOURCE) && defined(SYS_getdirentries64)
-#define SYSIO_SYS_getdirentries SYS_getdirentries64
-#elif defined(SYS_getdirentries)
-#define SYSIO_SYS_getdirentries SYS_getdirentries
-#endif
-#endif
-#if defined(_LARGEFILE64_SOURCE) && defined(SYS_getdents64)
-# define SYSIO_SYS_getdents64 SYS_getdents64
-#elif defined(SYS_getdents)
-# if defined (__mips64__)
-# define SYSIO_SYS_getdents64 SYS_getdents
-# else
-# define SYSIO_SYS_getdents SYS_getdents
-# endif
-#endif
-#if defined(SYS_link)
-#define SYSIO_SYS_link SYS_link
-#endif
-#if defined(SYS_unlink)
-#define SYSIO_SYS_unlink SYS_unlink
-#endif
-#if defined(SYS_symlink)
-#define SYSIO_SYS_symlink SYS_symlink
-#endif
-#if defined(SYS_rename)
-#define SYSIO_SYS_rename SYS_rename
-#endif
-#if defined(SYS_readlink)
-#define SYSIO_SYS_readlink SYS_readlink
-#endif
-#if defined(SYS_utimes)
-#define SYSIO_SYS_utimes SYS_utimes
-#endif
-#if defined(SYS_utime)
-#define SYSIO_SYS_utime SYS_utime
-#endif
-#if defined(SYS_socketcall)
-# if defined (__mips64__)
-# define SYSIO_SYS_socketcall SYS_O32_socketcall
-# else
-# define SYSIO_SYS_socketcall SYS_socketcall
-# endif
-#endif
-#if defined(SYS_socket)
-#define SYSIO_SYS_socket SYS_socket
-#endif
-#if defined(SYS_accept)
-#define SYSIO_SYS_accept SYS_accept
-#endif
-#if defined(SYS_bind)
-#define SYSIO_SYS_bind SYS_bind
-#endif
-#if defined(SYS_listen)
-#define SYSIO_SYS_listen SYS_listen
-#endif
-#if defined(SYS_connect)
-#define SYSIO_SYS_connect SYS_connect
-#endif
-#if defined(SYS_ioctl)
-#define SYSIO_SYS_ioctl SYS_ioctl
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2004 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-/*
- * Support for directory functions
- */
-
-#ifndef _STDDIR_H_
-#define _STDDIR_H_
-
-#undef BUFSIZE
-#define BUFSIZE 4096
-
-struct __dirstream {
- int fd;
- _SYSIO_OFF_T base; /* start pos for next system call */
- _SYSIO_OFF_T filepos; /* current pos in dir file stream */
- size_t cur; /* current byte pos in data buffer */
- size_t effective; /* effective data size in buffer */
- char buf[BUFSIZE];
-};
-
-#ifndef MAX
-#define MAX(a,b) (a) > (b) ? (a) : (b)
-#endif
-
-#endif /* ! _STDDIR_H_ */
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2006 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-/*
- * System IO common information.
- */
-
-#if !defined(__IS_UNUSED) && defined(__GNUC__)
-#define __IS_UNUSED __attribute__ ((unused))
-#else
-#define __IS_UNUSED
-#endif
-
-/*
- * Define internal file-offset type and it's maximum value.
- */
-#ifdef _LARGEFILE64_SOURCE
-#define _SYSIO_OFF_T off64_t
-#ifdef LLONG_MAX
-#define _SYSIO_OFF_T_MAX (LLONG_MAX)
-#else
-/*
- * Don't have LLONG_MAX before C99. We'll need to define it ourselves.
- */
-#define _SYSIO_OFF_T_MAX (9223372036854775807LL)
-#endif
-#else
-#define _SYSIO_OFF_T off_t
-#define _SYSIO_OFF_T_MAX LONG_MAX
-#endif
-
-/*
- * Internally, all file status is carried in the 64-bit capable
- * structure.
- */
-#ifdef _LARGEFILE64_SOURCE
-#define intnl_xtvec xtvec64
-#else
-#define intnl_xtvec xtvec
-#endif
-struct intnl_xtvec;
-
-struct iovec;
-
-/*
- * Symbol composition.
- */
-#define _PREPEND_HELPER(p, x) \
- p ## x
-#define PREPEND(p, x) \
- _PREPEND_HELPER(p, x)
-
-/*
- * SYSIO name label macros
- */
-#ifndef SYSIO_INTERFACE_NAME
-#ifdef SYSIO_LABEL_NAMES
-#define SYSIO_INTERFACE_NAME(x) \
- PREPEND(SYSIO_LABEL_NAMES, x)
-#else
-#define SYSIO_INTERFACE_NAME(x) x
-#endif /* SYSIO_LABEL_NAMES */
-#endif /* !SYSIO_INTERFACE_NAME */
-
-/* for debugging */
-#if 0
-#define ASSERT(cond) \
- if (!(cond)) { \
- printf("ASSERTION(" #cond ") failed: " __FILE__ ":" \
- __FUNCTION__ ":%d\n", __LINE__); \
- abort(); \
- }
-
-#define ERROR(fmt, a...) \
- do { \
- printf("ERROR(" __FILE__ ":%d):" fmt, __LINE__, ##a); \
- while(0)
-
-#else
-#define ERROR(fmt) do{}while(0)
-#define ASSERT do{}while(0)
-#endif
-
-/*
- * SYSIO interface frame macros
- *
- * + DISPLAY_BLOCK; Allocates storage on the stack for use by the set of
- * macros.
- * + ENTER; Performs entry point work
- * + RETURN; Returns a value and performs exit point work
- *
- * NB: For RETURN, the arguments are the return value and value for errno.
- * If the value for errno is non-zero then that value, *negated*, is set
- * into errno.
- */
-#define SYSIO_INTERFACE_DISPLAY_BLOCK \
- int _saved_errno;
-#define SYSIO_INTERFACE_ENTER \
- do { \
- _saved_errno = errno; \
- SYSIO_ENTER; \
- } while (0)
-#define SYSIO_INTERFACE_RETURN(rtn, err) \
- do { \
- SYSIO_LEAVE; \
- errno = (err) ? -(err) : _saved_errno; \
- return (rtn); \
- } while(0)
-
-/* Interface enter/leave hook functions */
-#ifdef SYSIO_TRACING
-extern void *_sysio_entry_trace_q;
-extern void *_sysio_exit_trace_q;
-
-extern void *_sysio_register_trace(void *q,
- void (*)(const char *file,
- const char *func,
- int line,
- void *data),
- void *data,
- void (*destructor)(void *data));
-extern void _sysio_remove_trace(void *q, void *p);
-extern void _sysio_run_trace_q(void *q,
- const char *file,
- const char *func,
- int line);
-#define SYSIO_ENTER \
- do { \
- _sysio_run_trace_q(_sysio_entry_trace_q, \
- __FILE__, __func__, __LINE__); \
- } while (0)
-
-
-#define SYSIO_LEAVE \
- do { \
- _sysio_run_trace_q(_sysio_exit_trace_q, \
- __FILE__, __func__, __LINE__); \
- } while (0)
-#else
-#define SYSIO_ENTER \
- do { } while (0)
-#define SYSIO_LEAVE \
- do { } while (0)
-#endif
-
-/* Accounting for IO stats; Read and write character count. */
-#if defined(REDSTORM)
-#define _SYSIO_UPDACCT(w, cc) \
- do { \
- if ((cc) < 0) \
- break; \
- if (w) \
- _add_iostats(0, (size_t )(cc)); \
- else \
- _add_iostats((size_t )(cc), 0); \
- } while(0)
-#else
-#define _SYSIO_UPDACCT(w, cc)
-#endif
-
-extern ssize_t _sysio_validx(const struct intnl_xtvec *xtv, size_t xtvlen,
- const struct iovec *iov, size_t iovlen,
- _SYSIO_OFF_T limit);
-extern ssize_t _sysio_enumerate_extents(const struct intnl_xtvec *xtv,
- size_t xtvlen,
- const struct iovec *iov,
- size_t iovlen,
- ssize_t (*f)(const struct iovec *,
- int,
- _SYSIO_OFF_T,
- ssize_t,
- void *),
- void *arg);
-extern ssize_t _sysio_enumerate_iovec(const struct iovec *iov,
- size_t count,
- _SYSIO_OFF_T off,
- ssize_t limit,
- ssize_t (*f)(void *,
- size_t,
- _SYSIO_OFF_T,
- void *),
- void *arg);
-extern ssize_t _sysio_doio(const struct intnl_xtvec *xtv, size_t xtvlen,
- const struct iovec *iov, size_t iovlen,
- ssize_t (*f)(void *, size_t, _SYSIO_OFF_T, void *),
- void *arg);
+++ /dev/null
-#if defined(HAVE_ASM_WEAK_DIRECTIVE) || defined(HAVE_ASM_WEAKEXT_DIRECTIVE)
-#define HAVE_WEAK_SYMBOLS
-#endif
-
-#define STRINGOF(x) #x
-
-/*
- * Define alias, asym, as a strong alias for symbol, sym.
- */
-#define sysio_sym_strong_alias(sym, asym) \
- extern __typeof(sym) asym __attribute__((alias(STRINGOF(sym))));
-
-#ifdef HAVE_WEAK_SYMBOLS
-
-/*
- * Define alias, asym, as a strong alias for symbol, sym.
- */
-#define sysio_sym_weak_alias(sym, asym) \
- extern __typeof(sym) asym __attribute__((weak, alias(STRINGOF(sym))));
-#else /* !defined(HAVE_ASM_WEAK_DIRECTIVE) */
-
-/*
- * Weak symbols not supported. Make it a strong alias then.
- */
-#define sysio_sym_weak_alias(sym, asym) sysio_sym_strong_alias(sym, asym)
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2004 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-/*
- * System IO common information.
- */
-
-#include <limits.h>
-#include <stdarg.h>
-
-#include "sysio-cmn.h"
-#include "creds.h"
-
-#if defined(_DIRENT_H) && _DIRENT_H
-/*
- * Need directory access routines too.
- */
-#define _DECLARE_DIR_ACCESS 1
-#else
-#define _DECLARE_DIR_ACCESS 0
-#endif
-
-#ifndef PATH_SEPARATOR
-/*
- * Path separator.
- */
-#define PATH_SEPARATOR '/'
-#endif
-
-#ifndef MAX_SYMLINK
-/*
- * Max recursion depth allowed when resoving symbolic links.
- */
-#define MAX_SYMLINK 250
-#endif
-
-/*
- * Internally, all directory entries are carried in the 64-bit capable
- * structure.
- */
-#ifdef _LARGEFILE64_SOURCE
-#define intnl_dirent dirent64
-#else
-#define intnl_dirent dirent
-#endif
-struct dirent;
-
-/*
- * Internally, all file status is carried in the 64-bit capable
- * structure.
- */
-#ifdef _LARGEFILE64_SOURCE
-#define intnl_stat stat64
-#else
-#define intnl_stat stat
-#endif
-struct stat;
-
-#ifdef _HAVE_STATVFS
-#ifdef _LARGEFILE64_SOURCE
-#define intnl_statvfs statvfs64
-#else
-#define intnl_statvfs statvfs
-#define INTNL_STATVFS_IS_NATURAL 1
-#endif
-struct statvfs;
-struct intnl_statvfs;
-#endif
-
-struct utimbuf;
-
-struct intnl_stat;
-
-struct pnode;
-
-#ifdef DEFER_INIT_CWD
-extern const char *_sysio_init_cwd;
-#endif
-
-extern struct pnode *_sysio_cwd;
-
-extern mode_t _sysio_umask;
-
-extern int _sysio_init(void);
-extern void _sysio_shutdown(void);
-#ifdef ZERO_SUM_MEMORY
-extern void _sysio_access_shutdown(void);
-#endif
-
-#if 0
-struct _sysio_boot_ctl {
- const char *onam;
- const char *oarg;
-};
-#endif
-
-extern int _sysio_boot(const char *opt, const char *arg);
-
-/*
- * Option-value pair information.
- */
-struct option_value_info {
- const char *ovi_name; /* name */
- char *ovi_value; /* value */
-};
-
-extern const char * _sysio_get_token(const char *buf,
- int accepts,
- const char *delim,
- const char *ignore,
- char *tbuf);
-extern char * _sysio_get_args(char *buf, struct option_value_info *vec);
-
-#define _SYSIO_LOCAL_TIME() _sysio_local_time()
-
-extern time_t _sysio_local_time(void);
-
-#ifdef SYSIO_TRACING
-extern void _sysio_cprintf(const char *fmt, ...);
-#endif
-
-/*
- * The following should be defined by the system includes, and probably are,
- * but it's not illegal to have multiple externs, so long as they are the
- * same. It helps when building the library in a standalone fashion.
- */
-extern int SYSIO_INTERFACE_NAME(access)(const char *path, int amode);
-extern int SYSIO_INTERFACE_NAME(chdir)(const char *path);
-extern int SYSIO_INTERFACE_NAME(chmod)(const char *path, mode_t mode);
-extern int SYSIO_INTERFACE_NAME(fchmod)(int fd, mode_t mode);
-extern int SYSIO_INTERFACE_NAME(chown)(const char *path, uid_t owner,
- gid_t group);
-extern int SYSIO_INTERFACE_NAME(fchown)(int fd, uid_t owner, gid_t group);
-extern int SYSIO_INTERFACE_NAME(close)(int d);
-extern int SYSIO_INTERFACE_NAME(dup)(int oldfd);
-extern int SYSIO_INTERFACE_NAME(dup2)(int oldfd, int newfd);
-extern int SYSIO_INTERFACE_NAME(fcntl)(int fd, int cmd, ...);
-extern int SYSIO_INTERFACE_NAME(fcntl64)(int fd, int cmd, ...);
-extern int SYSIO_INTERFACE_NAME(fstat)(int fd, struct stat *buf);
-#ifdef _LARGEFILE64_SOURCE
-extern int SYSIO_INTERFACE_NAME(fstat64)(int fd, struct stat64 *buf);
-extern int SYSIO_INTERFACE_NAME(lstat64)(const char *path, struct stat64 *buf);
-#endif
-extern int SYSIO_INTERFACE_NAME(fsync)(int fd);
-extern char *SYSIO_INTERFACE_NAME(getcwd)(char *buf, size_t size);
-extern off_t SYSIO_INTERFACE_NAME(lseek)(int fd, off_t offset, int whence);
-#ifdef _LARGEFILE64_SOURCE
-extern off64_t SYSIO_INTERFACE_NAME(lseek64)(int fd, off64_t offset,
- int whence);
-#endif
-extern int SYSIO_INTERFACE_NAME(lstat)(const char *path, struct stat *buf);
-#ifdef BSD
-extern int SYSIO_INTERFACE_NAME(getdirentries)(int fd, char *buf, int nbytes ,
- long *basep);
-#else
-extern ssize_t SYSIO_INTERFACE_NAME(getdirentries)(int fd, char *buf,
- size_t nbytes, off_t *basep);
-#ifdef _LARGEFILE64_SOURCE
-extern ssize_t SYSIO_INTERFACE_NAME(getdirentries64)(int fd,
- char *buf,
- size_t nbytes,
- off64_t *basep);
-#endif
-#endif
-extern int SYSIO_INTERFACE_NAME(mkdir)(const char *path, mode_t mode);
-extern int SYSIO_INTERFACE_NAME(open)(const char *path, int flag, ...);
-#ifdef _LARGEFILE64_SOURCE
-extern int SYSIO_INTERFACE_NAME(open64)(const char *path, int flag, ...);
-#endif
-extern int SYSIO_INTERFACE_NAME(creat)(const char *path, mode_t mode);
-#ifdef _LARGEFILE64_SOURCE
-extern int SYSIO_INTERFACE_NAME(creat64)(const char *path, mode_t mode);
-#endif
-extern int SYSIO_INTERFACE_NAME(stat)(const char *path, struct stat *buf);
-#ifdef _LARGEFILE64_SOURCE
-extern int SYSIO_INTERFACE_NAME(stat64)(const char *path, struct stat64 *buf);
-#endif
-extern ssize_t SYSIO_INTERFACE_NAME(read)(int fd, void *buf, size_t count);
-extern ssize_t SYSIO_INTERFACE_NAME(pread)(int fd, void *buf, size_t count,
- off_t offset);
-extern ssize_t SYSIO_INTERFACE_NAME(readv)(int fd,
- const struct iovec *iov,
- int count);
-extern ssize_t SYSIO_INTERFACE_NAME(write)(int fd,
- const void *buf,
- size_t count);
-extern ssize_t SYSIO_INTERFACE_NAME(pwrite)(int fd,
- const void *buf,
- size_t count,
- off_t offset);
-extern ssize_t SYSIO_INTERFACE_NAME(writev)(int fd,
- const struct iovec *iov,
- int count);
-#ifdef _HAVE_STATVFS
-extern int SYSIO_INTERFACE_NAME(statvfs)(const char *path, struct statvfs *buf);
-#ifdef _LARGEFILE64_SOURCE
-extern int SYSIO_INTERFACE_NAME(statvfs64)(const char *path,
- struct statvfs64 *buf);
-#endif
-extern int SYSIO_INTERFACE_NAME(fstatvfs)(int fd, struct statvfs *buf);
-#ifdef _LARGEFILE64_SOURCE
-extern int SYSIO_INTERFACE_NAME(fstatvfs64)(int fd, struct statvfs64 *buf);
-#endif
-#endif
-extern int SYSIO_INTERFACE_NAME(truncate)(const char *path, off_t length);
-#ifdef _LARGEFILE64_SOURCE
-extern int SYSIO_INTERFACE_NAME(truncate64)(const char *path, off64_t length);
-#endif
-extern int SYSIO_INTERFACE_NAME(ftruncate)(int fd, off_t length);
-#ifdef _LARGEFILE64_SOURCE
-extern int SYSIO_INTERFACE_NAME(ftruncate64)(int fd, off64_t length);
-#endif
-extern int SYSIO_INTERFACE_NAME(rmdir)(const char *path);
-extern int SYSIO_INTERFACE_NAME(symlink)(const char *path1, const char *path2);
-#ifdef HAVE_POSIX_1003_READLINK
-extern ssize_t SYSIO_INTERFACE_NAME(readlink)(const char *path,
-#else
-extern int SYSIO_INTERFACE_NAME(readlink)(const char *path,
-#endif
- char *buf,
- size_t bufsiz);
-extern int SYSIO_INTERFACE_NAME(link)(const char *oldpath, const char *newpath);
-extern int SYSIO_INTERFACE_NAME(unlink)(const char *path);
-extern int SYSIO_INTERFACE_NAME(rename)(const char *oldpath,
- const char *newpath);
-extern int SYSIO_INTERFACE_NAME(fdatasync)(int fd);
-extern int SYSIO_INTERFACE_NAME(ioctl)(int fd, unsigned long request, ...);
-extern mode_t SYSIO_INTERFACE_NAME(umask)(mode_t mask);
-extern int SYSIO_INTERFACE_NAME(mknod)(const char *path,
- mode_t mode, dev_t dev);
-extern int SYSIO_INTERFACE_NAME(utime)(const char *path,
- const struct utimbuf *buf);
-extern int SYSIO_INTERFACE_NAME(mount)(const char *source, const char *target,
- const char *filesystemtype,
- unsigned long mountflags,
- const void *data);
-extern int SYSIO_INTERFACE_NAME(umount)(const char *target);
-#if _DECLARE_DIR_ACCESS
-extern DIR *SYSIO_INTERFACE_NAME(opendir)(const char *name);
-extern int SYSIO_INTERFACE_NAME(closedir)(DIR *dir);
-extern struct dirent *SYSIO_INTERFACE_NAME(readdir)(DIR *dir);
-
-extern int SYSIO_INTERFACE_NAME(scandir)(const char *dir,
- struct dirent ***namelist,
- int(*filter)(const struct dirent *),
-#ifdef HAVE_POSIX2008_SCANDIR
- int(*compar)(const struct dirent **,
- const struct dirent **)
-#else
- int(*compar)(const void *, const void *)
-#endif
- );
-#if defined(_BSD_SOURCE) || defined(_SVID_SOURCE)
-extern ssize_t SYSIO_INTERFACE_NAME(getdirentries)(int fd,
- char *buf,
- size_t nbytes,
- off_t *basep);
-#endif
-#endif /* _DECLARE_DIR_ACCESS */
-
-#undef _DECLARE_DIR_ACCESS
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2004 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-/*
- * Extended application programmers interface for IO as found on Cray RedStorm
- * and the other current SUNMos/Puma/Cougar/Catamount systems.
- */
-
-#ifndef _XTIO_H_
-#define _XTIO_H_
-
-/*
- * When compiled for use with libsysio, this allows one to move all the
- * externals to a distinct namespace. When not, we want it to do nothing.
- *
- * NB: The choice of macro name here is dangerous. It's in the global
- * namespace! We should fix that one of these days.
- */
-#if !defined(SYSIO_INTERFACE_NAME)
-#define SYSIO_INTERFACE_NAME(_n) _n
-#endif
-
-#ifndef _IOID_T_DEFINED
-#define _IOID_T_DEFINED
-typedef void *ioid_t;
-
-#define IOID_FAIL 0
-#endif
-
-/*
- * Structure for strided I/O.
- */
-struct xtvec {
-#ifndef __USE_FILE_OFFSET64
- __off_t xtv_off; /* Stride/Extent offset. */
-#else
- __off64_t xtv_off; /* Stride/Extent offset. */
-#endif
- size_t xtv_len; /* Stride/Extent length. */
-};
-
-#ifdef __USE_LARGEFILE64
-struct xtvec64 {
- __off64_t xtv_off; /* Stride/Extent offset. */
- size_t xtv_len; /* Stride/Extent length. */
-};
-#endif
-
-#ifdef HAVE_POSIX2008_PREADV
-#define _SYSIO_PREADV_T int
-#else
-#define _SYSIO_PREADV_T size_t
-#endif
-
-struct iovec;
-
-/*
- * Get status of previously posted async file IO operation.
- */
-extern int SYSIO_INTERFACE_NAME(iodone)(ioid_t ioid);
-
-/*
- * Wait for completion of a previously posted asynch file IO request.
- */
-extern ssize_t SYSIO_INTERFACE_NAME(iowait)(ioid_t ioid);
-
-/*
- * Post asynch read into buffers mapped by an iovec from file at given offset.
- */
-extern ioid_t SYSIO_INTERFACE_NAME(ipreadv)(int fd,
- const struct iovec *iov,
- size_t count,
- off_t offset);
-
-#ifdef _LARGEFILE64_SOURCE
-/*
- * Post asynch read into buffers mapped by an iovec from file at given offset.
- */
-extern ioid_t SYSIO_INTERFACE_NAME(ipread64v)(int fd,
- const struct iovec *iov,
- size_t count,
- off64_t offset);
-#endif
-
-/*
- * Post asynch read into buffer from file at given offset.
- */
-extern ioid_t SYSIO_INTERFACE_NAME(ipread)(int fd,
- void *buf,
- size_t count,
- off_t offset);
-
-#ifdef _LARGEFILE64_SOURCE
-/*
- * Post asynch read into buffer from file at given offset.
- */
-extern ioid_t SYSIO_INTERFACE_NAME(ipread64)(int fd,
- void *buf,
- size_t count,
- off64_t offset);
-#endif
-
-/*
- * Read into buffers mapped by an iovec from file at given offset.
- */
-extern ssize_t SYSIO_INTERFACE_NAME(preadv)(int fd,
- const struct iovec *iov,
- _SYSIO_PREADV_T count,
- off_t offset);
-
-#ifdef _LARGEFILE64_SOURCE
-/*
- * Read into buffers mapped by an iovec from file at given offset.
- */
-extern ssize_t SYSIO_INTERFACE_NAME(pread64v)(int fd,
- const struct iovec *iov,
- _SYSIO_PREADV_T count,
- off64_t offset);
-#endif
-
-/*
- * Post asynch read into buffers mapped by an iovec.
- */
-extern ioid_t SYSIO_INTERFACE_NAME(ireadv)(int fd,
- const struct iovec *iov,
- int count);
-
-/*
- * Read into buffer.
- */
-extern ioid_t SYSIO_INTERFACE_NAME(iread)(int fd,
- void *buf,
- size_t count);
-
-/*
- * Post async read into buffers mapped by iovec from regions mapped
- * by xtvec.
- *
- * NB: An adaptation of "listio" from Argonne's PVFS.
- */
-extern ioid_t SYSIO_INTERFACE_NAME(ireadx)(int fd,
- const struct iovec *iov,
- size_t iov_count,
- const struct xtvec *xtv,
- size_t xtv_count);
-
-#ifdef __USE_LARGEFILE64
-/*
- * Post async read into buffers mapped by iovec from regions mapped
- * by xtvec.
- *
- * NB: An adaptation of "listio" from Argonne's PVFS.
- */
-extern ioid_t SYSIO_INTERFACE_NAME(iread64x)(int fd,
- const struct iovec *iov,
- size_t iov_count,
- const struct xtvec64 *xtv,
- size_t xtv_count);
-#endif
-
-/*
- * Read into buffers mapped by iovec from regions mapped
- * by xtvec.
- *
- * NB: An adaptation of "listio" from Argonne's PVFS.
- */
-extern ssize_t SYSIO_INTERFACE_NAME(readx)(int fd,
- const struct iovec *iov,
- size_t iov_count,
- const struct xtvec *xtv,
- size_t xtv_count);
-
-#ifdef __USE_LARGEFILE64
-/*
- * Read into buffers mapped by iovec from regions mapped
- * by xtvec.
- *
- * NB: An adaptation of "listio" from Argonne's PVFS.
- */
-extern ssize_t SYSIO_INTERFACE_NAME(read64x)(int fd,
- const struct iovec *iov,
- size_t iov_count,
- const struct xtvec64 *xtv,
- size_t xtv_count);
-#endif
-
-/*
- * Post asynch write from buffers mapped by an iovec to file at given offset.
- */
-extern ioid_t SYSIO_INTERFACE_NAME(ipwritev)(int fd,
- const struct iovec *iov,
- size_t count,
- off_t offset);
-#ifdef _LARGEFILE64_SOURCE
-/*
- * Post asynch write from buffers mapped by an iovec to file at given offset.
- */
-extern ioid_t SYSIO_INTERFACE_NAME(ipwrite64v)(int fd,
- const struct iovec *iov,
- size_t count,
- off64_t offset);
-#endif
-
-/*
- * Post asynch write from buffer to file at given offset.
- */
-extern ioid_t SYSIO_INTERFACE_NAME(ipwrite)(int fd,
- const void *buf,
- size_t count,
- off_t offset);
-
-#ifdef _LARGEFILE64_SOURCE
-/*
- * Post asynch write from buffer to file at given offset.
- */
-extern ioid_t SYSIO_INTERFACE_NAME(ipwrite64)(int fd,
- const void *buf,
- size_t count,
- off64_t offset);
-#endif
-
-/*
- * Write from buffers mapped by an iovec to file at given offset.
- */
-extern ssize_t SYSIO_INTERFACE_NAME(pwritev)(int fd,
- const struct iovec *iov,
- _SYSIO_PREADV_T count,
- off_t offset);
-
-#ifdef _LARGEFILE64_SOURCE
-/*
- * Write from buffers mapped by an iovec to file at given offset.
- */
-extern ssize_t SYSIO_INTERFACE_NAME(pwrite64v)(int fd,
- const struct iovec *iov,
- _SYSIO_PREADV_T count,
- off64_t offset);
-#endif
-
-/*
- * Post asynch write from buffer to file at given offset.
- */
-extern ioid_t SYSIO_INTERFACE_NAME(iwritev)(int fd,
- const struct iovec *iov,
- int count);
-
-/*
- * Write from buffer to file at given offset.
- */
-extern ioid_t SYSIO_INTERFACE_NAME(iwrite)(int fd,
- const void *buf,
- size_t count);
-
-/*
- * Post async write from buffers mapped by iovec to regions mapped
- * by xtvec.
- *
- * NB: An adaptation of "listio" from Argonne's PVFS.
- */
-extern ioid_t SYSIO_INTERFACE_NAME(iwritex)(int fd,
- const struct iovec *iov,
- size_t iov_count,
- const struct xtvec *xtv,
- size_t xtv_count);
-
-#ifdef __USE_LARGEFILE64
-/*
- * Post async write from buffers mapped by iovec to regions mapped
- * by xtvec.
- *
- * NB: An adaptation of "listio" from Argonne's PVFS.
- */
-extern ioid_t SYSIO_INTERFACE_NAME(iwrite64x)(int fd,
- const struct iovec *iov,
- size_t iov_count,
- const struct xtvec64 *xtv,
- size_t xtv_count);
-#endif
-
-/*
- * Write from buffers mapped by iovec to regions mapped
- * by xtvec.
- *
- * NB: An adaptation of "listio" from Argonne's PVFS.
- */
-extern ssize_t SYSIO_INTERFACE_NAME(writex)(int fd,
- const struct iovec *iov,
- size_t iov_count,
- const struct xtvec *xtv,
- size_t xtv_count);
-
-#ifdef __USE_LARGEFILE64
-/*
- * Write from buffers mapped by iovec to regions mapped
- * by xtvec.
- *
- * NB: An adaptation of "listio" from Argonne's PVFS.
- */
-extern ssize_t SYSIO_INTERFACE_NAME(write64x)(int fd,
- const struct iovec *iov,
- size_t iov_count,
- const struct xtvec64 *xtv,
- size_t xtv_count);
-#endif
-#endif /* ! _XTIO_H_ */
+++ /dev/null
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2011-01-19.21; # UTC
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-
-nl='
-'
-IFS=" "" $nl"
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit=${DOITPROG-}
-if test -z "$doit"; then
- doit_exec=exec
-else
- doit_exec=$doit
-fi
-
-# Put in absolute file names if you don't have them in your path;
-# or use environment vars.
-
-chgrpprog=${CHGRPPROG-chgrp}
-chmodprog=${CHMODPROG-chmod}
-chownprog=${CHOWNPROG-chown}
-cmpprog=${CMPPROG-cmp}
-cpprog=${CPPROG-cp}
-mkdirprog=${MKDIRPROG-mkdir}
-mvprog=${MVPROG-mv}
-rmprog=${RMPROG-rm}
-stripprog=${STRIPPROG-strip}
-
-posix_glob='?'
-initialize_posix_glob='
- test "$posix_glob" != "?" || {
- if (set -f) 2>/dev/null; then
- posix_glob=
- else
- posix_glob=:
- fi
- }
-'
-
-posix_mkdir=
-
-# Desired mode of installed file.
-mode=0755
-
-chgrpcmd=
-chmodcmd=$chmodprog
-chowncmd=
-mvcmd=$mvprog
-rmcmd="$rmprog -f"
-stripcmd=
-
-src=
-dst=
-dir_arg=
-dst_arg=
-
-copy_on_change=false
-no_target_directory=
-
-usage="\
-Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
- or: $0 [OPTION]... SRCFILES... DIRECTORY
- or: $0 [OPTION]... -t DIRECTORY SRCFILES...
- or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
- --help display this help and exit.
- --version display version info and exit.
-
- -c (ignored)
- -C install only if different (preserve the last data modification time)
- -d create directories instead of installing files.
- -g GROUP $chgrpprog installed files to GROUP.
- -m MODE $chmodprog installed files to MODE.
- -o USER $chownprog installed files to USER.
- -s $stripprog installed files.
- -t DIRECTORY install into DIRECTORY.
- -T report an error if DSTFILE is a directory.
-
-Environment variables override the default commands:
- CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
- RMPROG STRIPPROG
-"
-
-while test $# -ne 0; do
- case $1 in
- -c) ;;
-
- -C) copy_on_change=true;;
-
- -d) dir_arg=true;;
-
- -g) chgrpcmd="$chgrpprog $2"
- shift;;
-
- --help) echo "$usage"; exit $?;;
-
- -m) mode=$2
- case $mode in
- *' '* | *' '* | *'
-'* | *'*'* | *'?'* | *'['*)
- echo "$0: invalid mode: $mode" >&2
- exit 1;;
- esac
- shift;;
-
- -o) chowncmd="$chownprog $2"
- shift;;
-
- -s) stripcmd=$stripprog;;
-
- -t) dst_arg=$2
- # Protect names problematic for `test' and other utilities.
- case $dst_arg in
- -* | [=\(\)!]) dst_arg=./$dst_arg;;
- esac
- shift;;
-
- -T) no_target_directory=true;;
-
- --version) echo "$0 $scriptversion"; exit $?;;
-
- --) shift
- break;;
-
- -*) echo "$0: invalid option: $1" >&2
- exit 1;;
-
- *) break;;
- esac
- shift
-done
-
-if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
- # When -d is used, all remaining arguments are directories to create.
- # When -t is used, the destination is already specified.
- # Otherwise, the last argument is the destination. Remove it from $@.
- for arg
- do
- if test -n "$dst_arg"; then
- # $@ is not empty: it contains at least $arg.
- set fnord "$@" "$dst_arg"
- shift # fnord
- fi
- shift # arg
- dst_arg=$arg
- # Protect names problematic for `test' and other utilities.
- case $dst_arg in
- -* | [=\(\)!]) dst_arg=./$dst_arg;;
- esac
- done
-fi
-
-if test $# -eq 0; then
- if test -z "$dir_arg"; then
- echo "$0: no input file specified." >&2
- exit 1
- fi
- # It's OK to call `install-sh -d' without argument.
- # This can happen when creating conditional directories.
- exit 0
-fi
-
-if test -z "$dir_arg"; then
- do_exit='(exit $ret); exit $ret'
- trap "ret=129; $do_exit" 1
- trap "ret=130; $do_exit" 2
- trap "ret=141; $do_exit" 13
- trap "ret=143; $do_exit" 15
-
- # Set umask so as not to create temps with too-generous modes.
- # However, 'strip' requires both read and write access to temps.
- case $mode in
- # Optimize common cases.
- *644) cp_umask=133;;
- *755) cp_umask=22;;
-
- *[0-7])
- if test -z "$stripcmd"; then
- u_plus_rw=
- else
- u_plus_rw='% 200'
- fi
- cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
- *)
- if test -z "$stripcmd"; then
- u_plus_rw=
- else
- u_plus_rw=,u+rw
- fi
- cp_umask=$mode$u_plus_rw;;
- esac
-fi
-
-for src
-do
- # Protect names problematic for `test' and other utilities.
- case $src in
- -* | [=\(\)!]) src=./$src;;
- esac
-
- if test -n "$dir_arg"; then
- dst=$src
- dstdir=$dst
- test -d "$dstdir"
- dstdir_status=$?
- else
-
- # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
- # might cause directories to be created, which would be especially bad
- # if $src (and thus $dsttmp) contains '*'.
- if test ! -f "$src" && test ! -d "$src"; then
- echo "$0: $src does not exist." >&2
- exit 1
- fi
-
- if test -z "$dst_arg"; then
- echo "$0: no destination specified." >&2
- exit 1
- fi
- dst=$dst_arg
-
- # If destination is a directory, append the input filename; won't work
- # if double slashes aren't ignored.
- if test -d "$dst"; then
- if test -n "$no_target_directory"; then
- echo "$0: $dst_arg: Is a directory" >&2
- exit 1
- fi
- dstdir=$dst
- dst=$dstdir/`basename "$src"`
- dstdir_status=0
- else
- # Prefer dirname, but fall back on a substitute if dirname fails.
- dstdir=`
- (dirname "$dst") 2>/dev/null ||
- expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$dst" : 'X\(//\)[^/]' \| \
- X"$dst" : 'X\(//\)$' \| \
- X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
- echo X"$dst" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'
- `
-
- test -d "$dstdir"
- dstdir_status=$?
- fi
- fi
-
- obsolete_mkdir_used=false
-
- if test $dstdir_status != 0; then
- case $posix_mkdir in
- '')
- # Create intermediate dirs using mode 755 as modified by the umask.
- # This is like FreeBSD 'install' as of 1997-10-28.
- umask=`umask`
- case $stripcmd.$umask in
- # Optimize common cases.
- *[2367][2367]) mkdir_umask=$umask;;
- .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
- *[0-7])
- mkdir_umask=`expr $umask + 22 \
- - $umask % 100 % 40 + $umask % 20 \
- - $umask % 10 % 4 + $umask % 2
- `;;
- *) mkdir_umask=$umask,go-w;;
- esac
-
- # With -d, create the new directory with the user-specified mode.
- # Otherwise, rely on $mkdir_umask.
- if test -n "$dir_arg"; then
- mkdir_mode=-m$mode
- else
- mkdir_mode=
- fi
-
- posix_mkdir=false
- case $umask in
- *[123567][0-7][0-7])
- # POSIX mkdir -p sets u+wx bits regardless of umask, which
- # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
- ;;
- *)
- tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
- trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
- if (umask $mkdir_umask &&
- exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
- then
- if test -z "$dir_arg" || {
- # Check for POSIX incompatibilities with -m.
- # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
- # other-writeable bit of parent directory when it shouldn't.
- # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
- ls_ld_tmpdir=`ls -ld "$tmpdir"`
- case $ls_ld_tmpdir in
- d????-?r-*) different_mode=700;;
- d????-?--*) different_mode=755;;
- *) false;;
- esac &&
- $mkdirprog -m$different_mode -p -- "$tmpdir" && {
- ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
- test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
- }
- }
- then posix_mkdir=:
- fi
- rmdir "$tmpdir/d" "$tmpdir"
- else
- # Remove any dirs left behind by ancient mkdir implementations.
- rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
- fi
- trap '' 0;;
- esac;;
- esac
-
- if
- $posix_mkdir && (
- umask $mkdir_umask &&
- $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
- )
- then :
- else
-
- # The umask is ridiculous, or mkdir does not conform to POSIX,
- # or it failed possibly due to a race condition. Create the
- # directory the slow way, step by step, checking for races as we go.
-
- case $dstdir in
- /*) prefix='/';;
- [-=\(\)!]*) prefix='./';;
- *) prefix='';;
- esac
-
- eval "$initialize_posix_glob"
-
- oIFS=$IFS
- IFS=/
- $posix_glob set -f
- set fnord $dstdir
- shift
- $posix_glob set +f
- IFS=$oIFS
-
- prefixes=
-
- for d
- do
- test X"$d" = X && continue
-
- prefix=$prefix$d
- if test -d "$prefix"; then
- prefixes=
- else
- if $posix_mkdir; then
- (umask=$mkdir_umask &&
- $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
- # Don't fail if two instances are running concurrently.
- test -d "$prefix" || exit 1
- else
- case $prefix in
- *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
- *) qprefix=$prefix;;
- esac
- prefixes="$prefixes '$qprefix'"
- fi
- fi
- prefix=$prefix/
- done
-
- if test -n "$prefixes"; then
- # Don't fail if two instances are running concurrently.
- (umask $mkdir_umask &&
- eval "\$doit_exec \$mkdirprog $prefixes") ||
- test -d "$dstdir" || exit 1
- obsolete_mkdir_used=true
- fi
- fi
- fi
-
- if test -n "$dir_arg"; then
- { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
- { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
- { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
- test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
- else
-
- # Make a couple of temp file names in the proper directory.
- dsttmp=$dstdir/_inst.$$_
- rmtmp=$dstdir/_rm.$$_
-
- # Trap to clean up those temp files at exit.
- trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-
- # Copy the file name to the temp name.
- (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
-
- # and set any options; do chmod last to preserve setuid bits.
- #
- # If any of these fail, we abort the whole thing. If we want to
- # ignore errors from any of these, just make sure not to ignore
- # errors from the above "$doit $cpprog $src $dsttmp" command.
- #
- { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
- { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
- { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
- { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
- # If -C, don't bother to copy if it wouldn't change the file.
- if $copy_on_change &&
- old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
- new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
-
- eval "$initialize_posix_glob" &&
- $posix_glob set -f &&
- set X $old && old=:$2:$4:$5:$6 &&
- set X $new && new=:$2:$4:$5:$6 &&
- $posix_glob set +f &&
-
- test "$old" = "$new" &&
- $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
- then
- rm -f "$dsttmp"
- else
- # Rename the file to the real destination.
- $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
-
- # The rename failed, perhaps because mv can't rename something else
- # to itself, or perhaps because mv is so ancient that it does not
- # support -f.
- {
- # Now remove or move aside any old file at destination location.
- # We try this two ways since rm can't unlink itself on some
- # systems and the destination file might be busy for other
- # reasons. In this case, the final cleanup might fail but the new
- # file should still install successfully.
- {
- test ! -f "$dst" ||
- $doit $rmcmd -f "$dst" 2>/dev/null ||
- { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
- { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
- } ||
- { echo "$0: cannot unlink or rename $dst" >&2
- (exit 1); exit 1
- }
- } &&
-
- # Now rename the file to the real destination.
- $doit $mvcmd "$dsttmp" "$dst"
- }
- fi || exit 1
-
- trap '' 0
- fi
-done
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
+++ /dev/null
-# This Cplant(TM) source code is the property of Sandia National
-# Laboratories.
-#
-# This Cplant(TM) source code is copyrighted by Sandia National
-# Laboratories.
-#
-# The redistribution of this Cplant(TM) source code is subject to the
-# terms of the GNU Lesser General Public License
-# (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
-#
-# Cplant(TM) Copyright 1998-2003 Sandia Corporation.
-# Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
-# license for use of this work by or on behalf of the US Government.
-# Export of this program may require a license from the United States
-# Government.
-
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# Questions or comments about this library should be sent to:
-#
-# Lee Ward
-# Sandia National Laboratories, New Mexico
-# P.O. Box 5800
-# Albuquerque, NM 87185-1110
-#
-# lee@sandia.gov
-
-#
-# Useful commands for debugging libsysio in gdb
-#
-
-define x_dump_pbnode
- printf "%p: ", $arg0
- if $arg0->pb_name.name
- printf " \"%s\"", \
- $arg0->pb_name.name
- else
- printf " <NULL>"
- end
- printf " aliases:["
- set $x_p = $arg0->pb_aliases.lh_first
- while $x_p
- printf "<%p r:%d mnt:%p>", \
- $x_p, \
- $x_p->p_ref, \
- $x_p->p_mount
- set $x_p = $x_p->p_links.le_next
- end
- printf "]\n"
-end
-document x_dump_pbnode
-Dump path-base node and it's aliases
-
-Usage: x_dump_pbnode <pbnode>
-end
-
-define __x_dump_pnode
- printf "%spnode %p, mount %p, base: ", $arg0, $arg1, $arg1->p_mount
- x_dump_pbnode $arg1->p_base
-end
-
-define x_dump_pnode
- __x_dump_pnode "" $arg0
-end
-document x_dump_pnode
-Dump path node information
-
-Usage: x_dump_pnode <pnode>
-end
-
-define x_dump_mount
- printf "MOUNT %p: root pnode %p, covers %p\n", \
- $arg0, $arg0->mnt_root, $arg0->mnt_covers
- set $_x_dump_mount_var_pno = _sysio_pnodes->tqh_first
- while $_x_dump_mount_var_pno != 0
-printf "%p, %p\n", $_x_dump_mount_var_pno, $arg0
- if $_x_dump_mount_var_pno->p_mount == $arg0
- __x_dump_pnode " " $_x_dump_mount_var_pno
- end
- set $_x_dump_mount_var_pno = \
- $_x_dump_mount_var_pno->p_nodes.tqe_next
- end
-end
-document x_dump_mount
-Dump single mount record information
-
-Usage: x_dump_mount <mnt>
-end
-
-define x_dump_mounts
- set $__x_dump_mounts_var_mnt = mounts.lh_first
- while $__x_dump_mounts_var_mnt
- x_dump_mount $__x_dump_mounts_var_mnt
- set $__x_dump_mounts_var_mnt = \
- $__x_dump_mounts_var_mnt->mnt_link.le_next
- end
-end
-document x_dump_mounts
-Dump the contents of the libsysio mount table
-
-Usage: x_dump_mounts
-end
-
-define x_dump_pnodes
- set $_x_dump_pnodes_var_pno = _sysio_pnodes.tqh_first
- while $_x_dump_pnodes_var_pno
- x_dump_pnode $_x_dump_pnodes_var_pno
- set $_x_dump_pnodes_var_pno = \
- $_x_dump_pnodes_var_pno->p_nodes.tqe_next
- end
-end
-
-br _sysio_unmount_all
-run -r /tmp/lee foo bar
-x_dump_pnodes
+++ /dev/null
-#
-# Source this file. It will craft a usable name space for your testing.
-#
-# Lee; Sun Feb 8 18:02:16 EST 2004
-#
-# Note: We really should support symlinks someday.
-#
-unset _root_flags
-unset _extras
-if [ "x${SYSIO_AUTOMOUNT}" == "xyes" ]; then
- _root_flags="2"
- #
- # Add a /auto directory for automounted file systems. We
- # craft one automount that mounts /usr/home from the native
- # file system. Further automounts in the sub-mounts are not enabled.
- #
- _extras=" \
- {mnt, dev=\"incore:0755\",dir=\"/mnt\",fl=2} \
- {creat, ft=dir,nm=\"/mnt/home\",pm=04755} \
- {creat, ft=file,nm=\"/mnt/home/.mount\",pm=0600, \
- str=\"native:/home\"} \
- "
-fi
-export SYSIO_NAMESPACE="\
- {mnt, dev=\"native:/\",dir=/,fl=${_root_flags:-0}} \
- {mnt, dev=\"incore:0755\",dir=\"/dev\"} \
- {creat, ft=chr,nm=\"/dev/stdin\",pm=0400,mm=0+0} \
- {creat, ft=chr,nm=\"/dev/stdout\",pm=0200,mm=0+1} \
- {creat, ft=chr,nm=\"/dev/stderr\",pm=0200,mm=0+2} \
- {creat, ft=dir,nm=\"/dev/fd\",pm=0755} \
- {creat, ft=chr,nm=\"/dev/fd/0\",pm=0400,mm=0+0} \
- {open, nm=\"/dev/fd/0\",fd=0,m=0} \
- {creat, ft=chr,nm=\"/dev/fd/1\",pm=0200,mm=0+1} \
- {open, nm=\"/dev/fd/1\",fd=1,m=1} \
- {creat, ft=chr,nm=\"/dev/fd/2\",pm=0200,mm=0+2} \
- {open, nm=\"/dev/fd/2\",fd=2,m=1} \
- ${_extras} \
-"
-unset _root_flags
-unset _extras
+++ /dev/null
-#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
-
-scriptversion=2009-04-28.21; # UTC
-
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
-# 2008, 2009 Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program 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 General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-if test $# -eq 0; then
- echo 1>&2 "Try \`$0 --help' for more information"
- exit 1
-fi
-
-run=:
-sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
-sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
-
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
- configure_ac=configure.ac
-else
- configure_ac=configure.in
-fi
-
-msg="missing on your system"
-
-case $1 in
---run)
- # Try to run requested program, and just exit if it succeeds.
- run=
- shift
- "$@" && exit 0
- # Exit code 63 means version mismatch. This often happens
- # when the user try to use an ancient version of a tool on
- # a file that requires a minimum version. In this case we
- # we should proceed has if the program had been absent, or
- # if --run hadn't been passed.
- if test $? = 63; then
- run=:
- msg="probably too old"
- fi
- ;;
-
- -h|--h|--he|--hel|--help)
- echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
-
-Options:
- -h, --help display this help and exit
- -v, --version output version information and exit
- --run try to run the given command, and emulate it if it fails
-
-Supported PROGRAM values:
- aclocal touch file \`aclocal.m4'
- autoconf touch file \`configure'
- autoheader touch file \`config.h.in'
- autom4te touch the output file, or create a stub one
- automake touch all \`Makefile.in' files
- bison create \`y.tab.[ch]', if possible, from existing .[ch]
- flex create \`lex.yy.c', if possible, from existing .c
- help2man touch the output file
- lex create \`lex.yy.c', if possible, from existing .c
- makeinfo touch the output file
- tar try tar, gnutar, gtar, then tar without non-portable flags
- yacc create \`y.tab.[ch]', if possible, from existing .[ch]
-
-Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
-\`g' are ignored when checking the name.
-
-Send bug reports to <bug-automake@gnu.org>."
- exit $?
- ;;
-
- -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
- echo "missing $scriptversion (GNU Automake)"
- exit $?
- ;;
-
- -*)
- echo 1>&2 "$0: Unknown \`$1' option"
- echo 1>&2 "Try \`$0 --help' for more information"
- exit 1
- ;;
-
-esac
-
-# normalize program name to check for.
-program=`echo "$1" | sed '
- s/^gnu-//; t
- s/^gnu//; t
- s/^g//; t'`
-
-# Now exit if we have it, but it failed. Also exit now if we
-# don't have it and --version was passed (most likely to detect
-# the program). This is about non-GNU programs, so use $1 not
-# $program.
-case $1 in
- lex*|yacc*)
- # Not GNU programs, they don't have --version.
- ;;
-
- tar*)
- if test -n "$run"; then
- echo 1>&2 "ERROR: \`tar' requires --run"
- exit 1
- elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
- exit 1
- fi
- ;;
-
- *)
- if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
- # We have it, but it failed.
- exit 1
- elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
- # Could not run --version or --help. This is probably someone
- # running `$TOOL --version' or `$TOOL --help' to check whether
- # $TOOL exists and not knowing $TOOL uses missing.
- exit 1
- fi
- ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case $program in
- aclocal*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`acinclude.m4' or \`${configure_ac}'. You might want
- to install the \`Automake' and \`Perl' packages. Grab them from
- any GNU archive site."
- touch aclocal.m4
- ;;
-
- autoconf*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`${configure_ac}'. You might want to install the
- \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
- archive site."
- touch configure
- ;;
-
- autoheader*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`acconfig.h' or \`${configure_ac}'. You might want
- to install the \`Autoconf' and \`GNU m4' packages. Grab them
- from any GNU archive site."
- files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
- test -z "$files" && files="config.h"
- touch_files=
- for f in $files; do
- case $f in
- *:*) touch_files="$touch_files "`echo "$f" |
- sed -e 's/^[^:]*://' -e 's/:.*//'`;;
- *) touch_files="$touch_files $f.in";;
- esac
- done
- touch $touch_files
- ;;
-
- automake*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
- You might want to install the \`Automake' and \`Perl' packages.
- Grab them from any GNU archive site."
- find . -type f -name Makefile.am -print |
- sed 's/\.am$/.in/' |
- while read f; do touch "$f"; done
- ;;
-
- autom4te*)
- echo 1>&2 "\
-WARNING: \`$1' is needed, but is $msg.
- You might have modified some files without having the
- proper tools for further handling them.
- You can get \`$1' as part of \`Autoconf' from any GNU
- archive site."
-
- file=`echo "$*" | sed -n "$sed_output"`
- test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
- if test -f "$file"; then
- touch $file
- else
- test -z "$file" || exec >$file
- echo "#! /bin/sh"
- echo "# Created by GNU Automake missing as a replacement of"
- echo "# $ $@"
- echo "exit 0"
- chmod +x $file
- exit 1
- fi
- ;;
-
- bison*|yacc*)
- echo 1>&2 "\
-WARNING: \`$1' $msg. You should only need it if
- you modified a \`.y' file. You may need the \`Bison' package
- in order for those modifications to take effect. You can get
- \`Bison' from any GNU archive site."
- rm -f y.tab.c y.tab.h
- if test $# -ne 1; then
- eval LASTARG="\${$#}"
- case $LASTARG in
- *.y)
- SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
- if test -f "$SRCFILE"; then
- cp "$SRCFILE" y.tab.c
- fi
- SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
- if test -f "$SRCFILE"; then
- cp "$SRCFILE" y.tab.h
- fi
- ;;
- esac
- fi
- if test ! -f y.tab.h; then
- echo >y.tab.h
- fi
- if test ! -f y.tab.c; then
- echo 'main() { return 0; }' >y.tab.c
- fi
- ;;
-
- lex*|flex*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified a \`.l' file. You may need the \`Flex' package
- in order for those modifications to take effect. You can get
- \`Flex' from any GNU archive site."
- rm -f lex.yy.c
- if test $# -ne 1; then
- eval LASTARG="\${$#}"
- case $LASTARG in
- *.l)
- SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
- if test -f "$SRCFILE"; then
- cp "$SRCFILE" lex.yy.c
- fi
- ;;
- esac
- fi
- if test ! -f lex.yy.c; then
- echo 'main() { return 0; }' >lex.yy.c
- fi
- ;;
-
- help2man*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified a dependency of a manual page. You may need the
- \`Help2man' package in order for those modifications to take
- effect. You can get \`Help2man' from any GNU archive site."
-
- file=`echo "$*" | sed -n "$sed_output"`
- test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
- if test -f "$file"; then
- touch $file
- else
- test -z "$file" || exec >$file
- echo ".ab help2man is required to generate this page"
- exit $?
- fi
- ;;
-
- makeinfo*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified a \`.texi' or \`.texinfo' file, or any other file
- indirectly affecting the aspect of the manual. The spurious
- call might also be the consequence of using a buggy \`make' (AIX,
- DU, IRIX). You might want to install the \`Texinfo' package or
- the \`GNU make' package. Grab either from any GNU archive site."
- # The file to touch is that specified with -o ...
- file=`echo "$*" | sed -n "$sed_output"`
- test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
- if test -z "$file"; then
- # ... or it is the one specified with @setfilename ...
- infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
- file=`sed -n '
- /^@setfilename/{
- s/.* \([^ ]*\) *$/\1/
- p
- q
- }' $infile`
- # ... or it is derived from the source name (dir/f.texi becomes f.info)
- test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
- fi
- # If the file does not exist, the user really needs makeinfo;
- # let's fail without touching anything.
- test -f $file || exit 1
- touch $file
- ;;
-
- tar*)
- shift
-
- # We have already tried tar in the generic part.
- # Look for gnutar/gtar before invocation to avoid ugly error
- # messages.
- if (gnutar --version > /dev/null 2>&1); then
- gnutar "$@" && exit 0
- fi
- if (gtar --version > /dev/null 2>&1); then
- gtar "$@" && exit 0
- fi
- firstarg="$1"
- if shift; then
- case $firstarg in
- *o*)
- firstarg=`echo "$firstarg" | sed s/o//`
- tar "$firstarg" "$@" && exit 0
- ;;
- esac
- case $firstarg in
- *h*)
- firstarg=`echo "$firstarg" | sed s/h//`
- tar "$firstarg" "$@" && exit 0
- ;;
- esac
- fi
-
- echo 1>&2 "\
-WARNING: I can't seem to be able to run \`tar' with the given arguments.
- You may want to install GNU tar or Free paxutils, or check the
- command line arguments."
- exit 1
- ;;
-
- *)
- echo 1>&2 "\
-WARNING: \`$1' is needed, and is $msg.
- You might have modified some files without having the
- proper tools for further handling them. Check the \`README' file,
- it often tells you about the needed prerequisites for installing
- this package. You may also peek at any GNU archive site, in case
- some other package would contain this missing \`$1' program."
- exit 1
- ;;
-esac
-
-exit 0
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
+++ /dev/null
-#! /bin/sh
-# mkinstalldirs --- make directory hierarchy
-# Author: Noah Friedman <friedman@prep.ai.mit.edu>
-# Created: 1993-05-16
-# Public domain
-
-errstatus=0
-dirmode=""
-
-usage="\
-Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..."
-
-# process command line arguments
-while test $# -gt 0 ; do
- case $1 in
- -h | --help | --h*) # -h for help
- echo "$usage" 1>&2
- exit 0
- ;;
- -m) # -m PERM arg
- shift
- test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
- dirmode=$1
- shift
- ;;
- --) # stop option processing
- shift
- break
- ;;
- -*) # unknown option
- echo "$usage" 1>&2
- exit 1
- ;;
- *) # first non-opt arg
- break
- ;;
- esac
-done
-
-for file
-do
- if test -d "$file"; then
- shift
- else
- break
- fi
-done
-
-case $# in
- 0) exit 0 ;;
-esac
-
-case $dirmode in
- '')
- if mkdir -p -- . 2>/dev/null; then
- echo "mkdir -p -- $*"
- exec mkdir -p -- "$@"
- fi
- ;;
- *)
- if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
- echo "mkdir -m $dirmode -p -- $*"
- exec mkdir -m "$dirmode" -p -- "$@"
- fi
- ;;
-esac
-
-for file
-do
- set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
- shift
-
- pathcomp=
- for d
- do
- pathcomp="$pathcomp$d"
- case $pathcomp in
- -*) pathcomp=./$pathcomp ;;
- esac
-
- if test ! -d "$pathcomp"; then
- echo "mkdir $pathcomp"
-
- mkdir "$pathcomp" || lasterr=$?
-
- if test ! -d "$pathcomp"; then
- errstatus=$lasterr
- else
- if test ! -z "$dirmode"; then
- echo "chmod $dirmode $pathcomp"
- lasterr=""
- chmod "$dirmode" "$pathcomp" || lasterr=$?
-
- if test ! -z "$lasterr"; then
- errstatus=$lasterr
- fi
- fi
- fi
- fi
-
- pathcomp="$pathcomp/"
- done
-done
-
-exit $errstatus
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# End:
-# mkinstalldirs ends here
+++ /dev/null
-/.dirstamp
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2006 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdlib.h>
-#include <errno.h>
-#include <unistd.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "mount.h"
-#include "fs.h"
-#include "inode.h"
-#include "sysio-symbols.h"
-
-/*
- * Use a persistent buffer for gids. No, not a cache. We just want to
- * avoid calling malloc over, and over, and...
- */
-static gid_t *gids = NULL;
-static int gidslen = 0;
-
-/*
- * Check given access type on given inode.
- */
-int
-_sysio_check_permission(struct pnode *pno, struct creds *crp, int amode)
-{
- mode_t mask;
- struct inode *ino;
- int err;
- struct intnl_stat *stat;
- gid_t *gids;
- int ngids;
- int group_matched;
-
- /*
- * Check amode.
- */
- if ((amode & (R_OK|W_OK|X_OK)) != amode)
- return -EINVAL;
-
- if (!amode)
- return 0;
-
- mask = 0;
- if (amode & R_OK)
- mask |= S_IRUSR;
- if (amode & W_OK)
- mask |= S_IWUSR;
- if (amode & X_OK)
- mask |= S_IXUSR;
-
- ino = pno->p_base->pb_ino;
- assert(ino);
-
- err = -EACCES; /* assume error */
- stat = &ino->i_stbuf;
- do {
-#ifdef _SYSIO_ROOT_UID
- /*
- * Root?
- */
- if (_sysio_is_root(crp)) {
- err = 0;
- break;
- }
-#endif
-
- /*
- * Owner?
- */
- if (stat->st_uid == crp->creds_uid) {
- if ((stat->st_mode & mask) == mask)
- err = 0;
- break;
- }
-
- /*
- * Group?
- */
- mask >>= 3;
- group_matched = 0;
- gids = crp->creds_gids;
- ngids = crp->creds_ngids;
- while (ngids) {
- ngids--;
- if (stat->st_gid == *gids++) {
- group_matched = 1;
- if ((stat->st_mode & mask) == mask)
- err = 0;
- }
- }
- if (group_matched)
- break;
-
- /*
- * Other?
- */
- mask >>= 3;
- if ((stat->st_mode & mask) == mask)
- err = 0;
- } while (0);
- if (err)
- return err;
-
- /*
- * Check for RO access to the file due to mount
- * options.
- */
- if (amode & W_OK && IS_RDONLY(pno))
- return -EROFS;
-
- return 0;
-}
-
-/*
- * Cache groups.
- */
-static int
-_sysio_ldgroups(gid_t gid0, gid_t **gidsp, int *gidslenp)
-{
- int n, i;
- void *p;
-
- n = *gidslenp;
- if (n < 8) {
- *gidsp = NULL;
- n = 8;
- }
- for (;;) {
- /*
- * This is far more expensive than I would like. Each time
- * called it has to go to some length to acquire the
- * current uid and groups membership. We can't just cache
- * the result, either. The caller could have altered something
- * asynchronously. Wish we had easy access to this info.
- */
- if (n > *gidslenp) {
- p = realloc(*gidsp, (size_t )n * sizeof(gid_t));
- if (!p)
- return -errno;
- *gidsp = p;
- *gidslenp = n;
- }
- (*gidsp)[0] = gid0;
- i = getgroups(n - 1, *gidsp + 1);
- if (i < 0) {
- if (errno != EINVAL)
- return -errno;
- if (INT_MAX / 2 < n)
- return -EINVAL;
- n *= 2;
- continue;
- }
- break;
- }
- return i;
-}
-
-/*
- * Get current credentials.
- */
-static int
-_sysio_ldcreds(uid_t uid, gid_t gid, struct creds *crp)
-{
- int n;
-
- n = _sysio_ldgroups(gid, &gids, &gidslen);
- if (n < 0)
- return n;
- crp->creds_uid = uid;
- crp->creds_gids = gids;
- crp->creds_ngids = n;
-
- return 0;
-}
-
-/*
- * Determine if a given access is permitted to a given file.
- */
-int
-_sysio_permitted(struct pnode *pno, int amode)
-{
- struct creds cr;
- int err;
-
- err = _sysio_ldcreds(geteuid(), getegid(), &cr);
- if (err < 0)
- return err;
- err = _sysio_check_permission(pno, &cr, amode);
- return err;
-}
-
-#ifdef ZERO_SUM_MEMORY
-/*
- * Clean up persistent resource on shutdown.
- */
-void
-_sysio_access_shutdown()
-{
-
- if (gids)
- free(gids);
- gids = NULL;
- gidslen = 0;
-}
-#endif
-
-int
-SYSIO_INTERFACE_NAME(access)(const char *path, int amode)
-{
- struct intent intent;
- int err;
- struct pnode *pno;
- struct creds cr;
-
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
-
- INTENT_INIT(&intent, INT_GETATTR, NULL, NULL);
- err = _sysio_namei(_sysio_cwd, path, 0, &intent, &pno);
- if (err)
- SYSIO_INTERFACE_RETURN(-1, err);
- err = _sysio_ldcreds(geteuid(), getegid(), &cr);
- if (err < 0)
- goto out;
- err =
- _sysio_check_permission(pno, &cr, amode);
-out:
- P_RELE(pno);
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef __access
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(access),
- PREPEND(__, SYSIO_INTERFACE_NAME(access)))
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2006 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * #############################################################################
- * #
- * # This Cplant(TM) source code is the property of Sandia National
- * # Laboratories.
- * #
- * # This Cplant(TM) source code is copyrighted by Sandia National
- * # Laboratories.
- * #
- * # The redistribution of this Cplant(TM) source code is subject to the
- * # terms of the GNU Lesser General Public License
- * # (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- * #
- * # Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * # Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * # license for use of this work by or on behalf of the US Government.
- * # Export of this program may require a license from the United States
- * # Government.
- * #
- * #############################################################################
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <string.h>
-#include <limits.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "mount.h"
-#include "file.h"
-#include "sysio-symbols.h"
-
-#ifdef DEFER_INIT_CWD
-const char *_sysio_init_cwd = NULL;
-#endif
-
-struct pnode *_sysio_cwd = NULL;
-
-/*
- * Change to directory specified by the given pnode.
- */
-int
-_sysio_p_chdir(struct pnode *pno)
-{
- int err;
-
- /*
- * Revalidate the pnode, and ensure it's an accessable directory
- */
- err = _sysio_p_validate(pno, NULL, NULL);
- if (err)
- return err;
- if (!(pno->p_base->pb_ino &&
- S_ISDIR(pno->p_base->pb_ino->i_stbuf.st_mode)))
- return -ENOTDIR;
- if ((err = _sysio_permitted(pno, X_OK)) != 0)
- return err;
-
- /*
- * Release old if set.
- */
- if (_sysio_cwd)
- P_RELE(_sysio_cwd);
-
- /*
- * Finally, change to the new.
- */
- _sysio_cwd = pno;
-
- return 0;
-}
-
-int
-SYSIO_INTERFACE_NAME(chdir)(const char *path)
-{
- int err;
- struct pnode *pno;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- err = _sysio_namei(_sysio_cwd, path, 0, NULL, &pno);
- if (err)
- SYSIO_INTERFACE_RETURN(-1, err);
-
- err = _sysio_p_chdir(pno);
- if (err)
- P_RELE(pno);
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef __chdir
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(chdir),
- PREPEND(__, SYSIO_INTERFACE_NAME(chdir)))
-#endif
-
-/*
- * Return path tracked by the path ancestor chain.
- *
- * If the buf pointer is NULL, a buffer large enough to hold the path
- * is allocated from the heap.
- */
-
-static int
-_sysio_p_path(struct pnode *pno, char **buf, size_t size)
-{
- struct pnode *cur;
- size_t len;
- size_t n;
- char *cp;
-
- cur = pno;
-
- if (!size && buf && *buf)
- return -EINVAL;
-
- /*
- * Walk up the tree to the root, summing the component name
- * lengths and counting the vertices.
- */
- len = 0;
- n = 0;
- do {
- /*
- * If this is a covering path-node then the name should be
- * the *covered* nodes name, not this one unless we are at
- * the root of the name-space.
- */
- while (pno == pno->p_mount->mnt_root && pno != pno->p_parent )
- pno = pno->p_mount->mnt_covers;
-
- /*
- * Add length of this component to running sum and
- * account for this vertex.
- */
- assert((len >= pno->p_base->pb_name.len &&
- (size_t )~0 - pno->p_base->pb_name.len > len) ||
- (size_t )~0 - len > pno->p_base->pb_name.len);
- len += pno->p_base->pb_name.len;
- n++;
- assert(n);
- pno = pno->p_parent;
- } while (pno != pno->p_parent);
-
- if (!*buf)
- size = len + n + 1;
- if (len >= size || n >= size - len)
- return -ERANGE;
- if (!*buf) {
- /*
- * Allocate path buffer from the heap.
- */
- *buf = malloc(size * sizeof(char));
- if (!*buf)
- return -ENOMEM;
- }
-
- /*
- * Fill in the path buffer.
- */
- pno = cur;
- cp = *buf + len + n;
- *cp = '\0'; /* NUL terminate */
- do {
- /*
- * If this is a covering path-node then the name should be
- * the *covered* nodes name, not this one unless we are at
- * the root of the name-space.
- */
- while (pno == pno->p_mount->mnt_root && pno != pno->p_parent )
- pno = pno->p_mount->mnt_covers;
-
- /*
- * Add component and separator.
- */
- cp -= pno->p_base->pb_name.len;
- (void )memcpy(cp, pno->p_base->pb_name.name,
- pno->p_base->pb_name.len);
-
- *--cp = PATH_SEPARATOR;
- pno = pno->p_parent;
- } while (pno != pno->p_parent);
-
- return 0;
-}
-
-char *
-SYSIO_INTERFACE_NAME(getcwd)(char *buf, size_t size)
-{
- int err;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
-#ifdef DEFER_INIT_CWD
- if (!_sysio_cwd) {
- struct pnode *pno;
-
- /*
- * Can no longer defer initialization of the current working
- * directory. Force namei to make it happen now.
- */
- if (_sysio_namei(NULL, ".", 0, NULL, &pno) != 0)
- abort();
- P_RELE(pno);
- }
-#endif
- err = _sysio_p_path(_sysio_cwd, &buf, buf ? size : 0);
- SYSIO_INTERFACE_RETURN(err ? NULL : buf, err);
-}
-
-#ifdef __GLIBC__
-#undef __getcwd
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(getcwd),
- PREPEND(__, SYSIO_INTERFACE_NAME(getcwd)))
-#endif
-
-#if defined(PATH_MAX) && !(defined(REDSTORM))
-char *
-SYSIO_INTERFACE_NAME(getwd)(char *buf)
-{
-
- if (!buf) {
- errno = EFAULT;
- return NULL;
- }
-
- return SYSIO_INTERFACE_NAME(getcwd)(buf, PATH_MAX);
-}
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "file.h"
-#include "sysio-symbols.h"
-
-static int
-do_chmod(struct pnode *pno, struct inode *ino, mode_t mode)
-{
- int err;
- struct intnl_stat stbuf;
- unsigned mask;
-
- (void )memset(&stbuf, 0, sizeof(struct intnl_stat));
- stbuf.st_mode = mode & 07777;
- mask = SETATTR_MODE;
- err = _sysio_setattr(pno, ino, mask, &stbuf);
- return err;
-}
-
-int
-SYSIO_INTERFACE_NAME(chmod)(const char *path, mode_t mode)
-{
- int err;
- struct pnode *pno;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- err = _sysio_namei(_sysio_cwd, path, 0, NULL, &pno);
- if (err)
- goto out;
- err = do_chmod(pno, pno->p_base->pb_ino, mode);
- P_RELE(pno);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef __chmod
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(chmod),
- PREPEND(__, SYSIO_INTERFACE_NAME(chmod)))
-#endif
-
-int
-SYSIO_INTERFACE_NAME(fchmod)(int fd, mode_t mode)
-{
- int err;
- struct file *fil;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- err = 0;
- fil = _sysio_fd_find(fd);
- if (!fil) {
- err = -EBADF;
- goto out;
- }
-
- err = do_chmod(NULL, fil->f_ino, mode);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef __fchmod
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(fchmod),
- PREPEND(__, SYSIO_INTERFACE_NAME(fchmod)))
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "file.h"
-#include "sysio-symbols.h"
-
-static int
-_do_chown(struct pnode *pno, struct inode *ino, uid_t owner, gid_t group)
-{
- int err;
- struct intnl_stat stbuf;
- unsigned mask;
-
- (void )memset(&stbuf, 0, sizeof(struct intnl_stat));
- mask = 0;
- if (owner != (uid_t )-1) {
- stbuf.st_uid = owner;
- mask |= SETATTR_UID;
- }
- if (group != (gid_t )-1) {
- stbuf.st_gid = group;
- mask |= SETATTR_GID;
- }
- err = _sysio_setattr(pno, ino, mask, &stbuf);
- return err;
-}
-
-int
-SYSIO_INTERFACE_NAME(chown)(const char *path, uid_t owner, gid_t group)
-{
- int err;
- struct pnode *pno;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- err = _sysio_namei(_sysio_cwd, path, 0, NULL, &pno);
- if (err)
- goto out;
-
- err = _do_chown(pno, pno->p_base->pb_ino, owner, group);
- P_RELE(pno);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef __chown
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(chown),
- PREPEND(__, SYSIO_INTERFACE_NAME(chown)))
-#endif
-
-int
-SYSIO_INTERFACE_NAME(fchown)(int fd, uid_t owner, gid_t group)
-{
- int err;
- struct file *fil;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- err = 0;
- fil = _sysio_fd_find(fd);
- if (!fil) {
- err = -EBADF;
- goto out;
- }
-
- err = _do_chown(NULL, fil->f_ino, owner, group);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef __fchown
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(fchown),
- PREPEND(__, SYSIO_INTERFACE_NAME(fchown)))
-#endif
-
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdlib.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "dev.h"
-
-const struct inode_ops _sysio_nodev_ops = {
- _sysio_nodev_inop_lookup,
- _sysio_nodev_inop_getattr,
- _sysio_nodev_inop_setattr,
- _sysio_nodev_filldirentries,
- _sysio_nodev_inop_mkdir,
- _sysio_nodev_inop_rmdir,
- _sysio_nodev_inop_symlink,
- _sysio_nodev_inop_readlink,
- _sysio_nodev_inop_open,
- _sysio_nodev_inop_close,
- _sysio_nodev_inop_link,
- _sysio_nodev_inop_unlink,
- _sysio_nodev_inop_rename,
- _sysio_nodev_inop_read,
- _sysio_nodev_inop_write,
- _sysio_nodev_inop_pos,
- _sysio_nodev_inop_iodone,
- _sysio_nodev_inop_fcntl,
- _sysio_nodev_inop_sync,
- _sysio_nodev_inop_datasync,
- _sysio_nodev_inop_ioctl,
- _sysio_nodev_inop_mknod,
-#ifdef _HAVE_STATVFS
- _sysio_nodev_inop_statvfs,
-#endif
- _sysio_nodev_inop_gone
-};
-
-/*
- * Support for pseudo-devices.
- */
-
-struct device {
- const char *dev_name;
- struct inode_ops dev_ops;
-};
-
-static struct device cdev[128];
-
-int
-_sysio_dev_init()
-{
- unsigned major;
-
- major = 0;
- do {
- cdev[major].dev_name = NULL;
- cdev[major].dev_ops = _sysio_nodev_ops;
- } while (++major < sizeof(cdev) / sizeof(struct device));
-
- return 0;
-}
-
-/*
- * Allocate major dev number in the dynamic range [128-255].
- */
-dev_t
-_sysio_dev_alloc()
-{
- unsigned short major;
- static unsigned char c_major = 128;
-
- assert(c_major);
- major = c_major++;
- return SYSIO_MKDEV(major, 0);
-}
-
-static int
-dev_register(struct device devtbl[],
- int major,
- const char *name,
- struct inode_ops *ops)
-{
-
- assert(major < 128);
-
- if (major < 0) {
- major = sizeof(cdev) / sizeof(struct device);
- while (major--) {
- if (!devtbl[major].dev_name)
- break;
- }
- }
- if (major < 0)
- return -ENXIO; /* I dunno, what? */
- if (devtbl[major].dev_name)
- return -EEXIST;
- devtbl[major].dev_name = name;
- devtbl[major].dev_ops = *ops;
-
- return major;
-}
-
-int
-_sysio_char_dev_register(int major, const char *name, struct inode_ops *ops)
-{
-
- return dev_register(cdev, major, name, ops);
-}
-
-struct inode_ops *
-_sysio_dev_lookup(mode_t mode, dev_t dev)
-{
- struct device *devtbl;
- dev_t major;
-
- if (S_ISCHR(mode) || S_ISFIFO(mode))
- devtbl = cdev;
- else
- return (struct inode_ops *)&_sysio_nodev_ops;
-
- major = SYSIO_MAJOR_DEV(dev);
- if (!(major < 128) || !devtbl[major].dev_name)
- return (struct inode_ops *)&_sysio_nodev_ops;
-
- return &devtbl[major].dev_ops;
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "file.h"
-#include "sysio-symbols.h"
-
-int
-SYSIO_INTERFACE_NAME(dup2)(int oldfd, int newfd)
-{
- int fd;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- if (newfd < 0)
- SYSIO_INTERFACE_RETURN(-1, -EBADF);
- fd = _sysio_fd_dup(oldfd, newfd, 1);
- SYSIO_INTERFACE_RETURN(fd < 0 ? -1 : fd, fd < 0 ? fd : 0);
-}
-
-#ifdef REDSTORM
-#undef __dup2
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(dup2),
- PREPEND(__, SYSIO_INTERFACE_NAME(dup2)))
-#endif
-
-int
-SYSIO_INTERFACE_NAME(dup)(int oldfd)
-{
- int fd;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fd = _sysio_fd_dup(oldfd, -1, 0);
- SYSIO_INTERFACE_RETURN(fd < 0 ? -1 : fd, fd < 0 ? fd : 0);
-}
-
-#ifdef __GLIBC__
-#undef __dup
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(dup),
- PREPEND(__, SYSIO_INTERFACE_NAME(dup)))
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2005 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "file.h"
-
-#include "sysio-symbols.h"
-
-#ifdef HAVE_LUSTRE_HACK
-#include <sys/syscall.h>
-#include <native.h>
-#endif
-
-#ifdef HAVE_LUSTRE_HACK
-static int
-_sysio_lustre_fcntl(int fd, int cmd, va_list ap, int *rtn)
-{
- long arg = va_arg(ap, long);
-
- *rtn = syscall(SYSIO_SYS_fcntl, fd, cmd, arg);
- return *rtn == -1 ? -errno : 0;
-}
-#endif
-
-static int
-_sysio_fcntl_raw_call(struct inode *ino, int *r, int cmd, ...)
-{
- va_list ap;
- int err;
-
- va_start(ap, cmd);
- err = ino->i_ops.inop_fcntl(ino, cmd, ap, r);
- va_end(ap);
- return err;
-}
-
-/*
- * Convert offsets to absolute, when appropriate, and call appropriate driver
- * to complete the fcntl lock function. If successful, convert
- * returned values back to appropriate form.
- */
-static int
-_sysio_fcntl_lock(struct file *fil, int cmd, struct _SYSIO_FLOCK *fl)
-{
- struct _SYSIO_FLOCK flock;
- _SYSIO_OFF_T pos;
- int err;
- int rtn;
-
- /*
- * The drivers will not have a clue as to the
- * current position of the file pointer. We need to
- * convert relative whence values to absolute
- * file adresses for them, then.
- */
- flock = *fl;
- switch (flock.l_whence) {
- case SEEK_SET:
- /*
- * At least parameter check this one, too.
- */
- case SEEK_CUR:
- case SEEK_END:
- pos =
- _sysio_lseek_prepare(fil,
- flock.l_start,
- flock.l_whence,
- _SEEK_MAX(fil));
- if (pos < 0)
- return (int )pos;
- flock.l_start = pos;
- flock.l_whence = SEEK_SET;
- break;
- default:
- return -EINVAL;
- }
- err =
- _sysio_fcntl_raw_call(fil->f_ino, &rtn, cmd, &flock);
- if (err)
- return err;
- /*
- * Ugh, convert back to relative form.
- */
- switch (fl->l_whence) {
- case SEEK_SET:
- break;
- case SEEK_CUR:
- fl->l_start = flock.l_start;
- fl->l_start -= fil->f_pos;
- break;
- case SEEK_END:
- fl->l_start = flock.l_start;
- fl->l_start -=
- fil->f_ino->i_stbuf.st_size;
- break;
- default:
- abort();
- }
- /*
- * Return success.
- */
- return 0;
-}
-
-static int
-_sysio_vfcntl(int fd, int cmd, va_list ap)
-{
- int err;
- int rtn;
- struct file *fil;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- err = 0;
- fil = _sysio_fd_find(fd);
- if (!fil) {
-#ifdef HAVE_LUSTRE_HACK
- err = _sysio_lustre_fcntl(fd, cmd, ap, &rtn);
- goto out;
-#else
- rtn = -1;
- err = -EBADF;
- goto out;
-#endif
- }
-
- switch (cmd) {
-
- case F_DUPFD:
- {
- long newfd;
-
- newfd = va_arg(ap, long);
- if (newfd != (int )newfd || newfd < 0) {
- rtn = -1;
- err = -EBADF;
- goto out;
- }
- rtn = _sysio_fd_dup(fd, (int )newfd, 0);
- if (rtn < 0) {
- err = rtn;
- rtn = -1;
- }
- }
- break;
-#if !(defined(_LARGEFILE64_SOURCE) || F_GETLK64 == F_GETLK)
- case F_GETLK:
- case F_SETLK:
- case F_SETLKW:
- {
- struct intnl_stat buf;
- struct flock *fl;
-#ifdef _LARGEFILE64_SOURCE
- struct _SYSIO_FLOCK flock64;
-#endif
-
- /*
- * Refresh the cached attributes.
- */
- err =
- fil->f_ino->i_ops.inop_getattr(NULL,
- fil->f_ino,
- &buf);
- if (err) {
- rtn = -1;
- break;
- }
- /*
- * Copy args to a temp and normalize.
- */
- fl = va_arg(ap, struct flock *);
-#ifdef _LARGEFILE64_SOURCE
- flock64.l_type = fl->l_type;
- flock64.l_whence = fl->l_whence;
- flock64.l_start = fl->l_start;
- flock64.l_len = fl->l_len;
- flock64.l_pid = fl->l_pid;
- err = _sysio_fcntl_lock(fil, cmd, &flock64);
-#else
- err = _sysio_fcntl_lock(fil, cmd, fl);
-#endif
- if (err < 0) {
- rtn = -1;
- break;
- }
-#ifdef _LARGEFILE64_SOURCE
- /*
- * Copy back. Note that the fcntl_lock call
- * should have ensured that no overflow was possible.
- */
- fl->l_type = flock64.l_type;
- fl->l_whence = flock64.l_whence;
- fl->l_start = flock64.l_start;
- assert(fl->l_start == flock64.l_start);
- fl->l_len = flock64.l_len;
- assert(fl->l_len == flock64.l_len);
- fl->l_pid = flock64.l_pid;
-#endif
- rtn = 0;
- }
- break;
-#endif /* !(_LARGEFILE64_SOURCE || F_GETLK64 == F_GETLK) */
-#ifdef _LARGEFILE64_SOURCE
- case F_GETLK64:
- case F_SETLK64:
- case F_SETLKW64:
- {
- struct flock64 *fl64;
-
- fl64 = va_arg(ap, struct flock64 *);
- err = _sysio_fcntl_lock(fil, cmd, fl64);
- rtn = err ? -1 : 0;
- }
- break;
-#endif
- default:
- err = fil->f_ino->i_ops.inop_fcntl(fil->f_ino, cmd, ap, &rtn);
- break;
- }
-
-out:
- SYSIO_INTERFACE_RETURN(rtn, err);
-}
-
-int
-SYSIO_INTERFACE_NAME(fcntl)(int fd, int cmd, ...)
-{
- va_list ap;
- int err;
-
- va_start(ap, cmd);
- err = _sysio_vfcntl(fd, cmd, ap);
- va_end(ap);
- return err;
-}
-
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(fcntl),
- SYSIO_INTERFACE_NAME(fcntl64))
-
-#ifdef __GLIBC__
-#undef __fcntl
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(fcntl),
- PREPEND(__, SYSIO_INTERFACE_NAME(fcntl)))
-#endif
-
-#ifdef BSD
-#undef _fcntl
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(fcntl),
- PREPEND(_, SYSIO_INTERFACE_NAME(fcntl)))
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdlib.h>
-#include <assert.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "file.h"
-#include "inode.h"
-
-/*
- * Support for file IO.
- */
-
-/*
- * The open files table and it's size.
- */
-static struct file **_sysio_oftab = NULL;
-static size_t _sysio_oftab_size = 0;
-
-/*
- * Create and initialize open file record.
- */
-struct file *
-_sysio_fnew(struct inode *ino, int flags)
-{
- struct file *fil;
-
- fil = malloc(sizeof(struct file));
- if (!fil)
- return NULL;
-
- _SYSIO_FINIT(fil, ino, flags);
- F_REF(fil);
- I_REF(fil->f_ino);
-
- return fil;
-}
-
-/*
- * Destroy open file record.
- */
-void
-_sysio_fgone(struct file *fil)
-{
- int err;
-
- assert(!fil->f_ref);
- assert(fil->f_ino);
- err = (*fil->f_ino->i_ops.inop_close)(fil->f_ino);
- assert(!err);
- I_RELE(fil->f_ino);
- free(fil);
-}
-
-/*
- * IO operation completion handler.
- */
-void
-_sysio_fcompletio(struct ioctx *ioctx, struct file *fil)
-{
- _SYSIO_OFF_T off;
-
- if (ioctx->ioctx_cc <= 0)
- return;
-
- assert(ioctx->ioctx_ino == fil->f_ino);
- off = fil->f_pos + ioctx->ioctx_cc;
- if (fil->f_pos && off <= fil->f_pos)
- abort();
- fil->f_pos = off;
-}
-
-/*
- * Grow (or truncate) the file descriptor table.
- */
-static int
-fd_grow(size_t n)
-{
- size_t count;
- struct file **noftab, **filp;
-
- /*
- * Sanity check the new size.
- */
- if ((int )n < 0)
- return -EMFILE;
-
- /*
- * We never shrink the table.
- */
- if (n <= _sysio_oftab_size)
- return 0;
-
- noftab = realloc(_sysio_oftab, n * sizeof(struct file *));
- if (!noftab)
- return -ENOMEM;
- _sysio_oftab = noftab;
- count = _sysio_oftab_size;
- _sysio_oftab_size = n;
- filp = _sysio_oftab + count;
- n -= count;
- while (n--)
- *filp++ = NULL;
- return 0;
-}
-
-#ifdef ZERO_SUM_MEMORY
-void
-_sysio_fd_shutdown()
-{
-
- free(_sysio_oftab);
- _sysio_oftab_size = 0;
-}
-#endif
-
-/*
- * Find a free slot in the open files table greater than or equal to the
- * argument.
- */
-static int
-find_free_fildes(int low)
-{
- int n;
- int err;
- struct file **filp;
-
- for (n = low, filp = _sysio_oftab + low;
- n >= 0 && (unsigned )n < _sysio_oftab_size && *filp;
- n++, filp++)
- ;
- if (n < 0)
- return -ENFILE;
- if ((unsigned )n >= _sysio_oftab_size) {
- err = fd_grow((unsigned )n + 1);
- if (err)
- return err;
- filp = &_sysio_oftab[n];
- assert(!*filp);
- }
-
- return n;
-}
-
-/*
- * Find open file record from file descriptor.
- */
-struct file *
-_sysio_fd_find(int fd)
-{
- if (fd < 0 || (unsigned )fd >= _sysio_oftab_size)
- return NULL;
-
- return _sysio_oftab[fd];
-}
-
-/*
- * Close an open descriptor.
- */
-int
-_sysio_fd_close(int fd)
-{
- struct file *fil;
-
- fil = _sysio_fd_find(fd);
- if (!fil)
- return -EBADF;
-
- _sysio_oftab[fd] = NULL;
-
- F_RELE(fil);
-
- return 0;
-}
-
-/*
- * Associate open file record with given file descriptor (if forced), or any
- * available file descriptor if less than zero, or any available descriptor
- * greater than or equal to the given one if not forced.
- */
-int
-_sysio_fd_set(struct file *fil, int fd, int force)
-{
- int err;
- struct file *ofil;
-
- /*
- * Search for a free descriptor if needed.
- */
- if (fd < 0 || !force) {
- if (fd < 0)
- fd = 0;
- fd = find_free_fildes(fd);
- if (fd < 0)
- return fd;
- }
-
- if ((unsigned )fd >= _sysio_oftab_size) {
- err = fd_grow((unsigned )fd + 1);
- if (err)
- return err;
- }
-
- /*
- * Remember old.
- */
- ofil = _sysio_fd_find(fd);
- /*
- * Take the entry.
- */
- _sysio_oftab[fd] = fil;
- if (ofil)
- F_RELE(ofil);
-
- return fd;
-}
-
-/*
- * Duplicate old file descriptor.
- *
- * If the new file descriptor is less than zero, the new file descriptor
- * is chosen freely. Otherwise, choose an available descriptor greater
- * than or equal to the new, if not forced. Otherwise, if forced, (re)use
- * the new.
- */
-int
-_sysio_fd_dup(int oldfd, int newfd, int force)
-{
- struct file *fil;
- int fd;
-
- if (oldfd == newfd && oldfd >= 0)
- return newfd;
-
- fil = _sysio_fd_find(oldfd);
- if (!fil)
- return -EBADF;
-
- fd = _sysio_fd_set(fil, newfd, force);
- if (fd >= 0)
- F_REF(fil);
- return fd;
-}
-
-int
-_sysio_fd_close_all()
-{
- int fd;
- struct file **filp;
-
- /*
- * Close all open descriptors.
- */
- for (fd = 0, filp = _sysio_oftab;
- (size_t )fd < _sysio_oftab_size;
- fd++, filp++) {
- if (!*filp)
- continue;
- F_RELE(*filp);
- *filp = NULL;
- }
-
- /*
- * Release current working directory.
- */
- if (_sysio_cwd) {
- P_RELE(_sysio_cwd);
- _sysio_cwd = NULL;
- }
-
- return 0;
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "file.h"
-#include "inode.h"
-
-/*
- * Support for file IO.
- */
-
-/*
- * The open files table
- */
-typedef struct oftab {
- struct file **table; /* table array */
- size_t size; /* current table size */
- int offset; /* base fd number */
- int max; /* max size */
-} oftab_t;
-
-#define OFTAB_NATIVE (0)
-#define OFTAB_VIRTUAL (1)
-
-static oftab_t _sysio_oftab[2] = {
- {NULL, 0, 0, 0},
- {NULL, 0, 0, 1024*1024},
-};
-
-static int native_max_fds = 0;
-
-static inline void init_oftab()
-{
- if (!native_max_fds) {
- native_max_fds = sysconf(_SC_OPEN_MAX);
- if (native_max_fds <= 0)
- abort();
- _sysio_oftab[OFTAB_NATIVE].max = native_max_fds - 1;
- _sysio_oftab[OFTAB_VIRTUAL].offset = native_max_fds;
- }
-}
-
-static inline oftab_t *select_oftab(int fd)
-{
- return & _sysio_oftab[fd >= native_max_fds || fd < 0];
-}
-
-/*
- * Create and initialize open file record.
- */
-struct file *
-_sysio_fnew(struct inode *ino, int flags)
-{
- struct file *fil;
-
- fil = malloc(sizeof(struct file));
- if (!fil)
- return NULL;
-
- _SYSIO_FINIT(fil, ino, flags);
- F_REF(fil);
- I_REF(ino);
-
- return fil;
-}
-
-/*
- * Destroy open file record.
- */
-void
-_sysio_fgone(struct file *fil)
-{
- int err;
-
- assert(!fil->f_ref);
- assert(fil->f_ino);
- err = (*fil->f_ino->i_ops.inop_close)(fil->f_ino);
- I_RELE(fil->f_ino);
- assert(!err);
- free(fil);
-}
-
-/*
- * IO operation completion handler.
- */
-void
-_sysio_fcompletio(struct ioctx *ioctx, struct file *fil)
-{
- _SYSIO_OFF_T off;
-
- if (ioctx->ioctx_cc <= 0)
- return;
-
- assert(ioctx->ioctx_ino == fil->f_ino);
- off = fil->f_pos + ioctx->ioctx_cc;
- if (fil->f_pos && off <= fil->f_pos)
- abort();
- fil->f_pos = off;
-}
-
-/*
- * Grow (or truncate) the file descriptor table.
- */
-static int
-fd_grow(oftab_t *oftab, size_t n)
-{
- int fd;
- size_t count;
- struct file **noftab, **filp;
-
- /*
- * Sanity check the new size.
- */
- fd = (int )n;
- if ((size_t )fd != n)
- return -EMFILE;
-
- n++; /* index -> size */
- assert(n > oftab->size);
-
- if (n > oftab->max)
- return -ERANGE;
-
- if (n < 8)
- n = 8;
- if (n - oftab->size < oftab->size)
- n = (n + 1) * 2;
- noftab = realloc(oftab->table, n * sizeof(struct file *));
- if (!noftab)
- return -ENOMEM;
- oftab->table = noftab;
- count = oftab->size;
- oftab->size = n;
- if (n < count)
- return 0;
- filp = oftab->table + count;
- n -= count;
- while (n--)
- *filp++ = NULL;
- return 0;
-}
-
-#ifdef ZERO_SUM_MEMORY
-static void free_oftab(oftab_t *ot)
-{
- if (ot->table) {
- free(ot->table);
- ot->size = 0;
- }
-}
-
-void
-_sysio_fd_shutdown()
-{
- free_oftab(&_sysio_oftab[OFTAB_NATIVE]);
- free_oftab(&_sysio_oftab[OFTAB_VIRTUAL]);
-}
-#endif
-
-/*
- * Find a free slot in the open files table which >= @low
- * low < 0 means any
- */
-static int
-find_free_fildes(oftab_t *oftab, int low)
- {
- int n;
- int err;
- struct file **filp;
-
- if (low < 0)
- low = oftab->offset;
-
- n = low - oftab->offset;
- if (n < 0)
- return -ENFILE;
-
- for (filp = oftab->table + n;
- n < oftab->size && *filp;
- n++, filp++)
- ;
-
- if (n >= oftab->size) {
- err = fd_grow(oftab, n);
- if (err)
- return err;
- filp = &oftab->table[n];
- assert(!*filp);
- }
-
- return oftab->offset + n;
-}
-
-/*
- * Find open file record from file descriptor.
- * clear this entry if 'clear' is non-zero
- */
-static struct file *
-__sysio_fd_get(int fd, int clear)
-{
- oftab_t *oftab;
- struct file *file;
-
- init_oftab();
-
- if (fd < 0)
- return NULL;
-
- oftab = select_oftab(fd);
- if (!oftab->table || fd >= oftab->offset + oftab->size)
- return NULL;
-
- file = oftab->table[fd - oftab->offset];
- if (clear)
- oftab->table[fd - oftab->offset] = NULL;
-
- return file;
-}
-
-/*
- * Find open file record from file descriptor.
- */
-struct file *
-_sysio_fd_find(int fd)
-{
- return __sysio_fd_get(fd, 0);
-}
-
-/*
- * Close an open descriptor.
- */
-int
-_sysio_fd_close(int fd)
-{
- struct file *fil;
-
- fil = __sysio_fd_get(fd, 1);
- if (!fil)
- return -EBADF;
-
- F_RELE(fil);
-
- return 0;
-}
-
-/*
- * Associate open file record with given file descriptor (if forced), or any
- * available file descriptor if less than zero, or any available descriptor
- * greater than or equal to the given one if not forced.
- */
-int
-_sysio_fd_set(struct file *fil, int fd, int force)
-{
- int err;
- struct file *ofil;
- oftab_t *oftab;
-
- if (force && fd < 0)
- abort();
-
- init_oftab();
-
- oftab = select_oftab(fd);
-
- /*
- * Search for a free descriptor if needed.
- */
- if (!force) {
- fd = find_free_fildes(oftab, fd);
- if (fd < 0)
- return fd;
- }
-
- if (fd - oftab->offset >= oftab->size) {
- err = fd_grow(oftab, fd - oftab->offset);
- if (err)
- return err;
- }
-
- /*
- * Remember old.
- */
- ofil = __sysio_fd_get(fd, 1);
- if (ofil) {
- /* FIXME sometimes we could intercept open/socket to create
- * a fd, but missing close()? currently we have this problem
- * with resolv lib. as a workaround simply destroy the file
- * struct here. And this hack will break the behavior of
- * DUPFD.
- */
- if (fd >= 0 && oftab == &_sysio_oftab[0])
- free(ofil);
- else
- F_RELE(ofil);
- }
-
- oftab->table[fd - oftab->offset] = fil;
-
- return fd;
-}
-
-/*
- * Duplicate old file descriptor.
- *
- * If the new file descriptor is less than zero, the new file descriptor
- * is chosen freely. Otherwise, choose an available descriptor greater
- * than or equal to the new, if not forced. Otherwise, if forced, (re)use
- * the new.
- */
-int
-_sysio_fd_dup(int oldfd, int newfd, int force)
-{
- struct file *fil;
- int fd;
-
- init_oftab();
-
- if (oldfd == newfd && oldfd >= 0)
- return newfd;
-
- fil = _sysio_fd_find(oldfd);
- if (!fil)
- return -EBADF;
-
- /* old & new must belong to the same oftab */
- if (select_oftab(oldfd) != select_oftab(newfd))
- return -EINVAL;
-
- fd = _sysio_fd_set(fil, newfd, force);
- if (fd >= 0)
- F_REF(fil);
- return fd;
-}
-
-void
-_sysio_oftable_close_all(oftab_t *oftab)
-{
- struct file **filp;
- int fd;
-
- for (fd = 0, filp = oftab->table;
- (size_t )fd < oftab->size;
- fd++, filp++) {
- if (!*filp)
- continue;
- F_RELE(*filp);
- *filp = NULL;
- }
-}
-
-int
-_sysio_fd_close_all()
-{
- /* Close all open descriptors */
- _sysio_oftable_close_all(&_sysio_oftab[OFTAB_VIRTUAL]);
- /* FIXME: libsysio does not currently perform enough cleanup of
- * open files to allow __liblustre_cleanup_() to safely call
- * unmount(). See the related FIXME comment in that function
- * for details. The following disabled code is left in place to
- * document the solution that was originally under consideration
- * but never fully implemented. */
-#if 0
- _sysio_oftable_close_all(&_sysio_oftab[OFTAB_NATIVE]);
-#endif
-
- /* Release current working directory */
- if (_sysio_cwd) {
- P_RELE(_sysio_cwd);
- _sysio_cwd = NULL;
- }
-
- return 0;
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "fs.h"
-#include "inode.h"
-
-/*
- * File system abstractipon support.
- */
-
-/*
- * The "file system switch".
- */
-static LIST_HEAD(, fsswent) fsswitch = { NULL };
-
-/*
- * Lookup named entry in the switch.
- */
-struct fsswent *
-_sysio_fssw_lookup(const char *name)
-{
- struct fsswent *fssw;
-
- if (!fsswitch.lh_first)
- return NULL;
-
- fssw = fsswitch.lh_first;
- do {
- if (strcmp(fssw->fssw_name, name) == 0)
- return fssw;
- fssw = fssw->fssw_link.le_next;
- } while (fssw);
- return NULL;
-}
-
-/*
- * Register driver.
- */
-int
-_sysio_fssw_register(const char *name, struct fssw_ops *ops)
-{
- struct fsswent *fssw;
-
- fssw = _sysio_fssw_lookup(name);
- if (fssw)
- return -EEXIST;
-
- fssw = malloc(sizeof(struct fsswent) + strlen(name) + 1);
- if (!fssw)
- return -ENOMEM;
- fssw->fssw_name = (char *)fssw + sizeof(struct fsswent);
- (void )strcpy((char *)fssw->fssw_name, name);
- fssw->fssw_ops = *ops;
-
- LIST_INSERT_HEAD(&fsswitch, fssw, fssw_link);
-
- return 0;
-}
-
-#ifdef ZERO_SUM_MEMORY
-/*
- * Shutdown
- */
-void
-_sysio_fssw_shutdown()
-{
- struct fsswent *fssw;
-
- while ((fssw = fsswitch.lh_first)) {
- LIST_REMOVE(fssw, fssw_link);
- free(fssw);
- }
-}
-#endif
-
-/*
- * Allocate and initialize a new file system record.
- */
-struct filesys *
-_sysio_fs_new(struct filesys_ops *ops, unsigned flags, void *private)
-{
- struct filesys *fs;
-
- fs = malloc(sizeof(struct filesys));
- if (!fs)
- return NULL;
- FS_INIT(fs, flags, ops, private);
- return fs;
-}
-
-/*
- * Dispose of given file system record.
- */
-void
-_sysio_fs_gone(struct filesys *fs)
-{
- size_t n;
- struct itable_entry *head;
-
- if (fs->fs_ref)
- abort();
- n = FS_ITBLSIZ;
- do {
- head = &fs->fs_itbl[--n];
- while (head->lh_first)
- _sysio_i_gone(head->lh_first);
- } while (n);
- if (n)
- abort();
-
- (*fs->fs_ops.fsop_gone)(fs);
- free(fs);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "file.h"
-#include "inode.h"
-
-int
-SYSIO_INTERFACE_NAME(fsync)(int fd)
-{
- struct file *fil;
- int err;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!(fil && fil->f_ino))
- SYSIO_INTERFACE_RETURN(-1, -EBADF);
- err = (*fil->f_ino->i_ops.inop_sync)(fil->f_ino);
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-int
-SYSIO_INTERFACE_NAME(fdatasync)(int fd)
-{
- struct file *fil;
- int err;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!(fil && fil->f_ino))
- SYSIO_INTERFACE_RETURN(-1, -EBADF);
- err = (*fil->f_ino->i_ops.inop_datasync)(fil->f_ino);
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2004 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <unistd.h>
-#include <stdlib.h>
-#ifdef __GLIBC__
-#include <alloca.h>
-#endif
-#include <string.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <dirent.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "file.h"
-#include "sysio-symbols.h"
-
-#ifndef __GNUC__
-#define __restrict
-#endif
-
-static ssize_t
-filldirents(struct file *fil,
- char *buf, size_t nbytes,
- _SYSIO_OFF_T *__restrict basep)
-{
- _SYSIO_OFF_T opos;
- ssize_t cc;
-
- if (!S_ISDIR(fil->f_ino->i_stbuf.st_mode))
- return -ENOTDIR;
-
- opos = fil->f_pos;
- cc =
- (*fil->f_ino->i_ops.inop_filldirentries)(fil->f_ino,
- &fil->f_pos,
- buf, nbytes);
- if (cc < 0)
- return cc;
- *basep = opos;
- return cc;
-}
-
-static ssize_t
-PREPEND(_, SYSIO_INTERFACE_NAME(getdirentries64))(int fd,
- char *buf,
- size_t nbytes,
- _SYSIO_OFF_T * __restrict
- basep)
-{
- struct file *fil;
- ssize_t cc;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
-
- fil = _sysio_fd_find(fd);
- if (!(fil && fil->f_ino)) {
- SYSIO_INTERFACE_RETURN(-1, -EBADF);
- }
-
- cc = filldirents(fil, buf, nbytes, basep);
- SYSIO_INTERFACE_RETURN(cc < 0 ? -1 : cc, cc < 0 ? (int )cc : 0);
-}
-
-#ifdef _LARGEFILE64_SOURCE
-#undef getdirentries64
-sysio_sym_strong_alias(PREPEND(_, SYSIO_INTERFACE_NAME(getdirentries64)),
- SYSIO_INTERFACE_NAME(getdirentries64))
-#endif
-
-#undef getdirentries
-
-#ifndef DIRENT64_IS_NATURAL
-
-#ifndef EOVERFLOW
-#define EOVERFLOW ERANGE
-#endif
-
-#ifdef _DIRENT_HAVE_D_NAMLEN
-#define _namlen(dp) ((dp)->d_namlen)
-#else
-#define _namlen(dp) (strlen((dp)->d_name))
-#endif
-
-#ifndef _rndup
-#define _rndup(n, boundary) \
- ((((n) + (boundary) - 1 ) / (boundary)) * (boundary))
-#endif
-
-#define _dbaselen ((size_t )&((struct dirent *)0)->d_name[0])
-
-#ifdef __GLIBC__
-#define _dreclen(namlen) \
- ((_dbaselen + (namlen) + __alignof__ (struct dirent)) & \
- ~(__alignof__ (struct dirent) - 1))
-#else /* !defined(__GLIBC__) */
-#define _dreclen(namlen) \
- _rndup(_dbaselen + (namlen) + 1, sizeof(int))
-#endif
-
-#ifndef BSD
-ssize_t
-SYSIO_INTERFACE_NAME(getdirentries)(int fd,
- char *buf,
- size_t nbytes,
- off_t * __restrict basep)
-#else
-int
-SYSIO_INTERFACE_NAME(getdirentries)(int fd,
- char *buf,
- int nbytes,
- long * __restrict basep)
-#endif
-{
- struct file *fil;
- _SYSIO_OFF_T b;
- ssize_t cc, count;
- struct dirent64 *d64p, d64;
- struct dirent *dp;
- size_t n, reclen;
- void *p;
- char *cp;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
-
- fil = _sysio_fd_find(fd);
- if (!(fil && fil->f_ino)) {
- SYSIO_INTERFACE_RETURN(-1, -EBADF);
- }
-
- count = cc = filldirents(fil, buf, nbytes, &b);
- d64p = (void *)buf;
- dp = (void *)buf;
- reclen = 0;
- while (cc > 0) {
- n = _namlen(d64p);
- reclen = _dreclen(n);
- d64.d_ino = d64p->d_ino;
- d64.d_off = d64p->d_off;
- d64.d_type = d64p->d_type;
- d64.d_reclen = d64p->d_reclen;
- /*
- * Copy name first.
- */
- (void )memcpy(dp->d_name, d64p->d_name, n);
- /*
- * Then, the rest.
- */
- dp->d_ino = d64.d_ino;
- dp->d_off = d64.d_off;
- if (dp->d_ino != d64.d_ino ||
- dp->d_off != d64.d_off) {
- /*
- * If conversion failure then we are done.
- */
- if (cc == count) {
- /*
- * Couldn't process any entries. We return
- * the error now.
- */
- cc = - EOVERFLOW;
- }
- break;
- }
- fil->f_pos = dp->d_off;
- dp->d_type = d64.d_type;
- dp->d_reclen = reclen;
- /*
- * Fill the remainder with zeros.
- */
- p = (char *)dp + dp->d_reclen;
-#ifdef HAVE_D_NAMLEN
- dp->d_namlen = n;
-#endif
- cp = dp->d_name + n;
- do {
- *cp++ = 0;
- } while (cp < (char *)p);
- /*
- * Advance.
- */
- dp = p;
- cc -= d64.d_reclen;
- d64p = (struct dirent64 *)((char *)d64p + d64.d_reclen);
- }
-
- if (cc < 0)
- SYSIO_INTERFACE_RETURN(-1, cc);
- cc = (char *)dp - buf;
- *basep = b;
- SYSIO_INTERFACE_RETURN(cc, 0);
-}
-#else /* !defined(DIRENT64_IS_NATURAL) */
-sysio_sym_strong_alias(PREPEND(_, SYSIO_INTERFACE_NAME(getdirentries64),
- SYSIO_INTERFACE_NAME(getdirentries)))
-#endif
-
-#ifdef REDSTORM
-#undef __getdirentries
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(getdirentries),
- PREPEND(__, SYSIO_INTERFACE_NAME(getdirentries)))
-#endif
-#if defined(BSD) || defined(REDSTORM)
-#undef _getdirentries
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(getdirentries),
- PREPEND(_, SYSIO_INTERFACE_NAME(getdirentries)))
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2006 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#ifdef __linux__
-#define _BSD_SOURCE
-#endif
-
-#ifdef SYSIO_TRACING
-#include <stdio.h>
-#endif
-#include <stdlib.h>
-#if defined(_BSD_SOURCE) || defined(SYSIO_TRACING)
-#include <sys/syscall.h>
-#endif
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-#ifdef SYSIO_TRACING
-#include <stdarg.h>
-#endif
-#include <limits.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/uio.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "xtio.h"
-#ifdef SYSIO_TRACING
-#include "native.h"
-#endif
-#include "inode.h"
-#include "fs.h"
-#include "mount.h"
-#include "file.h"
-#include "dev.h"
-
-#ifdef STDFD_DEV
-#include "stdfd.h"
-#endif
-
-#ifdef SYSIO_TRACING
-
-/*
- * Tracing callback record.
- */
-struct trace_callback {
- TAILQ_ENTRY(trace_callback) links; /* trace list links */
- void (*f)(const char *file, /* callback function */
- const char *func,
- int line,
- void *data);
- void *data; /* callback data */
- void (*destructor)(void *data); /* data destructor */
-};
-
-/*
- * Initialize a tracing callback record.
- */
-#define TCB_INIT(__tcb, __f, __d, __destroy) \
- do { \
- (__tcb)->f = (__f); \
- (__tcb)->data = (__d); \
- (__tcb)->destructor = (__destroy); \
- } while (0)
-
-/*
- * Trace queue head record.
- */
-TAILQ_HEAD(trace_q, trace_callback);
-
-/*
- * The entry and exit queue heads, and queue pointers.
- */
-static struct trace_q _sysio_entry_trace_head;
-void *_sysio_entry_trace_q = &_sysio_entry_trace_head;
-static struct trace_q _sysio_exit_trace_head;
-void *_sysio_exit_trace_q = &_sysio_exit_trace_head;
-#endif
-
-/*
- * White space characters.
- */
-#define IGNORE_WHITE " \t\r\n"
-
-/*
- * Check if long overflows integer range.
- */
-#if LONG_MAX <= INT_MAX
-#define _irecheck(_l, _e) \
- ((_l) == LONG_MAX && (_e) == ERANGE)
-#else
-#define _irecheck(_l, _e) \
- ((_l) > INT_MAX)
-#endif
-
-/*
- * In sysio_init we'll allow simple comments, strings outside {}
- * delimited by COMMENT_INTRO, and '\n' or '\0'
- */
-#define COMMENT_INTRO '#'
-
-/*
- * In sysio_init we'll allow simple comments, strings outside {}
- * delimited by COMMENT_INTRO, and '\n' or '\0'
- */
-#define COMMENT_INTRO '#'
-
-/*
- * Sysio library initialization. Must be called before anything else in the
- * library.
- */
-int
-_sysio_init()
-{
- int err;
-#ifdef WITH_SOCKETS
- extern int _sysio_sockets_init(void);
-#endif
-
-#ifdef SYSIO_TRACING
- /*
- * Initialize tracing callback queues.
- */
- TAILQ_INIT(&_sysio_entry_trace_head);
- TAILQ_INIT(&_sysio_exit_trace_head);
-#endif
-
- err = _sysio_ioctx_init();
- if (err)
- goto error;
- err = _sysio_i_init();
- if (err)
- goto error;
- err = _sysio_mount_init();
- if (err)
- goto error;
-
- err = _sysio_dev_init();
- if (err)
- goto error;
-#ifdef STDFD_DEV
- err = _sysio_stdfd_init();
- if (err)
- goto error;
-#endif
-#ifdef WITH_SOCKETS
- err = _sysio_sockets_init();
- if (err)
- goto error;
-#endif
-
- goto out;
-error:
- errno = -err;
-out:
- /*
- * Unlike all other _sysio routines, this one returns with errno
- * set. It also returns the error, as usual.
- */
- return err;
-}
-
-/*
- * Sysio library shutdown.
- */
-void
-_sysio_shutdown()
-{
-
- if (!(_sysio_fd_close_all() == 0 &&
- _sysio_unmount_all() == 0))
- abort();
-
-#ifdef ZERO_SUM_MEMORY
- _sysio_fd_shutdown();
- _sysio_i_shutdown();
- _sysio_fssw_shutdown();
- _sysio_access_shutdown();
- free(incore_dir_template);
-#ifdef SYSIO_TRACING
- {
- struct trace_callback *tcb;
-
- /*
- * Empty the trace queues and free the entries.
- */
- while ((tcb = _sysio_entry_trace_head.tqh_first) != NULL)
- _sysio_remove_trace(&_sysio_entry_trace_head, tcb);
- while ((tcb = _sysio_exit_trace_head.tqh_first) != NULL)
- _sysio_remove_trace(&_sysio_exit_trace_head, tcb);
- }
-#endif
-#endif
-}
-
-#ifdef SYSIO_TRACING
-
-#if !(defined(_HAVE_ASPRINTF) && _HAVE_ASPRINTF)
-/*
- * Print a string to allocated memory.
- */
-static int
-vasprintf(char **strp, const char *fmt, va_list ap)
-{
- size_t siz;
- int oerrno;
- char *s;
- va_list aq;
- int n;
-
- siz = 50;
- oerrno = errno;
- if (!(s = malloc(siz))) {
- errno = oerrno;
- return -1;
- }
- for (;;) {
- va_copy(aq, ap);
- n = vsnprintf (s, siz, fmt, aq);
- va_end(aq);
- if (n > -1 && (size_t )n < siz)
- break;
- if (n > -1) /* glibc 2.1 */
- siz = n+1; /* precise */
- else /* glibc 2.0 */
- siz *= 2; /* twice the old */
- if (!(s = realloc (s, siz)))
- break;
- }
- *strp = s;
- errno = oerrno;
- return n;
-}
-
-#if 0
-static int
-asprintf(char **strp, const char *fmt, ...)
-{
- va_list ap;
- int n;
-
- va_start(ap, fmt);
- n = vasprintf(strp, fmt, ap);
- va_end(ap);
- return n;
-}
-#endif
-#endif /* !(defined(_HAVE_ASPRINTF) && _HAVE_ASPRINTF) */
-
-static void
-_sysio_cwrite(const char *buf, size_t len)
-{
- int oerrno;
-
- oerrno = errno;
- (void )syscall(SYSIO_SYS_write, STDERR_FILENO, buf, len);
- errno = oerrno;
-}
-
-/*
- * Console printf.
- */
-void
-_sysio_cprintf(const char *fmt, ...)
-{
- va_list ap;
- int len;
- char *buf;
-
- va_start(ap, fmt);
- buf = NULL;
- len = vasprintf(&buf, fmt, ap);
- va_end(ap);
- if (len < 0)
- return;
- _sysio_cwrite(buf, len);
- free(buf);
-}
-
-/*
- * Register a trace callback.
- *
- * The pointer to the trace record is returned.
- */
-void *
-_sysio_register_trace(void *q,
- void (*f)(const char *file,
- const char *func,
- int line,
- void *data),
- void *data,
- void (*destructor)(void *data))
-{
- struct trace_callback *tcb;
-
- tcb = malloc(sizeof(struct trace_callback));
- if (!tcb)
- return NULL;
- TCB_INIT(tcb, f, data, destructor);
- TAILQ_INSERT_TAIL((struct trace_q *)q, tcb, links);
- return tcb;
-}
-
-/*
- * Remove a registered trace callback.
- */
-void
-_sysio_remove_trace(void *q, void *p)
-{
- struct trace_callback *tcb;
-
- tcb = (struct trace_callback *)p;
-
- if (tcb->destructor)
- (*tcb->destructor)(tcb->data);
- TAILQ_REMOVE((struct trace_q *)q, tcb, links);
- free(tcb);
-}
-
-void
-/*
- * Run a trace queue, making all the callbacks.
- */
-_sysio_run_trace_q(void *q,
- const char *file,
- const char *func,
- int line)
-{
- struct trace_callback *tcb;
-
- tcb = ((struct trace_q *)q)->tqh_first;
- while (tcb) {
- (*tcb->f)(file, func, line, tcb->data);
- tcb = tcb->links.tqe_next;
- }
-}
-
-static void
-_sysio_trace_entry(const char *file __IS_UNUSED,
- const char *func,
- int line __IS_UNUSED,
- void *data __IS_UNUSED)
-{
-
- _sysio_cprintf("+ENTER+ %s\n", func);
-}
-
-static void
-_sysio_trace_exit(const char *file __IS_UNUSED,
- const char *func,
- int line __IS_UNUSED,
- void *data __IS_UNUSED)
-{
-
- _sysio_cprintf("+EXIT+ %s\n", func);
-}
-#endif /* defined(SYSIO_TRACING) */
-
-/*
- * (kind of)Duplicates strtok function.
- *
- * Given a buffer, returns the longest string
- * that does not contain any delim characters. Will
- * remove ws and any characters in the ignore string.
- * Returns the token.
- *
- * The parameter controlling acceptance controls whether a positive
- * match for some delimiter be made or not. If set, then either a delimiter
- * or NUL character is success.
- *
- */
-const char *
-_sysio_get_token(const char *buf,
- int accepts,
- const char *delim,
- const char *ignore,
- char *tbuf)
-{
- char c;
- int escape, quote;
-
- /*
- * Find the first occurance of delim, recording how many
- * characters lead up to it. Ignore indicated characters.
- */
- escape = quote = 0;
- while ((c = *buf) != '\0') {
- buf++;
- if (!escape) {
- if (c == '\\') {
- escape = 1;
- continue;
- }
- if (c == '\"') {
- quote ^= 1;
- continue;
- }
- if (!quote) {
- if (strchr(delim, c) != NULL) {
- accepts = 1;
- break;
- }
- if (strchr(ignore, c) != NULL)
- continue;
- }
- } else
- escape = 0;
- *tbuf++ = c;
- }
- if (!accepts)
- return NULL;
- *tbuf = '\0'; /* NUL term */
- return buf;
-}
-
-/*
- * Parse and record named arguments given as `name = value', comma-separated
- * pairs.
- *
- * NB: Alters the passed buffer.
- */
-char *
-_sysio_get_args(char *buf, struct option_value_info *vec)
-{
- char *nxt;
- char *name, *value;
- struct option_value_info *v;
-
- for (;;) {
- nxt =
- (char *)_sysio_get_token(buf,
- 1,
- "=,",
- IGNORE_WHITE,
- name = buf);
- if (!nxt ||
- (nxt != buf && *name == '\0' && buf + strlen(buf) == nxt)) {
- buf = NULL;
- break;
- }
- if (*name == '\0')
- break;
- buf =
- (char *)_sysio_get_token(nxt,
- 1,
- ",",
- IGNORE_WHITE,
- value = nxt);
- if (*value == '\0')
- value = NULL;
- for (v = vec; v->ovi_name; v++)
- if (strcmp(v->ovi_name, name) == 0)
- break;
- if (!v->ovi_name)
- return NULL;
- v->ovi_value = value;
- }
-
- return buf;
-}
-
-static int
-parse_mm(const char *s, dev_t *devp)
-{
- unsigned long ul;
- char *cp;
- dev_t dev;
-
- ul = strtoul(s, &cp, 0);
- if (*cp != '+' || ul > USHRT_MAX)
- return -EINVAL;
- dev = ul << 16;
- s = (const char *)++cp;
- ul = strtoul(s, &cp, 0);
- if (*cp != '\0' || ul > USHRT_MAX)
- return -EINVAL;
- dev |= ul & 0xffff;
- *devp = dev;
- return 0;
-}
-
-/*
- * Performs the creat command for the namespace assembly
- *
- * NB: Alters the passed buffer.
- */
-static int
-do_creat(char *args)
-{
- size_t len;
- struct option_value_info v[] = {
- { "ft", NULL }, /* file type */
- { "nm", NULL }, /* name */
- { "pm", NULL }, /* permissions */
- { "ow", NULL }, /* owner */
- { "gr", NULL }, /* group */
- { "mm", NULL }, /* major + minor */
- { "str", NULL }, /* file data */
- { NULL, NULL }
- };
- const char *cp;
- long perms;
- long owner, group;
- struct pnode *dir, *pno;
- mode_t mode;
- struct intent intent;
- dev_t dev;
- int err;
- enum {
- CREATE_DIR = 1,
- CREATE_CHR = 2,
- CREATE_BLK = 3,
- CREATE_FILE = 4
- } op;
- int intent_mode;
- struct inode *ino;
- int i;
-
- len = strlen(args);
- if (_sysio_get_args(args, v) - args != (ssize_t )len ||
- !(v[0].ovi_value &&
- v[1].ovi_value &&
- v[2].ovi_value))
- return -EINVAL;
- perms = strtol(v[2].ovi_value, (char **)&cp, 0);
- if (*cp ||
- perms < 0 ||
- (perms == LONG_MAX && errno == ERANGE) ||
- ((unsigned)perms & ~07777))
- return -EINVAL;
- if (v[3].ovi_value) {
- owner = strtol(v[3].ovi_value, (char **)&cp, 0);
- if (*cp ||
- ((owner == LONG_MIN || owner == LONG_MAX)
- && errno == ERANGE))
- return -EINVAL;
- } else
- owner = getuid();
- if (v[4].ovi_value) {
- group = strtol(v[4].ovi_value, (char **)&cp, 0);
- if (*cp ||
- ((group == LONG_MIN || group == LONG_MAX) &&
- errno == ERANGE))
- return -EINVAL;
- } else
- group = getegid();
-
- if (!(dir = _sysio_cwd) && !(dir = _sysio_root))
- return -ENOENT;
-
- /*
- * Init, get the operation, setup the intent.
- */
- err = 0;
- mode = perms;
- op = 0;
- if (strcmp(v[0].ovi_value, "dir") == 0) {
- op = CREATE_DIR;
- INTENT_INIT(&intent, INT_CREAT, &mode, NULL);
- } else if (strcmp(v[0].ovi_value, "chr") == 0) {
- op = CREATE_CHR;
- mode |= S_IFCHR;
- INTENT_INIT(&intent, INT_CREAT, &mode, NULL);
- if (!(v[5].ovi_value && parse_mm(v[5].ovi_value, &dev) == 0))
- err = -EINVAL;
- } else if (strcmp(v[0].ovi_value, "blk") == 0) {
- op = CREATE_BLK;
- mode |= S_IFBLK;
- INTENT_INIT(&intent, INT_CREAT, &mode, NULL);
- if (!(v[5].ovi_value && parse_mm(v[5].ovi_value, &dev) == 0))
- err = -EINVAL;
- } else if (strcmp(v[0].ovi_value, "file") == 0) {
- op = CREATE_FILE;
- intent_mode = O_CREAT|O_EXCL;
- INTENT_INIT(&intent, INT_CREAT, &mode, &intent_mode);
- } else
- err = -EINVAL;
- if (err)
- return err;
-
- /*
- * Lookup the given path.
- */
- err =
- _sysio_namei(dir,
- v[1].ovi_value,
- ND_NEGOK|ND_NOPERMCHECK,
- &intent,
- &pno);
- if (err)
- return err;
-
- /*
- * Perform.
- */
- switch (op) {
- case CREATE_DIR:
- err = _sysio_mkdir(pno, mode);
- break;
- case CREATE_CHR:
- case CREATE_BLK:
- err = _sysio_mknod(pno, mode, dev);
- break;
- case CREATE_FILE:
- err = _sysio_open(pno, O_CREAT|O_EXCL, mode);
- if (err)
- break;
- ino = pno->p_base->pb_ino;
- if (v[6].ovi_value) {
- struct iovec iovec;
- struct intnl_xtvec xtvec;
- struct ioctx io_context;
-
- /*
- * Deposit optional file content.
- */
- iovec.iov_base = v[6].ovi_value;
- iovec.iov_len = strlen(v[6].ovi_value);
- xtvec.xtv_off = 0;
- xtvec.xtv_len = iovec.iov_len;
- IOCTX_INIT(&io_context,
- 1,
- 1,
- ino,
- &iovec, 1,
- &xtvec, 1);
- _sysio_ioctx_enter(&io_context);
- err =
- (*ino->i_ops.inop_write)(pno->p_base->pb_ino,
- &io_context);
- if (!err) {
- ssize_t cc;
-
- cc = _sysio_ioctx_wait(&io_context);
- if (cc < 0)
- err = cc;
- else if ((size_t )cc != iovec.iov_len)
- err = -EIO; /* huh? */
- } else
- _sysio_ioctx_complete(&io_context);
- }
- i = (*ino->i_ops.inop_close)(ino);
- if (!err)
- err = i;
- break;
- default:
- abort();
- }
-
- P_RELE(pno);
- return err;
-}
-
-/*
- * Do mount.
- *
- * NB: The passed buffer is altered.
- */
-static int
-do_mnt(char *args)
-{
- size_t len;
- struct option_value_info v[] = {
- { "dev", NULL }, /* source (type:dev) */
- { "dir", NULL }, /* target dir */
- { "fl", NULL }, /* flags */
- { "da", NULL }, /* mount data */
- { NULL, NULL }
- };
- char *ty, *name;
- unsigned long flags;
- struct pnode *dir;
-
- len = strlen(args);
- if (_sysio_get_args(args, v) - args != (ssize_t )len ||
- !(v[0].ovi_value && v[1].ovi_value))
- return -EINVAL;
- ty =
- (char *)_sysio_get_token(v[0].ovi_value,
- 1,
- ":",
- "",
- name = v[0].ovi_value);
- flags = 0;
- if (v[2].ovi_value) {
- char *cp;
-
- /*
- * Optional flags.
- */
- flags = strtoul(v[2].ovi_value, &cp, 0);
- if (*cp || (flags == ULONG_MAX && errno == ERANGE))
- return -EINVAL;
- }
-
- if (strlen(v[1].ovi_value) == 1 && v[1].ovi_value[0] == PATH_SEPARATOR) {
- /*
- * Aha! It's root they want. Have to do that special.
- */
- return _sysio_mount_root(ty, name, flags, v[3].ovi_value);
- }
-
- if (!(dir = _sysio_cwd) && !(dir = _sysio_root))
- return -ENOENT;
- return _sysio_mount(dir,
- ty,
- v[1].ovi_value,
- name,
- flags,
- v[3].ovi_value);
-}
-
-
-#if 0
-/*
- * Chdir
- *
- * NB: Alters the passed buffer.
- */
-static int
-do_cd(char *args)
-{
- size_t len;
- struct option_value_info v[] = {
- { "dir", NULL }, /* directory */
- { NULL, NULL }
- };
- int err;
- struct pnode *dir, *pno;
-
- len = strlen(args);
- if (_sysio_get_args(args, v) - args != (ssize_t )len || !v[0].ovi_value)
- return -EINVAL;
-
- if (!(dir = _sysio_cwd) && !(dir = _sysio_root)) {
- /*
- * We have no namespace yet. They really need to give us
- * something to work with.
- */
- return -ENOENT;
- }
- err = _sysio_namei(dir, v[0].ovi_value, 0, NULL, &pno);
- if (err)
- return err;
- err = _sysio_p_chdir(pno);
- if (err)
- P_RELE(pno);
- return err;
-}
-#endif
-
-/*
- * Does a chmod
- *
- * NB: Alters passed buffer.
- */
-static int
-do_chmd(char *args)
-{
- size_t len;
- struct option_value_info v[] = {
- { "src", NULL }, /* path */
- { "pm", NULL }, /* perms */
- { NULL, NULL }
- };
- long perms;
- char *cp;
- struct intnl_stat stbuf;
- int err;
- struct pnode *dir, *pno;
-
- len = strlen(args);
- if (_sysio_get_args(args, v) - args != (ssize_t )len ||
- !(v[0].ovi_value && v[1].ovi_value))
- return -EINVAL;
- perms = strtol(v[1].ovi_value, &cp, 0);
- if (*cp ||
- perms < 0 ||
- (perms == LONG_MAX && errno == ERANGE) ||
- ((unsigned)perms & ~07777))
- return -EINVAL;
- (void )memset(&stbuf, 0, sizeof(stbuf));
- stbuf.st_mode = (mode_t)perms;
-
- if (!(dir = _sysio_cwd) && !(dir = _sysio_root))
- return -ENOENT;
- err = _sysio_namei(dir, v[0].ovi_value, ND_NOPERMCHECK, NULL, &pno);
- if (err)
- return err;
- err = _sysio_setattr(pno, pno->p_base->pb_ino, SETATTR_MODE, &stbuf);
- P_RELE(pno);
-
- return err;
-}
-
-static int
-do_open(char *args)
-{
- size_t len;
- struct option_value_info v[] = {
- { "nm", NULL }, /* path */
- { "fd", NULL }, /* fildes */
- { "m", NULL }, /* mode */
- { NULL, NULL }
- };
- char *cp;
- long l;
- int fd;
- unsigned long ul;
- mode_t m;
- struct pnode *dir, *pno;
- struct intent intent;
- int err;
- struct file *fil;
-
- len = strlen(args);
- if (_sysio_get_args(args, v) - args != (ssize_t )len ||
- !(v[0].ovi_value && v[1].ovi_value && v[2].ovi_value))
- return -EINVAL;
- l = strtol(v[1].ovi_value, (char **)&cp, 0);
- if (*cp || l < 0 || _irecheck(l, errno))
- return -EINVAL;
- fd = (int )l;
- ul = strtoul(v[1].ovi_value, (char **)&cp, 0);
- if (*cp ||
- (ul == ULONG_MAX && errno == ERANGE))
- return -EINVAL;
- m = (mode_t )ul & (O_RDONLY|O_WRONLY|O_RDWR);
-
- if (!(dir = _sysio_cwd) && !(dir = _sysio_root))
- return -ENOENT;
- INTENT_INIT(&intent, INT_OPEN, &m, NULL);
- pno = NULL;
- err = _sysio_namei(dir, v[0].ovi_value, ND_NOPERMCHECK, &intent, &pno);
- if (err)
- return err;
- fil = NULL;
- do {
- err = _sysio_open(pno, m, 0);
- if (err)
- break;
- fil = _sysio_fnew(pno->p_base->pb_ino, m);
- if (!fil) {
- err = -ENOMEM;
- break;
- }
- err = _sysio_fd_set(fil, fd, 1);
- if (err < 0)
- break;
- P_RELE(pno);
- return 0;
- } while (0);
- if (fil)
- F_RELE(fil);
- if (pno)
- P_RELE(pno);
- return err;
-}
-
-/*
- * Execute the given cmd.
- *
- * NB: Buf is altered.
- */
-static int
-do_command(char *buf)
-{
- size_t len;
- char *args, *cmd;
-
- len = strlen(buf);
- args = (char *)_sysio_get_token(buf, 1, ",", IGNORE_WHITE, cmd = buf);
- if (args) {
- if (strcmp("creat", cmd) == 0)
- return do_creat(args);
- if (strcmp("mnt", cmd) == 0)
- return do_mnt(args);
-#if 0
- if (strcmp("cd", cmd) == 0)
- return do_cd(args);
-#endif
- if (strcmp("chmd", cmd) == 0)
- return do_chmd(args);
- if (strcmp("open", cmd) == 0)
- return do_open(args);
- }
- return -EINVAL;
-}
-
-#ifdef SYSIO_TRACING
-/*
- * Set/Unset tracing.
- */
-static int
-_sysio_boot_tracing(const char *arg)
-{
- long l;
- char *cp;
- static struct trace_callback
- *entcb = NULL,
- *exitcb = NULL;
-
- l = 0;
- if (arg) {
- l = strtol(arg, (char **)&cp, 0);
- if (*cp || !(l == 0 || l == 1))
- return -EINVAL;
- }
- if (l) {
- if (entcb == NULL)
- entcb =
- _sysio_register_trace(_sysio_entry_trace_q,
- _sysio_trace_entry,
- NULL,
- NULL);
- if (entcb == NULL)
- return -errno;
- if (exitcb == NULL)
- exitcb =
- _sysio_register_trace(_sysio_exit_trace_q,
- _sysio_trace_exit,
- NULL,
- NULL);
- if (exitcb == NULL)
- return -errno;
- } else {
- if (entcb != NULL)
- _sysio_remove_trace(_sysio_entry_trace_q, entcb);
- entcb = NULL;
- if (exitcb != NULL)
- _sysio_remove_trace(_sysio_exit_trace_q, exitcb);
- exitcb = NULL;
- }
- return 0;
-}
-#endif
-
-/*
- * Initialize the namespace.
- */
-static int
-_sysio_boot_namespace(const char *arg)
-{
- char c, *tok;
- ssize_t len;
- int err;
- unsigned count;
- /*
- * Allocate token buffer.
- */
- len = strlen(arg);
- tok = malloc(len ? len : 1);
- if (!tok)
- return -ENOMEM;
- err = 0;
- count = 0;
- while (1) {
- /*
- * Discard leading white space.
- */
- while ((c = *arg) != '\0' && strchr(IGNORE_WHITE, c))
- arg++;
- if (COMMENT_INTRO == c) {
- /*
- * Discard comment.
- */
- while (*arg && (*arg != '\n')) {
- ++arg;
- }
- continue;
- }
-
- if (c == '\0')
- break;
- if (c != '{') {
- err = -EINVAL;
- break;
- }
- /*
- * Get the command.
- */
- *tok = '\0';
- arg =
- (char *)_sysio_get_token(arg + 1,
- 0,
- "}",
- IGNORE_WHITE,
- tok);
- if (!arg) {
- err = -EINVAL;
- break;
- }
- count++;
- /*
- * Perform.
- */
- err = do_command(tok);
- if (err)
- break;
- }
-#ifdef SYSIO_TRACING
- if (err)
- _sysio_cprintf("+NS init+ failed at expr %u (last = %s): %s\n",
- count,
- tok && *tok ? tok : "NULL",
- strerror(-err));
-#endif
- free(tok);
- return err;
-}
-
-#ifdef DEFER_INIT_CWD
-/*
- * Set deferred initial working directory.
- */
-static int
-_sysio_boot_cwd(const char *arg)
-{
-
- _sysio_init_cwd = arg;
- return 0;
-}
-#endif
-
-/*
- * Given an identifier and it's arguments, perform optional initializations.
- */
-int
-_sysio_boot(const char *opt, const char *arg)
-{
- struct option_value_info vec[] = {
-#ifdef SYSIO_TRACING
- { "trace", NULL }, /* tracing? */
-#endif
- { "namespace", NULL }, /* init namespace? */
-#ifdef DEFER_INIT_CWD
- { "cwd", NULL }, /* init working dir */
-#endif
- { NULL, NULL }
- };
- struct option_value_info *v;
- unsigned u;
- static int (*f[])(const char *) = {
-#ifdef SYSIO_TRACING
- _sysio_boot_tracing,
-#endif
- _sysio_boot_namespace,
-#ifdef DEFER_INIT_CWD
- _sysio_boot_cwd,
-#endif
- NULL /* can't happen */
- };
-
- for (v = vec, u = 0; v->ovi_name; v++, u++)
- if (strcmp(v->ovi_name, opt) == 0)
- break;
- if (!v->ovi_name)
- return -EINVAL;
- return (*f[u])(arg);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2006 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "fs.h"
-#include "mount.h"
-#include "inode.h"
-#include "dev.h"
-
-/*
- * Support for path and index nodes.
- */
-
-/*
- * Size of all names bucket-hash table.
- */
-#ifndef NAMES_TABLE_LEN
-#define NAMES_TABLE_LEN 251
-#endif
-
-/*
- * Desired i-nodes cache size is MAX_INODES_MULTIPLIER times the number
- * of slots in the names hash table.
- */
-#define MAX_INODES_MULTIPLIER 3
-
-/*
- * Active i-nodes in the system and the number of same.
- */
-struct inodes_head _sysio_inodes;
-static size_t n_inodes = 0;
-/*
- * Desired number of active i-nodes.
- */
-static size_t max_inodes = (MAX_INODES_MULTIPLIER * NAMES_TABLE_LEN);
-
-/*
- * System table for rapid access to component names.
- */
-static LIST_HEAD(, pnode_base) names[NAMES_TABLE_LEN];
-/*
- * Number of names tracked by the system.
- */
-static size_t n_names = 0;
-/*
- * Desired number of base path nodes to maintain.
- */
-static size_t max_names = (2 * NAMES_TABLE_LEN);
-
-/*
- * Number of pnodes to grab per memory allocation when filling the
- * free list.
- */
-#define PNODES_PER_CHUNK ((8 * 1024) / sizeof(struct pnode) - 2)
-
-#ifdef ZERO_SUM_MEMORY
-/*
- * Allocation information for pnodes bulk allocation.
- */
-struct pnodes_block {
- LIST_ENTRY(pnodes_block) pnblk_links;
- struct pnode pnblk_nodes[PNODES_PER_CHUNK];
-};
-
-static LIST_HEAD( ,pnodes_block) pnblocks;
-#endif
-
-/*
- * List of all path-nodes (aliases) referenced by any tree.
- */
-struct pnodes_head _sysio_pnodes;
-
-/*
- * Free path-nodes -- Not referenced by any tree for fas reuse.
- */
-static LIST_HEAD( ,pnode) free_pnodes;
-
-/*
- * The system root -- Aka `/'.
- */
-struct pnode *_sysio_root = NULL;
-
-/*
- * Initialize path and i-node support. Must be called before any other
- * routine in this module.
- */
-int
-_sysio_i_init()
-{
- unsigned i;
-
- TAILQ_INIT(&_sysio_inodes);
-
- for (i = 0; i < NAMES_TABLE_LEN; i++)
- LIST_INIT(&names[i]);
-
-#ifdef ZERO_SUM_MEMORY
- LIST_INIT(&pnblocks);
-#endif
- TAILQ_INIT(&_sysio_pnodes);
- LIST_INIT(&free_pnodes);
-
- return 0;
-}
-
-/*
- * Garbage-collect idle i-nodes. We try to keep resource use limited to
- * MAX_INODES_MULTIPLIER * max_names.
- */
-static void
-i_reclaim()
-{
- struct inode *next, *ino;
- size_t t;
-
- /*
- * I just can't figure out a good way to reclaim these well without
- * getting really fancy and using complex algorithms. The
- * base nodes hold references on them for a long time and then
- * release them. Those will age to the front of the queue and
- * we have to skip over them. Oh well...
- */
- t = MAX_INODES_MULTIPLIER * max_names;
- if (max_inodes < t) {
- /*
- * Oops. Nope. We want more inodes than names entries.
- */
- max_inodes = t;
- return;
- }
- next = _sysio_inodes.tqh_first;
- if (!next)
- return;
- t = max_inodes / 2;
- do {
- ino = next;
- next = ino->i_nodes.tqe_next;
- if (ino->i_ref || ino->i_immune)
- continue;
- _sysio_i_gone(ino);
- } while (next && n_inodes > t);
-
- if (n_inodes > t)
- max_inodes += t;
-}
-
-static unsigned
-hash(struct file_identifier *fid)
-{
- size_t n;
- unsigned char *ucp;
- unsigned hkey;
-
- n = fid->fid_len;
- ucp = fid->fid_data;
- hkey = 0;
- do {
- hkey <<= 1;
- hkey += *ucp++;
- } while (--n);
- return hkey;
-}
-
-/*
- * Allocate and initialize a new i-node. Returned i-node is referenced.
- *
- * NB: The passed file identifier is not copied. It is, therefor, up to the
- * caller to assure that the value is static until the inode is destroyed.
- */
-struct inode *
-_sysio_i_new(struct filesys *fs,
- struct file_identifier *fid,
- struct intnl_stat *stat,
- unsigned immunity,
- struct inode_ops *ops,
- void *private)
-{
- struct inode *ino;
- struct itable_entry *head;
- struct inode_ops operations;
-
- if (n_inodes > max_inodes) {
- /*
- * Try to limit growth.
- */
- i_reclaim();
- }
-
- ino = malloc(sizeof(struct inode));
- if (!ino)
- return NULL;
- ino->i_ops = *ops;
- operations = *ops;
- if (S_ISBLK(stat->st_mode) ||
- S_ISCHR(stat->st_mode) ||
- S_ISFIFO(stat->st_mode)) {
- struct inode_ops *o;
-
- /*
- * Replace some operations sent with
- * those from the device table.
- */
- o = _sysio_dev_lookup(stat->st_mode, stat->st_rdev);
- operations.inop_open = o->inop_open;
- operations.inop_close = o->inop_close;
- operations.inop_read = o->inop_read;
- operations.inop_write = o->inop_write;
- operations.inop_pos = o->inop_pos;
- operations.inop_iodone = o->inop_iodone;
- operations.inop_fcntl = o->inop_fcntl;
- operations.inop_datasync = o->inop_datasync;
- operations.inop_ioctl = o->inop_ioctl;
- }
- I_INIT(ino, fs, stat, &operations, fid, immunity, private);
- ino->i_ref = 1;
- TAILQ_INSERT_TAIL(&_sysio_inodes, ino, i_nodes);
- head = &fs->fs_itbl[hash(fid) % FS_ITBLSIZ];
- LIST_INSERT_HEAD(head, ino, i_link);
-
- n_inodes++;
- assert(n_inodes);
-
- return ino;
-}
-
-/*
- * Find existing i-node given i-number and pointers to FS record
- * and identifier.
- */
-struct inode *
-_sysio_i_find(struct filesys *fs, struct file_identifier *fid)
-{
- struct inode *ino;
- struct itable_entry *head;
-
- head = &fs->fs_itbl[hash(fid) % FS_ITBLSIZ];
- /*
- * Look for existing.
- */
- for (ino = head->lh_first; ino; ino = ino->i_link.le_next)
- if (ino->i_fid->fid_len == fid->fid_len &&
- memcmp(ino->i_fid->fid_data,
- fid->fid_data,
- fid->fid_len) == 0) {
- I_REF(ino);
- break;
- }
-
- return ino;
-}
-
-/*
- * Force reclaim of idle i-node.
- */
-void
-_sysio_i_gone(struct inode *ino)
-{
-
- if (ino->i_ref)
- abort();
- if (!ino->i_zombie)
- LIST_REMOVE(ino, i_link);
- TAILQ_REMOVE(&_sysio_inodes, ino, i_nodes);
- (*ino->i_ops.inop_gone)(ino);
- free(ino);
-
- assert(n_inodes);
- n_inodes--;
-}
-
-/*
- * Stale inode, zombie it and move it out of the way
- */
-void
-_sysio_i_undead(struct inode *ino)
-{
-
- if (ino->i_zombie)
- return;
- LIST_REMOVE(ino, i_link);
- ino->i_zombie = 1;
-}
-
-/*
- * Garbage collect idle path (and base path) nodes tracked by the system.
- */
-static void
-p_reclaim()
-{
- struct pnode *next, *pno;
- size_t t;
-
- next = _sysio_pnodes.tqh_first;
- if (!next)
- return;
- t = max_names / 2;
- do {
- pno = next;
- if (pno->p_ref) {
- next = pno->p_nodes.tqe_next;
- continue;
- }
- pno->p_ref++;
- assert(pno->p_ref);
- (void )_sysio_p_prune(pno);
- next = pno->p_nodes.tqe_next;
- assert(pno->p_ref);
- pno->p_ref--;
- if (pno->p_ref)
- continue;
- (void )_sysio_p_prune(pno);
- } while (n_names > t && next);
-
- if (n_names > t)
- max_names += t;
-}
-
-/*
- * Allocate and initialize a new base path node.
- */
-struct pnode_base *
-_sysio_pb_new(struct qstr *name, struct pnode_base *parent, struct inode *ino)
-{
- struct pnode_base *pb;
-
- if (n_names > max_names) {
- /*
- * Try to limit growth.
- */
- p_reclaim();
- }
-
- pb = malloc(sizeof(struct pnode_base) + name->len);
- if (!pb)
- return NULL;
-
- pb->pb_name.name = NULL;
- pb->pb_name.len = name->len;
- if (pb->pb_name.len) {
- char *cp;
-
- /*
- * Copy the passed name.
- *
- * We have put the space for the name immediately behind
- * the record in order to maximize spatial locality.
- */
- cp = (char *)pb + sizeof(struct pnode_base);
- (void )strncpy(cp, name->name, name->len);
- pb->pb_name.name = cp;
- assert(name->hashval);
- pb->pb_name.hashval = name->hashval;
- LIST_INSERT_HEAD(&names[name->hashval % NAMES_TABLE_LEN],
- pb,
- pb_names);
- }
- pb->pb_ino = ino;
- LIST_INIT(&pb->pb_children);
- LIST_INIT(&pb->pb_aliases);
- if (parent)
- LIST_INSERT_HEAD(&parent->pb_children, pb, pb_sibs);
- pb->pb_parent = parent;
-
- n_names++;
- assert(n_names);
-
- return pb;
-}
-
-/*
- * Destroy base path node, releasing resources back to the system.
- *
- * NB: Caller must release the inode referenced by the record.
- */
-static void
-pb_destroy(struct pnode_base *pb)
-{
-
- assert(n_names);
- n_names--;
-
- assert(!pb->pb_aliases.lh_first);
- assert(!pb->pb_children.lh_first);
- assert(!pb->pb_ino);
- if (pb->pb_name.len)
- LIST_REMOVE(pb, pb_names);
- if (pb->pb_parent)
- LIST_REMOVE(pb, pb_sibs);
-
-#ifndef NDEBUG
- /*
- * This can help us catch pb-nodes that are free'd redundantly.
- */
- pb->pb_name.hashval = 0;
-#endif
- free(pb);
-}
-
-/*
- * Force reclaim of idle base path node.
- */
-void
-_sysio_pb_gone(struct pnode_base *pb)
-{
-
- if (pb->pb_ino)
- I_RELE(pb->pb_ino);
- pb->pb_ino = NULL;
-
- pb_destroy(pb);
-}
-
-/*
- * Generate more path (alias) nodes for the fast allocator.
- */
-static void
-more_pnodes()
-{
- size_t n;
-#ifdef ZERO_SUM_MEMORY
- struct pnodes_block *pnblk;
-#endif
- struct pnode *pno;
-
-#ifdef ZERO_SUM_MEMORY
- pnblk = malloc(sizeof(struct pnodes_block));
- pno = NULL;
- if (pnblk) {
- LIST_INSERT_HEAD(&pnblocks, pnblk, pnblk_links);
- pno = pnblk->pnblk_nodes;
- }
-#else
- pno = malloc(PNODES_PER_CHUNK * sizeof(struct pnode));
-#endif
- if (!pno)
- return;
- n = PNODES_PER_CHUNK;
- do {
- LIST_INSERT_HEAD(&free_pnodes, pno, p_links);
- pno++;
- } while (--n);
-}
-
-#ifdef ZERO_SUM_MEMORY
-/*
- * Shutdown
- */
-void
-_sysio_i_shutdown()
-{
- struct pnodes_block *pnblk;
-
- while ((pnblk = pnblocks.lh_first)) {
- LIST_REMOVE(pnblk, pnblk_links);
- free(pnblk);
- }
-}
-#endif
-
-/*
- * Allocate, initialize and establish appropriate links for new path (alias)
- * node.
- */
-struct pnode *
-_sysio_p_new_alias(struct pnode *parent,
- struct pnode_base *pb,
- struct mount *mnt)
-{
- struct pnode *pno;
-
- assert(!pb->pb_name.name || pb->pb_name.hashval);
-
- pno = free_pnodes.lh_first;
- if (!pno) {
- more_pnodes();
- pno = free_pnodes.lh_first;
- }
- if (!pno)
- return NULL;
- LIST_REMOVE(pno, p_links);
-
- pno->p_ref = 1;
- pno->p_parent = parent;
- if (!pno->p_parent)
- pno->p_parent = pno;
- pno->p_base = pb;
- pno->p_mount = mnt;
- pno->p_cover = NULL;
- LIST_INSERT_HEAD(&pb->pb_aliases, pno, p_links);
- TAILQ_INSERT_TAIL(&_sysio_pnodes, pno, p_nodes);
-
- return pno;
-}
-
-/*
- * For reclamation of idle path (alias) node.
- */
-void
-_sysio_p_gone(struct pnode *pno)
-{
- struct pnode_base *pb;
-
- assert(!pno->p_ref);
- assert(!pno->p_cover);
-
- TAILQ_REMOVE(&_sysio_pnodes, pno, p_nodes);
- LIST_REMOVE(pno, p_links);
-
- pb = pno->p_base;
- if (!(pb->pb_aliases.lh_first || pb->pb_children.lh_first))
- _sysio_pb_gone(pb);
-
- LIST_INSERT_HEAD(&free_pnodes, pno, p_links);
-}
-
-/*
- * (Re)Validate passed path node.
- */
-int
-_sysio_p_validate(struct pnode *pno, struct intent *intnt, const char *path)
-{
- struct inode *ino;
- struct pnode_base *rootpb;
- int err;
-
- ino = pno->p_base->pb_ino;
- /*
- * An invalid pnode will not have an associated inode. We'll use
- * the FS root inode, then -- It *must* be valid.
- */
- rootpb = pno->p_mount->mnt_root->p_base;
- assert(rootpb->pb_ino);
- err =
- rootpb->pb_ino->i_ops.inop_lookup(pno,
- &ino,
- intnt,
- path);
- /*
- * If the inode lookup returns a different inode, release the old if
- * present and point to the new.
- */
- if (err || pno->p_base->pb_ino != ino) {
- if (pno->p_base->pb_ino)
- I_RELE(pno->p_base->pb_ino);
- pno->p_base->pb_ino = ino;
- }
- return err;
-}
-
-/*
- * Find (or create!) an alias for the given parent and name. A misnomer,
- * really -- This is a "get". Returned path node is referenced.
- */
-int
-_sysio_p_find_alias(struct pnode *parent,
- struct qstr *name,
- struct pnode **pnop)
-{
- struct pnode_base *pb;
- int err;
- struct pnode *pno;
-
- /*
- * Find the named child.
- */
- if (name->len) {
- /*
- * Try the names table.
- */
- pb = names[name->hashval % NAMES_TABLE_LEN].lh_first;
- while (pb) {
- if (pb->pb_parent == parent->p_base &&
- pb->pb_name.len == name->len &&
- strncmp(pb->pb_name.name,
- name->name,
- name->len) == 0)
- break;
- pb = pb->pb_names.le_next;
- }
- } else {
- /*
- * Brute force through the parent's list of children.
- */
- pb = parent->p_base->pb_children.lh_first;
- while (pb) {
- if (pb->pb_parent == parent->p_base &&
- pb->pb_name.len == name->len &&
- strncmp(pb->pb_name.name,
- name->name,
- name->len) == 0)
- break;
- pb = pb->pb_sibs.le_next;
- }
- }
- if (!pb) {
- /*
- * None found, create new child.
- */
- pb = _sysio_pb_new(name, parent->p_base, NULL);
- if (!pb)
- return -ENOMEM;
- }
- /*
- * Now find the proper alias. It's the one with the passed
- * parent.
- */
- err = 0;
- pno = pb->pb_aliases.lh_first;
- while (pno) {
- if (pno->p_parent == parent) {
- P_REF(pno);
- break;
- }
- pno = pno->p_links.le_next;
- }
- if (!pno) {
- /*
- * Hmm. No alias. Just create an invalid one, to be
- * validated later.
- */
- pno = _sysio_p_new_alias(parent, pb, parent->p_mount);
- if (!pno)
- err = -ENOMEM;
- }
- if (!err)
- *pnop = pno;
- return err;
-}
-
-/*
- * Prune idle path base nodes freom the passed sub-tree, including the root.
- */
-static void
-_sysio_prune(struct pnode_base *rpb)
-{
- struct pnode_base *nxtpb, *pb;
-
- nxtpb = rpb->pb_children.lh_first;
- while ((pb = nxtpb)) {
- nxtpb = pb->pb_sibs.le_next;
- if (pb->pb_aliases.lh_first)
- continue;
- if (pb->pb_children.lh_first) {
- _sysio_prune(pb);
- continue;
- }
- _sysio_pb_gone(pb);
- }
- if (rpb->pb_children.lh_first)
- return;
- _sysio_pb_gone(rpb);
-}
-
-/*
- * Prune idle nodes from the passed sub-tree, including the root.
- *
- * Returns the number of aliases on the same mount that could not be pruned.
- * i.e. a zero return means the entire sub-tree is gone.
- */
-size_t
-_sysio_p_prune(struct pnode *root)
-{
- size_t count;
- struct pnode_base *nxtpb, *pb;
- struct pnode *nxtpno, *pno;
-
- count = 0;
- nxtpb = root->p_base->pb_children.lh_first;
- while ((pb = nxtpb)) {
- nxtpb = pb->pb_sibs.le_next;
- nxtpno = pb->pb_aliases.lh_first;
- if (!nxtpno) {
- _sysio_prune(pb);
- continue;
- }
- while ((pno = nxtpno)) {
- nxtpno = pno->p_links.le_next;
- if (pno->p_mount != root->p_mount) {
- /*
- * Not the alias we were looking for.
- */
- continue;
- }
- if (pno->p_base->pb_children.lh_first) {
- /*
- * Node is interior. Recurse.
- */
- count += _sysio_p_prune(pno);
- continue;
- }
- if (pno->p_ref) {
- /*
- * Can't prune; It's active.
- */
- count++;
- continue;
- }
- assert(!pno->p_cover); /* covered => ref'd! */
- assert(!pno->p_base->pb_name.name ||
- pno->p_base->pb_name.hashval);
- /*
- * Ok to prune.
- */
- if (pno->p_mount->mnt_root == pno) {
-#ifndef AUTOMOUNT_FILE_NAME
- count++;
- continue;
-#else
- /*
- * This is an automount-point. Must
- * unmount before relcaim.
- */
- P_REF(pno);
- if (_sysio_do_unmount(pno->p_mount) != 0) {
- P_RELE(pno);
- count++;
- }
- continue;
-#endif
- }
- _sysio_p_gone(pno);
- }
- }
-
- if (count) {
- /*
- * Can't get the root or we disconnect the sub-trees.
- */
- return count + (root->p_ref ? 1 : 0);
- }
-
- /*
- * All that is left is the root. Try for it too.
- */
- if (root->p_ref) {
- count++;
- } else if (root->p_mount->mnt_root == root) {
-#ifndef AUTOMOUNT_FILE_NAME
- count++;
-#else
- /*
- * This is an automount-point. Must
- * unmount before relcaim.
- */
- P_REF(root);
- if (_sysio_do_unmount(root->p_mount) != 0) {
- P_RELE(root);
- count++;
- }
-#endif
- } else
- _sysio_p_gone(root);
-
- return count;
-}
-
-/*
- * Return path tracked by the base path node ancestor chain.
- *
- * Remember, base path nodes track the path relative to the file system and
- * path (alias) nodes track path relative to our name space -- They cross
- * mount points.
- */
-char *
-_sysio_pb_path(struct pnode_base *pb, const char separator)
-{
- char *buf;
- size_t len, n;
- struct pnode_base *tmp;
- char *cp;
-
- /*
- * First pass: Traverse to the root of the sub-tree, remembering
- * lengths.
- */
- len = 0;
- tmp = pb;
- do {
- n = tmp->pb_name.len;
- len += tmp->pb_name.len;
- if (n)
- len++;
- tmp = tmp->pb_parent;
- } while (tmp);
- if (!len)
- len++;
- /*
- * Alloc space.
- */
- buf = malloc(len + 1);
- if (!buf)
- return NULL;
- /*
- * Fill in the path buffer -- Backwards, since we're starting
- * from the end.
- */
- cp = buf;
- *cp = separator;
- cp += len;
- *cp = '\0'; /* NUL term */
- tmp = pb;
- do {
- cp -= tmp->pb_name.len;
- n = tmp->pb_name.len;
- if (n) {
- (void )strncpy(cp, tmp->pb_name.name, n);
- *--cp = separator;
- }
- tmp = tmp->pb_parent;
- } while (tmp);
-
- return buf;
-}
-
-/*
- * Common set attributes routine.
- */
-int
-_sysio_setattr(struct pnode *pno,
- struct inode *ino,
- unsigned mask,
- struct intnl_stat *stbuf)
-{
- /*
- * It is possible that pno is null (for ftruncate call).
- */
-
- if (pno)
- assert(!ino || pno->p_base->pb_ino == ino);
- if (!ino)
- ino = pno->p_base->pb_ino;
- assert(ino);
-
- if (pno && IS_RDONLY(pno))
- return -EROFS;
-
- /*
- * Determining permission to change the attributes is
- * difficult, at best. Just try it.
- */
- return (*ino->i_ops.inop_setattr)(pno, ino, mask, stbuf);
-}
-
-/*
- * Do nothing.
- */
-void
-_sysio_do_noop()
-{
-
- return;
-}
-
-/*
- * Abort.
- */
-void
-_sysio_do_illop()
-{
-
- abort();
-}
-
-/*
- * Return -EBADF
- */
-int
-_sysio_do_ebadf()
-{
-
- return -EBADF;
-}
-
-/*
- * Return -EINVAL
- */
-int
-_sysio_do_einval()
-{
-
- return -EINVAL;
-}
-
-/*
- * Return -ENOENT
- */
-int
-_sysio_do_enoent()
-{
-
- return -ENOENT;
-}
-
-/*
- * Return -ESPIPE
- */
-int
-_sysio_do_espipe()
-{
-
- return -ESPIPE;
-}
-
-/*
- * Return -EISDIR
- */
-int
-_sysio_do_eisdir()
-{
-
- return -EISDIR;
-}
-
-/*
- * Return -ENOSYS
- */
-int
-_sysio_do_enosys()
-{
-
- return -ENOSYS;
-}
-
-
-/*
- * Return -ENODEV
- */
-int
-_sysio_do_enodev()
-{
-
- return -ENODEV;
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <errno.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "file.h"
-
-#include "sysio-symbols.h"
-
-int
-SYSIO_INTERFACE_NAME(ioctl)(int fd, unsigned long request, ...)
-{
- int err;
- struct file *fil;
- va_list ap;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- err = 0;
- fil = _sysio_fd_find(fd);
- if (!fil) {
- err = -EBADF;
- goto out;
- }
-
- va_start(ap, request);
- err = fil->f_ino->i_ops.inop_ioctl(fil->f_ino, request, ap);
- va_end(ap);
-
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-
-#ifdef __GLIBC__
-#undef __ioctl
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(ioctl),
- PREPEND(__, SYSIO_INTERFACE_NAME(ioctl)))
-#endif
-
-#ifdef BSD
-#undef _ioctl
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(ioctl),
- PREPEND(_, SYSIO_INTERFACE_NAME(ioctl)))
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2004 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <sched.h>
-#include <assert.h>
-#include <sys/uio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "xtio.h"
-#include "inode.h"
-
-#if defined(REDSTORM)
-#include <catamount/do_iostats.h>
-#endif
-
-
-/*
- * Asynchronous IO context support.
- */
-
-/*
- * List of all outstanding (in-flight) asynch IO requests tracked
- * by the system.
- */
-static LIST_HEAD( ,ioctx) aioq;
-
-/*
- * Free callback entry.
- */
-#define cb_free(cb) free(cb)
-
-/*
- * Initialization. Must be called before using any other routine in this
- * module.
- */
-int
-_sysio_ioctx_init()
-{
-
- LIST_INIT(&aioq);
- return 0;
-}
-
-/*
- * Enter an IO context onto the async IO events queue.
- */
-void
-_sysio_ioctx_enter(struct ioctx *ioctx)
-{
-
- LIST_INSERT_HEAD(&aioq, ioctx, ioctx_link);
-}
-
-/*
- * Allocate and initialize a new IO context.
- */
-struct ioctx *
-_sysio_ioctx_new(struct inode *ino,
- int wr,
- const struct iovec *iov,
- size_t iovlen,
- const struct intnl_xtvec *xtv,
- size_t xtvlen)
-{
- struct ioctx *ioctx;
-
- ioctx = malloc(sizeof(struct ioctx));
- if (!ioctx)
- return NULL;
-
- I_REF(ino);
-
- IOCTX_INIT(ioctx,
- 0,
- wr,
- ino,
- iov, iovlen,
- xtv, xtvlen);
-
- /*
- * Link request onto the outstanding requests queue.
- */
- _sysio_ioctx_enter(ioctx);
-
- return ioctx;
-}
-
-/*
- * Add an IO completion call-back to the end of the context call-back queue.
- * These are called in iowait() as the last thing, right before the context
- * is destroyed.
- *
- * They are called in order. Beware.
- */
-int
-_sysio_ioctx_cb(struct ioctx *ioctx,
- void (*f)(struct ioctx *, void *),
- void *data)
-{
- struct ioctx_callback *entry;
-
- entry = malloc(sizeof(struct ioctx_callback));
- if (!entry)
- return -ENOMEM;
-
- entry->iocb_f = f;
- entry->iocb_data = data;
-
- TAILQ_INSERT_TAIL(&ioctx->ioctx_cbq, entry, iocb_next);
-
- return 0;
-}
-
-/*
- * Find an IO context given it's identifier.
- *
- * NB: This is dog-slow. If there are alot of these, we will need to change
- * this implementation.
- */
-struct ioctx *
-_sysio_ioctx_find(void *id)
-{
- struct ioctx *ioctx;
-
- for (ioctx = aioq.lh_first; ioctx; ioctx = ioctx->ioctx_link.le_next)
- if (ioctx == id)
- return ioctx;
-
- return NULL;
-}
-
-/*
- * Check if asynchronous IO operation is complete.
- */
-int
-_sysio_ioctx_done(struct ioctx *ioctx)
-{
-
- if (ioctx->ioctx_done)
- return 1;
- if (!(*ioctx->ioctx_ino->i_ops.inop_iodone)(ioctx))
- return 0;
- ioctx->ioctx_done = 1;
- return 1;
-}
-
-/*
- * Wait for asynchronous IO operation to complete, return status
- * and dispose of the context.
- *
- * Note:
- * The context is no longer valid after return.
- */
-ssize_t
-_sysio_ioctx_wait(struct ioctx *ioctx)
-{
- ssize_t cc;
-
- /*
- * Wait for async operation to complete.
- */
- while (!_sysio_ioctx_done(ioctx)) {
-#ifdef POSIX_PRIORITY_SCHEDULING
- (void )sched_yield();
-#endif
- }
-
- /*
- * Get status.
- */
- cc = ioctx->ioctx_cc;
- if (cc < 0)
- cc = -ioctx->ioctx_errno;
-
- /*
- * Dispose.
- */
- _sysio_ioctx_complete(ioctx);
-
- return cc;
-}
-
-/*
- * Free callback entry.
- */
-void
-_sysio_ioctx_cb_free(struct ioctx_callback *cb)
-{
-
- cb_free(cb);
-}
-
-/*
- * Complete an asynchronous IO request.
- */
-void
-_sysio_ioctx_complete(struct ioctx *ioctx)
-{
- struct ioctx_callback *entry;
-
-
- /* update IO stats */
- _SYSIO_UPDACCT(ioctx->ioctx_write, ioctx->ioctx_cc);
-
- /*
- * Run the call-back queue.
- */
- while ((entry = ioctx->ioctx_cbq.tqh_first)) {
- TAILQ_REMOVE(&ioctx->ioctx_cbq, entry, iocb_next);
- (*entry->iocb_f)(ioctx, entry->iocb_data);
- cb_free(entry);
- }
-
- /*
- * Unlink from the file record's outstanding request queue.
- */
- LIST_REMOVE(ioctx, ioctx_link);
-
- if (ioctx->ioctx_fast)
- return;
-
- I_RELE(ioctx->ioctx_ino);
-
- free(ioctx);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-
-/*
- * Asynch IO support for the API.
- */
-
-/*
- * Poll status of asynch IO request.
- */
-int
-SYSIO_INTERFACE_NAME(iodone)(void *ioid)
-{
- struct ioctx *ioctx;
- int rc;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- ioctx = _sysio_ioctx_find(ioid);
- if (!ioctx)
- SYSIO_INTERFACE_RETURN(-1, -EINVAL);
-
- rc = _sysio_ioctx_done(ioctx);
- SYSIO_INTERFACE_RETURN(rc < 0 ? -1 : rc, rc < 0 ? rc : 0);
-}
-
-/*
- * Wait for completion of and return results from identified asynch IO
- * request.
- *
- * The identifier is no longer valid after return.
- */
-ssize_t
-SYSIO_INTERFACE_NAME(iowait)(void *ioid)
-{
- struct ioctx *ioctx;
- ssize_t cc;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- ioctx = _sysio_ioctx_find(ioid);
- if (!ioctx)
- SYSIO_INTERFACE_RETURN(-1, -EINVAL);
-
- cc = _sysio_ioctx_wait(ioctx);
- SYSIO_INTERFACE_RETURN(cc < 0 ? -1 : cc, cc < 0 ? (int )cc : 0);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "mount.h"
-#include "inode.h"
-#include "sysio-symbols.h"
-
-int
-SYSIO_INTERFACE_NAME(link)(const char *oldpath, const char *newpath)
-{
- struct intent intent;
- int err;
- struct pnode *old, *new;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- INTENT_INIT(&intent, 0, NULL, NULL);
- err = _sysio_namei(_sysio_cwd, oldpath, 0, &intent, &old);
- if (err)
- goto out;
- if (S_ISDIR(old->p_base->pb_ino->i_stbuf.st_mode)) {
- err = -EPERM;
- goto error1;
- }
- INTENT_INIT(&intent, INT_UPDPARENT, NULL, NULL);
- new = NULL;
- err = _sysio_namei(_sysio_cwd, newpath, ND_NEGOK, &intent, &new);
- if (err)
- goto error1;
- if (new->p_base->pb_ino) {
- err = -EEXIST;
- goto error2;
- }
- if (old->p_mount->mnt_root != new->p_mount->mnt_root) {
- err = -EXDEV;
- goto error2;
- }
- /*
- * Use the parent node operations to request the task in case the
- * driver is implemented using differentiated inode operations based
- * on file type, such as incore does.
- */
- err = old->p_parent->p_base->pb_ino->i_ops.inop_link(old, new);
- if (err)
- goto error2;
- /*
- * The new p-node must be pointed at the inode referenced by the old.
- */
- assert(!new->p_base->pb_ino && old->p_base->pb_ino);
- new->p_base->pb_ino = old->p_base->pb_ino;
- I_REF(new->p_base->pb_ino);
-
-error2:
- P_RELE(new);
-error1:
- P_RELE(old);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef __link
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(link),
- PREPEND(__, SYSIO_INTERFACE_NAME(link)))
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2005 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <errno.h>
-#include <unistd.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "file.h"
-
-#include "sysio-symbols.h"
-
-_SYSIO_OFF_T
-_sysio_lseek_prepare(struct file *fil,
- _SYSIO_OFF_T offset,
- int whence,
- _SYSIO_OFF_T max)
-{
- _SYSIO_OFF_T off, pos;
- struct intnl_stat stbuf;
-
- off = -1;
- switch (whence) {
-
- case SEEK_SET:
- off = 0;
- break;
- case SEEK_CUR:
- off = fil->f_pos;
- break;
- case SEEK_END:
- {
- int err;
-
- /*
- * Don't blindly trust the attributes
- * in the inode record for this. Give the
- * driver a chance to refresh them.
- */
- err =
- (*fil->f_ino->i_ops.inop_getattr)(NULL,
- fil->f_ino,
- &stbuf);
- if (err)
- return err;
-
- }
- off = stbuf.st_size;
- break;
- default:
- return -EINVAL;
- }
- pos = off + offset;
- if ((offset < 0 && -offset > off) || (offset > 0 && pos <= off))
- return -EINVAL;
- if (pos >= max)
- return -EOVERFLOW;
- return pos;
-}
-
-static _SYSIO_OFF_T
-_sysio_lseek(struct file *fil,
- _SYSIO_OFF_T offset,
- int whence,
- _SYSIO_OFF_T max)
-{
- _SYSIO_OFF_T pos;
-
- pos = _sysio_lseek_prepare(fil, offset, whence, max);
- if (pos < 0)
- return pos;
- pos = (fil->f_ino->i_ops.inop_pos)(fil->f_ino, pos);
- if (pos < 0)
- return pos;
- fil->f_pos = pos;
- return pos;
-}
-
-#ifdef _LARGEFILE64_SOURCE
-#undef lseek64
-
-extern off64_t
-SYSIO_INTERFACE_NAME(lseek64)(int fd, off64_t offset, int whence)
-{
- struct file *fil;
- off64_t off;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN((off64_t )-1, -EBADF);
- off = _sysio_lseek(fil, offset, whence, _SEEK_MAX(fil));
- SYSIO_INTERFACE_RETURN(off < 0 ? (off64_t )-1 : off,
- off < 0 ? (int )off : 0);
-
-}
-#ifdef __GLIBC__
-#undef __lseek64
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(lseek64),
- PREPEND(__, SYSIO_INTERFACE_NAME(lseek64)))
-#endif
-#ifdef REDSTORM
-#undef __libc_lseek64
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(lseek64),
- PREPEND(__, SYSIO_INTERFACE_NAME(libc_lseek64)))
-#endif
-#endif
-
-#undef lseek
-
-extern off_t
-SYSIO_INTERFACE_NAME(lseek)(int fd, off_t offset, int whence)
-{
- struct file *fil;
- _SYSIO_OFF_T off;
- off_t rtn;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN((off_t )-1, -EBADF);
- off = _sysio_lseek(fil, offset, whence, LONG_MAX);
- if (off < 0)
- SYSIO_INTERFACE_RETURN((off_t )-1, (int )off);
- rtn = (off_t )off;
- assert(rtn == off);
- SYSIO_INTERFACE_RETURN(rtn, 0);
-}
-
-#ifdef __GLIBC__
-#undef __lseek
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(lseek),
- PREPEND(__, SYSIO_INTERFACE_NAME(lseek)))
-#endif
-
-#ifdef __linux__
-#undef llseek
-int
-SYSIO_INTERFACE_NAME(llseek)(unsigned int fd __IS_UNUSED,
- unsigned long offset_high __IS_UNUSED,
- unsigned long offset_low __IS_UNUSED,
- loff_t *result __IS_UNUSED,
- unsigned int whence __IS_UNUSED)
-{
- struct file *fil;
- loff_t off;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- /*
- * This is just plain goofy.
- */
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(-1, -EBADF);
-#ifndef _LARGEFILE64_SOURCE
- if (offset_high) {
- /*
- * We are using 32-bit internals. This just isn't
- * going to work.
- */
- SYSIO_INTERFACE_RETURN(-1, -EOVERFLOW);
- }
-#else
- off = offset_high;
- off <<= 32;
- off |= offset_low;
-#endif
- off = _sysio_lseek(fil, off, whence, _SEEK_MAX(fil));
- if (off < 0)
- SYSIO_INTERFACE_RETURN((off_t )-1, (int )off);
- *result = off;
- SYSIO_INTERFACE_RETURN(0, 0);
-}
-
-#undef __llseek
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(llseek),
- PREPEND(__, SYSIO_INTERFACE_NAME(llseek)))
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2006 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "fs.h"
-#include "mount.h"
-#include "sysio-symbols.h"
-
-int
-_sysio_mkdir(struct pnode *pno, mode_t mode)
-{
- int err;
- struct inode *parenti;
-
- if (pno->p_base->pb_ino)
- return -EEXIST;
-
- err = _sysio_permitted(pno->p_parent, W_OK);
- if (err)
- return err;
-
- parenti = pno->p_parent->p_base->pb_ino;
- assert(parenti);
- return (*parenti->i_ops.inop_mkdir)(pno, mode);
-}
-
-int
-SYSIO_INTERFACE_NAME(mkdir)(const char *path, mode_t mode)
-{
- int err;
- struct intent intent;
- struct pnode *pno;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- INTENT_INIT(&intent, INT_CREAT, &mode, NULL);
- err = _sysio_namei(_sysio_cwd, path, ND_NEGOK, &intent, &pno);
- if (err)
- goto out;
-
- mode &= ~(_sysio_umask & 0777); /* apply umask */
- err = _sysio_mkdir(pno, mode);
- P_RELE(pno);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef __mkdir
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(mkdir),
- PREPEND(__, SYSIO_INTERFACE_NAME(mkdir)))
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <unistd.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "fs.h"
-#include "mount.h"
-
-#include "sysio-symbols.h"
-
-#undef mknod
-#undef __xmknod
-
-/*
- * Internal routine to make a device node.
- */
-int
-_sysio_mknod(struct pnode *pno, mode_t mode, dev_t dev)
-{
-
- if (pno->p_base->pb_ino)
- return -EEXIST;
-
- /*
- * Support only regular, character-special and fifos right now.
- * (mode & S_IFMT) == 0 is the same as S_IFREG.
- */
- if (!(S_ISREG(mode) || S_ISCHR(mode) || S_ISFIFO(mode)))
- return -EINVAL;
-
- if (IS_RDONLY(pno))
- return -EROFS;
- return (*pno->p_parent->p_base->pb_ino->i_ops.inop_mknod)(pno,
- mode,
- dev);
-}
-
-int
-PREPEND(__, SYSIO_INTERFACE_NAME(xmknod))(int __ver,
- const char *path,
- mode_t mode,
- dev_t *dev)
-{
- int err;
- struct intent intent;
- struct pnode *pno;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- if (__ver != _MKNOD_VER) {
- err = -ENOSYS;
- goto out;
- }
-
- mode &= ~(_sysio_umask & 0777); /* apply umask */
-
- INTENT_INIT(&intent, INT_CREAT, &mode, NULL);
- err = _sysio_namei(_sysio_cwd, path, ND_NEGOK, &intent, &pno);
- if (err)
- goto out;
-
- err = _sysio_permitted(pno->p_parent, W_OK);
- if (err)
- goto error;
- err = _sysio_mknod(pno, mode, *dev);
-error:
- P_RELE(pno);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef _xmknod
-sysio_sym_weak_alias(PREPEND(__, SYSIO_INTERFACE_NAME(xmknod)),
- PREPEND(_, SYSIO_INTERFACE_NAME(xmknod)))
-#endif
-
-static int
-PREPEND(__, SYSIO_INTERFACE_NAME(mknod))(const char *path,
- mode_t mode,
- dev_t dev)
-{
-
- return PREPEND(__, SYSIO_INTERFACE_NAME(xmknod))(_MKNOD_VER,
- path,
- mode,
- &dev);
-}
-
-sysio_sym_weak_alias(PREPEND(__, SYSIO_INTERFACE_NAME(mknod)),
- SYSIO_INTERFACE_NAME(mknod))
+++ /dev/null
-#
-# Note; Remove statvfs{,64}.c until we decide what to do with them.
-# Lee; Tue Feb 24 09:37:32 EST 2004
-#
-
-if WITH_LUSTRE_HACK
-FILE_SUPPORT = src/file_hack.c
-else
-FILE_SUPPORT = src/file.c
-endif
-
-if WITH_LUSTRE_HACK
-LUSTRE_SRCDIR_SRCS = src/stdlib.c
-else
-LUSTRE_SRCDIR_SRCS =
-endif
-
-SRCDIR_SRCS = src/access.c src/chdir.c src/chmod.c \
- src/chown.c src/dev.c src/dup.c src/fcntl.c \
- src/fs.c src/fsync.c \
- src/getdirentries.c src/init.c src/inode.c \
- src/ioctl.c src/ioctx.c src/iowait.c \
- src/link.c src/lseek.c src/mkdir.c \
- src/mknod.c src/mount.c src/namei.c \
- src/open.c src/rw.c src/reconcile.c src/rename.c \
- src/rmdir.c src/stat64.c src/stat.c \
- src/stddir.c src/readdir.c src/readdir64.c \
- src/symlink.c src/readlink.c \
- src/truncate.c src/unlink.c src/utime.c \
- $(FILE_SUPPORT) $(LUSTRE_SRCDIR_SRCS)
-
-SRCDIR_EXTRA = src/module.mk
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2004 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#ifdef AUTOMOUNT_FILE_NAME
-#include <fcntl.h>
-#include <sys/uio.h>
-#endif
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "xtio.h"
-#include "fs.h"
-#include "mount.h"
-#include "inode.h"
-
-/*
- * File system and volume mount support.
- */
-
-#ifdef AUTOMOUNT_FILE_NAME
-/*
- * Name of autmount specification file in a directory with
- * the sticky-bit set.
- */
-struct qstr _sysio_mount_file_name = { "", 0, 0 };
-#endif
-
-/*
- * Active mounts.
- */
-static LIST_HEAD(, mount) mounts;
-
-static int _sysio_sub_fsswop_mount(const char *source,
- unsigned flags,
- const void *data,
- struct pnode *tocover,
- struct mount **mntp);
-
-static struct fssw_ops _sysio_sub_fssw_ops = {
- _sysio_sub_fsswop_mount
-};
-
-/*
- * Initialization. Must be called before any other routine in this module.
- */
-int
-_sysio_mount_init()
-{
- int err;
-
- LIST_INIT(&mounts);
-#ifdef AUTOMOUNT_FILE_NAME
- _sysio_next_component(AUTOMOUNT_FILE_NAME, &_sysio_mount_file_name);
-#endif
-
- /*
- * Register the sub-trees "file system" driver.
- */
- err = _sysio_fssw_register("sub", &_sysio_sub_fssw_ops);
- if (err)
- return err;
-
- return 0;
-}
-
-/*
- * Mount rooted sub-tree somewhere in the existing name space.
- */
-int
-_sysio_do_mount(struct filesys *fs,
- struct pnode_base *rootpb,
- unsigned flags,
- struct pnode *tocover,
- struct mount **mntp)
-{
- struct mount *mnt;
- int err;
-
- /*
- * It's really poor form to allow the new root to be a
- * descendant of the pnode being covered.
- */
- if (tocover) {
- struct pnode_base *pb;
-
- for (pb = rootpb;
- pb && pb != tocover->p_base;
- pb = pb->pb_parent)
- ;
- if (pb == tocover->p_base)
- return -EBUSY;
- }
-
- /*
- * Alloc
- */
- mnt = malloc(sizeof(struct mount));
- if (!mnt)
- return -ENOMEM;
- err = 0;
- /*
- * Init enough to make the mount record usable to the path node
- * generation routines.
- */
- mnt->mnt_fs = fs;
- if (fs->fs_flags & FS_F_RO) {
- /*
- * Propagate the read-only flag -- Whether they set it or not.
- */
- flags |= MOUNT_F_RO;
- }
- mnt->mnt_flags = flags;
- /*
- * Get alias for the new root.
- */
- mnt->mnt_root =
- _sysio_p_new_alias(tocover ? tocover->p_parent : NULL, rootpb, mnt);
- if (!mnt->mnt_root) {
- err = -ENOMEM;
- goto error;
- }
- /*
- * It may have been a while since the root inode was validated;
- * better validate again. And it better be a directory!
- */
- err = _sysio_p_validate(mnt->mnt_root, NULL, NULL);
- if (err)
- goto error;
-
- if (!S_ISDIR(mnt->mnt_root->p_base->pb_ino->i_stbuf.st_mode)) {
- err = -ENOTDIR;
- goto error;
- }
- /*
- * Cover up the mount point.
- */
- mnt->mnt_covers = tocover;
- if (!mnt->mnt_covers) {
- /*
- * New graph; It covers itself.
- */
- mnt->mnt_covers = tocover = mnt->mnt_root;
- }
- assert(!tocover->p_cover);
- tocover->p_cover = mnt->mnt_root;
-
- LIST_INSERT_HEAD(&mounts, mnt, mnt_link);
-
- *mntp = mnt;
- return 0;
-
-error:
- if (mnt->mnt_root) {
- P_RELE(mnt->mnt_root);
- _sysio_p_prune(mnt->mnt_root);
- }
- free(mnt);
- return err;
-}
-
-/*
- * Remove mounted sub-tree from the system.
- */
-int
-_sysio_do_unmount(struct mount *mnt)
-{
- struct pnode *root;
- struct filesys *fs;
-
- root = mnt->mnt_root;
- if (root->p_cover && root->p_cover != root) {
- /*
- * Active mount.
- */
- return -EBUSY;
- }
- assert(mnt->mnt_covers->p_cover == root);
- if (_sysio_p_prune(root) != 1) {
- /*
- * Active aliases.
- */
- return -EBUSY;
- }
- /*
- * We're committed.
- *
- * Drop ref of covered pnode and break linkage in name space.
- */
- if (root->p_cover != root)
- P_RELE(mnt->mnt_covers);
- mnt->mnt_covers->p_cover = NULL;
- LIST_REMOVE(mnt, mnt_link);
- /*
- * Kill the root.
- */
- P_RELE(root);
- root->p_cover = NULL;
- _sysio_p_gone(root);
- /*
- * Release mount record resource.
- */
- fs = mnt->mnt_fs;
- free(mnt);
- FS_RELE(fs);
-
- return 0;
-}
-
-/*
- * Establish the system name space.
- */
-int
-_sysio_mount_root(const char *source,
- const char *fstype,
- unsigned flags,
- const void *data)
-{
- struct fsswent *fssw;
- int err;
- struct mount *mnt;
-
- if (_sysio_root)
- return -EBUSY;
-
- fssw = _sysio_fssw_lookup(fstype);
- if (!fssw)
- return -ENODEV;
-
- err = (*fssw->fssw_ops.fsswop_mount)(source, flags, data, NULL, &mnt);
- if (err)
- return err;
-
- _sysio_root = mnt->mnt_root;
-#ifndef DEFER_INIT_CWD
- /*
- * It is very annoying to have to set the current working directory.
- * So... If it isn't set, make it the root now.
- */
- if (!_sysio_cwd) {
- _sysio_cwd = _sysio_root;
- P_REF(_sysio_cwd);
- }
-#endif
-
- return 0;
-}
-
-int
-_sysio_mount(struct pnode *cwd,
- const char *source,
- const char *target,
- const char *filesystemtype,
- unsigned long mountflags,
- const void *data)
-{
- int err;
- struct fsswent *fssw;
- struct intent intent;
- struct pnode *tgt;
- struct mount *mnt;
-
- /*
- * Find the file system switch entry specified.
- */
- fssw = _sysio_fssw_lookup(filesystemtype);
- if (!fssw)
- return -ENODEV;
-
- /*
- * Look up the target path node.
- */
- INTENT_INIT(&intent, INT_GETATTR, NULL, NULL);
- err = _sysio_namei(cwd, target, 0, &intent, &tgt);
- if (err)
- return err;
-
- if (tgt == _sysio_root) {
- /*
- * Attempting to mount over root.
- */
- err = -EBUSY;
- } else {
- /*
- * Do the deed.
- */
- err =
- (*fssw->fssw_ops.fsswop_mount)(source,
- mountflags,
- data,
- tgt,
- &mnt);
- }
- if (err)
- P_RELE(tgt);
- return err;
-}
-
-int
-SYSIO_INTERFACE_NAME(mount)(const char *source,
- const char *target,
- const char *filesystemtype,
- unsigned long mountflags,
- const void *data)
-{
- int err;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- err =
- _sysio_mount(_sysio_cwd,
- source,
- target,
- filesystemtype,
- mountflags,
- data);
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-int
-SYSIO_INTERFACE_NAME(umount)(const char *target)
-{
- int err;
- struct pnode *pno;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- /*
- * Look up the target path node.
- */
- err = _sysio_namei(_sysio_cwd, target, 0, NULL, &pno);
- if (err)
- goto out;
- P_RELE(pno); /* was ref'd */
-
- /*
- * Do the deed.
- */
-#if 0
- if (!pno->p_cover) {
- err = -EINVAL;
- goto error;
- }
-#endif
- assert(pno->p_mount);
- err = _sysio_do_unmount(pno->p_mount);
-
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-/*
- * Unmount all file systems -- Usually as part of shutting everything down.
- */
-int
-_sysio_unmount_all()
-{
- int err;
- struct mount *mnt, *nxt;
- struct pnode *pno;
-
- err = 0;
- nxt = mounts.lh_first;
- while ((mnt = nxt)) {
- nxt = mnt->mnt_link.le_next;
- pno = mnt->mnt_root;
- /*
- * If this is an automount generated mount, the root
- * has no reference. We can cause the dismount with a
- * simple prune.
- */
- if (!_sysio_p_prune(pno))
- continue;
-#ifdef notdef
- /*
- * Need a ref but only if this is not the root of a
- * disconnected graph. If it is, then it is covered by itself
- * and, so, already referenced.
- */
- if (pno->p_cover != pno)
- P_REF(pno);
-#endif
- err = _sysio_do_unmount(mnt);
- if (err) {
-#ifdef notdef
- if (pno->p_cover != pno)
- P_RELE(pno);
-#endif
- break;
- }
- if (pno == _sysio_root)
- _sysio_root = NULL;
- }
-
- return err;
-}
-
-static int
-_sysio_sub_fsswop_mount(const char *source,
- unsigned flags,
- const void *data __IS_UNUSED,
- struct pnode *tocover,
- struct mount **mntp)
-{
- int err;
- struct nameidata nameidata;
- struct mount *mnt;
-
- /*
- * How can we make a sub-mount from nothing?
- */
- if (!_sysio_root)
- return -EBUSY;
-
- /*
- * Lookup the source.
- */
- ND_INIT(&nameidata, 0, source, _sysio_root, NULL);
- err = _sysio_path_walk(_sysio_root, &nameidata);
- if (err)
- return err;
-
- /*
- * Mount the rooted sub-tree at the given position.
- */
- err =
- _sysio_do_mount(nameidata.nd_pno->p_mount->mnt_fs,
- nameidata.nd_pno->p_base,
- nameidata.nd_pno->p_mount->mnt_flags & flags,
- tocover,
- &mnt);
-
- /*
- * Clean up and return.
- */
- if (!err) {
- FS_REF(nameidata.nd_pno->p_mount->mnt_fs);
- *mntp = mnt;
- }
- P_RELE(nameidata.nd_pno);
- return err;
-}
-
-#ifdef AUTOMOUNT_FILE_NAME
-/*
- * Parse automount specification formatted as:
- *
- * <fstype>:<source>[[ \t]+<comma-separated-mount-options>]
- *
- * NB:
- * The buffer sent is (almost) always modified.
- */
-static int
-parse_automount_spec(char *s, char **fstyp, char **srcp, char **optsp)
-{
- int err;
- char *cp;
- char *fsty, *src, *opts;
-
- err = 0;
-
- /*
- * Eat leading white.
- */
- while (*s && *s == ' ' && *s == '\t')
- s++;
- /*
- * Get fstype.
- */
- fsty = cp = s;
- while (*cp &&
- *cp != ':' &&
- *cp != ' ' &&
- *cp != '\t' &&
- *cp != '\r' &&
- *cp != '\n')
- cp++;
- if (fsty == cp || *cp != ':')
- goto error;
- *cp++ = '\0';
-
- s = cp;
- /*
- * Eat leading white.
- */
- while (*s && *s == ' ' && *s == '\t')
- s++;
- /*
- * Get source.
- */
- src = cp = s;
- while (*cp &&
- *cp != ' ' &&
- *cp != '\t' &&
- *cp != '\r' &&
- *cp != '\n')
- cp++;
- if (src == cp)
- goto error;
- if (*cp)
- *cp++ = '\0';
-
- s = cp;
- /*
- * Eat leading white.
- */
- while (*s && *s == ' ' && *s == '\t')
- s++;
- /*
- * Get opts.
- */
- opts = cp = s;
- while (*cp &&
- *cp != ' ' &&
- *cp != '\t' &&
- *cp != '\r' &&
- *cp != '\n')
- cp++;
- if (opts == cp)
- opts = NULL;
- if (*cp)
- *cp++ = '\0';
-
- if (*cp)
- goto error;
-
- *fstyp = fsty;
- *srcp = src;
- *optsp = opts;
- return 0;
-
-error:
- return -EINVAL;
-}
-
-/*
- * Parse (and strip) system mount options.
- */
-static char *
-parse_opts(char *opts, unsigned *flagsp)
-{
- unsigned flags;
- char *src, *dst;
- char *cp;
-
- flags = 0;
- src = dst = opts;
- for (;;) {
- cp = src;
- while (*cp && *cp != ',')
- cp++;
- if (src + 2 == cp && strncmp(src, "rw", 2) == 0) {
- /*
- * Do nothing. This is the default.
- */
- src += 2;
- } else if (src + 2 == cp && strncmp(src, "ro", 2) == 0) {
- /*
- * Read-only.
- */
- flags |= MOUNT_F_RO;
- src += 2;
- }
- else if (src + 4 == cp && strncmp(src, "auto", 4) == 0) {
- /*
- * Enable automounts.
- */
- flags |= MOUNT_F_AUTO;
- src += 4;
- }
- if (src < cp) {
- /*
- * Copy what we didn't consume.
- */
- if (dst != opts)
- *dst++ = ',';
- do
- *dst++ = *src++;
- while (src != cp);
- }
- if (!*src)
- break;
- *dst = '\0';
- src++; /* skip comma */
- }
- *dst = '\0';
-
- *flagsp = flags;
- return opts;
-}
-
-/*
- * Attempt automount over the given directory.
- */
-int
-_sysio_automount(struct pnode *mntpno)
-{
- int err;
- struct inode *ino;
- struct iovec iovec;
- struct ioctx iocontext;
- struct intnl_xtvec xtvec;
- ssize_t cc;
- char *fstype, *source, *opts;
- unsigned flags;
- struct fsswent *fssw;
- struct mount *mnt;
-
- /*
- * Revalidate -- Paranoia.
- */
- err = _sysio_p_validate(mntpno, NULL, NULL);
- if (err)
- return err;
-
- /*
- * Read file content.
- */
- ino = mntpno->p_base->pb_ino;
- if (ino->i_stbuf.st_size > 64 * 1024) {
- /*
- * Let's be reasonable.
- */
- return -EINVAL;
- }
- iovec.iov_base = malloc(ino->i_stbuf.st_size + 1);
- if (!iovec.iov_base)
- return -ENOMEM;
- iovec.iov_len = ino->i_stbuf.st_size;
- err = _sysio_open(mntpno, O_RDONLY, 0);
- if (err)
- goto out;
- xtvec.xtv_off = 0;
- xtvec.xtv_len = ino->i_stbuf.st_size;
- IOCTX_INIT(&iocontext,
- 1,
- 0,
- ino,
- &iovec, 1,
- &xtvec, 1);
- _sysio_ioctx_enter(&iocontext);
- err = (*ino->i_ops.inop_read)(ino, &iocontext);
- if (err) {
- _sysio_ioctx_complete(&iocontext);
- (void )(*ino->i_ops.inop_close)(ino);
- goto out;
- }
- cc = _sysio_ioctx_wait(&iocontext);
- err = (*ino->i_ops.inop_close)(ino);
- if (err)
- goto out;
- if (cc < 0) {
- err = (int )cc;
- goto out;
- }
- ((char *)iovec.iov_base)[cc] = '\0';
-
- /*
- * Parse.
- */
- err = parse_automount_spec(iovec.iov_base, &fstype, &source, &opts);
- if (err)
- goto out;
- flags = 0;
- if (opts)
- opts = parse_opts(opts, &flags);
-
- /*
- * Find the file system switch entry specified.
- */
- fssw = _sysio_fssw_lookup(fstype);
- if (!fssw) {
- err = -ENODEV;
- goto out;
- }
-
- /*
- * Do the deed.
- */
- P_REF(mntpno->p_parent);
- err =
- (*fssw->fssw_ops.fsswop_mount)(source,
- flags,
- opts,
- mntpno->p_parent,
- &mnt);
- if (err)
- P_RELE(mntpno->p_parent);
-
-out:
- if (iovec.iov_base)
- free(iovec.iov_base);
- return err;
-}
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2006 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <unistd.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "mount.h"
-#include "inode.h"
-
-/*
- * Parse next component in path.
- */
-#ifndef AUTOMOUNT_FILE_NAME
-static
-#endif
-void
-_sysio_next_component(const char *path, struct qstr *name)
-{
- while (*path == PATH_SEPARATOR)
- path++;
- name->name = path;
- name->len = 0;
- name->hashval = 0;
- while (*path && *path != PATH_SEPARATOR) {
- name->hashval =
- 37 * name->hashval + *path++;
- name->len++;
- }
-}
-
-/*
- * Given parent, look up component.
- */
-static int
-lookup(struct pnode *parent,
- struct qstr *name,
- struct pnode **pnop,
- struct intent *intnt,
- const char *path,
- int check_permissions)
-{
- int err;
- struct pnode *pno;
-
- if (!parent->p_base->pb_ino)
- return -ENOTDIR;
-
- /*
- * Sometimes we don't want to check permissions. At initialization
- * time, for instance.
- */
- if (check_permissions) {
- err = _sysio_permitted(parent, X_OK);
- if (err)
- return err;
- }
-
- /*
- * Short-circuit `.' and `..'; We don't cache those.
- */
- pno = NULL;
- if (name->len == 1 && name->name[0] == '.')
- pno = parent;
- else if (name->len == 2 && name->name[0] == '.' && name->name[1] == '.')
- pno = parent->p_parent;
- if (pno)
- P_REF(pno);
- else {
- /*
- * Get cache entry then.
- */
- err = _sysio_p_find_alias(parent, name, &pno);
- if (err)
- return err;
- }
-
- /*
- * While covered, move to the covering node.
- */
- while (pno->p_cover && pno->p_cover != pno) {
- struct pnode *cover;
-
- cover = pno->p_cover;
- P_REF(cover);
- P_RELE(pno);
- pno = cover;
- }
-
- *pnop = pno;
-
- /*
- * (Re)validate the pnode.
- */
- err = _sysio_p_validate(pno, intnt, path);
- if (err)
- return err;
-
- return 0;
-}
-
-/*
- * The meat. Walk an absolute or relative path, looking up each
- * component. Various flags in the nameidata argument govern actions
- * and return values/state. They are:
- *
- * ND_NOFOLLOW symbolic links are not followed
- * ND_NEGOK if terminal/leaf does not exist, return
- * path node (alias) anyway.
- * ND_NOPERMCHECK do not check permissions
- */
-int
-_sysio_path_walk(struct pnode *parent, struct nameidata *nd)
-{
- int err;
- const char *path;
- struct qstr this, next;
- struct inode *ino;
-
- /*
- * NULL path?
- */
- if (!nd->nd_path)
- return -EFAULT;
-
- /*
- * Empty path?
- */
- if (!*nd->nd_path)
- return -ENOENT;
-
- /*
- * Leading slash?
- */
- if (*nd->nd_path == PATH_SEPARATOR) {
- /*
- * Make parent the root of the name space.
- */
- parent = nd->nd_root;
- }
-
-#ifdef DEFER_INIT_CWD
- if (!parent) {
- const char *icwd;
-
- if (!_sysio_init_cwd && !nd->nd_root)
- abort();
-
- /*
- * Finally have to set the current working directory. We can
- * not tolerate errors here or else risk leaving the process
- * in a very unexpected location. We abort then unless all goes
- * well.
- */
- icwd = _sysio_init_cwd;
- _sysio_init_cwd = NULL;
- parent = nd->nd_root;
- if (!parent)
- abort();
- (void )_sysio_namei(nd->nd_root, icwd, 0, NULL, &parent);
- if (_sysio_p_chdir(parent) != 0)
- abort();
- }
-#endif
-
- /*
- * (Re)Validate the parent.
- */
- err = _sysio_p_validate(parent, NULL, NULL);
- if (err)
- return err;
-
- /*
- * Prime everything for the loop. Will need another reference to the
- * initial directory. It'll be dropped later.
- */
- nd->nd_pno = parent;
- P_REF(nd->nd_pno);
- _sysio_next_component(nd->nd_path, &next);
- path = next.name;
- parent = NULL;
- err = 0;
-
- /*
- * Derecurse the path tree-walk.
- */
- for (;;) {
- ino = nd->nd_pno->p_base->pb_ino;
- if (S_ISLNK(ino->i_stbuf.st_mode) &&
- (next.len || !(nd->nd_flags & ND_NOFOLLOW))) {
- char *lpath;
- ssize_t cc;
- struct nameidata nameidata;
-
- if (nd->nd_slicnt >= MAX_SYMLINK) {
- err = -ELOOP;
- break;
- }
-
- /*
- * Follow symbolic link.
- */
- lpath = malloc(MAXPATHLEN + 1);
- if (!lpath) {
- err = -ENOMEM;
- break;
- }
- cc =
- ino->i_ops.inop_readlink(nd->nd_pno,
- lpath,
- MAXPATHLEN);
- if (cc < 0) {
- free(lpath);
- err = (int )cc;
- break;
- }
- lpath[cc] = '\0'; /* NUL term */
- /*
- * Handle symbolic links with recursion. Yuck!
- * Pass the NULL intent for recursive symlink
- * except the last component.
- */
- ND_INIT(&nameidata,
- nd->nd_flags,
- lpath,
- nd->nd_root,
- !next.len ? nd->nd_intent : NULL);
- nameidata.nd_slicnt = nd->nd_slicnt + 1;
- err =
- _sysio_path_walk(nd->nd_pno->p_parent, &nameidata);
- free(lpath);
- if (err)
- break;
- P_RELE(nd->nd_pno);
- nd->nd_pno = nameidata.nd_pno;
- ino = nd->nd_pno->p_base->pb_ino;
- }
-#ifdef AUTOMOUNT_FILE_NAME
- else if (ino &&
- S_ISDIR(ino->i_stbuf.st_mode) &&
- (nd->nd_pno->p_mount->mnt_flags & MOUNT_F_AUTO) &&
- nd->nd_amcnt < MAX_MOUNT_DEPTH &&
- ino->i_stbuf.st_mode & S_ISUID) {
- struct pnode *pno;
-
- /*
- * We're committed to a lookup. It's time to see if
- * we're going to do it in an automount-point and
- * arrange the mount if so.
- */
- assert(!nd->nd_pno->p_cover);
- err =
- lookup(nd->nd_pno,
- &_sysio_mount_file_name,
- &pno,
- NULL,
- NULL,
- 1);
- if (pno)
- P_RELE(pno);
- if (!err && _sysio_automount(pno) == 0) {
- struct pnode *root;
-
- /*
- * All went well. Need to switch
- * parent pno and ino to the
- * root of the newly mounted sub-tree.
- *
- * NB:
- * We don't recurseively retry these
- * things. It's OK to have the new root
- * be an automount-point but it's going
- * to take another lookup to accomplish it.
- * The alternative could get us into an
- * infinite loop.
- */
- root = nd->nd_pno->p_cover;
- assert(root);
- P_RELE(nd->nd_pno);
- nd->nd_pno = root;
-#if 0
- P_REF(nd->nd_pno);
-#endif
- ino = nd->nd_pno->p_base->pb_ino;
- assert(ino);
-
- /*
- * Must send the intent-path again.
- */
- path = nd->nd_path;
- nd->nd_amcnt++;
-
- /*
- * Must go back top and retry with this
- * new pnode as parent.
- */
- continue;
- }
- err = 0; /* it never happened */
- }
-#endif
-
- /*
- * Set up for next component.
- */
- this = next;
- if (path)
- path = this.name;
- if (!this.len)
- break;
- if (!ino) {
- /*
- * Should only be here if final component was
- * target of a symlink.
- */
- nd->nd_path = this.name + this.len;
- err = -ENOENT;
- break;
- }
- nd->nd_path = this.name + this.len;
- _sysio_next_component(nd->nd_path, &next);
- parent = nd->nd_pno;
- nd->nd_pno = NULL;
-
- /*
- * Parent must be a directory.
- */
- if (ino && !S_ISDIR(ino->i_stbuf.st_mode)) {
- err = -ENOTDIR;
- break;
- }
-
- /*
- * The extra path arg is passed only on the first lookup in the
- * walk as we cross into each file system, anew. The intent is
- * passed both on the first lookup and when trying to look up
- * the final component -- Of the original path, not on the
- * file system.
- *
- * Confused? Me too and I came up with this weirdness. It's
- * hints to the file system drivers. Read on.
- *
- * The first lookup will give everything one needs to ready
- * everything for the entire operation before the path is
- * walked. The file system driver knows it's the first lookup
- * in the walk because it has both the path and the intent.
- *
- * Alternatively, one could split the duties; The first lookup
- * can be used to prime the file system inode cache with the
- * interior nodes we'll want in the path-walk. Then, when
- * looking up the last component, ready everything for the
- * operations(s) to come. The file system driver knows it's
- * the last lookup in the walk because it has the intent,
- * again, but without the path.
- *
- * One special case; If we were asked to look up a single
- * component, we treat it as the last component. The file
- * system driver never sees the extra path argument. It should
- * be noted that the driver always has the fully qualified
- * path, on the target file system, available to it for any
- * node it is looking up, including the last, via the base
- * path node and it's ancestor chain.
- */
- err =
- lookup(parent,
- &this,
- &nd->nd_pno,
- (path || !next.len)
- ? nd->nd_intent
- : NULL,
- (path && next.len) ? path : NULL,
- !(nd->nd_flags & ND_NOPERMCHECK));
- if (err) {
- if (err == -ENOENT &&
- !next.len &&
- (nd->nd_flags & ND_NEGOK))
- err = 0;
- break;
- }
- path = NULL; /* Stop that! */
- if ((parent->p_mount->mnt_fs !=
- nd->nd_pno->p_mount->mnt_fs)) {
- /*
- * Crossed into a new fs. We'll want the next lookup
- * to include the path again.
- */
- path = nd->nd_path;
- }
-
- /*
- * Release the parent.
- */
- P_RELE(parent);
- parent = NULL;
- }
-
- /*
- * Trailing separators cause us to break from the loop with
- * a parent set but no pnode. Check for that.
- */
- if (!nd->nd_pno) {
- nd->nd_pno = parent;
- parent = NULL;
- /*
- * Make sure the last processed component was a directory. The
- * trailing slashes are illegal behind anything else.
- */
- if (!(err ||
- S_ISDIR(nd->nd_pno->p_base->pb_ino->i_stbuf.st_mode)))
- err = -ENOTDIR;
- }
-
- /*
- * Drop reference to parent if set. Either we have a dup of the original
- * parent or an intermediate reference.
- */
- if (parent)
- P_RELE(parent);
-
- /*
- * On error, we will want to drop our reference to the current
- * path node if at end.
- */
- if (err && nd->nd_pno) {
- P_RELE(nd->nd_pno);
- nd->nd_pno = NULL;
- }
-
- return err;
-}
-
-#ifdef CPLANT_YOD
-/*
- * for backward compatibility w/protocol switch
- * remove everything up to the first ':'
- * fortran libs prepend cwd to path, so not much choice
- */
-#define STRIP_PREFIX(p) strchr(p,':') ? strchr(p,':')+1 : p
-#else
-#define STRIP_PREFIX(p) p
-#endif
-
-/*
- * Expanded form of the path-walk routine, with the common arguments, builds
- * the nameidata bundle and calls path-walk.
- */
-int
-_sysio_namei(struct pnode *parent,
- const char *path,
- unsigned flags,
- struct intent *intnt,
- struct pnode **pnop)
-{
- struct nameidata nameidata;
- int err;
-
- ND_INIT(&nameidata, flags, STRIP_PREFIX(path), _sysio_root, intnt);
- err = _sysio_path_walk(parent, &nameidata);
- if (!err)
- *pnop = nameidata.nd_pno;
- return err;
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2006 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-/*
- * Incorporate the GNU flags for open if we can.
- */
-#define _GNU_SOURCE
-
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "file.h"
-#include "fs.h"
-#include "mount.h"
-#include "sysio-symbols.h"
-
-/*
- * Open file support.
- */
-
-mode_t _sysio_umask = 0; /* process umask. */
-
-/*
- * Internal form of open.
- */
-int
-_sysio_open(struct pnode *pno, int flags, mode_t mode)
-{
- int ro;
- int w;
- int err;
- struct inode *ino;
-
- ro = IS_RDONLY(pno);
- w = flags & (O_WRONLY|O_RDWR);
- if (w == (O_WRONLY|O_RDWR)) {
- /*
- * Huh?
- */
- return -EINVAL;
- }
- if (w && ro)
- return -EROFS;
- ino = pno->p_base->pb_ino;
- if ((flags & O_CREAT) && !ino) {
- struct pnode *parent;
-
- /*
- * Must create it.
- */
- if (ro)
- return -EROFS;
- parent = pno->p_parent;
- err = _sysio_p_validate(parent, NULL, NULL);
- if (!err) {
- ino = parent->p_base->pb_ino;
- assert(ino);
- err = (*ino->i_ops.inop_open)(pno, flags, mode);
- }
- } else if ((flags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL))
- err = -EEXIST;
- else if (!ino)
- err = _sysio_p_validate(pno, NULL, NULL);
-#ifdef O_NOFOLLOW
- else if (flags & O_NOFOLLOW && S_ISLNK(ino->i_stbuf.st_mode))
- err = -ELOOP;
-#endif
- else {
- /*
- * Simple open of pre-existing file.
- */
- err = (*ino->i_ops.inop_open)(pno, flags, mode);
- }
-
- return err;
-}
-
-#undef open
-
-int
-SYSIO_INTERFACE_NAME(open)(const char *path, int flags, ...)
-{
- mode_t mode;
- unsigned ndflags;
- struct intent intent;
- int rtn;
- struct pnode *pno;
- struct file *fil;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- /*
- * Get mode argument and determine parameters for namei
- */
- mode = 0;
- ndflags = 0;
- intent.int_opmask = INT_OPEN;
- if (flags & O_CREAT) {
- va_list ap;
-
- /*
- * Set ndflags to indicate return of negative alias is OK.
- */
- ndflags |= ND_NEGOK;
-
- /*
- * Will need mode too.
- */
- va_start(ap, flags);
- mode =
-#ifndef REDSTORM
- va_arg(ap, mode_t);
-#else
- va_arg(ap, int);
-#endif
- va_end(ap);
- mode &= ~(_sysio_umask & 0777) | 07000; /* apply umask */
- intent.int_opmask |= INT_CREAT;
- }
-#ifdef O_NOFOLLOW
- if (flags & O_NOFOLLOW)
- ndflags |= ND_NOFOLLOW;
-#endif
-
- /*
- * Find the file.
- */
- fil = NULL;
- INTENT_INIT(&intent, intent.int_opmask, &mode, &flags);
- pno = NULL;
- rtn = _sysio_namei(_sysio_cwd, path, ndflags, &intent, &pno);
- if (rtn)
- goto error;
- /*
- * Ask for the open/creat.
- */
- rtn = _sysio_open(pno, flags, mode);
- if (rtn)
- goto error;
- /*
- * Get a file descriptor.
- */
- fil = _sysio_fnew(pno->p_base->pb_ino, flags);
- if (!fil) {
- rtn = -ENOMEM;
- goto error;
- }
- rtn = _sysio_fd_set(fil, -1, 0);
- if (rtn < 0)
- goto error;
-
- P_RELE(pno);
-
- SYSIO_INTERFACE_RETURN(rtn, 0);
-
-error:
- if (fil)
- F_RELE(fil);
- if (pno)
- P_RELE(pno);
- SYSIO_INTERFACE_RETURN(-1, rtn);
-}
-
-#ifdef __GLIBC__
-#undef __open
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(open),
- PREPEND(__, SYSIO_INTERFACE_NAME(open)))
-#undef open64
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(open), SYSIO_INTERFACE_NAME(open64))
-#undef __open64
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(open),
- PREPEND(__, SYSIO_INTERFACE_NAME(open64)))
-#endif
-
-#ifdef REDSTORM
-#undef __libc_open64
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(open),
- PREPEND(__, SYSIO_INTERFACE_NAME(libc_open64)))
-#endif
-
-#ifdef BSD
-#undef _open
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(open),
- PREPEND(_, SYSIO_INTERFACE_NAME(open)))
-#endif
-
-int
-SYSIO_INTERFACE_NAME(close)(int fd)
-{
- int err;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- err = _sysio_fd_close(fd);
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef __GLIBC__
-#undef __close
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(close),
- PREPEND(__, SYSIO_INTERFACE_NAME(close)))
-#endif
-
-#ifdef BSD
-#undef _close
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(close),
- PREPEND(_, SYSIO_INTERFACE_NAME(close)))
-#endif
-
-int
-SYSIO_INTERFACE_NAME(creat)(const char *path, mode_t mode)
-{
-
- return SYSIO_INTERFACE_NAME(open)(path, O_CREAT|O_WRONLY|O_TRUNC, mode);
-}
-
-#ifdef __GLIBC__
-#undef __creat
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(creat),
- PREPEND(__, SYSIO_INTERFACE_NAME(creat)))
-#undef creat64
-#ifndef HAVE_LUSTRE_HACK
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(creat), SYSIO_INTERFACE_NAME(creat64))
-#else
-/* XXX workaround SuSE SLES 8, glibc-2.2.5 */
-sysio_sym_strong_alias(SYSIO_INTERFACE_NAME(creat),
- SYSIO_INTERFACE_NAME(creat64))
-#endif
-#undef __creat64
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(creat),
- PREPEND(__, SYSIO_INTERFACE_NAME(creat64)))
-#endif
-
-#ifdef REDSTORM
-#undef __libc_creat
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(creat),
- PREPEND(__, SYSIO_INTERFACE_NAME(libc_creat)))
-#endif
-
-#ifdef BSD
-#undef _creat
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(creat),
- PREPEND(_, SYSIO_INTERFACE_NAME(creat)))
-#endif
-
-mode_t
-SYSIO_INTERFACE_NAME(umask)(mode_t mask)
-{
- mode_t omask;
-
- omask = _sysio_umask;
- _sysio_umask = mask & 0777;
- return omask;
-}
-
-#ifdef REDSTORM
-#undef __umask
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(umask),
- PREPEND(__, SYSIO_INTERFACE_NAME(umask)))
-#endif
+++ /dev/null
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#ifdef __linux__
-#include <features.h>
-#if defined(__GLIBC__) && !defined(REDSTORM)
-
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <sysio.h>
-
-#include "sysio-symbols.h"
-
-#ifndef _READDIR
-#define _READDIR SYSIO_INTERFACE_NAME(readdir)
-#define _SCANDIR SYSIO_INTERFACE_NAME(scandir)
-#define _GETDIRENTRIES SYSIO_INTERFACE_NAME(getdirentries)
-#define _DIRENT_T struct dirent
-#define _OFF_T off_t
-#endif
-
-#include "stddir.h"
-
-_DIRENT_T *
-_READDIR(DIR *dir)
-{
- _DIRENT_T *dp = NULL;
- _OFF_T dbase;
-
-#ifndef BSD
- ssize_t rc;
-#else
- int rc;
-#endif
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
-
- /* need to read new data? */
- rc = 0;
- if (dir->cur >= dir->effective) {
- dir->cur = 0;
- dbase = (_OFF_T )dir->base;
- if (sizeof(dbase) != sizeof(dir->base) &&
- dbase != dir->base) {
- dir->effective = 0;
- SYSIO_INTERFACE_RETURN(NULL, -EOVERFLOW);
- }
- rc = _GETDIRENTRIES(dir->fd,
- dir->buf,
-#ifndef BSD
- (size_t )BUFSIZE,
- (_OFF_T *) &dbase);
-#else
- (int )BUFSIZE,
- (long *) __restrict dbase);
-#endif
- dir->base = (_SYSIO_OFF_T )dbase;
-
- /* error or end-of-file */
- if (rc == -ENOENT)
- rc = 0;
- if (rc <= 0) {
- dir->effective = 0;
- SYSIO_INTERFACE_RETURN(NULL, rc);
- }
- dir->effective = rc;
- }
- dp = (_DIRENT_T *)(dir->buf + dir->cur);
-
-#ifdef _DIRENT_HAVE_D_RECLEN
- dir->cur += dp->d_reclen;
-#else
- dir->cur += sizeof(_DIRENT_T);
-#endif
-#ifdef _DIRENT_HAVE_D_OFF
- dir->filepos = dp->d_off;
-#else
- dir->filepos = dir->cur;
-#endif
-
- SYSIO_INTERFACE_RETURN(dp, 0);
-}
-
-sysio_sym_weak_alias(_READDIR, PREPEND(__,_READDIR))
-
-int
-_SCANDIR(const char *dirname,
- _DIRENT_T ***namelist,
- int (*filter) (const _DIRENT_T *),
-#ifdef HAVE_POSIX2008_SCANDIR
- int(*compar)(const _DIRENT_T **, const _DIRENT_T **)
-#else
- int(*compar)(const void *, const void *)
-#endif
- )
-{
- DIR *dir = NULL;
- _DIRENT_T *de = NULL,
- *nextde = NULL,
- **s = NULL;
- int n = 32, i = 0;
- size_t desize;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
-
- if ((dir = SYSIO_INTERFACE_NAME(opendir)(dirname)) == NULL)
- SYSIO_INTERFACE_RETURN(-1, -errno);
-
- while ((de = _READDIR(dir)) != NULL) {
- if ((filter == NULL) || filter(de)) {
- if (i == 0 || i >= n) {
- n = MAX(n, 2*i);
- s = (_DIRENT_T **)realloc(s,
- (size_t )(n * sizeof(_DIRENT_T *)));
- if (!s)
- SYSIO_INTERFACE_RETURN(-1, -ENOMEM);
- }
- desize = &de->d_name[_D_ALLOC_NAMLEN(de)] - (char * )de;
- nextde = (_DIRENT_T *)malloc(desize);
- if (!nextde)
- SYSIO_INTERFACE_RETURN(-1, -ENOMEM);
-
- s[i++] = (_DIRENT_T *)memcpy(nextde, de, desize);
- }
- }
- if (compar)
- qsort (s,
- i,
- sizeof (*s),
- (int (*)(const void *, const void *))compar);
-
- *namelist = s;
-
- SYSIO_INTERFACE_NAME(closedir)(dir);
-
- SYSIO_INTERFACE_RETURN(i, 0);
-}
-
-sysio_sym_weak_alias(_SCANDIR, PREPEND(__,_SCANDIR))
-
-#endif
-#endif
+++ /dev/null
-#ifdef _LARGEFILE64_SOURCE
-#define _SCANDIR SYSIO_INTERFACE_NAME(scandir64)
-#define _READDIR SYSIO_INTERFACE_NAME(readdir64)
-#define _GETDIRENTRIES SYSIO_INTERFACE_NAME(getdirentries64)
-#define _DIRENT_T struct dirent64
-#define _OFF_T _SYSIO_OFF_T
-
-#include "readdir.c"
-
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2004 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <unistd.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "sysio-symbols.h"
-
-#ifdef HAVE_POSIX_1003_READLINK
-ssize_t
-#else
-int
-#endif
-SYSIO_INTERFACE_NAME(readlink)(const char *path, char *buf, size_t bufsiz)
-{
- struct intent intent;
- int err;
- struct pnode *pno;
- struct inode *ino;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- INTENT_INIT(&intent, INT_GETATTR, NULL, NULL);
- err = _sysio_namei(_sysio_cwd, path, ND_NOFOLLOW, &intent, &pno);
- if (err)
- goto out;
- ino = pno->p_base->pb_ino;
- if (!S_ISLNK(ino->i_stbuf.st_mode)) {
- err = -EINVAL;
- goto error;
- }
- err = (*ino->i_ops.inop_readlink)(pno, buf, bufsiz);
-error:
- P_RELE(pno);
-out:
- SYSIO_INTERFACE_RETURN(err < 0 ? -1 : err, err >= 0 ? 0 : err);
-}
-
-#ifdef REDSTORM
-#undef __readlink
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(readlink),
- PREPEND(__, SYSIO_INTERFACE_NAME(readlink)))
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2004 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/uio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "xtio.h"
-
-/*
- * Extent-vector IO support.
- */
-
-/*
- * Arguments to IO vector enumerator callback when used by _sysio_doio().
- */
-struct doio_helper_args {
- ssize_t (*f)(void *, size_t, _SYSIO_OFF_T, void *); /* base func */
- void *arg; /* caller arg */
-};
-
-/*
- * General help validating strided-IO vectors.
- *
- * A driver may call this to make sure underflow/overflow of an off_t can't
- * occur and overflow of a ssize_t can't occur when writing. The sum
- * of the reconciled transfer length is returned or some appropriate
- * error depending on underflow/overflow.
- *
- * The following algorithm assumes:
- *
- * a) sizeof(size_t) >= sizeof(ssize_t)
- * b) 2's complement arithmetic
- * c) The compiler won't optimize away code because it's developers
- * believed that something with an undefined result in `C' can't happen.
- */
-ssize_t
-_sysio_validx(const struct intnl_xtvec *xtv, size_t xtvlen,
- const struct iovec *iov, size_t iovlen,
- _SYSIO_OFF_T limit)
-{
- ssize_t acc, cc;
- struct iovec iovec;
- struct intnl_xtvec xtvec;
- _SYSIO_OFF_T off;
-
- if (!(xtvlen && iovlen))
- return -EINVAL;
-
- acc = 0;
- xtvec.xtv_len = iovec.iov_len = 0;
- do {
- while (!xtvec.xtv_len) {
- if (!xtvlen--)
- break;
- if (!xtv->xtv_len) {
- xtv++;
- continue;
- }
- xtvec = *xtv++;
- if (xtvec.xtv_off < 0)
- return -EINVAL;
- }
- if (!xtvec.xtv_len)
- break;
- do {
- while (!iovec.iov_len) {
- if (!iovlen--)
- break;
- if (!iov->iov_len) {
- iov++;
- continue;
- }
- iovec = *iov++;
- }
- if (!iovec.iov_len)
- break;
- cc = iovec.iov_len;
- if (cc < 0)
- return -EINVAL;
- if ((size_t )cc > xtvec.xtv_len)
- cc = xtvec.xtv_len;
- xtvec.xtv_len -= cc;
- iovec.iov_len -= cc;
- off = xtvec.xtv_off + cc;
- if (xtvec.xtv_off && off <= xtvec.xtv_off)
- return off < 0 ? -EINVAL : -EOVERFLOW;
- if (off > limit)
- return -EFBIG;
- xtvec.xtv_off = off;
- cc += acc;
- if (acc && (cc <= acc))
- return -EINVAL;
- acc = cc;
- } while (xtvec.xtv_len && iovlen);
- } while ((xtvlen || xtvec.xtv_len) && iovlen);
- return acc;
-}
-
-/*
- */
-ssize_t
-_sysio_enumerate_extents(const struct intnl_xtvec *xtv, size_t xtvlen,
- const struct iovec *iov, size_t iovlen,
- ssize_t (*f)(const struct iovec *, int,
- _SYSIO_OFF_T,
- ssize_t,
- void *),
- void *arg)
-{
- ssize_t acc, tmp, cc;
- struct iovec iovec;
- struct intnl_xtvec xtvec;
- const struct iovec *start;
- _SYSIO_OFF_T off;
- size_t n;
- size_t remain;
-
- acc = 0;
- iovec.iov_len = 0;
- while (xtvlen) {
- /*
- * Coalesce contiguous extent vector entries.
- */
- off = xtvec.xtv_off = xtv->xtv_off;
- off += xtvec.xtv_len = xtv->xtv_len;
- while (++xtv, --xtvlen) {
- if (off != xtv->xtv_off) {
- /*
- * Not contiguous.
- */
- break;
- }
- if (!xtv->xtv_len) {
- /*
- * Zero length.
- */
- continue;
- }
- off += xtv->xtv_len;
- xtvec.xtv_len += xtv->xtv_len;
- }
- while (xtvec.xtv_len) {
- if (iovec.iov_len) {
- tmp = iovec.iov_len;
- if (iovec.iov_len > xtvec.xtv_len)
- iovec.iov_len = xtvec.xtv_len;
- cc =
- (*f)(&iovec, 1,
- xtvec.xtv_off,
- xtvec.xtv_len,
- arg);
- if (cc <= 0) {
- if (acc)
- return acc;
- return cc;
- }
- iovec.iov_base = (char *)iovec.iov_base + cc;
- iovec.iov_len = tmp - cc;
- tmp = cc + acc;
- if (acc && tmp <= acc)
- abort(); /* paranoia */
- acc = tmp;
- } else if (iovlen) {
- start = iov;
- n = xtvec.xtv_len;
- do {
- if (iov->iov_len > n) {
- /*
- * That'll do.
- */
- break;
- }
- n -= iov->iov_len;
- iov++;
- } while (--iovlen);
- if (iov == start) {
- iovec = *iov++;
- iovlen--;
- continue;
- }
- remain = xtvec.xtv_len - n;
- cc =
- (*f)(start, iov - start,
- xtvec.xtv_off,
- remain,
- arg);
- if (cc <= 0) {
- if (acc)
- return acc;
- return cc;
- }
-
- tmp = cc + acc;
- if (acc && tmp <= acc)
- abort(); /* paranoia */
- acc = tmp;
-
- remain -= cc;
- if (remain)
- return acc; /* short */
- } else
- return acc; /* short out */
- xtvec.xtv_off += cc;
- xtvec.xtv_len -= cc;
- }
- }
- return acc;
-}
-
-ssize_t
-_sysio_enumerate_iovec(const struct iovec *iov, size_t count,
- _SYSIO_OFF_T off,
- ssize_t limit,
- ssize_t (*f)(void *, size_t, _SYSIO_OFF_T, void *),
- void *arg)
-{
- ssize_t acc, cc;
- size_t n;
- unsigned indx;
- size_t remain;
-
- if (!count)
- return -EINVAL;
- assert(limit >= 0);
- acc = 0;
- n = limit;
- for (indx = 0; n && indx < count; indx++) {
- if (iov[indx].iov_len < n) {
- cc = (ssize_t )iov[indx].iov_len;
- if (cc < 0)
- return -EINVAL;
- } else
- cc = (ssize_t )n;
- if (!cc)
- continue;
- n -= cc;
- cc += acc;
- if (acc && cc <= acc)
- return -EINVAL;
- acc = cc;
- }
- if (!acc)
- return 0;
- acc = 0;
- do {
- if (!iov->iov_len) {
- iov++;
- continue;
- }
- n =
- iov->iov_len < (size_t )limit
- ? iov->iov_len
- : (size_t )limit;
- cc = (*f)(iov->iov_base, n, off, arg);
- if (cc <= 0) {
- if (acc)
- return acc;
- return cc;
- }
- off += cc;
- limit -= cc;
- remain = iov->iov_len - cc;
- cc += acc;
- if (acc && cc <= acc)
- abort(); /* bad driver! */
- acc = cc;
- if (remain || !limit)
- break; /* short/limited read */
- iov++;
- } while (--count);
- return acc;
-}
-
-static ssize_t
-_sysio_doio_helper(const struct iovec *iov, int count,
- _SYSIO_OFF_T off,
- ssize_t limit,
- struct doio_helper_args *args)
-{
-
- return _sysio_enumerate_iovec(iov, count,
- off, limit,
- args->f,
- args->arg);
-}
-
-/*
- * A meta-driver for the whole strided-io process. Appropriate when
- * the driver can't handle anything but simple p{read,write}-like
- * interface.
- */
-ssize_t
-_sysio_doio(const struct intnl_xtvec *xtv, size_t xtvlen,
- const struct iovec *iov, size_t iovlen,
- ssize_t (*f)(void *, size_t, _SYSIO_OFF_T, void *),
- void *arg)
-{
- struct doio_helper_args arguments;
-
- arguments.f = f;
- arguments.arg = arg;
- return _sysio_enumerate_extents(xtv, xtvlen,
- iov, iovlen,
- (ssize_t (*)(const struct iovec *, int,
- _SYSIO_OFF_T,
- ssize_t,
- void *))_sysio_doio_helper,
- &arguments);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "mount.h"
-#include "inode.h"
-
-int
-SYSIO_INTERFACE_NAME(rename)(const char *oldpath, const char *newpath)
-{
- struct intent intent;
- int err;
- struct pnode *old, *new;
- struct pnode_base *nxtpb, *pb;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
-
- /*
- * Neither old nor new may be the empty string.
- */
- if (*oldpath == '\0' || *newpath == '\0')
- SYSIO_INTERFACE_RETURN(-1, -ENOENT);
-
- /*
- * Resolve oldpath to a path node.
- */
- INTENT_INIT(&intent, INT_UPDPARENT, NULL, NULL);
- err = _sysio_namei(_sysio_cwd, oldpath, ND_NOFOLLOW, &intent, &old);
- if (err)
- goto error3;
- /*
- * Resolve newpath to a path node.
- */
- INTENT_INIT(&intent, INT_UPDPARENT, NULL, NULL);
- err =
- _sysio_namei(_sysio_cwd,
- newpath,
- ND_NOFOLLOW | ND_NEGOK,
- &intent,
- &new);
- if (err)
- goto error2;
-
- /*
- * Don't allow mount points to move.
- */
- if (old->p_mount->mnt_root == old || old->p_cover ||
- new->p_mount->mnt_root == new) {
- err = -EBUSY;
- goto error1;
- }
-
- /*
- * No xdev renames either.
- */
- if (old->p_mount->mnt_fs != new->p_mount->mnt_fs) {
- err = -EXDEV;
- goto error1;
- }
-
- /*
- * Make sure the old pnode can't be found in the ancestor chain
- * for the new. If it can, they are trying to move into a subdirectory
- * of the old.
- */
- nxtpb = new->p_base;
- do {
- pb = nxtpb;
- nxtpb = pb->pb_parent;
- if (pb == old->p_base) {
- err = -EINVAL;
- goto error1;
- }
- } while (nxtpb);
-
- /*
- * If old == new, we're done.
- */
- if (old->p_base->pb_ino == new->p_base->pb_ino)
- goto short_out;
-
- if (new->p_base->pb_ino) {
- /*
- * Existing entry. We're replacing the new. Make sure that's
- * ok.
- */
- if (S_ISDIR(new->p_base->pb_ino->i_stbuf.st_mode)) {
- if (!S_ISDIR(old->p_base->pb_ino->i_stbuf.st_mode)) {
- err = -EISDIR;
- goto error1;
- }
- if (new->p_base->pb_ino->i_stbuf.st_nlink > 2) {
- err = -ENOTEMPTY;
- goto error1;
- }
- } else if (S_ISDIR(old->p_base->pb_ino->i_stbuf.st_mode)) {
- err = -ENOTDIR;
- goto error1;
- }
- }
-
- /*
- * It's not impossible to clean up the altered name space after
- * a rename. However, it is onerous and I don't want to do it right
- * now. If it becomes an issue, we can do it later. For now, I've
- * elected to use the semantic that says, basically, the entire
- * sub-tree must be unreferenced. That's per POSIX, but it's a nasty
- * thing to do to the caller.
- */
- if (_sysio_p_prune(new) != 1) {
- err = -EBUSY;
- goto error1;
- }
- /*
- * Use the parent node operations to request the task in case the
- * driver is implemented using differentiated inode operations based
- * on file type, such as incore does.
- */
- err = old->p_parent->p_base->pb_ino->i_ops.inop_rename(old, new);
- if (err)
- goto error1;
- /*
- * Reflect the successful rename in the active name space graph.
- */
- if (new->p_base->pb_ino)
- I_GONE(new->p_base->pb_ino);
- new->p_base->pb_ino = old->p_base->pb_ino;
- old->p_base->pb_ino = NULL;
-
-short_out:
-error1:
- P_RELE(new);
-error2:
- P_RELE(old);
-error3:
- if (err)
- goto out;
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2006 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <unistd.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "fs.h"
-#include "mount.h"
-#include "sysio-symbols.h"
-
-int
-SYSIO_INTERFACE_NAME(rmdir)(const char *path)
-{
- struct intent intent;
- int err;
- struct pnode *pno;
- struct inode *ino;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- INTENT_INIT(&intent, INT_UPDPARENT, NULL, NULL);
- err = _sysio_namei(_sysio_cwd, path, 0, &intent, &pno);
- if (err)
- goto out;
- if (!S_ISDIR(pno->p_base->pb_ino->i_stbuf.st_mode)) {
- err = -ENOTDIR;
- goto error;
- }
- err = _sysio_permitted(pno->p_parent, W_OK);
- if (err)
- goto error;
- if (pno->p_ref > 1) {
- err = -EBUSY;
- goto error;
- }
- /*
- * Use the parent node operations to request the task in case the
- * driver is implemented using differentiated inode operations based
- * on file type, such as incore does.
- */
- err = (*pno->p_parent->p_base->pb_ino->i_ops.inop_rmdir)(pno);
- if (err)
- goto error;
- /*
- * Invalidate the path-base node and kill the i-node.
- */
- ino = pno->p_base->pb_ino;
- pno->p_base->pb_ino = NULL;
- I_GONE(ino);
-error:
- P_RELE(pno);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef __rmdir
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(rmdir),
- PREPEND(__, SYSIO_INTERFACE_NAME(rmdir)))
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2004 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/uio.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "xtio.h"
-#include "file.h"
-#include "inode.h"
-
-#include "sysio-symbols.h"
-
-#define IIOXOP_READ(ino) (ino)->i_ops.inop_read, 0
-#define IIOXOP_WRITE(ino) (ino)->i_ops.inop_write, 1
-
-/*
- * Decoding the interface routine names:
- *
- * Much of this carries legacy from the POSIX world and the Intel ASCI
- * Red programming environment. Routine names are composed of prefix,
- * basic POSIX names, and postfix. The basic POSIX names are read and write.
- * Prefixes, left-to-right:
- *
- * - 'i' -- asynchronous operation (from ASCI Red)
- * - 'p' -- positional (POSIX)
- * Posfixes, only one:
- * - 'v' -- vectored (POSIX)
- * - 'x' -- extent-based (new for Red Storm)
- *
- * All valid combinations are available and symmetric.
- */
-
-/*
- * Post op using iovec with regions specified by the passed extent vector.
- *
- * NOTE: There are enough parameters that we should really consider
- * passing them in a structure.
- */
-static int
-_sysio_iiox(int (*f)(struct inode *, struct ioctx *),
- int wr,
- struct file *fil,
- const struct iovec *iov,
- size_t iov_count,
- void (*iov_free)(struct ioctx *),
- const struct intnl_xtvec *xtv,
- size_t xtv_count,
- void (*xtv_free)(struct ioctx *),
- void (*completio)(struct ioctx *, void *),
- struct ioctx **ioctxp)
-{
- struct inode *ino;
- ssize_t cc;
- struct ioctx *ioctx;
- int err;
- struct ioctx_callback *cb;
-
- /*
- * Check that it was opened with flags supporting the operation.
- */
- if (!F_CHKRW(fil, wr ? 'w' : 'r'))
- return -EBADF;
-
- ino = fil->f_ino;
- if (!ino) {
- /*
- * Huh? It's dead.
- */
- return -EBADF;
- }
- cc =
- _sysio_validx(xtv, xtv_count,
- iov, iov_count,
-#if defined(_LARGEFILE64_SOURCE) && defined(O_LARGEFILE)
- (fil->f_flags & O_LARGEFILE) == 0
- ? LONG_MAX
- :
-#endif
- _SYSIO_OFF_T_MAX);
- if (cc < 0)
- return cc;
- ioctx = _sysio_ioctx_new(ino, wr, iov, iov_count, xtv, xtv_count);
- if (!ioctx)
- return -ENOMEM;
- if ((iov_free &&
- (err = _sysio_ioctx_cb(ioctx,
- (void (*)(struct ioctx *,
- void *))iov_free,
- NULL))) ||
- (xtv_free &&
- (err = _sysio_ioctx_cb(ioctx,
- (void (*)(struct ioctx *,
- void *))xtv_free,
- NULL))) ||
- (completio &&
- (err = _sysio_ioctx_cb(ioctx,
- (void (*)(struct ioctx *,
- void *))completio,
- fil))) ||
- (err = (*f)(ino, ioctx))) {
- /*
- * Release the callback queue. Don't want it run after all.
- */
- while ((cb = ioctx->ioctx_cbq.tqh_first)) {
- TAILQ_REMOVE(&ioctx->ioctx_cbq,
- cb,
- iocb_next);
- _sysio_ioctx_cb_free(cb);
- }
- _sysio_ioctx_complete(ioctx);
- return err;
- }
- *ioctxp = ioctx;
- return 0;
-}
-
-/*
- * Sum iovec entries, returning total found or error if range of ssize_t would
- * be exceeded.
- */
-static ssize_t
-_sysio_sum_iovec(const struct iovec *iov, int count)
-{
- ssize_t tmp, cc;
-
- if (count <= 0)
- return -EINVAL;
-
- cc = 0;
- while (count--) {
- tmp = cc;
- cc += iov->iov_len;
- if (tmp && iov->iov_len && cc <= tmp)
- return -EINVAL;
- iov++;
- }
- return cc;
-}
-
-/*
- * Asynch IO from/to iovec from/to current file offset.
- */
-static int
-_sysio_iiov(int (*f)(struct inode *, struct ioctx *),
- int wr,
- struct file *fil,
- const struct iovec *iov,
- int count,
- void (*iov_free)(struct ioctx *),
- struct intnl_xtvec *xtv,
- void (*xtv_free)(struct ioctx *),
- struct ioctx **ioctxp)
-{
- ssize_t cc;
- _SYSIO_OFF_T off;
- int err;
-
- cc = _sysio_sum_iovec(iov, count);
- if (cc < 0)
- return (int )cc;
- xtv->xtv_off = fil->f_pos;
- xtv->xtv_len = cc;
- off = xtv->xtv_off + xtv->xtv_len;
- if (xtv->xtv_off && off <= xtv->xtv_off) {
- /*
- * Ouch! The IO vector specifies more bytes than
- * are addressable. Trim the region to limit how
- * much of the IO vector is finally transferred.
- */
- xtv->xtv_len = _SYSIO_OFF_T_MAX - xtv->xtv_off;
- }
- err =
- _sysio_iiox(f,
- wr,
- fil,
- iov, count, iov_free,
- xtv, 1, xtv_free,
- (void (*)(struct ioctx *, void *))_sysio_fcompletio,
- ioctxp);
- if (err)
- return err;
- return 0;
-}
-
-static void
-free_xtv(struct ioctx *ioctx)
-{
-
- free((struct iovec *)ioctx->ioctx_xtv);
- ioctx->ioctx_iov = NULL;
-}
-
-ioid_t
-SYSIO_INTERFACE_NAME(ireadv)(int fd, const struct iovec *iov, int count)
-{
- struct file *fil;
- struct intnl_xtvec *xtv;
- struct ioctx *ioctx;
- int err;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -EBADF);
-
- xtv = malloc(sizeof(struct intnl_xtvec));
- if (!xtv)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -ENOMEM);
-
- err =
- _sysio_iiov(IIOXOP_READ(fil->f_ino),
- fil,
- iov, count, NULL,
- xtv, free_xtv,
- &ioctx);
- if (err) {
- free(xtv);
- SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
- }
- SYSIO_INTERFACE_RETURN(ioctx, 0);
-}
-
-ssize_t
-SYSIO_INTERFACE_NAME(readv)(int fd, const struct iovec *iov, int count)
-{
- struct file *fil;
- struct intnl_xtvec xtvector;
- struct ioctx *ioctx;
- int err;
- ssize_t cc;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(-1, -EBADF);
-
- err =
- _sysio_iiov(IIOXOP_READ(fil->f_ino),
- fil,
- iov, count, NULL,
- &xtvector, NULL,
- &ioctx);
- if (!err && (cc = _sysio_ioctx_wait(ioctx)) < 0)
- err = (int )cc;
-
- SYSIO_INTERFACE_RETURN(err ? -1 : cc, err);
-}
-
-#if defined(__GLIBC__)
-#undef __readv
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(readv),
- PREPEND(__, SYSIO_INTERFACE_NAME(readv)))
-#undef __libc_readv
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(readv),
- PREPEND(__, SYSIO_INTERFACE_NAME(libc_readv)))
-#endif
-
-static void
-free_iov(struct ioctx *ioctx)
-{
-
- free((struct iovec *)ioctx->ioctx_iov);
- ioctx->ioctx_iov = NULL;
-}
-
-ioid_t
-SYSIO_INTERFACE_NAME(iread)(int fd, void *buf, size_t count)
-{
- struct iovec *iov;
- struct file *fil;
- struct intnl_xtvec *xtv;
- struct ioctx *ioctx;
- int err;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -EBADF);
-
- iov = malloc(sizeof(struct iovec));
- if (!iov)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -ENOMEM);
-
- iov->iov_base = buf;
- iov->iov_len = count;
- xtv = malloc(sizeof(struct intnl_xtvec));
- if (!xtv) {
- free(iov);
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -ENOMEM);
- }
- err =
- _sysio_iiov(IIOXOP_READ(fil->f_ino),
- fil,
- iov, 1, free_iov,
- xtv, free_xtv,
- &ioctx);
- if (err) {
- free(xtv);
- free(iov);
- SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
- }
- SYSIO_INTERFACE_RETURN(ioctx, 0);
-}
-
-ssize_t
-SYSIO_INTERFACE_NAME(read)(int fd, void *buf, size_t count)
-{
- struct file *fil;
- struct iovec iovector;
- struct intnl_xtvec xtvector;
- int err;
- struct ioctx *ioctx;
- ssize_t cc;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(-1, -EBADF);
-
- iovector.iov_base = buf;
- iovector.iov_len = count;
- err =
- _sysio_iiov(IIOXOP_READ(fil->f_ino),
- fil,
- &iovector, 1, NULL,
- &xtvector, NULL,
- &ioctx);
- if (!err && (cc = _sysio_ioctx_wait(ioctx)) < 0)
- err = (int )cc;
- SYSIO_INTERFACE_RETURN(err ? -1 : cc, err);
-}
-
-#ifdef __GLIBC__
-#undef __read
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(read),
- PREPEND(__, SYSIO_INTERFACE_NAME(read)))
-#undef __libc_read
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(read),
- PREPEND(__, SYSIO_INTERFACE_NAME(libc_read)))
-#endif
-
-/*
- * Asynch IO between iovec and data at the given offset.
- */
-static int
-_sysio_ipiov(int (*f)(struct inode *, struct ioctx *),
- int wr,
- struct file *fil,
- const struct iovec *iov,
- int count,
- void (*iov_free)(struct ioctx *),
- _SYSIO_OFF_T off,
- struct intnl_xtvec *xtv,
- void (*xtv_free)(struct ioctx *),
- struct ioctx **ioctxp)
-{
- ssize_t cc;
- int err;
-
- SYSIO_ENTER;
- cc = _sysio_sum_iovec(iov, count);
- if (cc < 0) {
- SYSIO_LEAVE;
- return (int )cc;
- }
- xtv->xtv_off = off,
- xtv->xtv_len = cc;
- err =
- _sysio_iiox(f,
- wr,
- fil,
- iov, count, iov_free,
- xtv, 1, xtv_free,
- NULL,
- ioctxp);
- SYSIO_LEAVE;
- if (err)
- return err;
- return 0;
-}
-
-static ioid_t
-PREPEND(_, SYSIO_INTERFACE_NAME(ipreadv))(int fd,
- const struct iovec *iov,
- size_t count,
- _SYSIO_OFF_T offset)
-{
- struct file *fil;
- struct intnl_xtvec *xtv;
- struct ioctx *ioctx;
- int err;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -EBADF);
-
- xtv = malloc(sizeof(struct intnl_xtvec));
- if (!xtv)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -ENOMEM);
-
- err =
- _sysio_ipiov(IIOXOP_READ(fil->f_ino),
- fil,
- iov, count, NULL,
- offset,
- xtv, free_xtv,
- &ioctx);
- if (err) {
- free(xtv);
- SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
- }
- SYSIO_INTERFACE_RETURN(ioctx, 0);
-}
-
-#ifdef _LARGEFILE64_SOURCE
-#undef ipread64v
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(ipreadv)),
- SYSIO_INTERFACE_NAME(ipread64v))
-#endif
-
-ioid_t
-SYSIO_INTERFACE_NAME(ipreadv)(int fd,
- const struct iovec *iov,
- size_t count,
- off_t offset)
-{
-
- return PREPEND(_, SYSIO_INTERFACE_NAME(ipreadv))(fd,
- iov,
- count,
- offset);
-}
-
-static ssize_t
-PREPEND(_, SYSIO_INTERFACE_NAME(preadv))(int fd,
- const struct iovec *iov,
- _SYSIO_PREADV_T count,
- _SYSIO_OFF_T offset)
-{
- struct file *fil;
- struct intnl_xtvec xtvector;
- struct ioctx *ioctx;
- int err;
- ssize_t cc;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(-1, -EBADF);
-
- err =
- _sysio_ipiov(IIOXOP_READ(fil->f_ino),
- fil,
- iov, count, NULL,
- offset,
- &xtvector, NULL,
- &ioctx);
- if (!err && (cc = _sysio_ioctx_wait(ioctx)) < 0)
- err = (int )cc;
-
- SYSIO_INTERFACE_RETURN(err ? -1 : cc, err);
-}
-
-#ifdef _LARGEFILE64_SOURCE
-#undef pread64v
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(preadv)),
- SYSIO_INTERFACE_NAME(pread64v))
-#endif
-
-ssize_t
-SYSIO_INTERFACE_NAME(preadv)(int fd,
- const struct iovec *iov,
- _SYSIO_PREADV_T count,
- off_t offset)
-{
-
- return PREPEND(_, SYSIO_INTERFACE_NAME(preadv))(fd,
- iov,
- count,
- offset);
-}
-
-static ioid_t
-PREPEND(_, SYSIO_INTERFACE_NAME(ipread))(int fd,
- void *buf,
- size_t count,
- _SYSIO_OFF_T offset)
-{
- struct file *fil;
- struct intnl_xtvec *xtv;
- struct iovec *iov;
- struct ioctx *ioctx;
- int err;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -EBADF);
-
- xtv = malloc(sizeof(struct intnl_xtvec));
- iov = malloc(sizeof(struct iovec));
- if (!(xtv && iov)) {
- err = -ENOMEM;
- goto error;
- }
- xtv->xtv_off = offset;
- iov->iov_base = buf;
- xtv->xtv_len = iov->iov_len = count;
- err =
- _sysio_ipiov(IIOXOP_READ(fil->f_ino),
- fil,
- iov, 1, free_iov,
- offset,
- xtv, free_xtv,
- &ioctx);
-error:
- if (err) {
- if (iov)
- free(iov);
- if (xtv)
- free(xtv);
- SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
- }
- SYSIO_INTERFACE_RETURN(ioctx, 0);
-}
-
-#ifdef _LARGEFILE64_SOURCE
-#undef ipread64
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(ipread)),
- SYSIO_INTERFACE_NAME(ipread64))
-#endif
-
-ioid_t
-SYSIO_INTERFACE_NAME(ipread)(int fd,
- void *buf,
- size_t count,
- off_t offset)
-{
-
- return PREPEND(_, SYSIO_INTERFACE_NAME(ipread))(fd,
- buf,
- count,
- offset);
-}
-
-ssize_t
-PREPEND(_, SYSIO_INTERFACE_NAME(pread))(int fd,
- void *buf,
- size_t count,
- _SYSIO_OFF_T offset)
-{
- struct file *fil;
- struct intnl_xtvec xtvec;
- struct iovec iovec;
- struct ioctx *ioctx;
- int err;
- ssize_t cc;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -EBADF);
-
- xtvec.xtv_off = offset;
- iovec.iov_base = buf;
- xtvec.xtv_len = iovec.iov_len = count;
- err =
- _sysio_ipiov(IIOXOP_READ(fil->f_ino),
- fil,
- &iovec, 1, NULL,
- offset,
- &xtvec, NULL,
- &ioctx);
- if (!err && (cc = _sysio_ioctx_wait(ioctx)) < 0)
- err = (int )cc;
-
- SYSIO_INTERFACE_RETURN(err ? -1 : cc, err);
-}
-
-#ifdef _LARGEFILE64_SOURCE
-#undef pread64
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(pread)),
- SYSIO_INTERFACE_NAME(pread64))
-#if __GLIBC__
-#undef __pread64
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(pread)),
- PREPEND(__, SYSIO_INTERFACE_NAME(pread64)))
-#undef __libc_pread64
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(pread)),
- PREPEND(__, SYSIO_INTERFACE_NAME(libc_pread64)))
-#endif
-#endif
-
-ssize_t
-SYSIO_INTERFACE_NAME(pread)(int fd, void *buf, size_t count, off_t offset)
-{
-
- return PREPEND(_, SYSIO_INTERFACE_NAME(pread))(fd,
- buf,
- count,
- offset);
-}
-
-#if __GLIBC__
-#undef __pread
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(pread),
- PREPEND(__, SYSIO_INTERFACE_NAME(pread)))
-#undef __libc_pread
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(pread),
- PREPEND(__, SYSIO_INTERFACE_NAME(libc_pread)))
-#endif
-
-static ioid_t
-PREPEND(_, SYSIO_INTERFACE_NAME(ireadx))(int fd,
- const struct iovec *iov,
- size_t iov_count,
- const struct intnl_xtvec *xtv,
- size_t xtv_count)
-{
- struct file *fil;
- int err;
- struct ioctx *ioctx;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -EBADF);
-
- /* Perform a check on the iov_count and xtv_count */
- if ((iov_count == 0) || (xtv_count == 0))
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -EINVAL);
-
- err =
- _sysio_iiox(IIOXOP_READ(fil->f_ino),
- fil,
- iov, iov_count, NULL,
- xtv, xtv_count, NULL,
- NULL,
- &ioctx);
-
- SYSIO_INTERFACE_RETURN(err ? IOID_FAIL : ioctx, err);
-}
-
-#ifdef _LARGEFILE64_SOURCE
-#undef iread64x
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(ireadx)),
- SYSIO_INTERFACE_NAME(iread64x))
-#endif
-
-#ifdef _LARGEFILE64_SOURCE
-ioid_t
-SYSIO_INTERFACE_NAME(ireadx)(int fd,
- const struct iovec *iov, size_t iov_count,
- const struct xtvec *xtv, size_t xtv_count)
-{
- struct file *fil;
- struct intnl_xtvec *ixtv, *ixtvent;
- size_t count;
- int err;
- struct ioctx *ioctx;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -EBADF);
-
-
- /* Perform a check on the iov_count and xtv_count */
- if ((iov_count == 0) || (xtv_count == 0))
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -EINVAL);
-
- ixtv = ixtvent = malloc(xtv_count * sizeof(struct intnl_xtvec));
- if (!ixtv)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -ENOMEM);
-
- count = xtv_count;
- while (count--) {
- ixtvent->xtv_off = xtv->xtv_off;
- ixtvent->xtv_len = xtv->xtv_len;
- ixtvent++;
- xtv++;
- }
-
- err =
- _sysio_iiox(IIOXOP_READ(fil->f_ino),
- fil,
- iov, iov_count, NULL,
- ixtv, xtv_count, free_xtv,
- NULL,
- &ioctx);
- if (err) {
- free(ixtv);
- SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
- }
- SYSIO_INTERFACE_RETURN(ioctx, 0);
-}
-#else
-#undef ireadx
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(ireadx)),
- SYSIO_INTERFACE_NAME(ireadx))
-#endif
-
-ssize_t
-SYSIO_INTERFACE_NAME(readx)(int fd,
- const struct iovec *iov, size_t iov_count,
- const struct xtvec *xtv, size_t xtv_count)
-{
- ioid_t ioid;
-
- if ((ioid = SYSIO_INTERFACE_NAME(ireadx)(fd,
- iov,
- iov_count,
- xtv,
- xtv_count)) == IOID_FAIL)
- return -1;
- return SYSIO_INTERFACE_NAME(iowait)(ioid);
-}
-
-#ifdef _LARGEFILE64_SOURCE
-#undef iread64x
-ssize_t
-SYSIO_INTERFACE_NAME(read64x)(int fd,
- const struct iovec *iov, size_t iov_count,
- const struct xtvec64 *xtv, size_t xtv_count)
-{
- ioid_t ioid;
-
- if ((ioid = SYSIO_INTERFACE_NAME(iread64x)(fd,
- iov,
- iov_count,
- xtv,
- xtv_count)) == IOID_FAIL)
- return -1;
- return SYSIO_INTERFACE_NAME(iowait)(ioid);
-}
-#endif
-
-#ifdef notdef
-int
-read_list(int fd,
- int mem_list_count,
- char *mem_offsets[],
- int mem_lengths[],
- int file_list_count,
- int64_t file_offsets[],
- int32_t file_lengths[])
-{
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- SYSIO_INTERFACE_RETURN(-1, -ENOSYS);
-}
-#endif
-
-ioid_t
-SYSIO_INTERFACE_NAME(iwritev)(int fd,
- const struct iovec *iov,
- int count)
-{
- struct file *fil;
- struct intnl_xtvec *xtv;
- struct ioctx *ioctx;
- int err;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -EBADF);
-
- xtv = malloc(sizeof(struct intnl_xtvec));
- if (!xtv)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -ENOMEM);
-
- err =
- _sysio_iiov(IIOXOP_WRITE(fil->f_ino),
- fil,
- iov, count, NULL,
- xtv, free_xtv,
- &ioctx);
- if (err) {
- free(xtv);
- SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
- }
- SYSIO_INTERFACE_RETURN(ioctx, 0);
-}
-
-ssize_t
-SYSIO_INTERFACE_NAME(writev)(int fd, const struct iovec *iov,
- int count)
-{
- struct file *fil;
- struct intnl_xtvec xtvector;
- struct ioctx *ioctx;
- int err;
- ssize_t cc;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(-1, -EBADF);
-
- err =
- _sysio_iiov(IIOXOP_WRITE(fil->f_ino),
- fil,
- iov, count, NULL,
- &xtvector, NULL,
- &ioctx);
- if (!err && (cc = _sysio_ioctx_wait(ioctx)) < 0)
- err = (int )cc;
-
- SYSIO_INTERFACE_RETURN(err < 0 ? -1 : cc, err);
-}
-
-#ifdef __GLIBC__
-#undef __writev
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(writev),
- PREPEND(__, SYSIO_INTERFACE_NAME(writev)))
-#undef __libc_writev
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(writev),
- PREPEND(__, SYSIO_INTERFACE_NAME(libc_writev)))
-#endif
-
-ioid_t
-SYSIO_INTERFACE_NAME(iwrite)(int fd, const void *buf, size_t count)
-{
- struct iovec *iov;
- struct file *fil;
- struct intnl_xtvec *xtv;
- struct ioctx *ioctx;
- int err;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -EBADF);
-
- iov = malloc(sizeof(struct iovec));
- if (!iov)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -ENOMEM);
-
- iov->iov_base = (void *)buf;
- iov->iov_len = count;
- xtv = malloc(sizeof(struct intnl_xtvec));
- if (!xtv) {
- free(iov);
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -ENOMEM);
- }
- err =
- _sysio_iiov(IIOXOP_WRITE(fil->f_ino),
- fil,
- iov, 1, free_iov,
- xtv, free_xtv,
- &ioctx);
- if (err) {
- free(xtv);
- free(iov);
- SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
- }
- SYSIO_INTERFACE_RETURN(ioctx, 0);
-}
-
-ssize_t
-SYSIO_INTERFACE_NAME(write)(int fd, const void *buf, size_t count)
-{
- struct file *fil;
- struct iovec iovector;
- struct intnl_xtvec xtvector;
- int err;
- struct ioctx *ioctx;
- ssize_t cc;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(-1, -EBADF);
-
- iovector.iov_base = (void *)buf;
- iovector.iov_len = count;
- err =
- _sysio_iiov(IIOXOP_WRITE(fil->f_ino),
- fil,
- &iovector, 1, NULL,
- &xtvector, NULL,
- &ioctx);
- if (!err && (cc = _sysio_ioctx_wait(ioctx)) < 0)
- err = (int )cc;
-
- SYSIO_INTERFACE_RETURN(err < 0 ? -1 : cc, err);
-}
-
-#ifdef __GLIBC__
-#undef __write
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(write),
- PREPEND(__, SYSIO_INTERFACE_NAME(write)))
-#undef __libc_write
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(write),
- PREPEND(__, SYSIO_INTERFACE_NAME(libc_write)))
-#endif
-
-static ioid_t
-PREPEND(_, SYSIO_INTERFACE_NAME(ipwritev))(int fd,
- const struct iovec *iov,
- size_t count,
- _SYSIO_OFF_T offset)
-{
- struct file *fil;
- struct intnl_xtvec *xtv;
- struct ioctx *ioctx;
- int err;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -EBADF);
-
- xtv = malloc(sizeof(struct intnl_xtvec));
- if (!xtv)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -ENOMEM);
-
- err =
- _sysio_ipiov(IIOXOP_WRITE(fil->f_ino),
- fil,
- iov, count, NULL,
- offset,
- xtv, free_xtv,
- &ioctx);
- if (err) {
- free(xtv);
- SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
- }
- SYSIO_INTERFACE_RETURN(ioctx, 0);
-}
-
-#ifdef _LARGEFILE64_SOURCE
-#undef ipwrite64v
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(ipwritev)),
- SYSIO_INTERFACE_NAME(ipwrite64v))
-#endif
-
-ioid_t
-SYSIO_INTERFACE_NAME(ipwritev)(int fd,
- const struct iovec *iov,
- size_t count,
- off_t offset)
-{
-
- return PREPEND(_, SYSIO_INTERFACE_NAME(ipwritev))(fd,
- iov,
- count,
- offset);
-}
-
-static ssize_t
-PREPEND(_, SYSIO_INTERFACE_NAME(pwritev))(int fd,
- const struct iovec *iov,
- _SYSIO_PREADV_T count,
- _SYSIO_OFF_T offset)
-{
- struct file *fil;
- struct intnl_xtvec xtvector;
- struct ioctx *ioctx;
- int err;
- ssize_t cc;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(-1, -EBADF);
-
- err =
- _sysio_ipiov(IIOXOP_WRITE(fil->f_ino),
- fil,
- iov, count, NULL,
- offset,
- &xtvector, NULL,
- &ioctx);
- if (!err && (cc = _sysio_ioctx_wait(ioctx)) < 0)
- err = (int )cc;
-
- SYSIO_INTERFACE_RETURN(err ? -1 : cc, err);
-}
-
-#ifdef _LARGEFILE64_SOURCE
-#undef pwrite64v
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(pwritev)),
- SYSIO_INTERFACE_NAME(pwrite64v))
-#endif
-
-ssize_t
-SYSIO_INTERFACE_NAME(pwritev)(int fd,
- const struct iovec *iov,
- _SYSIO_PREADV_T count,
- off_t offset)
-{
-
- return PREPEND(_, SYSIO_INTERFACE_NAME(pwritev))(fd,
- iov,
- count,
- offset);
-}
-
-static ioid_t
-PREPEND(_, SYSIO_INTERFACE_NAME(ipwrite))(int fd,
- const void *buf,
- size_t count,
- _SYSIO_OFF_T offset)
-{
- struct file *fil;
- struct intnl_xtvec *xtv;
- struct iovec *iov;
- struct ioctx *ioctx;
- int err;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -EBADF);
-
- xtv = malloc(sizeof(struct intnl_xtvec));
- iov = malloc(sizeof(struct iovec));
- if (!(xtv && iov)) {
- err = -errno;
- goto error;
- }
- xtv->xtv_off = offset;
- iov->iov_base = (void *)buf;
- xtv->xtv_len = iov->iov_len = count;
- err =
- _sysio_ipiov(IIOXOP_WRITE(fil->f_ino),
- fil,
- iov, 1, free_iov,
- offset,
- xtv, free_xtv,
- &ioctx);
-error:
- if (err) {
- if (iov)
- free(iov);
- if (xtv)
- free(xtv);
- SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
- }
- SYSIO_INTERFACE_RETURN(ioctx, 0);
-}
-
-#ifdef _LARGEFILE64_SOURCE
-#undef ipwrite64
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(ipwrite)),
- SYSIO_INTERFACE_NAME(ipwrite64))
-#endif
-
-ioid_t
-SYSIO_INTERFACE_NAME(ipwrite)(int fd,
- const void *buf,
- size_t count,
- off_t offset)
-{
-
- return PREPEND(_, SYSIO_INTERFACE_NAME(ipwrite))(fd,
- buf,
- count,
- offset);
-}
-
-ssize_t
-PREPEND(_, SYSIO_INTERFACE_NAME(pwrite))(int fd,
- const void *buf,
- size_t count,
- _SYSIO_OFF_T offset)
-{
- struct file *fil;
- struct intnl_xtvec xtvec;
- struct iovec iovec;
- struct ioctx *ioctx;
- int err;
- ssize_t cc;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(-1, -EBADF);
-
- xtvec.xtv_off = offset;
- iovec.iov_base = (void *)buf;
- xtvec.xtv_len = iovec.iov_len = count;
- err =
- _sysio_ipiov(IIOXOP_WRITE(fil->f_ino),
- fil,
- &iovec, 1, NULL,
- offset,
- &xtvec, NULL,
- &ioctx);
- if (!err && (cc = _sysio_ioctx_wait(ioctx)) < 0)
- err = (int )cc;
-
- SYSIO_INTERFACE_RETURN(err ? -1 : cc, err);
-}
-
-#ifdef _LARGEFILE64_SOURCE
-#undef pwrite64
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(pwrite)),
- SYSIO_INTERFACE_NAME(pwrite64))
-#ifdef __GLIBC
-#undef __pwrite64
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(pwrite)),
- PREPEND(__, SYSIO_INTERFACE_NAME(pwrite64)))
-#undef __libc_pwrite64
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(pwrite)),
- PREPEND(__, SYSIO_INTERFACE_NAME(libc_pwrite64)))
-#endif
-#endif
-
-ssize_t
-SYSIO_INTERFACE_NAME(pwrite)(int fd,
- const void *buf,
- size_t count,
- off_t offset)
-{
-
- return PREPEND(_, SYSIO_INTERFACE_NAME(pwrite))(fd,
- buf,
- count,
- offset);
-}
-
-#ifdef __GLIBC
-#undef __libc_pwrite
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(pwrite), __libc_pwrite)
- PREPEND(__, SYSIO_INTERFACE_NAME(libc_pwrite)))
-#endif
-
-static ioid_t
-PREPEND(_, SYSIO_INTERFACE_NAME(iwritex))(int fd,
- const struct iovec *iov,
- size_t iov_count,
- const struct intnl_xtvec *xtv,
- size_t xtv_count)
-{
- struct file *fil;
- int err;
- struct ioctx *ioctx;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!(fil && xtv_count))
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -EBADF);
-
- err =
- _sysio_iiox(IIOXOP_WRITE(fil->f_ino),
- fil,
- iov, iov_count, NULL,
- xtv, xtv_count, NULL,
- NULL,
- &ioctx);
-
- SYSIO_INTERFACE_RETURN(err ? IOID_FAIL : ioctx, err);
-}
-
-#ifdef _LARGEFILE64_SOURCE
-#undef iwrite64x
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(iwritex)),
- SYSIO_INTERFACE_NAME(iwrite64x))
-#endif
-
-#ifdef _LARGEFILE64_SOURCE
-ioid_t
-SYSIO_INTERFACE_NAME(iwritex)(int fd,
- const struct iovec *iov, size_t iov_count,
- const struct xtvec *xtv, size_t xtv_count)
-{
- struct file *fil;
- struct intnl_xtvec *ixtv, *ixtvent;
- size_t count;
- int err;
- struct ioctx *ioctx;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- fil = _sysio_fd_find(fd);
- if (!fil)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -EBADF);
-
- /* Perform a check on the iov_count and xtv_count */
- if ((iov_count == 0) || (xtv_count == 0))
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -EINVAL);
-
- ixtv = ixtvent = malloc(xtv_count * sizeof(struct intnl_xtvec));
- if (!ixtv)
- SYSIO_INTERFACE_RETURN(IOID_FAIL, -ENOMEM);
-
- count = xtv_count;
- while (count--) {
- ixtvent->xtv_off = xtv->xtv_off;
- ixtvent->xtv_len = xtv->xtv_len;
- ixtvent++;
- xtv++;
- }
-
- err =
- _sysio_iiox(IIOXOP_WRITE(fil->f_ino),
- fil,
- iov, iov_count, NULL,
- ixtv, xtv_count, free_xtv,
- NULL,
- &ioctx);
- if (err) {
- free(ixtv);
- SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
- }
- SYSIO_INTERFACE_RETURN(ioctx, 0);
-}
-#else
-#undef iwritex
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(iwritex)),
- SYSIO_INTERFACE_NAME(iwritex))
-#endif
-
-#undef writex
-ssize_t
-SYSIO_INTERFACE_NAME(writex)(int fd,
- const struct iovec *iov, size_t iov_count,
- const struct xtvec *xtv, size_t xtv_count)
-{
- ioid_t ioid;
-
- if ((ioid =
- SYSIO_INTERFACE_NAME(iwritex)(fd,
- iov,
- iov_count,
- xtv,
- xtv_count)) == IOID_FAIL)
- return -1;
- return SYSIO_INTERFACE_NAME(iowait)(ioid);
-}
-
-#ifdef _LARGEFILE64_SOURCE
-#undef write64x
-ssize_t
-SYSIO_INTERFACE_NAME(write64x)(int fd,
- const struct iovec *iov, size_t iov_count,
- const struct xtvec64 *xtv, size_t xtv_count)
-{
- ioid_t ioid;
-
- if ((ioid = SYSIO_INTERFACE_NAME(iwrite64x)(fd,
- iov,
- iov_count,
- xtv,
- xtv_count)) == IOID_FAIL)
- return -1;
- return SYSIO_INTERFACE_NAME(iowait)(ioid);
-}
-#endif
-
-#ifdef notdef
-int
-write_list(int fd,
- int mem_list_count,
- char *mem_offsets[],
- int mem_lengths[],
- int file_list_count,
- int64_t file_offsets[],
- int32_t file_lengths[])
-{
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- SYSIO_INTERFACE_RETURN(-1, -ENOSYS);
-}
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "file.h"
-
-#include "sysio-symbols.h"
-
-#ifndef REDSTORM
-#undef fstat
-#undef stat
-#undef lstat
-#endif
-
-#undef __fxstat
-#undef __xstat
-#undef __lxstat
-
-#if !defined(_STAT_VER)
-#define _STAT_VER 0
-#endif
-
-#ifdef _LARGEFILE64_SOURCE
-static void
-convstat(struct stat64 *st64_buf, struct stat *st_buf)
-{
-
- st_buf->st_dev = st64_buf->st_dev;
- st_buf->st_ino = st64_buf->st_ino;
- st_buf->st_mode = st64_buf->st_mode;
- st_buf->st_nlink = st64_buf->st_nlink;
- st_buf->st_uid = st64_buf->st_uid;
- st_buf->st_gid = st64_buf->st_gid;
- st_buf->st_rdev = st64_buf->st_rdev;
- st_buf->st_size = st64_buf->st_size;
- st_buf->st_blksize = st64_buf->st_blksize;
- st_buf->st_blocks = st64_buf->st_blocks;
- st_buf->st_atime = st64_buf->st_atime;
- st_buf->st_mtime = st64_buf->st_mtime;
- st_buf->st_ctime = st64_buf->st_ctime;
-}
-#endif
-
-int
-PREPEND(__, SYSIO_INTERFACE_NAME(fxstat))(int __ver,
- int __fildes,
- struct stat *__stat_buf)
-{
- struct file *fil;
- int err;
- struct intnl_stat *buf;
-#ifdef _LARGEFILE64_SOURCE
- struct stat64 st64;
-#endif
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- if (__ver != _STAT_VER) {
- err = -ENOSYS;
- goto out;
- }
-
- err = 0;
- fil = _sysio_fd_find(__fildes);
- if (!fil) {
- err = -EBADF;
- goto out;
- }
-#ifdef _LARGEFILE64_SOURCE
- buf = &st64;
-#else
- buf = __stat_buf;
-#endif
- /*
- * Never use the attributes cached in the inode record. Give the
- * driver a chance to refresh them.
- */
- err =
- fil->f_ino->i_ops.inop_getattr(NULL, fil->f_ino, buf);
-#ifdef _LARGEFILE64_SOURCE
- if (!err)
- convstat(buf, __stat_buf);
-#endif
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef _fxstat
-sysio_sym_weak_alias(PREPEND(__, SYSIO_INTERFACE_NAME(fxstat)),
- PREPEND(_, SYSIO_INTERFACE_NAME(fxstat)))
-#endif
-
-#ifndef REDSTORM
-static int
-PREPEND(__, SYSIO_INTERFACE_NAME(fstat))(int fd, struct stat *buf)
-{
-
- return PREPEND(__, SYSIO_INTERFACE_NAME(fxstat))(_STAT_VER,
- fd,
- buf);
-}
-
-sysio_sym_weak_alias(PREPEND(__, SYSIO_INTERFACE_NAME(fstat)),
- SYSIO_INTERFACE_NAME(fstat))
-
-#ifdef BSD
-#undef _fstat
-sysio_sym_weak_alias(PREPEND(__, SYSIO_INTERFACE_NAME(fstat)),
- PREPEND(_, SYSIO_INTERFACE_NAME(fstat)))
-#endif
-#endif
-
-int
-PREPEND(__, SYSIO_INTERFACE_NAME(xstat))(int __ver,
- const char *__filename,
- struct stat *__stat_buf)
-{
- struct intent intent;
- int err;
- struct pnode *pno;
- struct inode *ino;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- if (__ver != _STAT_VER) {
- err = -ENOSYS;
- goto out;
- }
-
- INTENT_INIT(&intent, INT_GETATTR, NULL, NULL);
- err = _sysio_namei(_sysio_cwd, __filename, 0, &intent, &pno);
- if (err)
- goto out;
- /*
- * Leverage the INT_GETATTR intent above. We are counting
- * on the FS driver to either make sure the attributes cached in
- * the inode are always correct or refresh them in the lookup, above.
- */
- ino = pno->p_base->pb_ino;
-#ifdef _LARGEFILE64_SOURCE
- convstat(&ino->i_stbuf, __stat_buf);
-#else
- (void )memcpy(__stat_buf, &ino->i_stbuf, sizeof(struct intnl_stat));
-#endif
- P_RELE(pno);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef _xstat
-sysio_sym_weak_alias(PREPEND(__, SYSIO_INTERFACE_NAME(xstat)),
- PREPEND(_, SYSIO_INTERFACE_NAME(xstat)))
-#endif
-
-#ifndef REDSTORM
-static int
-PREPEND(__, SYSIO_INTERFACE_NAME(stat))(const char *filename,
- struct stat *buf)
-{
-
- return PREPEND(__, SYSIO_INTERFACE_NAME(xstat))(_STAT_VER,
- filename,
- buf);
-}
-
-sysio_sym_weak_alias(PREPEND(__, SYSIO_INTERFACE_NAME(stat)),
- SYSIO_INTERFACE_NAME(stat))
-
-#ifdef BSD
-#undef _stat
-sysio_sym_weak_alias(PREPEND(__, SYSIO_INTERFACE_NAME(stat)),
- PREPEND(_, SYSIO_INTERFACE_NAME(stat)))
-#endif
-#endif
-
-int
-PREPEND(__, SYSIO_INTERFACE_NAME(lxstat))(int __ver,
- const char *__filename,
- struct stat *__stat_buf)
-{
- struct intent intent;
- int err;
- struct pnode *pno;
- struct inode *ino;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- if (__ver != _STAT_VER) {
- err = -ENOSYS;
- goto out;
- }
-
- INTENT_INIT(&intent, INT_GETATTR, NULL, NULL);
- err = _sysio_namei(_sysio_cwd, __filename, ND_NOFOLLOW, &intent, &pno);
- if (err)
- goto out;
- /*
- * Leverage the INT_GETATTR intent above. We are counting
- * on the FS driver to either make sure the attributes cached in
- * the inode are always correct or refresh them in the lookup, above.
- */
- ino = pno->p_base->pb_ino;
-#ifdef _LARGEFILE64_SOURCE
- convstat(&ino->i_stbuf, __stat_buf);
-#else
- (void )memcpy(__stat_buf, &ino->i_stbuf, sizeof(struct intnl_stat));
-#endif
- P_RELE(pno);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef _lxstat
-sysio_sym_weak_alias(PREPEND(__, SYSIO_INTERFACE_NAME(lxstat)),
- PREPEND(_, SYSIO_INTERFACE_NAME(lxstat)))
-#endif
-
-#ifndef REDSTORM
-static int
-PREPEND(__, SYSIO_INTERFACE_NAME(lstat))(const char *filename, struct stat *buf)
-{
- return PREPEND(__, SYSIO_INTERFACE_NAME(lxstat))(_STAT_VER,
- filename,
- buf);
-}
-
-sysio_sym_weak_alias(PREPEND(__, SYSIO_INTERFACE_NAME(lstat)),
- SYSIO_INTERFACE_NAME(lstat))
-
-#ifdef BSD
-#undef _lstat
-sysio_sym_weak_alias(PREPEND(__, SYSIO_INTERFACE_NAME(lstat)),
- PREPEND(_, SYSIO_INTERFACE_NAME(lstat)))
-#endif
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#ifdef _LARGEFILE64_SOURCE
-
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "file.h"
-
-#ifndef REDSTORM
-#undef fstat64
-#undef stat64
-#undef lstat64
-#endif
-
-#undef __fxstat64
-#undef __xstat64
-#undef __lxstat64
-
-int
-PREPEND(__, SYSIO_INTERFACE_NAME(fxstat64))(int __ver,
- int __fildes,
- struct stat64 *__stat_buf)
-{
- struct file *fil;
- int err;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- if (__ver != _STAT_VER) {
- err = -ENOSYS;
- goto out;
- }
-
- err = 0;
- fil = _sysio_fd_find(__fildes);
- if (!fil) {
- err = -EBADF;
- goto out;
- }
- /*
- * Never use the attributes cached in the inode record. Give
- * the driver a chance to refresh them.
- */
- err = fil->f_ino->i_ops.inop_getattr(NULL, fil->f_ino, __stat_buf);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifndef REDSTORM
-int
-SYSIO_INTERFACE_NAME(fstat64)(int fd, struct stat64 *buf)
-{
-
- return PREPEND(__, SYSIO_INTERFACE_NAME(fxstat64))(_STAT_VER, fd, buf);
-}
-#endif
-
-int
-PREPEND(__, SYSIO_INTERFACE_NAME(xstat64))(int __ver,
- const char *__filename,
- struct stat64 *__stat_buf)
-{
- struct intent intent;
- int err;
- struct pnode *pno;
- struct inode *ino;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- if (__ver != _STAT_VER) {
- err = -ENOSYS;
- goto out;
- }
-
- INTENT_INIT(&intent, INT_GETATTR, NULL, NULL);
- err = _sysio_namei(_sysio_cwd, __filename, 0, &intent, &pno);
- if (err)
- goto out;
- /*
- * Leverage the INT_GETATTR intent above. We are counting
- * on the FS driver to either make sure the attributes cached in
- * the inode are always correct or refresh them in the lookup, above.
- */
- ino = pno->p_base->pb_ino;
- (void )memcpy(__stat_buf, &ino->i_stbuf, sizeof(struct intnl_stat));
- P_RELE(pno);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifndef REDSTORM
-int
-SYSIO_INTERFACE_NAME(stat64)(const char *filename, struct stat64 *buf)
-{
-
- return PREPEND(__, SYSIO_INTERFACE_NAME(xstat64))(_STAT_VER,
- filename,
- buf);
-}
-#endif
-
-int
-PREPEND(__, SYSIO_INTERFACE_NAME(lxstat64))(int __ver,
- const char *__filename,
- struct stat64 *__stat_buf)
-{
- struct intent intent;
- int err;
- struct pnode *pno;
- struct inode *ino;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- if (__ver != _STAT_VER) {
- err = -ENOSYS;
- goto out;
- }
-
- INTENT_INIT(&intent, INT_GETATTR, NULL, NULL);
- err = _sysio_namei(_sysio_cwd, __filename, ND_NOFOLLOW, &intent, &pno);
- if (err)
- goto out;
- /*
- * Leverage the INT_GETATTR intent above. We are counting
- * on the FS driver to either make sure the attributes cached in
- * the inode are always correct or refresh them in the lookup, above.
- */
- ino = pno->p_base->pb_ino;
- (void )memcpy(__stat_buf, &ino->i_stbuf, sizeof(struct intnl_stat));
- P_RELE(pno);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifndef REDSTORM
-int
-SYSIO_INTERFACE_NAME(lstat64)(const char *filename, struct stat64 *buf)
-{
-
- return PREPEND(__, SYSIO_INTERFACE_NAME(lxstat64))(_STAT_VER,
- filename,
- buf);
-}
-#endif
-#endif /* !_LARGEFILE64_SOURCE */
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#ifndef BSD
-
-#include <unistd.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/statvfs.h>
-#include <sys/types.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "file.h"
-#include "sysio-symbols.h"
-
-#undef statvfs
-#undef fstatvfs
-
-#ifndef INTNL_STATVFS_IS_NATURAL
-static void
-convstatvfs(struct statvfs *stvfsbuf, struct intnl_statvfs *istvfsbuf)
-{
- stvfsbuf->f_bsize = istvfsbuf->f_bsize;
- stvfsbuf->f_frsize = istvfsbuf->f_frsize;
- stvfsbuf->f_blocks = (unsigned long )istvfsbuf->f_blocks;
- stvfsbuf->f_bfree = (unsigned long )istvfsbuf->f_bfree;
- stvfsbuf->f_bavail = (unsigned long )istvfsbuf->f_bavail;
- stvfsbuf->f_files = (unsigned long )istvfsbuf->f_files;
- stvfsbuf->f_ffree = (unsigned long )istvfsbuf->f_ffree;
- stvfsbuf->f_favail = (unsigned long )istvfsbuf->f_favail;
- stvfsbuf->f_fsid = istvfsbuf->f_fsid;
- stvfsbuf->f_flag = istvfsbuf->f_flag;
- stvfsbuf->f_namemax = istvfsbuf->f_namemax;
-}
-#endif
-
-int
-SYSIO_INTERFACE_NAME(statvfs)(const char *path, struct statvfs *buf)
-{
- int err;
- struct pnode *pno;
-#ifdef INTNL_STATVFS_IS_NATURAL
-#define _call_buf buf
-#else
- struct intnl_statvfs _call_buffer;
- struct intnl_statvfs *_call_buf = &_call_buffer;
-#endif
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- err = _sysio_namei(_sysio_cwd, path, 0, NULL, &pno);
- if (err)
- goto out;
-
- err = pno->p_base->pb_ino->i_ops.inop_statvfs(pno, NULL, _call_buf);
- P_RELE(pno);
- if (err)
- goto err;
-#ifndef INTNL_STATVFS_IS_NATURAL
- convstatvfs(buf, _call_buf);
-#endif
- goto out;
-err:
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef __statvfs
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(statvfs),
- PREPEND(__, SYSIO_INTERFACE_NAME(statvfs)))
-#endif
-
-int
-SYSIO_INTERFACE_NAME(fstatvfs)(int fd, struct statvfs *buf)
-{
- int err;
- struct file *filp;
-#ifdef INTNL_STATVFS_IS_NATURAL
-#define _call_buf buf
-#else
- struct intnl_statvfs _call_buffer;
- struct intnl_statvfs *_call_buf = &_call_buffer;
-#endif
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- err = 0;
- filp = _sysio_fd_find(fd);
- if (!filp) {
- err = -EBADF;
- goto out;
- }
-
- err = filp->f_ino->i_ops.inop_statvfs(NULL, filp->f_ino, _call_buf);
- if (err)
- goto err;
-#ifndef INTNL_STATVFS_IS_NATURAL
- convstatvfs(buf, _call_buf);
-#endif
- goto out;
-err:
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef __fstatvfs
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(fstatvfs),
- PREPEND(__, SYSIO_INTERFACE_NAME(fstatvfs)))
-#endif
-
-#endif /* ifndef BSD */
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#ifndef BSD
-#include <unistd.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/vfs.h>
-#include <sys/types.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "file.h"
-#include "sysio-symbols.h"
-
-int
-SYSIO_INTERFACE_NAME(statvfs64)(const char *path, struct statvfs64 *buf)
-{
- int err;
- struct pnode *pno;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- err = _sysio_namei(_sysio_cwd, path, 0, NULL, &pno);
- if (err)
- goto out;
-
- err = pno->p_base->pb_ino->i_ops.inop_statvfs(pno, NULL, buf);
- P_RELE(pno);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef __statvfs64
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(statvfs64),
- PREPEND(__, SYSIO_INTERFACE_NAME(statvfs64)))
-#endif
-
-int
-SYSIO_INTERFACE_NAME(fstatvfs64)(int fd, struct statvfs64 *buf)
-{
- int err;
- struct file *filp;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- err = 0;
- filp = _sysio_fd_find(fd);
- if (!filp) {
- err = -EBADF;
- goto out;
- }
-
- err = filp->f_ino->i_ops.inop_statvfs(NULL, filp->f_ino, buf);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef __fstatvfs64
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(fstatvfs64),
- PREPEND(__, SYSIO_INTERFACE_NAME(fstatvfs64)))
-#endif
-
-#endif /* ifndef BSD */
+++ /dev/null
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#ifdef __linux__
-#include <features.h>
-#if defined(__GLIBC__) && !defined(REDSTORM)
-
-/*
- * stddir.c
- *
- * As of glibc 2.3, the new capability to define functions with a 'hidden'
- * attribute means that any time glibc decides to use that capability
- * we will no longer be able to successfully intercept low level calls
- * in a link against default system glibc. Thus the following imported
- * functions.
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <dirent.h>
-
-#include <sysio.h>
-
-#include "sysio-symbols.h"
-#include "stddir.h"
-
-/***********************************************************
- * dir series functions *
- ***********************************************************/
-
-DIR*
-SYSIO_INTERFACE_NAME(opendir)(const char *name)
-{
- DIR *dir;
-
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
-
- dir = (DIR * )calloc(1, sizeof(DIR));
- if (!dir)
- SYSIO_INTERFACE_RETURN(NULL, -ENOMEM);
-
- dir->fd = SYSIO_INTERFACE_NAME(open)(name, O_RDONLY);
- if (dir->fd < 0) {
- free(dir);
- SYSIO_INTERFACE_RETURN(NULL, -errno);
- }
- return dir;
-}
-
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(opendir),
- PREPEND(__, SYSIO_INTERFACE_NAME(opendir)))
-
-int
-SYSIO_INTERFACE_NAME(closedir)(DIR *dir)
-{
- int rc;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
-
- rc = SYSIO_INTERFACE_NAME(close)(dir->fd);
- free(dir);
-
- SYSIO_INTERFACE_RETURN(rc, 0);
-}
-
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(closedir),
- PREPEND(__, SYSIO_INTERFACE_NAME(closedir)))
-
-int
-SYSIO_INTERFACE_NAME(dirfd)(DIR *dir)
-{
- return(dir->fd);
-}
-
-long int
-SYSIO_INTERFACE_NAME(telldir)(DIR *dir)
-{
- return(dir->filepos);
-}
-
-void
-SYSIO_INTERFACE_NAME(seekdir)(DIR *dir, long int offset)
-{
- dir->filepos = offset;
- dir->base = offset;
- dir->effective = 0;
- dir->cur = 0;
-}
-
-void
-SYSIO_INTERFACE_NAME(rewinddir)(DIR *dir)
-{
- dir->base = 0;
- dir->filepos = 0;
- dir->cur = 0;
- dir->effective = 0;
-}
-
-#endif
-#endif
+++ /dev/null
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * stdlib.c
- *
- * The only purpose of this file is help liblustre adaptive to more
- * applications, and specifically for running on Linux. The ideal
- * final solution would be remove this completely and only rely on
- * system call interception. Unfortunately we failed to find that
- * way at the moment.
- *
- * Initially we try the simplest implementation here, just get a confidence
- * it could work.
- *
- */
-#if !(defined(BSD) || defined(REDSTORM))
-
-#include <stdlib.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <dirent.h>
-
-#include <sysio.h>
-
-#include "sysio-symbols.h"
-
-/***********************************************************
- * FIXME workaround for linux only *
- ***********************************************************/
-
-#define LINUX
-#if defined(LINUX)
-ssize_t getxattr(char *path, char *name, void *value, size_t size)
-{
- errno = ENOSYS;
- return -1;
-}
-
-ssize_t lgetxattr(char *path, char *name, void *value, size_t size)
-{
- errno = ENOSYS;
- return -1;
-}
-
-ssize_t fgetxattr(int fd, char *name, void *value, size_t size)
-{
- errno = ENOSYS;
- return -1;
-}
-
-long setxattr(char *path, char *name, void *value, size_t size, int flags)
-{
- errno = ENOSYS;
- return -1;
-}
-
-long lsetxattr(char *path, char *name, void *value, size_t size, int flags)
-{
- errno = ENOSYS;
- return -1;
-}
-
-long fsetxattr(int fd, char *name, void *value, size_t size, int flags)
-{
- errno = ENOSYS;
- return -1;
-}
-
-long listxattr(char *path, char *list, size_t size)
-{
- errno = ENOSYS;
- return -1;
-}
-
-long llistxattr(char *path, char *list, size_t size)
-{
- errno = ENOSYS;
- return -1;
-}
-
-long flistxattr(int fd, char *list, size_t size)
-{
- errno = ENOSYS;
- return -1;
-}
-
-long removexattr(char *path, char *name)
-{
- errno = ENOSYS;
- return -1;
-}
-
-long lremovexattr(char *path, char *name)
-{
- errno = ENOSYS;
- return -1;
-}
-
-long fremovexattr(int fd, char *name)
-{
- errno = ENOSYS;
- return -1;
-}
-#endif
-
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2006 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <unistd.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "fs.h"
-#include "mount.h"
-#include "sysio-symbols.h"
-
-int
-SYSIO_INTERFACE_NAME(symlink)(const char *oldpath, const char *newpath)
-{
- int err;
- struct intent intent;
- struct pnode *pno;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- INTENT_INIT(&intent, INT_CREAT, NULL, NULL);
- err =
- _sysio_namei(_sysio_cwd,
- newpath,
- ND_NOFOLLOW|ND_NEGOK,
- &intent,
- &pno);
- if (err)
- goto out;
- if (pno->p_base->pb_ino) {
- err = -EEXIST;
- goto error;
- }
- err = _sysio_permitted(pno->p_parent, W_OK);
- if (err)
- goto error;
-
- /*
- * Use the parent node operations to request the task in case the
- * driver is implemented using differentiated inode operations based
- * on file type, such as incore does.
- */
- err =
- (*pno->p_parent->p_base->pb_ino->i_ops.inop_symlink)(pno, oldpath);
-error:
- P_RELE(pno);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef __symlink
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(symlink),
- PREPEND(__, SYSIO_INTERFACE_NAME(symlink)))
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <unistd.h>
-#include <string.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "file.h"
-#include "fs.h"
-#include "mount.h"
-
-#include "sysio-symbols.h"
-
-/*
- * Truncate file, given path (alias) or index node.
- */
-static int
-do_truncate(struct pnode *pno, struct inode *ino, _SYSIO_OFF_T length)
-{
- struct intnl_stat stbuf;
- unsigned mask;
-
- if (length < 0)
- return -EINVAL;
-
- if (!ino && pno->p_base->pb_ino)
- ino = pno->p_base->pb_ino;
- if (!ino)
- return -EBADF;
- if (S_ISDIR(ino->i_stbuf.st_mode)) /* for others too? */
- return -EISDIR;
- if (!S_ISREG(ino->i_stbuf.st_mode))
- return -EINVAL;
-
- (void )memset(&stbuf, 0, sizeof(stbuf));
- stbuf.st_size = length;
- mask = SETATTR_LEN;
- return _sysio_setattr(pno, ino, mask, &stbuf);
-}
-
-static int
-PREPEND(_, SYSIO_INTERFACE_NAME(truncate))(const char *path,
- _SYSIO_OFF_T length)
-{
- int err;
- struct pnode *pno;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- err = _sysio_namei(_sysio_cwd, path, 0, NULL, &pno);
- if (err)
- goto out;
- err = do_truncate(pno, pno->p_base->pb_ino, length);
- P_RELE(pno);
-
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef _LARGEFILE64_SOURCE
-#undef truncate64
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(truncate)),
- SYSIO_INTERFACE_NAME(truncate64))
-
-#undef truncate
-int
-SYSIO_INTERFACE_NAME(truncate)(const char *path, off_t length)
-{
-
- return PREPEND(_, SYSIO_INTERFACE_NAME(truncate))(path, length);
-}
-#else
-#undef truncate
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(truncate)),
- SYSIO_INTERFACE_NAME(truncate))
-#endif
-
-static int
-PREPEND(_, SYSIO_INTERFACE_NAME(ftruncate))(int fd, _SYSIO_OFF_T length)
-{
- int err;
- struct file *fil;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- err = 0;
- fil = _sysio_fd_find(fd);
- if (!fil) {
- err = -EBADF;
- goto out;
- }
- if (!F_CHKRW(fil, 'w')) {
- err = -EBADF;
- goto out;
- }
- err = do_truncate(NULL, fil->f_ino, length);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef _LARGEFILE64_SOURCE
-#undef ftruncate64
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(ftruncate)),
- SYSIO_INTERFACE_NAME(ftruncate64))
-
-#undef ftruncate
-int
-SYSIO_INTERFACE_NAME(ftruncate)(int fd, off_t length)
-{
-
- return PREPEND(_, SYSIO_INTERFACE_NAME(ftruncate))(fd, length);
-}
-#else
-#undef ftruncate
-sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(ftruncate)),
- SYSIO_INTERFACE_NAME(ftruncate))
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2006 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <unistd.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "fs.h"
-#include "mount.h"
-#include "sysio-symbols.h"
-
-int
-SYSIO_INTERFACE_NAME(unlink)(const char *path)
-{
- struct intent intent;
- int err;
- struct pnode *pno;
- struct inode *ino;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- INTENT_INIT(&intent, INT_UPDPARENT, NULL, NULL);
- err = _sysio_namei(_sysio_cwd, path, ND_NOFOLLOW, &intent, &pno);
- if (err)
- goto out;
-
- err = _sysio_permitted(pno->p_parent, W_OK);
- if (err)
- goto error;
-
- ino = pno->p_base->pb_ino;
- /*
- * Use the parent node operations to request the task in case the
- * driver is implemented using differentiated inode operations based
- * on file type, such as incore does.
- */
- err = (*pno->p_parent->p_base->pb_ino->i_ops.inop_unlink)(pno);
- if (err)
- goto error;
- assert(pno->p_base->pb_ino);
- /*
- * Invalidate the path node.
- */
- ino = pno->p_base->pb_ino;
- pno->p_base->pb_ino = NULL;
- /*
- * Kill the i-node. I've thought and thought about this. We
- * can't allow it to be found via namei any longer because we
- * can't count on generation numbers support and have no
- * clue why there might be other soft-references -- Could
- * be an open file.
- */
- I_GONE(ino);
-
-error:
- P_RELE(pno);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
-
-#ifdef REDSTORM
-#undef __unlink
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(unlink),
- PREPEND(__, SYSIO_INTERFACE_NAME(unlink)))
-#endif
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <time.h>
-#include <assert.h>
-#include <sys/types.h>
-#include <utime.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <sys/queue.h>
-#include <sys/time.h>
-
-#include "sysio.h"
-#include "inode.h"
-#include "file.h"
-
-time_t
-_sysio_local_time()
-{
- struct timeval tv;
-
- if (gettimeofday(&tv, NULL) != 0)
- abort();
- return tv.tv_sec;
-}
-
-int
-SYSIO_INTERFACE_NAME(utime)(const char *path, const struct utimbuf *buf)
-{
- int err;
- struct pnode *pno;
- struct utimbuf _utbuffer;
- struct intnl_stat stbuf;
- SYSIO_INTERFACE_DISPLAY_BLOCK;
-
- SYSIO_INTERFACE_ENTER;
- err = _sysio_namei(_sysio_cwd, path, 0, NULL, &pno);
- if (err)
- goto out;
- if (!buf) {
- _utbuffer.actime = _utbuffer.modtime = _SYSIO_LOCAL_TIME();
- buf = &_utbuffer;
- }
- (void )memset(&stbuf, 0, sizeof(struct intnl_stat));
- stbuf.st_atime = buf->actime;
- stbuf.st_mtime = buf->modtime;
- err =
- _sysio_setattr(pno,
- pno->p_base->pb_ino,
- SETATTR_ATIME | SETATTR_MTIME,
- &stbuf);
- P_RELE(pno);
-out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
-}
+++ /dev/null
-/Makefile.in
+++ /dev/null
-noinst_PROGRAMS = test_copy test_stats test_path test_list \
- test_getcwd test_link test_unlink test_symlink test_rename \
- test_regions test_stddir test_fcntl_lock test_mknod test_mkdir \
- test_chown
-
-CLEANFILES=drv_data.c
-
-if WITH_NATIVE_DRIVER
-NATIVE_DRIVER_NAME=native
-NATIVE_DRIVER_CFLAGS= -I$(top_srcdir)/drivers/native
-else
-NATIVE_DRIVER_NAME=
-NATIVE_DRIVER_CFLAGS=
-endif
-
-if WITH_INCORE_DRIVER
-INCORE_DRIVER_NAME=incore
-INCORE_DRIVER_CFLAGS= -I$(top_srcdir)/drivers/incore
-else
-INCORE_DRIVER_NAME=
-INCORE_DRIVER_CFLAGS=
-endif
-
-if WITH_CPLANT_YOD
-YOD_DRIVER_NAME=yod
-YOD_DRIVER_CFLAGS= -DCPLANT_YOD
-else
-YOD_DRIVER_NAME=
-YOD_DRIVER_CFLAGS=
-endif
-
-DRIVERS=$(NATIVE_DRIVER_NAME) $(INCORE_DRIVER_NAME) $(YOD_DRIVER_NAME) \
- $(STFD_DEV_NAME)
-
-CMNSRC=startup.c drv_init_all.c drv_data.c
-
-BUILT_SOURCES=drv_data.c
-
-CFL=$(AM_CFLAGS) $(AM_CPPFLAGS) \
- $(NATIVE_DRIVER_CFLAGS) $(INCORE_DRIVER_CFLAGS) \
- $(STDFD_DEV_CFLAGS) $(YOD_DRIVER_CFLAGS)
-
-LIBS=$(LIBBUILD_DIR)/libsysio.a
-
-test_copy_SOURCES=test_copy.c $(CMNSRC)
-test_copy_CFLAGS=$(CFL)
-test_copy_DEPENDENCIES=$(LIBS)
-
-test_stats_SOURCES=test_stats.c $(CMNSRC)
-test_stats_CFLAGS=$(CFL)
-test_stats_DEPENDENCIES=$(LIBS)
-
-test_path_SOURCES=test_path.c $(CMNSRC)
-test_path_CFLAGS=$(CFL)
-test_path_DEPENDENCIES=$(LIBS)
-
-test_list_SOURCES=test_list.c $(CMNSRC)
-test_list_CFLAGS=$(CFL)
-test_list_DEPENDENCIES=$(LIBS)
-
-test_getcwd_SOURCES=test_getcwd.c $(CMNSRC)
-test_getcwd_CFLAGS=$(CFL)
-test_getcwd_DEPENDENCIES=$(LIBS)
-
-test_link_SOURCES=test_link.c $(CMNSRC)
-test_link_CFLAGS=$(CFL)
-test_link_DEPENDENCIES=$(LIBS)
-
-test_unlink_SOURCES=test_unlink.c $(CMNSRC)
-test_unlink_CFLAGS=$(CFL)
-test_unlink_DEPENDENCIES=$(LIBS)
-
-test_symlink_SOURCES=test_symlink.c $(CMNSRC)
-test_symlink_CFLAGS=$(CFL)
-test_symlink_DEPENDENCIES=$(LIBS)
-
-test_rename_SOURCES=test_rename.c $(CMNSRC)
-test_rename_CFLAGS=$(CFL)
-test_rename_DEPENDENCIES=$(LIBS)
-
-test_regions_SOURCES=test_regions.c $(CMNSRC)
-test_regions_CFLAGS=$(CFL)
-test_regions_DEPENDENCIES=$(LIBS)
-
-test_stddir_SOURCES=test_stddir.c $(CMNSRC)
-test_stddir_CFLAGS=$(CFL)
-test_stddir_DEPENDENCIES=$(LIBS)
-
-test_fcntl_lock_SOURCES=test_fcntl_lock.c $(CMNSRC)
-test_fcntl_lock_CFLAGS=$(CFL)
-test_fcntl_lock_DEPENDENCIES=$(LIBS)
-
-test_mknod_SOURCES=test_mknod.c $(CMNSRC)
-test_mknod_CFLAGS=$(CFL)
-test_mknod_DEPENDENCIES=$(LIBS)
-
-test_mkdir_SOURCES=test_mkdir.c $(CMNSRC)
-test_mkdir_CFLAGS=$(CFL)
-test_mkdir_DEPENDENCIES=$(LIBS)
-
-test_chown_SOURCES=test_chown.c $(CMNSRC)
-test_chown_CFLAGS=$(CFL)
-test_chown_DEPENDENCIES=$(LIBS)
-
-drv_data.c: $(CONFIG_DEPENDENCIES) $(top_srcdir)/tests/gendrvdata.sh
- test -z "drv_data.c" && rm -f drv_data.c; \
- $(SHELL) $(top_srcdir)/tests/gendrvdata.sh $(DRIVERS) > drv_data.c
-
-lib_LIBRARIES=libruntime.a
-
-libruntime_a_SOURCES=sysio-run-start.c startup.c drv_init_all.c drv_data.c
-
-AM_CFLAGS = -L$(LIBBUILD_DIR)
-include $(top_srcdir)/Rules.make
+++ /dev/null
-To run the tests, just do a "make check" in the tests subdirectory.
-On the CPlant alpha systems, 3 of the 7 tests in test_all.pl are excluded
-due to known problems (problems as of the date of writing this; they
-may have since been fixed). You can also manually run the individual
-tests or ./test_all.pl. If you are running on CPlant, you need to
-run test_all.pl with a -alpha argument. Either "make check" or
-test_all.pl will run the 7 basic functionality tests (explained
-below) and report the total number of passes and failures.
-number of passes and failures.
-
------------------------SCRIPTS---------------------------------
-
-There are a total of 8 scripts: test_copy.pl, test_list.pl,
-test_getcwd.pl, test_stats.pl, test_stdfd.pl, test_path.pl,
-populator.pl, and verifier.pl. All but the last two scripts
-are ran with the test_all.pl script. Here is an explanation
-of the scripts. All scripts take an optional "-alpha" arg
-for running the scripts in an alpha/cplant environment. The
-alpha arg makes certain assumptions about the running of the
-environment; for example, it does not initilization and it
-starts off the test driver with yod.
-
-test_copy.pl <src> <dest> : This copies a file from src to dest.
- : It runs a system cmp to verify that
- : the two files are equivalent
-
-test_list.pl [-p] <dir> : This comes in two forms.
-test_list.pl [-p] <fstype:mdir> <dir> : In the first form, it will
- : parse through the getdirentries
- : result in order to generate a
- : a listing. If the -p option is
- : given, it will print out the
- : listing. In the second form, it
- : mounts mdir into dir and then does
- : the listing
-
-test_getcwd.pl <dir> : Tests getcwd by verifying that setting the current
- : working directory to dir and then calling getcwd
- : returns dir
-
-test_stats.pl <file> : Verifies that the set of stat calls (stat, fstat,
- : fstatvfs, statvfs) return the same set of stats for file
- : and that the calls return the same items as Perl's stat
- : call (which would use a native library and not libsysio)
-
-test_stdfd.pl <file> : Verified that stdin, stdout, and stderr can be opened and
- : either written to or read from
-
-test_path.pl <path1> <path2> ... : Print each path listed and its type.
- : If no paths are given, paths are read
- : from stdin until a "quit" is given
-
-populator.pl [-seed seed] : Create a file and populate with random numbers.
- [-file filename] : Will use the given seed for the random number
- [-bytes bytes] : generator if it is given, otherwise it uses the
- : the current time as a seed. The seed used is
- : returned. If no filename is given, the file
- : will be named randfile.seed.procnum, where seed
- : is the seed used and procnum is the process number
- : of the script. If no bytes are given, 1024 bytes
- : are written. All write commands use libsysio
-
-
-verifier.pl <-seed seed> <-file fname> : Verifies that all bytes in the file fname
- : (which was created with populator) match the
- : random numbers which would have been used with
- : the populator, using the given seed.
-
-
-
------------------------------TEST DRIVER---------------------------------
-
-
-There are 6 basic commands for the test driver, CALL, PRINT,
-ALLOC, FREE, HELP, and exit (EXIT, quit, or QUIT will also work).
-
-CALL is the main command for running libsysio calls. The format
-will depend on the particular libsysio command being ran.
-Basically, the format is CALL cmd args. The available commands
-used with CALL are (in no particular order):
-
-fstat iwrite read chdir
-fstatvfs iwritev readv chmod
-fsync list rmdir chown
-ftruncate lseek sizeof close
-getcwd lstat stat cmpstr
-getdirentries mkdir statvfs creat
-init mknod symlink debug
-ioctl mount truncate dup
-iodone open umask dup2
-iowait umount endian ipread
-printline unlink ipreadv pread
-write fcntl ipwrite preadv
-writev fdatasync ipwritev pwritev
-fill iread pwrite ireadv
-
-The specifics of the commands are explained later.
-
-The return value from a command can be saved and referenced later
-by using a syntax similar to $foo = x. Commands can be combined, such
-as:
-
-CALL fstat ( $fd = CALL open foo ) ( $buf = ALLOC 128 ),
-
-with some cautionary notes. First, everything needs to be
-seperated by a space. File names with spaces in them need to be quoted,
-as in:
-
-$fd = CALL open "file with spaces" O_RDONLY
-
-Second, any value that is used needs to be identified with an identifier.
-In other words, the command:
-
-$buf = ALLOC ( CALL sizeof stat )
-
-will not work, but the command
-
-$buf = ALLOC ( $size = CALL sizeof stat )
-
-will.
-
-
-All commands return a 4 digit status code. The codes are:
-
-0000 : Success. This does NOT necessarily mean that the libsysio
- : command returned success, only that there were no errors
- : in issuing the command to libsysio. To get the result of
- : the libsysio command, use PRINT $$ . PRINT $errno will return
- : the last error code.
-0x001 : Invalid arguments given to command
-0x002 : Invalid command issued
-0x004 : Invalid variable identifier given
-
-
-ALLOC takes a size argument and an optional alignment argument.
-FREE takes the variable to free as an argument.
-HELP without any arguments displays the list of commands.
-HELP <cmd> will give information on the specific command
-
-PRINT take several forms. To just print out a variable, type
-PRINT $var-name. If the variable is an integer, it will return
-the integer. If it is a string, it will print out the string.
-If it is a buffer, it will print out the buffer as a series of
-hex digits. Note for most buffers, the test driver will not
-know what it contains--just because it should contain a string
-does not mean that the driver will know that.
-
-The other form of PRINT is:
-
-PRINT $var_name <offset> <length> <type>
-
-which will print out length units of the given type starting at
-the given offset. The length is the total length in bytes, so
-for an integer, a length of 4 would only print out one integer.
-The length argument is ignored for strings. Allowable types are
-INT SHORT CHAR and LONG.
-
-For most of the CALL commands, their format is similar to the
-related sysio call. The ones that do not have a corresponding
-sysio call are listed below:
-
-init: This MUST be called prior to any sysio calls. It initilizes
- : libsysio
-
-printline: If debugging is turned on, this will print a line number
- : with any debug lines
-
-fill <val> <type> <size> <offset> <buf>: Fills buffer buf with size
- : bytes of val starting at
- : buf+offset. The type of val
- : can be UINT. STR, or PTR and
- : is given by the type arg
-
-list <dir>: Lists contents of dir. If no dir is given, uses cwd
-
-debug <num>: Sets debug level to num
-
-sizeof <obj>: Gives the size of the obj. Valid objs are char, int,
- : long, flock, stat, and statvfs
-
-endian: returns 0 if the machine is little endian, one otherwise
-
-cmpstr <buf1> <buf2>: Issues a strcmp call on the two buffers to
- : see if they are the same. Returns 0 for a
- : match
+++ /dev/null
-#include <stdio.h>
-
-extern int (*drvinits[])(void);
-
-/*
- * Init all the drivers we know about.
- */
-int
-drv_init_all()
-{
- int (**f)(void);
- int err;
-
- err = 0;
- f = drvinits;
- while (*f) {
- err = (**f++)();
- if (err)
- return err;
- }
-
- return 0;
-}
+++ /dev/null
-#!/bin/sh
-
-# This Cplant(TM) source code is the property of Sandia National
-# Laboratories.
-#
-# This Cplant(TM) source code is copyrighted by Sandia National
-# Laboratories.
-#
-# The redistribution of this Cplant(TM) source code is subject to the
-# terms of the GNU Lesser General Public License
-# (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
-#
-# Cplant(TM) Copyright 1998-2003 Sandia Corporation.
-# Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
-# license for use of this work by or on behalf of the US Government.
-# Export of this program may require a license from the United States
-# Government.
-
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# Questions or comments about this library should be sent to:
-#
-# Lee Ward
-# Sandia National Laboratories, New Mexico
-# P.O. Box 5800
-# Albuquerque, NM 87185-1110
-#
-# lee@sandia.gov
-
-echo '/*'
-echo ' * This file automatically generated by gendrvdata.sh. All changes'
-echo ' * will be lost!'
-echo ' */'
-echo
-echo '#include <stdlib.h>'
-echo
-echo '#include "test.h"'
-echo
-for i in $@; do
- echo "extern int _sysio_${i}_init(void);"
-done
-echo
-echo 'int (*drvinits[])(void) = {'
-
-for i in $@; do
- echo " _sysio_${i}_init,"
-done
-echo " NULL"
-echo "};"
+++ /dev/null
-TESTS_EXTRA = tests/drv_init_all.c tests/startup.c tests/sysio-run-start.c \
- tests/test_chown.c tests/test_copy.c tests/test_fcntl_lock.c \
- tests/test_getcwd.c tests/test.h tests/test_link.c tests/test_list.c \
- tests/test_mkdir.c tests/test_mknod.c tests/test_path.c \
- tests/test_regions.c tests/test_rename.c tests/test_stats.c \
- tests/test_stddir.c tests/test_symlink.c tests/test_unlink.c \
- tests/Makefile.am tests/Makefile.in tests/module.mk
+++ /dev/null
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/queue.h>
-
-#include "test.h"
-
-#include "sysio.h"
-#include "xtio.h"
-
-int
-_test_sysio_startup()
-{
- int err;
- char *arg;
-
- err = _sysio_init();
- if (err)
- return err;
- err = drv_init_all();
- if (err)
- return err;
-#ifdef SYSIO_TRACING
- /*
- * tracing
- */
- arg = getenv("SYSIO_TRACING");
- err = _sysio_boot("trace", arg);
- if (err)
- return err;
-#endif
- /*
- * namespace
- */
- arg = getenv("SYSIO_NAMESPACE");
- if (!(arg || (arg = getenv("SYSIO_MANUAL")))) {
- /*
- * Assume a native mount at root with automounts enabled.
- */
- arg = "{mnt,dev=\"native:/\",dir=/,fl=2}";
- }
- err = _sysio_boot("namespace", arg);
- if (err)
- return err;
-#ifdef DEFER_INIT_CWD
- /*
- * Current working directory.
- */
- arg = getenv("SYSIO_CWD");
- if (!arg)
- arg = "/";
- err = _sysio_boot("cwd", arg);
- if (err)
- return err;
-#endif
- return 0;
-}
-
-void
-_test_sysio_shutdown()
-{
-
- _sysio_shutdown();
-}
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/uio.h>
-#include <xtio.h>
-#include "test.h"
-
-void _sysio_startup(void) __attribute__ ((constructor));
-
-void
-_sysio_startup()
-{
- int err;
-
- err = _test_sysio_startup();
- if (err) {
- errno = -err;
- perror("sysio startup");
- abort();
- }
- if (atexit(_test_sysio_shutdown) != 0) {
- perror("atexit");
- abort();
- }
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-extern int (*drvinits[])(void);
-
-extern int drv_init_all(void);
-extern int _test_sysio_startup(void);
-extern void _test_sysio_shutdown(void);
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2007 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <getopt.h>
-
-#if defined(SYSIO_LABEL_NAMES)
-#include "sysio.h"
-#endif
-#include "test.h"
-
-/*
- * Test chown call
- *
- * Usage: chown <path> <uid> <gid>
- *
- */
-
-static void usage(void);
-
-int
-main(int argc, char *const argv[])
-{
- int (*chown_func)(const char *, uid_t, gid_t);
- int (*stat_func)(const char *, struct stat *);
- int i;
- int err;
- int n;
- char *path;
- uid_t uid;
- gid_t gid;
- struct stat stbuf;
- extern int _test_sysio_startup(void);
-
- chown_func = SYSIO_INTERFACE_NAME(chown);
- stat_func = SYSIO_INTERFACE_NAME(stat);
-
- /*
- * Parse command line arguments.
- */
- while ((i = getopt(argc, argv, "")) != -1)
- switch (i) {
-
- default:
- usage();
- }
-
- /*
- * Init sysio lib.
- */
- err = _test_sysio_startup();
- if (err) {
- errno = -err;
- perror("sysio startup");
- exit(1);
- }
-
- n = argc - optind;
- if (n < 3) usage();
-
- path = argv[optind++];
- uid = atoi(argv[optind++]);
- gid = atoi(argv[optind++]);
-
- do {
- err = (*chown_func)(path, uid, gid);
- if (err != 0) {
- perror(path);
- break;
- }
- err = (*stat_func)(path, &stbuf);
- if (err != 0) {
- perror(path);
- break;
- }
- (void )printf("uid now %ld, gid now %ld\n",
- (long )stbuf.st_uid, (long )stbuf.st_gid);
- } while (0);
-
- /*
- * Clean up.
- */
- _test_sysio_shutdown();
-
- return err ? -1 : 0;
-}
-
-static void
-usage()
-{
-
- (void )fprintf(stderr,
- "Usage: chown"
- " <path> <uid> <gid>\n");
-
- exit(1);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/uio.h>
-#include <sys/queue.h>
-#include <getopt.h>
-
-#if defined(SYSIO_LABEL_NAMES)
-#include "sysio.h"
-#endif
-#include "xtio.h"
-#include "test.h"
-
-/*
- * Copy one file to another.
- *
- * Usage: test_copy [-o] <src> <dest>
- *
- * Destination will not be overwritten if it already exist.
- */
-
-static int overwrite = 0; /* over-write? */
-
-void usage(void);
-int copy_file(const char *spath, const char *dpath);
-
-int
-main(int argc, char * const argv[])
-{
- int i;
- int err;
- const char *spath, *dpath;
-
- /*
- * Parse command-line args.
- */
- while ((i = getopt(argc,
- argv,
- "o"
- )) != -1)
- switch (i) {
-
- case 'o':
- overwrite = 1;
- break;
- default:
- usage();
- }
-
- if (!(argc - optind))
- usage();
- err = _test_sysio_startup();
- if (err) {
- errno = -err;
- perror("sysio startup");
- exit(1);
- }
-
- /*
- * Source
- */
- spath = argv[optind++];
- if (!(argc - optind))
- usage();
- /*
- * Destination
- */
- dpath = argv[optind++];
- if (argc - optind)
- usage();
-
- err = copy_file(spath, dpath);
-
- _test_sysio_shutdown();
-
- return err;
-}
-
-void
-usage()
-{
-
- (void )fprintf(stderr,
- "Usage: test_copy "
- " source destination\n");
- exit(1);
-}
-
-int
-open_file(const char *path, int flags, mode_t mode)
-{
- int fd;
-
- fd = SYSIO_INTERFACE_NAME(open)(path, flags, mode);
- if (fd < 0)
- perror(path);
-
- return fd;
-}
-
-int
-copy_file(const char *spath, const char *dpath)
-{
- int sfd, dfd;
- int flags;
- int rtn;
- struct stat stat;
- char *buf;
- size_t bufsiz;
- ssize_t cc, wcc;
-
- sfd = dfd = -1;
- rtn = -1;
- buf = NULL;
-
- sfd = open_file(spath, O_RDONLY, 0);
- if (sfd < 0)
- goto out;
- flags = O_CREAT|O_WRONLY;
- if (!overwrite)
- flags |= O_EXCL;
- dfd = open_file(dpath, flags, 0666);
- if (dfd < 0)
- goto out;
-
- rtn = SYSIO_INTERFACE_NAME(fstat)(dfd, &stat);
- if (rtn != 0) {
- perror(dpath);
- goto out;
- }
- bufsiz = stat.st_blksize;
- if (bufsiz < (64 * 1024))
- bufsiz =
- (((64 * 1024) / stat.st_blksize - 1) + 1) * (64 * 1024);
- buf = malloc(bufsiz);
- if (!buf) {
- perror(dpath);
- goto out;
- }
-
- while ((cc = SYSIO_INTERFACE_NAME(read)(sfd, buf, bufsiz)) > 0)
- if ((wcc = SYSIO_INTERFACE_NAME(write)(dfd, buf, cc)) != cc) {
- if (wcc < 0) {
- perror(dpath);
- break;
- }
- (void )fprintf(stderr,
- "%s: short write (%u/%u)\n",
- dpath,
- (unsigned )wcc,
- (unsigned )cc);
- break;
- }
- if (cc < 0) {
- perror(spath);
- rtn = -1;
- }
-
-out:
- if (buf)
- free(buf);
- if (sfd >= 0 && SYSIO_INTERFACE_NAME(close)(sfd) != 0)
- perror(spath);
- if (dfd >= 0 &&
- (SYSIO_INTERFACE_NAME(fsync)(dfd) != 0 ||
- SYSIO_INTERFACE_NAME(close)(dfd) != 0))
- perror(dpath);
-
- return rtn;
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2005 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <getopt.h>
-
-#if defined(SYSIO_LABEL_NAMES)
-#include "sysio.h"
-#endif
-#include "xtio.h"
-#include "test.h"
-
-/*
- * fcntl lock tests
- *
- * Usage: test_fcnt_lock [<path> ...]
- */
-
-void usage(void);
-void do_tests(const char *path);
-
-int
-main(int argc, char * const argv[])
-{
- int i;
- int err;
- extern int _test_sysio_startup(void);
-
- /*
- * Parse command-line args.
- */
- while ((i = getopt(argc, argv, "")) != -1)
- switch (i) {
-
- default:
- usage();
- }
-
- err = _test_sysio_startup();
- if (err) {
- errno = -err;
- perror("sysio startup");
- exit(1);
- }
-
- while (optind < argc)
- do_tests(argv[optind++]);
-
- /*
- * Clean up.
- */
- _test_sysio_shutdown();
-
- return 0;
-}
-
-void
-usage()
-{
-
- (void )fprintf(stderr,
- "Usage: test_fcntl_lock"
- " source...\n");
- exit(1);
-}
-
-void
-do_tests(const char *path)
-{
- int fd;
- int err;
- struct flock flock;
-
- fd = SYSIO_INTERFACE_NAME(open)(path, O_RDONLY);
- if (fd < 0) {
- perror(path);
- return;
- }
- do {
- flock.l_type = F_RDLCK;
- flock.l_whence = SEEK_CUR;
- flock.l_start = 0;
- flock.l_len = 0;
- flock.l_pid = 0;
- err = SYSIO_INTERFACE_NAME(fcntl)(fd, F_SETLK, &flock);
- if (err)
- break;
- flock.l_type = F_UNLCK;
- err = SYSIO_INTERFACE_NAME(fcntl)(fd, F_SETLK, &flock);
- if (err)
- break;
- } while (0);
-
- if (err)
- perror(path);
- if (SYSIO_INTERFACE_NAME(close)(fd) != 0)
- perror(path);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/uio.h>
-#include <sys/queue.h>
-#include <dirent.h>
-#include <getopt.h>
-
-#if defined(SYSIO_LABEL_NAMES)
-#include "sysio.h"
-#endif
-#include "xtio.h"
-#include "mount.h"
-
-#include "test.h"
-
-/*
- * Test getcwd()
- *
- * Usage: test_cwd [<working-dir>...]
- *
- * Without any path arguments, the program reads from standard-in, dealing with
- * each line as an absolute or relative path until EOF.
- */
-
-static int doit(const char *path);
-static void usage(void);
-
-int
-main(int argc, char *const argv[])
-{
- int i;
- int err;
- int n;
- extern int _test_sysio_startup(void);
-
- /*
- * Parse command line arguments.
- */
- while ((i = getopt(argc, argv, "")) != -1)
- switch (i) {
-
- default:
- usage();
- }
- /*
- * Init sysio lib.
- */
- err = _test_sysio_startup();
- if (err) {
- errno = -err;
- perror("sysio startup");
- exit(1);
- }
-
- n = argc - optind;
-
- /*
- * Try path(s) listed on command-line.
- */
- while (optind < argc) {
- const char *path;
-
- path = argv[optind++];
- (void )doit(path);
- }
-
- /*
- * If no command-line arguments, read from stdin until EOF.
- */
- if (!n) {
- int doflush;
- static char buf[4096];
- size_t len;
- char *cp;
- char c;
-
- doflush = 0;
- while (fgets(buf, sizeof(buf), stdin) != NULL) {
- len = strlen(buf);
- cp = buf + len - 1;
- c = *cp;
- *cp = '\0';
- if (!doflush)
- doit(buf);
- doflush = c == '\n' ? 0 : 1;
- }
- }
-
- /*
- * Clean up.
- */
- _test_sysio_shutdown();
-
- return 0;
-}
-
-static int
-doit(const char *path)
-{
- char *buf;
-
- if (SYSIO_INTERFACE_NAME(chdir)(path) != 0) {
- perror(path);
- return -1;
- }
- buf = SYSIO_INTERFACE_NAME(getcwd)(NULL, 0);
- if (!buf) {
- perror(path);
- return -1;
- }
- (void )printf("%s\n", buf);
- free(buf);
- return 0;
-}
-
-static void
-usage()
-{
-
- (void )fprintf(stderr,
- "Usage: test_getcwd "
- " [<path> ...\n]");
-
- exit(1);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#if 0
-#include <dirent.h>
-#endif
-#include <sys/uio.h>
-#include <sys/queue.h>
-#include <getopt.h>
-
-#if defined(SYSIO_LABEL_NAMES)
-#include "sysio.h"
-#endif
-#include "xtio.h"
-#include "test.h"
-
-/*
- * Test hard link
- *
- * Usage: link oldpath newpath
- *
- */
-
-static void usage(void);
-
-int
-main(int argc, char *const argv[])
-{
- int i;
- int err;
- int n;
- extern int _test_sysio_startup(void);
-
- /*
- * Parse command line arguments.
- */
- while ((i = getopt(argc, argv, "")) != -1)
- switch (i) {
-
- default:
- usage();
- }
-
- /*
- * Init sysio lib.
- */
- err = _test_sysio_startup();
- if (err) {
- errno = -err;
- perror("sysio startup");
- exit(1);
- }
-
- n = argc - optind;
- if (n < 2) usage();
-
- /*
- * Try paths listed on command-line.
- */
- while (optind < argc) {
- const char *old, *new;
- struct stat stbuf;
-
- old = argv[optind++];
- new = argv[optind++];
- if ((err = SYSIO_INTERFACE_NAME(link)(old, new)) != 0) {
- perror("link");
- break;
- }
- if ((err = SYSIO_INTERFACE_NAME(lstat)(new, &stbuf)) != 0) {
- perror(new);
- break;
- }
- }
-
- /*
- * Clean up.
- */
- _test_sysio_shutdown();
-
- return err ? -1 : 0;
-}
-
-static void
-usage()
-{
-
- (void )fprintf(stderr,
- "Usage: unlink"
- " oldpath newpath\n");
-
- exit(1);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <sys/uio.h>
-#include <sys/queue.h>
-#include <getopt.h>
-
-#if defined(SYSIO_LABEL_NAMES)
-#include "sysio.h"
-#endif
-#include "xtio.h"
-#include "test.h"
-
-/*
- * Stat files.
- *
- * Usage: test_list [path...]
- *
- * Without any path arguments, the program reads from standard-in, dealing with
- * each line as an absolute or relative path until EOF.
- */
-
-static int listit(const char *path);
-static void usage(void);
-
-int
-main(int argc, char *const argv[])
-{
- int i;
- int err;
- int n;
- extern int _test_sysio_startup(void);
-
- /*
- * Parse command line arguments.
- */
- while ((i = getopt(argc, argv, "")) != -1)
- switch (i) {
-
- default:
- usage();
- }
-
- /*
- * Init sysio lib.
- */
- err = _test_sysio_startup();
- if (err) {
- errno = -err;
- perror("sysio startup");
- exit(1);
- }
-
- n = argc - optind;
-
- /*
- * Try path(s) listed on command-line.
- */
- while (optind < argc) {
- const char *path;
-
- path = argv[optind++];
- (void )listit(path);
- }
-
- /*
- * If no command-line arguments, read from stdin until EOF.
- */
- if (!n) {
- int doflush;
- static char buf[4096];
- size_t len;
- char *cp;
- char c;
-
- doflush = 0;
- while (fgets(buf, sizeof(buf), stdin) != NULL) {
- len = strlen(buf);
- cp = buf + len - 1;
- c = *cp;
- *cp = '\0';
- if (!doflush)
- listit(buf);
- doflush = c == '\n' ? 0 : 1;
- }
- }
-
- /*
- * Clean up.
- */
- _test_sysio_shutdown();
-
- return 0;
-}
-
-static int
-listit(const char *path)
-{
- int fd;
- size_t n;
- struct dirent *buf, *dp;
- off_t base;
- ssize_t cc;
-
- fd = SYSIO_INTERFACE_NAME(open)(path, O_RDONLY);
- if (fd < 0) {
- perror(path);
- return -1;
- }
-
- n = 16 * 1024;
- buf = malloc(n);
- if (!buf) {
- perror(path);
- cc = -1;
- goto out;
- }
-
- while ((cc = SYSIO_INTERFACE_NAME(getdirentries)(fd,
- (char *)buf,
- n,
- &base)) > 0) {
- dp = buf;
- while (cc > 0) {
- (void )printf("\t%s: ino %llu type %u\n",
- dp->d_name,
- (unsigned long long )dp->d_ino,
- (int )dp->d_type);
- cc -= dp->d_reclen;
- dp = (struct dirent *)((char *)dp + dp->d_reclen);
- }
- }
-
-out:
- if (cc < 0)
- perror(path);
-
- free(buf);
- {
- int oerrno = errno;
-
- if (SYSIO_INTERFACE_NAME(close)(fd) != 0) {
- perror(path);
- if (cc < 0)
- errno = oerrno;
- else
- cc = -1;
- }
- }
-
- return (int )cc;
-}
-
-static void
-usage()
-{
-
- (void )fprintf(stderr,
- "Usage: list_path"
- " [<path> ...\n]");
-
- exit(1);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2006 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#if 0
-#include <dirent.h>
-#endif
-#include <getopt.h>
-
-#if defined(SYSIO_LABEL_NAMES)
-#include "sysio.h"
-#endif
-#include "test.h"
-
-/*
- * Make directories.
- *
- * Usage: mkdir [path...]
- *
- * Without any path arguments, the program creates directories named
- * by the command line args.
- */
-
-static int do_mkdir(const char *path);
-static void usage(void);
-
-int
-main(int argc, char *const argv[])
-{
- int i;
- int err;
- int n;
- extern int _test_sysio_startup(void);
-
- /*
- * Parse command line arguments.
- */
- while ((i = getopt(argc, argv, "")) != -1)
- switch (i) {
-
- default:
- usage();
- }
-
- /*
- * Init sysio lib.
- */
- err = _test_sysio_startup();
- if (err) {
- errno = -err;
- perror("sysio startup");
- exit(1);
- }
-
- n = argc - optind;
-
- /*
- * Try path(s) listed on command-line.
- */
- while (optind < argc) {
- const char *path;
-
- path = argv[optind++];
- (void )do_mkdir(path);
- }
-
- /*
- * If no command-line arguments, read from stdin until EOF.
- */
- if (!n) {
- int doflush;
- static char buf[4096];
- size_t len;
- char *cp;
- char c;
-
- doflush = 0;
- while (fgets(buf, sizeof(buf), stdin) != NULL) {
- len = strlen(buf);
- cp = buf + len - 1;
- c = *cp;
- *cp = '\0';
- if (!doflush)
- do_mkdir(buf);
- doflush = c == '\n' ? 0 : 1;
- }
- }
-
- /*
- * Clean up.
- */
- _test_sysio_shutdown();
-
- return 0;
-}
-
-static int
-do_mkdir(const char *path)
-{
-
- if (SYSIO_INTERFACE_NAME(mkdir)(path, 777) != 0) {
- perror(path);
- return -1;
- }
-
- return 0;
-}
-
-static void
-usage()
-{
-
- (void )fprintf(stderr,
- "Usage: mkdir"
- " [<path> ...\n]");
-
- exit(1);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2006 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-/*
- * Can't provoke a definition of the S_IFMT macros without a little extra work.
- */
-#define _BSD_SOURCE
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <getopt.h>
-
-#if defined(SYSIO_LABEL_NAMES)
-#include "sysio.h"
-#endif
-#include "test.h"
-
-/*
- * Create a node.
- *
- * Usage: mknod path {f|b|c} [dev]
- *
- * The dev argument should not be present for regular file and FIFO object
- * creation.
- */
-
-static int do_mknod(const char *path, mode_t mode, dev_t dev);
-static void usage(void);
-
-int
-main(int argc, char *const argv[])
-{
- int i;
- int err;
- mode_t mode;
- dev_t dev;
- extern int _test_sysio_startup(void);
-
- /*
- * Parse command line arguments.
- */
- while ((i = getopt(argc, argv, "")) != -1)
- switch (i) {
-
- default:
- usage();
- }
-
- /*
- * Init sysio lib.
- */
- err = _test_sysio_startup();
- if (err) {
- errno = -err;
- perror("sysio startup");
- exit(1);
- }
-
- if (argc - optind < 2)
- usage();
- if (strlen(argv[optind + 1]) != 1)
- usage();
- mode = 0666;
- switch (*argv[optind + 1]) {
-
- case 'f':
- mode |= S_IFREG;
- break;
- case 'b':
- mode |= S_IFBLK;
- break;
- case 'c':
- mode |= S_IFCHR;
- break;
- case 'p':
- mode |= S_IFIFO;
- break;
- default:
- usage();
- }
- dev = 0;
- if (!(S_ISREG(mode) || S_ISFIFO(mode)))
- dev = atoi(argv[optind + 2]);
- else if (argc - optind != 2) {
- (void )fprintf(stderr, "Too many arguments\n");
- usage();
- }
- (void )do_mknod(argv[optind + 0], mode, dev);
-
- /*
- * Clean up.
- */
- _test_sysio_shutdown();
-
- return 0;
-}
-
-static int
-do_mknod(const char *path, mode_t mode, dev_t dev)
-{
-
- if (SYSIO_INTERFACE_NAME(mknod)(path, mode, dev) != 0) {
- perror(path);
- return -1;
- }
-
- return 0;
-}
-
-static void
-usage()
-{
-
- (void )fprintf(stderr, "Usage: mknod path {f|b|c|p} dev\n");
- exit(1);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <sys/uio.h>
-#include <getopt.h>
-
-#if defined(SYSIO_LABEL_NAMES)
-#include "sysio.h"
-#endif
-#include "xtio.h"
-#include "test.h"
-
-/*
- * Stat files.
- *
- * Usage: test_path [path...]
- *
- * Without any path arguments, the program reads from standard-in, dealing with
- * each line as an absolute or relative path until EOF.
- */
-
-static int statit(const char *path);
-static void usage(void);
-
-int
-main(int argc, char *const argv[])
-{
- int i;
- int err;
- int n;
- extern int _test_sysio_startup(void);
-
- /*
- * Parse command line arguments.
- */
- while ((i = getopt(argc, argv, "")) != -1)
- switch (i) {
-
- default:
- usage();
- }
-
- /*
- * Init sysio lib.
- */
- err = _test_sysio_startup();
- if (err) {
- errno = -err;
- perror("sysio startup");
- exit(1);
- }
-
- n = argc - optind;
-
- /*
- * Try path(s) listed on command-line.
- */
- while (optind < argc) {
- const char *path;
-
- path = argv[optind++];
- (void )statit(path);
- }
-
- /*
- * If no command-line arguments, read from stdin until EOF.
- */
- if (!n) {
- int doflush;
- static char buf[4096];
- size_t len;
- char *cp;
- char c;
-
- doflush = 0;
- while (fgets(buf, sizeof(buf), stdin) != NULL) {
- len = strlen(buf);
- cp = buf + len - 1;
- c = *cp;
- *cp = '\0';
- if (!doflush)
- statit(buf);
- doflush = c == '\n' ? 0 : 1;
- }
- }
-
- /*
- * Clean up.
- */
- _test_sysio_shutdown();
-
- return 0;
-}
-
-static int
-statit(const char *path)
-{
- int err;
- struct stat stbuf;
- char t;
- static char buf[4096];
- ssize_t cc;
-
- /*
- * Get file attrs.
- */
- err = SYSIO_INTERFACE_NAME(lstat)(path, &stbuf);
- if (err) {
- perror(path);
- return -1;
- }
-
- /*
- * Get readable representation of file type.
- */
- if (S_ISDIR(stbuf.st_mode))
- t = 'd';
- else if (S_ISCHR(stbuf.st_mode))
- t = 'c';
- else if (S_ISBLK(stbuf.st_mode))
- t = 'b';
- else if (S_ISREG(stbuf.st_mode))
- t = 'f';
-#ifdef S_ISFIFO
- else if (S_ISFIFO(stbuf.st_mode))
- t = 'p';
-#endif
-#ifdef S_ISLNK
- else if (S_ISLNK(stbuf.st_mode))
- t = 'S';
-#endif
-#ifdef S_ISSOCK
- else if (S_ISSOCK(stbuf.st_mode))
- t = 's';
-#endif
-#ifdef S_TYPEISMQ
- else if (S_TYPEISMQ(&stbuf))
- t = 'q';
-#endif
-#ifdef S_TYPEISSEM
- else if (S_TYPEISSEM(&stbuf))
- t = 'M';
-#endif
-#ifdef S_TYPEISSHM
- else if (S_TYPEISSHM(&stbuf))
- t = 'm';
-#endif
- else
- t = '?';
-
- /*
- * Print path and type.
- */
- if (S_ISLNK(stbuf.st_mode)) {
- cc = SYSIO_INTERFACE_NAME(readlink)(path, buf, sizeof(buf));
- if (cc < 0) {
- perror(path);
- return -1;
- }
- }
- (void )printf("%s: %c", path, t);
- if (S_ISLNK(stbuf.st_mode) && (size_t )cc < sizeof(buf))
- (void )printf(" %.*s", (int )cc, buf);
- (void )putchar('\n');
-
- return 0;
-}
-
-static void
-usage()
-{
-
- (void )fprintf(stderr,
- "Usage: test_path"
- " [<path> ...\n]");
-
- exit(1);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is regionsrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2004 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a regions of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <limits.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/uio.h>
-#include <getopt.h>
-
-#if defined(SYSIO_LABEL_NAMES)
-#include "sysio.h"
-#endif
-#include "xtio.h"
-#include "test.h"
-
-/*
- * Copy one file to another.
- *
- * Usage: test_regions [-x] \
- * {r,w} <off> <count> <path>
- *
- * Destination will not be overwritten if it already exist.
- */
-
-#if defined(_LARGEFILE64_SOURCE) && _LARGEFILE64_SOURCE
-#define GO64
-#else
-#warning Cannot prompt the 64-bit interface
-#endif
-
-char which;
-#ifdef GO64
-int use64 = 0; /* 64-bit interface? */
-#endif
-
-void usage(void);
-
-int
-main(int argc, char * const argv[])
-{
- int i;
- int err;
- long l;
- off_t off;
-#ifdef GO64
- long long ll;
- off64_t off64;
-#endif
- char *cp;
- unsigned long nbytes;
- const char *path;
- char *buf;
- int flags;
- int fd;
- ssize_t cc;
- extern int _test_sysio_startup(void);
-
- /*
- * Parse command-line args.
- */
- while ((i = getopt(argc,
- argv,
-#ifdef __GLIBC__
- "+"
-#endif
-#ifdef GO64
- "x"
-#endif
- "")) != -1)
- switch (i) {
-
-#ifdef GO64
- case 'x':
- use64 = 1;
- break;
-#endif
- default:
- usage();
- }
-
- if (argc - optind != 4)
- usage();
-
- which = *argv[optind];
- if (strlen(argv[optind]) != 1 || !(which == 'r' || which == 'w')) {
- (void )fprintf(stderr, "Which op?\n");
- exit(1);
- }
- optind++;
- off = l =
-#ifdef GO64
- ll = strtoll(argv[optind++], &cp, 0);
-#else
- strtol(argv[optind++], &cp, 0);
-#endif
-#ifdef GO64
- off64 = ll;
-#endif
- if (*cp != '\0' ||
-#ifdef GO64
- ((ll == LLONG_MIN || ll == LLONG_MAX) && errno == ERANGE) ||
- off64 != ll || (!use64 && off != ll)
-#else
- ((l == LONG_MIN || l == LONG_MAX) && errno == ERANGE) ||
- off != l
-#endif
- ) {
- (void )fprintf(stderr, "Offset out of range\n");
- exit(1);
- }
- nbytes = strtoul(argv[optind++], &cp, 0);
- if (*cp != '\0' || (nbytes == ULONG_MAX && errno == ERANGE)) {
- (void )fprintf(stderr, "Transfer count out of range\n");
- exit(1);
- }
- if (!(argc - optind))
- usage();
- path = argv[optind++];
-
- err = _test_sysio_startup();
- if (err) {
- errno = -err;
- perror("sysio startup");
- exit(1);
- }
-
- (void )umask(022);
-
- buf = malloc(nbytes);
- if (!buf) {
- perror("malloc");
- err = 1;
- goto out;
- }
- (void )memset(buf, 0, nbytes);
-
- err = 0;
- flags = which == 'r' ? O_RDONLY : (O_WRONLY|O_CREAT|O_EXCL);
-#ifdef GO64
- if (use64)
- flags |= O_LARGEFILE;
-#endif
- fd = SYSIO_INTERFACE_NAME(open)(path, flags, 0666);
- if (fd < 0) {
- perror(path);
- err = 1;
- goto error;
- }
-#ifdef GO64
- if (use64)
- off64 = SYSIO_INTERFACE_NAME(lseek64)(fd, off64, SEEK_SET);
- else
- off64 =
-#endif
- off = SYSIO_INTERFACE_NAME(lseek)(fd, off, SEEK_SET);
-#ifdef GO64
- if ((use64 && off64 < 0) || (!use64 && off < 0)) {
- perror(use64 ? "lseek64" : "lseek");
- err = 1;
- goto error;
- }
-#else
- if (off < 0) {
- perror("lseek");
- err = 1;
- goto error;
- }
-#endif
- if (which == 'r')
- cc = SYSIO_INTERFACE_NAME(read)(fd, buf, nbytes);
- else
- cc = SYSIO_INTERFACE_NAME(write)(fd, buf, nbytes);
- if (cc < 0) {
- perror(path);
- err = 1;
- goto error;
- }
-#ifdef GO64
- if (use64) {
- off64 = SYSIO_INTERFACE_NAME(lseek64)(fd, 0, SEEK_CUR);
- } else
- off64 =
-#endif
- off = SYSIO_INTERFACE_NAME(lseek)(fd, 0, SEEK_CUR);
- (void )printf(("%s%s@"
-#ifdef GO64
- "%lld"
-#else
- "%ld"
-#endif
- ": %ld, off "
-#ifdef GO64
- "%lld"
-#else
- "%ld"
-#endif
- "\n"),
- which == 'r' ? "read" : "write",
-#ifdef GO64
- use64 ? "64" : "",
- ll,
-#else
- "",
- l,
-#endif
- (long )cc,
-#ifdef GO64
- (long long int)off64
-#else
- off
-#endif
- );
-
-error:
- if (fd > 0 && SYSIO_INTERFACE_NAME(close)(fd) != 0)
- perror(path);
- free(buf);
-out:
- _test_sysio_shutdown();
-
- return err;
-}
-
-void
-usage()
-{
-
- (void )fprintf(stderr,
- "Usage: test_regions "
-#ifdef GO64
- "[-x] "
-#endif
- " {r,w} <offset> <nbytes> <path>\n");
- exit(1);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/uio.h>
-#include <getopt.h>
-
-#if defined(SYSIO_LABEL_NAMES)
-#include "sysio.h"
-#endif
-#include "xtio.h"
-#include "test.h"
-
-/*
- * Rename a file system object.
- *
- * Usage: test_rename <src> <dest>
- */
-
-void usage(void);
-int rename_file(const char *spath, const char *dpath);
-
-int
-main(int argc, char * const argv[])
-{
- int i;
- int err;
- const char *spath, *dpath;
- extern int _test_sysio_startup(void);
-
- /*
- * Parse command-line args.
- */
- while ((i = getopt(argc,
- argv,
- ""
- )) != -1)
- switch (i) {
-
- default:
- usage();
- }
-
- if (!(argc - optind))
- usage();
-
- err = _test_sysio_startup();
- if (err) {
- errno = -err;
- perror("sysio startup");
- exit(1);
- }
-
- (void )SYSIO_INTERFACE_NAME(umask)(022);
-
- /*
- * Source
- */
- spath = argv[optind++];
- if (!(argc - optind))
- usage();
- /*
- * Destination
- */
- dpath = argv[optind++];
- if (argc - optind)
- usage();
-
- err = SYSIO_INTERFACE_NAME(rename)(spath, dpath);
- if (err)
- perror("rename");
-
- _test_sysio_shutdown();
-
- return err;
-}
-
-void
-usage()
-{
-
- (void )fprintf(stderr,
- "Usage: test_rename"
- " source destination\n");
- exit(1);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#ifdef notdef
-#include <sys/statvfs.h>
-#endif
-#include <sys/uio.h>
-#include <getopt.h>
-
-#if defined(SYSIO_LABEL_NAMES)
-#include "sysio.h"
-#endif
-#include "xtio.h"
-#include "test.h"
-
-/*
- * Get stats of file and file system.
- *
- * Usage: test_stats [<path> ...]
- */
-
-void usage(void);
-void do_stats(const char *path);
-
-int
-main(int argc, char * const argv[])
-{
- int i;
- int err;
- extern int _test_sysio_startup(void);
-
- /*
- * Parse command-line args.
- */
- while ((i = getopt(argc, argv, "")) != -1)
- switch (i) {
-
- default:
- usage();
- }
-
- err = _test_sysio_startup();
- if (err) {
- errno = -err;
- perror("sysio startup");
- exit(1);
- }
-
- (void )SYSIO_INTERFACE_NAME(umask)(022);
-
- while (optind < argc)
- do_stats(argv[optind++]);
-
- /*
- * Clean up.
- */
- _test_sysio_shutdown();
-
- return 0;
-}
-
-void
-usage()
-{
-
- (void )fprintf(stderr,
- "Usage: test_stats"
- " source destination\n");
- exit(1);
-}
-
-void
-do_stats(const char *path)
-{
- int fd;
- int err;
- struct stat stbuf1, stbuf2;
-#ifdef notdef
- struct statvfs stvfsbuf1, stvfsbuf2;
-#endif
-
- fd = SYSIO_INTERFACE_NAME(open)(path, O_RDONLY);
- if (fd < 0) {
- perror(path);
- return;
- }
- err = SYSIO_INTERFACE_NAME(fstat)(fd, &stbuf1);
- if (!err)
- err = SYSIO_INTERFACE_NAME(stat)(path, &stbuf2);
-#ifdef notdef
- if (!err)
- err = SYSIO_INTERFACE_NAME(fstatvfs)(fd, &stvfsbuf1);
- if (!err)
- err = SYSIO_INTERFACE_NAME(statvfs)(path, &stvfsbuf1);
-#endif
- if (err) {
- perror(path);
- goto out;
- }
- if (stbuf1.st_dev != stbuf2.st_dev ||
- stbuf1.st_ino != stbuf2.st_ino) {
- (void )fprintf(stderr, "%s: [f]stat info mismatch\n", path);
- goto out;
- }
-#ifdef notdef
- if (stvfsbuf1.f_fsid != stvfsbuf2.f_fsid) {
- (void )fprintf(stderr, "%s: [f]statvfs info mismatch\n", path);
- }
-#endif
- printf("%s:"
- " dev %lu,"
- " ino %lu,"
- " mode %lu,"
- " nlink %lu,"
- " uid %lu,"
- " gid %lu,"
- " rdev %lu,"
- " size %llu,"
- " blksize %lu,"
- " blocks %lu,"
- " atime %lu,"
- " mtime %lu,"
- " ctime %lu"
- "\n",
- path,
- (unsigned long )stbuf1.st_dev,
- (unsigned long )stbuf1.st_ino,
- (unsigned long )stbuf1.st_mode,
- (unsigned long )stbuf1.st_nlink,
- (unsigned long )stbuf1.st_uid,
- (unsigned long )stbuf1.st_gid,
- (unsigned long )stbuf1.st_rdev,
- (unsigned long long)stbuf1.st_size,
- (unsigned long )stbuf1.st_blksize,
- (unsigned long )stbuf1.st_blocks,
- (unsigned long )stbuf1.st_atime,
- (unsigned long )stbuf1.st_mtime,
- (unsigned long )stbuf1.st_ctime);
-out:
- if (SYSIO_INTERFACE_NAME(close)(fd) != 0)
- perror("closing file");
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <getopt.h>
-#include <dirent.h>
-#include <sys/types.h>
-
-#if defined(SYSIO_LABEL_NAMES)
-#include "sysio.h"
-#endif
-#include "xtio.h"
-#include "test.h"
-
-/*
- * Test {open, read, close}dir functions
- *
- * Usage: test_stddir [path, ...]
- */
-static int testit(const char *);
-static void usage(void);
-
-int
-main (int argc, char** argv)
-{
- int err;
- int i;
- int n;
- const char *path;
-
- /*
- * Parse command line arguments.
- */
- while ((i = getopt(argc, argv, "")) != -1)
- switch (i) {
-
- default:
- usage();
- }
-
- /*
- * Init sysio lib.
- */
- err = _test_sysio_startup();
- if (err) {
- errno = -err;
- perror("sysio startup");
- exit(1);
- }
-
- /*
- * If no command-line arguments, read from stdin until EOF.
- */
- n = argc - optind;
- if (!n) {
- int doflush;
- static char buf[4096];
- size_t len;
- char *cp;
- char c;
-
- doflush = 0;
- while (fgets(buf, sizeof(buf), stdin) != NULL) {
- len = strlen(buf);
- cp = buf + len - 1;
- c = *cp;
- *cp = '\0';
- if (!doflush)
- err = testit(buf);
- if (err)
- break;
- doflush = c == '\n' ? 0 : 1;
- }
- }
-
- /*
- * Try path(s) listed on command-line.
- */
- while (optind < argc) {
- path = argv[optind++];
- err = testit(path);
- if (err)
- break;
- }
-
- /*
- * Clean up.
- */
- _test_sysio_shutdown();
-
- return err;
-}
-
-int
-testit(const char *path)
-{
- DIR *d;
- struct dirent *de;
-
- printf("testing directory functions on %s\n", path);
-
- if ((d = SYSIO_INTERFACE_NAME(opendir)(path)) == NULL) {
- perror(path);
- return errno;
- }
-
- while ((de = SYSIO_INTERFACE_NAME(readdir)(d)) != NULL)
- printf("\t %s: ino %lu off %lu type %u\n",
- de->d_name, (unsigned long )de->d_ino,
- (unsigned long )de->d_off, (int )de->d_type);
-
- if (SYSIO_INTERFACE_NAME(closedir)(d)) {
- perror("closedir");
- return errno;
- }
-
- return 0;
-}
-
-static void
-usage()
-{
-
- (void )fprintf(stderr,
- "Usage: test_stddir [<path> ...]\n");
-
- exit(1);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2006 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#if 0
-#include <dirent.h>
-#endif
-#include <sys/uio.h>
-#include <sys/queue.h>
-#include <getopt.h>
-
-#if defined(SYSIO_LABEL_NAMES)
-#include "sysio.h"
-#endif
-#include "xtio.h"
-#include "test.h"
-
-/*
- * Test soft links
- *
- * Usage: symlink oldpath newpath
- *
- */
-
-static void usage(void);
-
-int
-main(int argc, char *const argv[])
-{
- int i;
- int err;
- int n;
- extern int _test_sysio_startup(void);
-
- /*
- * Parse command line arguments.
- */
- while ((i = getopt(argc, argv, "")) != -1)
- switch (i) {
-
- default:
- usage();
- }
-
- /*
- * Init sysio lib.
- */
- err = _test_sysio_startup();
- if (err) {
- errno = -err;
- perror("sysio startup");
- exit(1);
- }
-
- n = argc - optind;
- if (n < 2) usage();
-
- /*
- * Try paths listed on command-line.
- */
- while (optind < argc) {
- const char *old, *new;
- struct stat stbuf;
-
- old = argv[optind++];
- new = argv[optind++];
- if ((err = SYSIO_INTERFACE_NAME(symlink)(old, new)) != 0) {
- perror("link");
- break;
- }
- if ((err = SYSIO_INTERFACE_NAME(lstat)(new, &stbuf)) != 0) {
- perror(new);
- break;
- }
- }
-
- /*
- * Clean up.
- */
- _test_sysio_shutdown();
-
- return err ? -1 : 0;
-}
-
-static void
-usage()
-{
-
- (void )fprintf(stderr,
- "Usage: symlink"
- " oldpath newpath\n");
-
- exit(1);
-}
+++ /dev/null
-/*
- * This Cplant(TM) source code is the property of Sandia National
- * Laboratories.
- *
- * This Cplant(TM) source code is copyrighted by Sandia National
- * Laboratories.
- *
- * The redistribution of this Cplant(TM) source code is subject to the
- * terms of the GNU Lesser General Public License
- * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
- *
- * Cplant(TM) Copyright 1998-2003 Sandia Corporation.
- * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
- * license for use of this work by or on behalf of the US Government.
- * Export of this program may require a license from the United States
- * Government.
- */
-
-/*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Questions or comments about this library should be sent to:
- *
- * Lee Ward
- * Sandia National Laboratories, New Mexico
- * P.O. Box 5800
- * Albuquerque, NM 87185-1110
- *
- * lee@sandia.gov
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#if 0
-#include <dirent.h>
-#endif
-#include <sys/uio.h>
-#include <getopt.h>
-
-#if defined(SYSIO_LABEL_NAMES)
-#include "sysio.h"
-#endif
-#include "xtio.h"
-#include "test.h"
-
-/*
- * Unlink files.
- *
- * Usage: unlink [path...]
- *
- * Without any path arguments, the program unlinks files named
- * by the ocmmand line args.
- */
-
-static int unlinkit(const char *path);
-static void usage(void);
-
-int
-main(int argc, char *const argv[])
-{
- int i;
- int err;
- int n;
- extern int _test_sysio_startup(void);
-
- /*
- * Parse command line arguments.
- */
- while ((i = getopt(argc, argv, "")) != -1)
- switch (i) {
-
- default:
- usage();
- }
-
- /*
- * Init sysio lib.
- */
- err = _test_sysio_startup();
- if (err) {
- errno = -err;
- perror("sysio startup");
- exit(1);
- }
-
- n = argc - optind;
-
- /*
- * Try path(s) listed on command-line.
- */
- while (optind < argc) {
- const char *path;
-
- path = argv[optind++];
- (void )unlinkit(path);
- }
-
- /*
- * If no command-line arguments, read from stdin until EOF.
- */
- if (!n) {
- int doflush;
- static char buf[4096];
- size_t len;
- char *cp;
- char c;
-
- doflush = 0;
- while (fgets(buf, sizeof(buf), stdin) != NULL) {
- len = strlen(buf);
- cp = buf + len - 1;
- c = *cp;
- *cp = '\0';
- if (!doflush)
- unlinkit(buf);
- doflush = c == '\n' ? 0 : 1;
- }
- }
-
- /*
- * Clean up.
- */
- _test_sysio_shutdown();
-
- return 0;
-}
-
-static int
-unlinkit(const char *path)
-{
-
- if (SYSIO_INTERFACE_NAME(unlink)(path) != 0) {
- perror(path);
- return -1;
- }
-
- return 0;
-}
-
-static void
-usage()
-{
-
- (void )fprintf(stderr,
- "Usage: unlink"
- " [<path> ...\n]");
-
- exit(1);
-}
+++ /dev/null
-/Makefile.in
-/libtest
+++ /dev/null
-## Liblustre excecutables & libraries Makefile
-SUBDIRS = . tests
-
-AM_CPPFLAGS = $(HAVE_EFENCE) -I$(SYSIO)/include \
- $(LLCPPFLAGS) -I$(top_srcdir)/lnet/ulnds
-AM_CFLAGS = $(LLCFLAGS)
-
-AM_LIBS = $(LIBEFENCE)
-
-
-
-LUSTRE_LIBS = libllite.a \
- $(top_builddir)/lustre/lov/liblov.a \
- $(top_builddir)/lustre/obdecho/libobdecho.a \
- $(top_builddir)/lustre/osc/libosc.a \
- $(top_builddir)/lustre/fid/libfid.a \
- $(top_builddir)/lustre/fld/libfld.a \
- $(top_builddir)/lustre/lmv/liblmv.a \
- $(top_builddir)/lustre/mdc/libmdc.a \
- $(top_builddir)/lustre/mgc/libmgc.a \
- $(top_builddir)/lustre/ptlrpc/libptlrpc.a \
- $(top_builddir)/lustre/obdclass/liblustreclass.a
-
-LND_LIBS =
-if BUILD_USOCKLND
-LND_LIBS += $(top_builddir)/lnet/ulnds/socklnd/libsocklnd.a
-endif
-
-LNET_LIBS = $(top_builddir)/lnet/utils/libuptlctl.a \
- $(top_builddir)/lnet/lnet/liblnet.a
-
-SYSIO_LIBS = $(SYSIO)/lib/libsysio.a
-
-if LIBLUSTRE
-lib_LIBRARIES = liblustre.a
-noinst_LIBRARIES = libllite.a
-
-install-exec-hook: liblustre.so
- @$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(libdir)
- @list=$< ; for p in $$list; do \
- if test -f $$p; then \
- f="`echo $$p | sed -e 's|^.*/||'`"; \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(libdir)/$$f"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(libdir)/$$f; \
- else :; fi; \
- done
-else
-install-exec-hook:
-endif
-
-libllite_a_SOURCES = llite_lib.c super.c namei.c rw.c file.c dir.c \
- lutil.c lutil.h llite_lib.h llite_cl.c
-
-# for make rpms -- need cleanup
-liblustre_a_SOURCES = llite_lib.c super.c namei.c rw.c file.c dir.c \
- llite_lib.h llite_cl.c
-
-export CC
-export LDFLAGS
-export AR
-export RANLIB
-
-liblustre.a : $(LUSTRE_LIBS) $(LND_LIBS) $(LNET_LIBS) $(SYSIO_LIBS)
- sh $(srcdir)/genlib.sh "$(SYSIO)" "$(LIBS)" "$(LND_LIBS)" "$(PTHREAD_LIBS)" "$(CAP_LIBS)"
-
-EXTRA_DIST = genlib.sh
-
-CLEANFILES = liblsupport.a liblustre.so
+++ /dev/null
-/*
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program 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
- * General Public License version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- *
- * Copyright (c) 2011, 2012, Intel Corporation.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- *
- * lustre/liblustre/dir.c
- *
- * Lustre Light directory handling
- */
-
-#define DEBUG_SUBSYSTEM S_LLITE
-
-#include <errno.h>
-#include <stddef.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <libcfs/libcfs.h>
-#include <lustre/lustre_idl.h>
-#include <liblustre.h>
-#include <lclient.h>
-#include <lustre_dlm.h>
-#include <lustre_lite.h>
-#include <lustre_net.h>
-#include <lustre_req_layout.h>
-#include <obd.h>
-#include <obd_class.h>
-#include <obd_support.h>
-#include "llite_lib.h"
-#include <dirent.h>
-
-/* (new) readdir implementation overview can be found in lustre/llite/dir.c */
-static int llu_dir_do_readpage(struct inode *inode, struct page *page)
-{
- struct llu_inode_info *lli = llu_i2info(inode);
- struct intnl_stat *st = llu_i2stat(inode);
- struct llu_sb_info *sbi = llu_i2sbi(inode);
- struct ptlrpc_request *request;
- struct lustre_handle lockh;
- struct mdt_body *body;
- struct lookup_intent it = { .it_op = IT_READDIR };
- struct md_op_data op_data = {{ 0 }};
- ldlm_policy_data_t policy = { .l_inodebits = { MDS_INODELOCK_UPDATE } };
- int rc = 0;
- ENTRY;
-
- llu_prep_md_op_data(&op_data, inode, NULL, NULL, 0, 0, LUSTRE_OPC_ANY);
- rc = md_lock_match(sbi->ll_md_exp, LDLM_FL_BLOCK_GRANTED,
- &lli->lli_fid, LDLM_IBITS, &policy, LCK_CR, &lockh);
- if (!rc) {
- struct ldlm_enqueue_info einfo = {
- .ei_type = LDLM_IBITS,
- .ei_mode = LCK_CR,
- .ei_cb_bl = llu_md_blocking_ast,
- .ei_cb_cp = ldlm_completion_ast,
- .ei_cbdata = inode,
- };
-
- rc = md_enqueue(sbi->ll_md_exp, &einfo, NULL, &it, &op_data,
- &lockh, LDLM_FL_CANCEL_ON_BLOCK);
- request = (struct ptlrpc_request *)it.d.lustre.it_data;
- if (request)
- ptlrpc_req_finished(request);
- if (rc < 0) {
- CERROR("lock enqueue: err: %d\n", rc);
- RETURN(rc);
- }
- }
- ldlm_lock_dump_handle(D_OTHER, &lockh);
-
- op_data.op_npages = 1;
- rc = md_readpage(sbi->ll_md_exp, &op_data, &page, &request);
- if (!rc) {
- body = req_capsule_server_get(&request->rq_pill, &RMF_MDT_BODY);
- LASSERT(body != NULL); /* checked by md_readpage() */
-
- if (body->valid & OBD_MD_FLSIZE)
- st->st_size = body->size;
- } else {
- CERROR("read_dir_page(%ld) error %d\n", page->index, rc);
- }
- ptlrpc_req_finished(request);
- EXIT;
-
- ldlm_lock_decref(&lockh, LCK_CR);
- return rc;
-}
-
-static struct page *llu_dir_read_page(struct inode *ino, __u64 hash,
- int exact, struct ll_dir_chain *chain)
-{
- struct page *page;
- int rc;
- ENTRY;
-
- OBD_PAGE_ALLOC(page, 0);
- if (!page)
- RETURN(ERR_PTR(-ENOMEM));
- page->index = hash_x_index(hash, 0);
-
- rc = llu_dir_do_readpage(ino, page);
- if (rc) {
- OBD_PAGE_FREE(page);
- RETURN(ERR_PTR(rc));
- }
-
- return page;
-}
-
-static void *(*memmover)(void *, const void *, size_t) = memmove;
-
-#define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de)))
-#define ROUND_UP64(x) (((x)+sizeof(__u64)-1) & ~(sizeof(__u64)-1))
-static int filldir(char *buf, int buflen, const char *name, int namelen,
- loff_t offset, ino_t ino, unsigned int d_type, int *filled)
-{
- struct intnl_dirent *dirent = (struct intnl_dirent *)(buf + *filled);
- struct intnl_dirent holder;
- int reclen = ROUND_UP64(NAME_OFFSET(dirent) + namelen + 1);
-
- /*
- * @buf is not guaranteed to be properly aligned. To work around,
- * first fill stack-allocated @holder, then copy @holder into @buf by
- * memmove().
- */
-
- /* check overflow */
- if ((*filled + reclen) > buflen)
- return 1;
-
- holder.d_ino = ino;
-#ifdef _DIRENT_HAVE_D_OFF
- holder.d_off = offset;
-#endif
- holder.d_reclen = reclen;
-#ifdef _DIRENT_HAVE_D_TYPE
- holder.d_type = (unsigned short) d_type;
-#endif
- /* gcc unrolls memcpy() of structs into field-wise assignments,
- * assuming proper alignment. Humor it. */
- (*memmover)(dirent, &holder, NAME_OFFSET(dirent));
- memcpy(dirent->d_name, name, namelen);
- dirent->d_name[namelen] = 0;
-
- *filled += reclen;
-
- return 0;
-}
-
-/*
- * TODO: much of the code here is similar/identical to llite ll_readdir().
- * These code can be factored out and shared in a common module.
- */
-
-ssize_t llu_iop_filldirentries(struct inode *dir, _SYSIO_OFF_T *basep,
- char *buf, size_t nbytes)
-{
- struct llu_inode_info *lli = llu_i2info(dir);
- struct intnl_stat *st = llu_i2stat(dir);
- loff_t pos = *basep;
- struct ll_dir_chain chain;
- struct page *page;
- int filled = 0;
- int rc;
- int done;
- __u16 type;
- ENTRY;
-
- liblustre_wait_event(0);
-
- if (st->st_size == 0) {
- CWARN("dir size is 0?\n");
- RETURN(0);
- }
-
- if (pos == MDS_DIR_END_OFF)
- /*
- * end-of-file.
- */
- RETURN(0);
-
- rc = 0;
- done = 0;
- ll_dir_chain_init(&chain);
-
- page = llu_dir_read_page(dir, pos, 0, &chain);
- while (rc == 0 && !done) {
- struct lu_dirpage *dp;
- struct lu_dirent *ent;
-
- if (!IS_ERR(page)) {
- /*
- * If page is empty (end of directoryis reached),
- * use this value.
- */
- __u64 hash = MDS_DIR_END_OFF;
- __u64 next;
-
- dp = page->addr;
- for (ent = lu_dirent_start(dp); ent != NULL && !done;
- ent = lu_dirent_next(ent)) {
- char *name;
- int namelen;
- struct lu_fid fid;
- __u64 ino;
-
- hash = le64_to_cpu(ent->lde_hash);
- namelen = le16_to_cpu(ent->lde_namelen);
-
- if (hash < pos)
- /*
- * Skip until we find target hash
- * value.
- */
- continue;
-
- if (namelen == 0)
- /*
- * Skip dummy record.
- */
- continue;
-
- fid = ent->lde_fid;
- name = ent->lde_name;
- fid_le_to_cpu(&fid, &fid);
- ino = cl_fid_build_ino(&fid, 0);
- type = ll_dirent_type_get(ent);
- done = filldir(buf, nbytes, name, namelen,
- (loff_t)hash, ino, type,
- &filled);
- }
- next = le64_to_cpu(dp->ldp_hash_end);
- OBD_PAGE_FREE(page);
- if (!done) {
- pos = next;
- if (pos == MDS_DIR_END_OFF)
- /*
- * End of directory reached.
- */
- done = 1;
- else if (1 /* chain is exhausted*/)
- /*
- * Normal case: continue to the next
- * page.
- */
- page = llu_dir_read_page(dir, pos, 1,
- &chain);
- else {
- /*
- * go into overflow page.
- */
- }
- } else {
- pos = hash;
- if (filled == 0)
- GOTO(out, filled = -EINVAL);
- }
- } else {
- rc = PTR_ERR(page);
- CERROR("error reading dir "DFID" at %lu: rc %d\n",
- PFID(&lli->lli_fid), (unsigned long)pos, rc);
- }
- }
- lli->lli_dir_pos = (loff_t)pos;
- *basep = lli->lli_dir_pos;
-out:
- ll_dir_chain_fini(&chain);
- liblustre_wait_event(0);
- RETURN(filled);
-}
+++ /dev/null
-/*
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program 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
- * General Public License version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- *
- * Copyright (c) 2011, 2013, Intel Corporation.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- *
- * lustre/liblustre/file.c
- *
- * Lustre Light file operations
- */
-
-#define DEBUG_SUBSYSTEM S_LLITE
-
-#include <errno.h>
-#include <fcntl.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <libcfs/libcfs.h>
-#include <lustre/lustre_idl.h>
-#include <liblustre.h>
-#include <lclient.h>
-#include <lustre_lib.h>
-#include <lustre_lite.h>
-#include <lustre_mdc.h>
-#include <lustre_net.h>
-#include <lustre_req_layout.h>
-#include <obd.h>
-#include <obd_class.h>
-#include <obd_support.h>
-#include "llite_lib.h"
-
-/* Pack the required supplementary groups into the supplied groups array.
- * If we don't need to use the groups from the target inode(s) then we
- * instead pack one or more groups from the user's supplementary group
- * array in case it might be useful. Not needed if doing an MDS-side upcall. */
-void ll_i2gids(__u32 *suppgids, struct inode *i1, struct inode *i2)
-{
- LASSERT(i1 != NULL);
- LASSERT(suppgids != NULL);
-
- if (in_group_p(i1->i_stbuf.st_gid))
- suppgids[0] = i1->i_stbuf.st_gid;
- else
- suppgids[0] = -1;
-
- if (i2) {
- if (in_group_p(i2->i_stbuf.st_gid))
- suppgids[1] = i2->i_stbuf.st_gid;
- else
- suppgids[1] = -1;
- } else {
- suppgids[1] = -1;
- }
-}
-
-void llu_prep_md_op_data(struct md_op_data *op_data, struct inode *i1,
- struct inode *i2, const char *name, int namelen,
- int mode, __u32 opc)
-{
- LASSERT(i1 != NULL || i2 != NULL);
- LASSERT(op_data);
-
- if (i1) {
- ll_i2gids(op_data->op_suppgids, i1, i2);
- op_data->op_fid1 = *ll_inode2fid(i1);
- }else {
- ll_i2gids(op_data->op_suppgids, i2, i1);
- op_data->op_fid1 = *ll_inode2fid(i2);
- }
-
- if (i2)
- op_data->op_fid2 = *ll_inode2fid(i2);
- else
- fid_zero(&op_data->op_fid2);
-
- op_data->op_name = name;
- op_data->op_mode = mode;
- op_data->op_namelen = namelen;
- op_data->op_mod_time = CFS_CURRENT_TIME;
- op_data->op_data = NULL;
-}
-
-void obdo_refresh_inode(struct inode *dst,
- struct obdo *src,
- obd_flag valid)
-{
- struct intnl_stat *st = llu_i2stat(dst);
- valid &= src->o_valid;
-
- if (valid & (OBD_MD_FLCTIME | OBD_MD_FLMTIME))
- CDEBUG(D_INODE,"valid "LPX64", cur time "CFS_TIME_T"/"CFS_TIME_T
- ", new %lu/%lu\n",
- src->o_valid, LTIME_S(st->st_mtime),
- LTIME_S(st->st_ctime),
- (long)src->o_mtime, (long)src->o_ctime);
-
- if (valid & OBD_MD_FLATIME && src->o_atime > LTIME_S(st->st_atime))
- LTIME_S(st->st_atime) = src->o_atime;
- if (valid & OBD_MD_FLMTIME && src->o_mtime > LTIME_S(st->st_mtime))
- LTIME_S(st->st_mtime) = src->o_mtime;
- if (valid & OBD_MD_FLCTIME && src->o_ctime > LTIME_S(st->st_ctime))
- LTIME_S(st->st_ctime) = src->o_ctime;
- if (valid & OBD_MD_FLSIZE && src->o_size > st->st_size)
- st->st_size = src->o_size;
- /* optimum IO size */
- if (valid & OBD_MD_FLBLKSZ)
- st->st_blksize = src->o_blksize;
- /* allocation of space */
- if (valid & OBD_MD_FLBLOCKS && src->o_blocks > st->st_blocks)
- st->st_blocks = src->o_blocks;
-}
-
-/**
- * Assign an obtained @ioepoch to client's inode. No lock is needed, MDS does
- * not believe attributes if a few ioepoch holders exist. Attributes for
- * previous ioepoch if new one is opened are also skipped by MDS.
- */
-void llu_ioepoch_open(struct llu_inode_info *lli, __u64 ioepoch)
-{
- if (ioepoch && lli->lli_ioepoch != ioepoch) {
- lli->lli_ioepoch = ioepoch;
- CDEBUG(D_INODE, "Epoch "LPU64" opened on "DFID" for truncate\n",
- ioepoch, PFID(&lli->lli_fid));
- }
-}
-
-int llu_local_open(struct llu_inode_info *lli, struct lookup_intent *it)
-{
- struct ptlrpc_request *req = it->d.lustre.it_data;
- struct ll_file_data *fd;
- struct mdt_body *body;
- ENTRY;
-
- body = req_capsule_server_get(&req->rq_pill, &RMF_MDT_BODY);
- LASSERT(body != NULL);
-
- /* already opened? */
- if (lli->lli_open_count++)
- RETURN(0);
-
- LASSERT(!lli->lli_file_data);
-
- OBD_ALLOC(fd, sizeof(*fd));
- /* We can't handle this well without reorganizing ll_file_open and
- * ll_md_close, so don't even try right now. */
- LASSERT(fd != NULL);
-
- memcpy(&fd->fd_mds_och.och_fh, &body->handle, sizeof(body->handle));
- fd->fd_mds_och.och_magic = OBD_CLIENT_HANDLE_MAGIC;
- fd->fd_mds_och.och_fid = lli->lli_fid;
- lli->lli_file_data = fd;
- llu_ioepoch_open(lli, body->ioepoch);
- md_set_open_replay_data(lli->lli_sbi->ll_md_exp, &fd->fd_mds_och, it);
-
- RETURN(0);
-}
-
-int llu_iop_open(struct pnode *pnode, int flags, mode_t mode)
-{
- struct inode *inode = pnode->p_base->pb_ino;
- struct llu_inode_info *lli = llu_i2info(inode);
- struct intnl_stat *st = llu_i2stat(inode);
- struct ptlrpc_request *request;
- struct lookup_intent *it;
- int rc = 0;
- ENTRY;
-
- liblustre_wait_event(0);
-
- /* don't do anything for '/' */
- if (llu_is_root_inode(inode))
- RETURN(0);
-
- CDEBUG(D_VFSTRACE, "VFS Op:inode=%llu\n", (long long)st->st_ino);
- LL_GET_INTENT(inode, it);
-
- if (!it->d.lustre.it_disposition) {
- LBUG();
- }
-
- rc = it_open_error(DISP_OPEN_OPEN, it);
- if (rc)
- GOTO(out_release, rc);
-
- rc = llu_local_open(lli, it);
- if (rc)
- LBUG();
-
- if (!S_ISREG(st->st_mode))
- GOTO(out_release, rc = 0);
-
- if (lli->lli_has_smd && cl_is_lov_delay_create(flags)) {
- /* a bit ugly, but better than changing the open() API */
- unsigned int tmp_flags = flags;
-
- cl_lov_delay_create_clear(&tmp_flags);
- flags = tmp_flags;
- }
- /*XXX: open_flags are overwritten and the previous ones are lost */
- lli->lli_open_flags = flags & ~(O_CREAT | O_EXCL | O_TRUNC);
-
- out_release:
- request = it->d.lustre.it_data;
- ptlrpc_req_finished(request);
-
- it->it_op_release(it);
- OBD_FREE(it, sizeof(*it));
-
- /* libsysio hasn't done anything for O_TRUNC. here we
- * simply simulate it as open(...); truncate(...); */
- if (rc == 0 && (flags & O_TRUNC) && S_ISREG(st->st_mode)) {
- struct iattr attr;
-
- memset(&attr, 0, sizeof(attr));
- attr.ia_size = 0;
- attr.ia_valid |= ATTR_SIZE | ATTR_RAW;
- rc = llu_setattr_raw(inode, &attr);
- if (rc)
- CERROR("error %d truncate in open()\n", rc);
- }
-
- liblustre_wait_event(0);
- RETURN(rc);
-}
-
-int llu_objects_destroy(struct ptlrpc_request *req, struct inode *dir)
-{
- struct mdt_body *body;
- struct lov_mds_md *eadata;
- struct lov_stripe_md *lsm = NULL;
- struct obd_trans_info oti = { 0 };
- struct obdo *oa;
- int rc;
- ENTRY;
-
- body = req_capsule_server_get(&req->rq_pill, &RMF_MDT_BODY);
-
- if (!(body->valid & OBD_MD_FLEASIZE))
- RETURN(0);
-
- if (body->eadatasize == 0) {
- CERROR("OBD_MD_FLEASIZE set but eadatasize zero\n");
- GOTO(out, rc = -EPROTO);
- }
-
- /* The MDS sent back the EA because we unlinked the last reference
- * to this file. Use this EA to unlink the objects on the OST.
- * It's opaque so we don't swab here; we leave it to obd_unpackmd() to
- * check it is complete and sensible. */
- eadata = req_capsule_server_sized_get(&req->rq_pill, &RMF_MDT_MD,
- body->eadatasize);
-
- LASSERT(eadata != NULL);
-
- rc = obd_unpackmd(llu_i2obdexp(dir), &lsm, eadata,body->eadatasize);
- if (rc < 0) {
- CERROR("obd_unpackmd: %d\n", rc);
- GOTO(out, rc);
- }
- LASSERT(rc >= sizeof(*lsm));
-
- OBDO_ALLOC(oa);
- if (oa == NULL)
- GOTO(out_free_memmd, rc = -ENOMEM);
-
- oa->o_oi = lsm->lsm_oi;
- oa->o_mode = body->mode & S_IFMT;
- oa->o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLGROUP;
- obdo_set_parent_fid(oa, &llu_i2info(dir)->lli_fid);
- if (body->valid & OBD_MD_FLCOOKIE) {
- oa->o_valid |= OBD_MD_FLCOOKIE;
- oti.oti_logcookies =
- req_capsule_server_sized_get(&req->rq_pill,
- &RMF_LOGCOOKIES,
- sizeof(struct llog_cookie) *
- lsm->lsm_stripe_count);
- if (oti.oti_logcookies == NULL) {
- oa->o_valid &= ~OBD_MD_FLCOOKIE;
- body->valid &= ~OBD_MD_FLCOOKIE;
- }
- }
-
- rc = obd_destroy(NULL, llu_i2obdexp(dir), oa, lsm, &oti, NULL, NULL);
- OBDO_FREE(oa);
- if (rc)
- CERROR("obd destroy objid "DOSTID" error %d\n",
- POSTID(&lsm->lsm_oi), rc);
-out_free_memmd:
- obd_free_memmd(llu_i2obdexp(dir), &lsm);
-out:
- return rc;
-}
-
-/** Cliens updates SOM attributes on MDS: obd_getattr and md_setattr. */
-int llu_som_update(struct inode *inode, struct md_op_data *op_data)
-{
- struct llu_inode_info *lli = llu_i2info(inode);
- struct llu_sb_info *sbi = llu_i2sbi(inode);
- struct obdo oa = { 0 };
- __u32 old_flags;
- int rc;
- ENTRY;
-
- LASSERT(!(lli->lli_flags & LLIF_MDS_SIZE_LOCK));
- LASSERT(sbi->ll_lco.lco_flags & OBD_CONNECT_SOM);
-
- old_flags = op_data->op_flags;
- op_data->op_flags = MF_SOM_CHANGE;
-
- /* If inode is already in another epoch, skip getattr from OSTs. */
- if (lli->lli_ioepoch == op_data->op_ioepoch) {
- rc = llu_inode_getattr(inode, &oa, op_data->op_ioepoch,
- old_flags & MF_GETATTR_LOCK);
- if (rc) {
- oa.o_valid = 0;
- if (rc != -ENOENT)
- CERROR("inode_getattr failed (%d): unable to "
- "send a Size-on-MDS attribute update "
- "for inode %llu/%lu\n", rc,
- (long long)llu_i2stat(inode)->st_ino,
- lli->lli_st_generation);
- } else {
- CDEBUG(D_INODE, "Size-on-MDS update on "DFID"\n",
- PFID(&lli->lli_fid));
- }
-
- /* Install attributes into op_data. */
- md_from_obdo(op_data, &oa, oa.o_valid);
- }
-
- rc = llu_md_setattr(inode, op_data, NULL);
- RETURN(rc);
-}
-
-void llu_pack_inode2opdata(struct inode *inode, struct md_op_data *op_data,
- struct lustre_handle *fh)
-{
- struct llu_inode_info *lli = llu_i2info(inode);
- struct intnl_stat *st = llu_i2stat(inode);
- ENTRY;
-
- op_data->op_fid1 = lli->lli_fid;
- op_data->op_attr.ia_atime = st->st_atime;
- op_data->op_attr.ia_mtime = st->st_mtime;
- op_data->op_attr.ia_ctime = st->st_ctime;
- op_data->op_attr.ia_size = st->st_size;
- op_data->op_attr_blocks = st->st_blocks;
- op_data->op_attr.ia_attr_flags = lli->lli_st_flags;
- op_data->op_ioepoch = lli->lli_ioepoch;
- if (fh)
- op_data->op_handle = *fh;
- EXIT;
-}
-
-/** Pack SOM attributes info @opdata for CLOSE, DONE_WRITING rpc. */
-void llu_done_writing_attr(struct inode *inode, struct md_op_data *op_data)
-{
- struct llu_inode_info *lli = llu_i2info(inode);
- ENTRY;
-
- op_data->op_flags |= MF_SOM_CHANGE;
-
- /* Pack Size-on-MDS attributes if we are in IO
- * epoch and attributes are valid. */
- LASSERT(!(lli->lli_flags & LLIF_MDS_SIZE_LOCK));
- if (!cl_local_size(inode))
- op_data->op_attr.ia_valid |= ATTR_MTIME_SET | ATTR_CTIME_SET |
- ATTR_ATIME_SET | ATTR_SIZE | ATTR_BLOCKS;
-
- EXIT;
-}
-
-static void llu_prepare_close(struct inode *inode, struct md_op_data *op_data,
- struct ll_file_data *fd)
-{
- struct obd_client_handle *och = &fd->fd_mds_och;
-
- op_data->op_attr.ia_valid = ATTR_MODE | ATTR_ATIME_SET |
- ATTR_MTIME_SET | ATTR_CTIME_SET;
-
- if (fd->fd_flags & FMODE_WRITE) {
- struct llu_sb_info *sbi = llu_i2sbi(inode);
- if (!(sbi->ll_lco.lco_flags & OBD_CONNECT_SOM) ||
- !S_ISREG(llu_i2stat(inode)->st_mode)) {
- op_data->op_attr.ia_valid |= ATTR_SIZE | ATTR_BLOCKS;
- } else {
- /* Inode cannot be dirty. Close the epoch. */
- op_data->op_flags |= MF_EPOCH_CLOSE;
- /* XXX: Send SOM attributes only if they are really
- * changed. */
- llu_done_writing_attr(inode, op_data);
- }
- }
- llu_pack_inode2opdata(inode, op_data, &och->och_fh);
- llu_prep_md_op_data(op_data, inode, NULL, NULL,
- 0, 0, LUSTRE_OPC_ANY);
-}
-
-int llu_md_close(struct obd_export *md_exp, struct inode *inode)
-{
- struct llu_inode_info *lli = llu_i2info(inode);
- struct ll_file_data *fd = lli->lli_file_data;
- struct ptlrpc_request *req = NULL;
- struct obd_client_handle *och = &fd->fd_mds_och;
- struct intnl_stat *st = llu_i2stat(inode);
- struct md_op_data op_data = { { 0 } };
- int rc;
- ENTRY;
-
- /* clear group lock, if present */
- if (fd->fd_flags & LL_FILE_GROUP_LOCKED)
- llu_put_grouplock(inode, fd->fd_grouplock.cg_gid);
-
- llu_prepare_close(inode, &op_data, fd);
- rc = md_close(md_exp, &op_data, och->och_mod, &req);
- if (rc == -EAGAIN) {
- /* We are the last writer, so the MDS has instructed us to get
- * the file size and any write cookies, then close again. */
- LASSERT(lli->lli_open_flags & FMODE_WRITE);
- rc = llu_som_update(inode, &op_data);
- if (rc) {
- CERROR("inode %llu mdc Size-on-MDS update failed: "
- "rc = %d\n", (long long)st->st_ino, rc);
- rc = 0;
- }
- } else if (rc) {
- CERROR("inode %llu close failed: rc %d\n",
- (long long)st->st_ino, rc);
- } else {
- rc = llu_objects_destroy(req, inode);
- if (rc)
- CERROR("inode %llu ll_objects destroy: rc = %d\n",
- (long long)st->st_ino, rc);
- }
-
- md_clear_open_replay_data(md_exp, och);
- ptlrpc_req_finished(req);
- och->och_fh.cookie = DEAD_HANDLE_MAGIC;
- lli->lli_file_data = NULL;
- OBD_FREE(fd, sizeof(*fd));
-
- RETURN(rc);
-}
-
-int llu_file_release(struct inode *inode)
-{
- struct ll_file_data *fd;
- struct llu_sb_info *sbi = llu_i2sbi(inode);
- struct llu_inode_info *lli = llu_i2info(inode);
- int rc = 0, rc2;
-
- ENTRY;
- CDEBUG(D_VFSTRACE, "VFS Op:inode=%llu/%lu\n",
- (long long)llu_i2stat(inode)->st_ino, lli->lli_st_generation);
-
- if (llu_is_root_inode(inode))
- RETURN(0);
-
- /* still opened by others? */
- if (--lli->lli_open_count)
- RETURN(0);
-
- fd = lli->lli_file_data;
- if (!fd) /* no process opened the file after an mcreate */
- RETURN(0);
-
- rc2 = llu_md_close(sbi->ll_md_exp, inode);
- if (rc2 && !rc)
- rc = rc2;
-
- RETURN(rc);
-}
-
-/*
- * libsysio require us return 0
- */
-int llu_iop_close(struct inode *inode)
-{
- int rc;
-
- liblustre_wait_event(0);
-
- rc = llu_file_release(inode);
- if (rc) {
- CERROR("file close error %d\n", rc);
- }
- /* if open count == 0 && stale_flag is set, should we
- * remove the inode immediately? */
- liblustre_wait_idle();
- return 0;
-}
-
-_SYSIO_OFF_T llu_iop_pos(struct inode *ino, _SYSIO_OFF_T off)
-{
- ENTRY;
-
- liblustre_wait_event(0);
-
- if (off < 0 || off > ll_file_maxbytes(ino))
- RETURN(-EINVAL);
-
- RETURN(off);
-}
+++ /dev/null
-#!/bin/bash
-#set -xv
-set -e
-
-#
-# This script is to generate lib lustre library as a whole. It will leave
-# two files on current directory: liblustre.a and liblustre.so.
-#
-# Most concern here is the libraries linking order
-#
-# FIXME: How to do this cleanly use makefile?
-#
-
-# see http://osdir.com/ml/gmane.comp.gnu.binutils.bugs/2006-01/msg00016.php
-ppc64_CPU=`uname -p`
-if [ "x${ppc64_CPU}" = "xppc64" ]; then
- LD="$CC -m64"
-else
- LD=$CC
-fi
-
-CWD=`pwd`
-
-SYSIO=$1
-LIBS=$2
-LND_LIBS=$3
-PTHREAD_LIBS=$4
-CAP_LIBS=$5
-
-if [ ! -f $SYSIO/lib/libsysio.a ]; then
- echo "ERROR: $SYSIO/lib/libsysio.a dosen't exist"
- exit 1
-fi
-
-# do cleanup at first
-rm -f liblustre.so
-
-ALL_OBJS=
-
-build_obj_list() {
- _objs=`$AR -t $1/$2 | grep -v SYMDEF | grep -v SORTED`
- for _lib in $_objs; do
- ALL_OBJS=$ALL_OBJS"$1/$_lib ";
- done;
-}
-
-#
-# special treatment for libsysio
-#
-sysio_tmp=$CWD/sysio_tmp_`date +%s`
-rm -rf $sysio_tmp
-build_sysio_obj_list() {
- _objs=`$AR -t $1 | grep -v SYMDEF | grep -v SORTED`
- mkdir -p $sysio_tmp
- cd $sysio_tmp
- $AR -x $1
- cd ..
- for _lib in $_objs; do
- ALL_OBJS=$ALL_OBJS"$sysio_tmp/$_lib ";
- done
-}
-
-# lustre components libs
-build_obj_list . libllite.a
-build_obj_list ../lov liblov.a
-build_obj_list ../obdecho libobdecho.a
-build_obj_list ../osc libosc.a
-build_obj_list ../lmv liblmv.a
-build_obj_list ../mdc libmdc.a
-build_obj_list ../fid libfid.a
-build_obj_list ../fld libfld.a
-build_obj_list ../mgc libmgc.a
-build_obj_list ../ptlrpc libptlrpc.a
-build_obj_list ../obdclass liblustreclass.a
-
-# lnet components libs
-build_obj_list ../../lnet/utils libuptlctl.a
-build_obj_list ../../libcfs/libcfs libcfs.a
-build_obj_list ../../libcfs/libcfs libcfsutil.a
-if $(echo "$LND_LIBS" | grep "socklnd" >/dev/null) ; then
- build_obj_list ../../lnet/ulnds/socklnd libsocklnd.a
-fi
-build_obj_list ../../lnet/lnet liblnet.a
-
-# create static lib lsupport
-rm -f $CWD/liblsupport.a
-$AR -cru $CWD/liblsupport.a $ALL_OBJS
-$RANLIB $CWD/liblsupport.a
-
-# if libsysio is already in our LIBS we don't need to link against it here
-if $(echo "$LIBS" | grep -v -- "-lsysio" >/dev/null) ; then
- build_sysio_obj_list $SYSIO/lib/libsysio.a
-fi
-
-# create static lib lustre
-rm -f $CWD/liblustre.a
-$AR -cru $CWD/liblustre.a $ALL_OBJS
-$RANLIB $CWD/liblustre.a
-
-# create shared lib lustre
-rm -f $CWD/liblustre.so
-OS=`uname`
-if test x$OS = xAIX; then
- $LD $LDFLAGS -shared -o $CWD/liblustre.so $ALL_OBJS -lpthread -Xlinker -bnoipath ../../libsyscall.so
-else
-# using -nostdlib on Ubuntu causes errors such as:
-#./llite_lib.o: In function `liblustre_process_log':
-#/home/brian/rpm/BUILD/lustre-1.8.2.50/lustre/liblustre/llite_lib.c:234: undefined reference to `__stack_chk_fail_local'
-# due to the use of SSP
-#$LD -shared -nostdlib -o $CWD/liblustre.so $ALL_OBJS $CAP_LIBS $PTHREAD_LIBS
- $LD $LDFLAGS -shared -o $CWD/liblustre.so $ALL_OBJS $CAP_LIBS $PTHREAD_LIBS
-fi
-
-rm -rf $sysio_tmp
+++ /dev/null
-/*
- * Copyright (c) 2007 Cluster File Systems, Inc.
- * Author: Nikita Danilov <nikita@clusterfs.com>
- *
- * This file is part of Lustre, http://www.lustre.org.
- *
- * Lustre is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * Lustre 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Lustre; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * Copyright (c) 2011, 2013, Intel Corporation.
- */
-
-#define DEBUG_SUBSYSTEM S_LLITE
-
-#include <errno.h>
-#include <stdarg.h>
-#include <stddef.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/uio.h>
-#include <libcfs/libcfs.h>
-#include <lustre/lustre_idl.h>
-#include <liblustre.h>
-#include <lclient.h>
-#include <cl_object.h>
-#include <lustre_export.h>
-#include <lustre_lite.h>
-#include <obd.h>
-#include <obd_support.h>
-#include "llite_lib.h"
-
-/*
- * slp_ prefix stands for "Sysio Library Posix". It corresponds to historical
- * "llu_" prefix.
- */
-
-static int slp_type_init (struct lu_device_type *t);
-static void slp_type_fini (struct lu_device_type *t);
-
-static int slp_page_init(const struct lu_env *env, struct cl_object *obj,
- struct cl_page *page, pgoff_t index);
-static int slp_attr_get (const struct lu_env *env, struct cl_object *obj,
- struct cl_attr *attr);
-
-static struct lu_device *slp_device_alloc(const struct lu_env *env,
- struct lu_device_type *t,
- struct lustre_cfg *cfg);
-
-static int slp_io_init(const struct lu_env *env, struct cl_object *obj,
- struct cl_io *io);
-static struct slp_io *cl2slp_io(const struct lu_env *env,
- const struct cl_io_slice *slice);
-
-
-static void llu_free_user_page(struct page *page);
-
-static const struct lu_object_operations slp_lu_obj_ops;
-static const struct lu_device_operations slp_lu_ops;
-static const struct cl_device_operations slp_cl_ops;
-static const struct cl_io_operations ccc_io_ops;
-static const struct lu_device_type_operations slp_device_type_ops;
- //struct lu_device_type slp_device_type;
-static const struct cl_page_operations slp_transient_page_ops;
-static const struct cl_lock_operations slp_lock_ops;
-
-
-/*****************************************************************************
- *
- * Slp device and device type functions.
- *
- */
-
-static void *slp_session_key_init(const struct lu_context *ctx,
- struct lu_context_key *key)
-{
- struct slp_session *session;
-
- OBD_ALLOC_PTR(session);
- if (session == NULL)
- session = ERR_PTR(-ENOMEM);
- return session;
-}
-
-static void slp_session_key_fini(const struct lu_context *ctx,
- struct lu_context_key *key, void *data)
-{
- struct slp_session *session = data;
- OBD_FREE_PTR(session);
-}
-
-struct lu_context_key slp_session_key = {
- .lct_tags = LCT_SESSION,
- .lct_init = slp_session_key_init,
- .lct_fini = slp_session_key_fini
-};
-
-/* type constructor/destructor: slp_type_{init,fini,start,stop}(). */
-LU_TYPE_INIT_FINI(slp, &ccc_key, &ccc_session_key, &slp_session_key);
-
-static struct lu_device *slp_device_alloc(const struct lu_env *env,
- struct lu_device_type *t,
- struct lustre_cfg *cfg)
-{
- return ccc_device_alloc(env, t, cfg, &slp_lu_ops, &slp_cl_ops);
-}
-
-static int slp_lock_init(const struct lu_env *env,
- struct cl_object *obj, struct cl_lock *lock,
- const struct cl_io *io)
-{
- return ccc_lock_init(env, obj, lock, io, &slp_lock_ops);
-}
-
-static const struct cl_object_operations slp_ops = {
- .coo_page_init = slp_page_init,
- .coo_lock_init = slp_lock_init,
- .coo_io_init = slp_io_init,
- .coo_attr_get = slp_attr_get,
- .coo_attr_set = ccc_attr_set,
- .coo_conf_set = ccc_conf_set,
- .coo_glimpse = ccc_object_glimpse
-};
-
-static int slp_object_print(const struct lu_env *env, void *cookie,
- lu_printer_t p, const struct lu_object *o)
-{
- struct ccc_object *obj = lu2ccc(o);
- struct inode *inode = obj->cob_inode;
- struct intnl_stat *st = NULL;
-
- if (inode)
- st = llu_i2stat(inode);
-
- return (*p)(env, cookie, LUSTRE_SLP_NAME"-object@%p(%p:%lu/%u)",
- obj, inode,
- st ? (unsigned long)st->st_ino : 0UL,
- inode ? (unsigned int)llu_i2info(inode)->lli_st_generation
- : 0);
-}
-
-static const struct lu_object_operations slp_lu_obj_ops = {
- .loo_object_init = ccc_object_init,
- .loo_object_start = NULL,
- .loo_object_delete = NULL,
- .loo_object_release = NULL,
- .loo_object_free = ccc_object_free,
- .loo_object_print = slp_object_print,
- .loo_object_invariant = NULL
-};
-
-static struct lu_object *slp_object_alloc(const struct lu_env *env,
- const struct lu_object_header *hdr,
- struct lu_device *dev)
-{
- return ccc_object_alloc(env, hdr, dev, &slp_ops, &slp_lu_obj_ops);
-}
-
-static const struct lu_device_operations slp_lu_ops = {
- .ldo_object_alloc = slp_object_alloc
-};
-
-static const struct cl_device_operations slp_cl_ops = {
- .cdo_req_init = ccc_req_init
-};
-
-static const struct lu_device_type_operations slp_device_type_ops = {
- .ldto_init = slp_type_init,
- .ldto_fini = slp_type_fini,
-
- .ldto_start = slp_type_start,
- .ldto_stop = slp_type_stop,
-
- .ldto_device_alloc = slp_device_alloc,
- .ldto_device_free = ccc_device_free,
- .ldto_device_init = ccc_device_init,
- .ldto_device_fini = ccc_device_fini
-};
-
-static struct lu_device_type slp_device_type = {
- .ldt_tags = LU_DEVICE_CL,
- .ldt_name = LUSTRE_SLP_NAME,
- .ldt_ops = &slp_device_type_ops,
- .ldt_ctx_tags = LCT_CL_THREAD
-};
-
-int slp_global_init(void)
-{
- int result;
-
- result = ccc_global_init(&slp_device_type);
- return result;
-}
-
-void slp_global_fini(void)
-{
- ccc_global_fini(&slp_device_type);
-}
-
-/*****************************************************************************
- *
- * Object operations.
- *
- */
-
-static int slp_page_init(const struct lu_env *env, struct cl_object *obj,
- struct cl_page *page, pgoff_t index)
-{
- struct ccc_page *cpg = cl_object_page_slice(obj, page);
-
- CLOBINVRNT(env, obj, ccc_object_invariant(obj));
-
- cpg->cpg_page = page->cp_vmpage;
-
- if (page->cp_type == CPT_CACHEABLE) {
- LBUG();
- } else {
- struct ccc_object *clobj = cl2ccc(obj);
-
- cl_page_slice_add(page, &cpg->cpg_cl, obj, index,
- &slp_transient_page_ops);
- clobj->cob_transient_pages++;
- }
-
- return 0;
-}
-
-static int slp_io_init(const struct lu_env *env, struct cl_object *obj,
- struct cl_io *io)
-{
- struct ccc_io *vio = ccc_env_io(env);
- int result = 0;
-
- CLOBINVRNT(env, obj, ccc_object_invariant(obj));
-
- cl_io_slice_add(io, &vio->cui_cl, obj, &ccc_io_ops);
- if (io->ci_type == CIT_READ || io->ci_type == CIT_WRITE) {
- size_t count;
-
- count = io->u.ci_rw.crw_count;
- /* "If nbyte is 0, read() will return 0 and have no other
- * results." -- Single Unix Spec */
- if (count == 0)
- result = 1;
- else {
- vio->cui_tot_count = count;
- vio->cui_tot_nrsegs = 0;
- }
-
- }
- return result;
-}
-
-static int slp_attr_get(const struct lu_env *env, struct cl_object *obj,
- struct cl_attr *attr)
-{
- struct inode *inode = ccc_object_inode(obj);
- struct intnl_stat *st = llu_i2stat(inode);
-
- attr->cat_size = st->st_size;
- attr->cat_blocks = st->st_blocks;
- attr->cat_mtime = st->st_mtime;
- attr->cat_atime = st->st_atime;
- attr->cat_ctime = st->st_ctime;
- /* KMS is not known by this layer */
- return 0; /* layers below have to fill in the rest */
-}
-
-/*****************************************************************************
- *
- * Page operations.
- *
- */
-
-static void slp_page_fini_common(struct ccc_page *cp)
-{
- struct page *vmpage = cp->cpg_page;
-
- LASSERT(vmpage != NULL);
- llu_free_user_page(vmpage);
- OBD_FREE_PTR(cp);
-}
-
-static void slp_page_completion_common(const struct lu_env *env,
- struct ccc_page *cp, int ioret)
-{
- LASSERT(cp->cpg_cl.cpl_page->cp_sync_io != NULL);
-}
-
-static void slp_page_completion_read(const struct lu_env *env,
- const struct cl_page_slice *slice,
- int ioret)
-{
- struct ccc_page *cp = cl2ccc_page(slice);
- ENTRY;
-
- slp_page_completion_common(env, cp, ioret);
-
- EXIT;
-}
-
-static void slp_page_completion_write_common(const struct lu_env *env,
- const struct cl_page_slice *slice,
- int ioret)
-{
- struct ccc_page *cp = cl2ccc_page(slice);
-
- if (ioret == 0) {
- cp->cpg_write_queued = 0;
- /*
- * Only ioret == 0, write succeed, then this page could be
- * deleted from the pending_writing count.
- */
- }
- slp_page_completion_common(env, cp, ioret);
-}
-
-static int slp_page_is_vmlocked(const struct lu_env *env,
- const struct cl_page_slice *slice)
-{
- return -EBUSY;
-}
-
-static void slp_transient_page_fini(const struct lu_env *env,
- struct cl_page_slice *slice)
-{
- struct ccc_page *cp = cl2ccc_page(slice);
- struct cl_page *clp = slice->cpl_page;
- struct ccc_object *clobj = cl2ccc(clp->cp_obj);
-
- slp_page_fini_common(cp);
- clobj->cob_transient_pages--;
-}
-
-
-static const struct cl_page_operations slp_transient_page_ops = {
- .cpo_own = ccc_transient_page_own,
- .cpo_assume = ccc_transient_page_assume,
- .cpo_unassume = ccc_transient_page_unassume,
- .cpo_disown = ccc_transient_page_disown,
- .cpo_discard = ccc_transient_page_discard,
- .cpo_is_vmlocked = slp_page_is_vmlocked,
- .cpo_fini = slp_transient_page_fini,
- .io = {
- [CRT_READ] = {
- .cpo_completion = slp_page_completion_read,
- },
- [CRT_WRITE] = {
- .cpo_completion = slp_page_completion_write_common,
- }
- }
-};
-
-/*****************************************************************************
- *
- * Lock operations.
- *
- */
-
-static int slp_lock_enqueue(const struct lu_env *env,
- const struct cl_lock_slice *slice,
- struct cl_io *unused, __u32 enqflags)
-{
- CLOBINVRNT(env, slice->cls_obj, ccc_object_invariant(slice->cls_obj));
-
- liblustre_wait_event(0);
- return 0;
-}
-
-static const struct cl_lock_operations slp_lock_ops = {
- .clo_delete = ccc_lock_delete,
- .clo_fini = ccc_lock_fini,
- .clo_enqueue = slp_lock_enqueue,
- .clo_wait = ccc_lock_wait,
- .clo_unuse = ccc_lock_unuse,
- .clo_fits_into = ccc_lock_fits_into,
-};
-
-/*****************************************************************************
- *
- * io operations.
- *
- */
-
-static int slp_io_rw_lock(const struct lu_env *env,
- const struct cl_io_slice *ios)
-{
- struct ccc_io *cio = ccc_env_io(env);
- struct cl_io *io = ios->cis_io;
- loff_t start;
- loff_t end;
-
- if (cl_io_is_append(io)) {
- start = 0;
- end = OBD_OBJECT_EOF;
- } else {
- start = io->u.ci_wr.wr.crw_pos;
- end = start + io->u.ci_wr.wr.crw_count - 1;
- }
-
- ccc_io_update_iov(env, cio, io);
-
- /*
- * This acquires real DLM lock only in O_APPEND case, because of
- * the io->ci_lockreq setting in llu_io_init().
- */
- LASSERT(ergo(cl_io_is_append(io), io->ci_lockreq == CILR_MANDATORY));
- LASSERT(ergo(!cl_io_is_append(io), io->ci_lockreq == CILR_NEVER));
- return ccc_io_one_lock(env, io, 0,
- io->ci_type == CIT_READ ? CLM_READ : CLM_WRITE,
- start, end);
-
-}
-
-static int slp_io_setattr_iter_init(const struct lu_env *env,
- const struct cl_io_slice *ios)
-{
- return 0;
-}
-
-static int slp_io_setattr_start(const struct lu_env *env,
- const struct cl_io_slice *ios)
-{
- return 0;
-}
-
-static struct page *llu_get_user_page(int index, void *addr, int offset,
- int count)
-{
- struct page *page;
-
- OBD_ALLOC_PTR(page);
- if (!page)
- return NULL;
- page->index = index;
- page->addr = addr;
- page->_offset = offset;
- page->_count = count;
-
- CFS_INIT_LIST_HEAD(&page->list);
- CFS_INIT_LIST_HEAD(&page->_node);
-
- return page;
-}
-
-static void llu_free_user_page(struct page *page)
-{
- OBD_FREE_PTR(page);
-}
-
-
-static int llu_queue_pio(const struct lu_env *env, struct cl_io *io,
- struct llu_io_group *group,
- char *buf, size_t count, loff_t pos)
-{
- struct cl_object *obj = io->ci_obj;
- struct inode *inode = ccc_object_inode(obj);
- struct intnl_stat *st = llu_i2stat(inode);
- struct obd_export *exp = llu_i2obdexp(inode);
- struct page *page;
- int rc = 0, ret_bytes = 0;
- struct cl_page *clp;
- struct cl_2queue *queue;
- ENTRY;
-
- if (!exp)
- RETURN(-EINVAL);
-
- queue = &io->ci_queue;
- cl_2queue_init(queue);
-
-
- /* prepare the pages array */
- do {
- unsigned long index, offset, bytes;
-
- offset = (pos & ~CFS_PAGE_MASK);
- index = pos >> PAGE_CACHE_SHIFT;
- bytes = PAGE_CACHE_SIZE - offset;
- if (bytes > count)
- bytes = count;
-
- /* prevent read beyond file range */
- if (/* local_lock && */
- io->ci_type == CIT_READ && pos + bytes >= st->st_size) {
- if (pos >= st->st_size)
- break;
- bytes = st->st_size - pos;
- }
-
- /* prepare page for this index */
- page = llu_get_user_page(index, buf - offset, offset, bytes);
- if (!page) {
- rc = -ENOMEM;
- break;
- }
-
- clp = cl_page_find(env, obj,
- cl_index(obj, pos),
- page, CPT_TRANSIENT);
-
- if (IS_ERR(clp)) {
- rc = PTR_ERR(clp);
- break;
- }
-
- rc = cl_page_own(env, io, clp);
- if (rc) {
- LASSERT(clp->cp_state == CPS_FREEING);
- cl_page_put(env, clp);
- break;
- }
-
- cl_2queue_add(queue, clp);
-
- /* drop the reference count for cl_page_find, so that the page
- * will be freed in cl_2queue_fini. */
- cl_page_put(env, clp);
-
- cl_page_clip(env, clp, offset, offset+bytes);
-
- count -= bytes;
- pos += bytes;
- buf += bytes;
-
- group->lig_rwcount += bytes;
- ret_bytes += bytes;
- page++;
- } while (count);
-
- if (rc == 0) {
- enum cl_req_type iot;
- iot = io->ci_type == CIT_READ ? CRT_READ : CRT_WRITE;
- rc = cl_io_submit_sync(env, io, iot, queue, 0);
- }
-
- group->lig_rc = rc;
-
- cl_2queue_discard(env, io, queue);
- cl_2queue_disown(env, io, queue);
- cl_2queue_fini(env, queue);
-
- RETURN(ret_bytes);
-}
-
-static
-struct llu_io_group *get_io_group(struct inode *inode, int maxpages)
-{
- struct llu_io_group *group;
-
- OBD_ALLOC_PTR(group);
- if (!group)
- return ERR_PTR(-ENOMEM);
-
- return group;
-}
-
-static int max_io_pages(ssize_t len, int iovlen)
-{
- return ((len + PAGE_CACHE_SIZE - 1) / PAGE_CACHE_SIZE) +
- 2 + iovlen - 1;
-}
-
-void put_io_group(struct llu_io_group *group)
-{
- OBD_FREE_PTR(group);
-}
-
-/**
- * True, if \a io is a normal io, False for sendfile() / splice_{read|write}
- */
-int cl_is_normalio(const struct lu_env *env, const struct cl_io *io)
-{
- return 1;
-}
-
-static int slp_io_start(const struct lu_env *env, const struct cl_io_slice *ios)
-{
- struct ccc_io *cio = cl2ccc_io(env, ios);
- struct cl_io *io = ios->cis_io;
- struct cl_object *obj = io->ci_obj;
- struct inode *inode = ccc_object_inode(obj);
- int err, ret;
- loff_t pos;
- long cnt;
- struct llu_io_group *iogroup;
- int iovidx;
- struct intnl_stat *st = llu_i2stat(inode);
- struct llu_inode_info *lli = llu_i2info(inode);
- struct llu_io_session *session = cl2slp_io(env, ios)->sio_session;
- int write = io->ci_type == CIT_WRITE;
- int exceed = 0;
-
- CLOBINVRNT(env, obj, ccc_object_invariant(obj));
-
- if (write) {
- pos = io->u.ci_wr.wr.crw_pos;
- cnt = io->u.ci_wr.wr.crw_count;
- } else {
- pos = io->u.ci_rd.rd.crw_pos;
- cnt = io->u.ci_rd.rd.crw_count;
- }
-
- iogroup = get_io_group(inode, max_io_pages(cnt, cio->cui_nrsegs));
- if (IS_ERR(iogroup))
- RETURN(PTR_ERR(iogroup));
-
- err = ccc_prep_size(env, obj, io, pos, cnt, &exceed);
- if (err != 0 || (write == 0 && exceed != 0))
- GOTO(out, err);
-
- CDEBUG(D_INODE,
- "%s ino %lu, %lu bytes, offset "LPU64", i_size "LPU64"\n",
- write ? "Write" : "Read", (unsigned long)st->st_ino,
- cnt, (__u64)pos, (__u64)st->st_size);
-
- if (write && io->u.ci_wr.wr_append)
- pos = io->u.ci_wr.wr.crw_pos = st->st_size; /* XXX? Do we need to change io content too here? */
- /* XXX What about if one write syscall writes at 2 different offsets? */
-
- for (iovidx = 0; iovidx < cio->cui_nrsegs; iovidx++) {
- char *buf = (char *) cio->cui_iov[iovidx].iov_base;
- long count = cio->cui_iov[iovidx].iov_len;
-
- if (!count)
- continue;
- if (cnt < count)
- count = cnt;
- if (IS_BAD_PTR(buf) || IS_BAD_PTR(buf + count)) {
- GOTO(out, err = -EFAULT);
- }
-
- if (io->ci_type == CIT_READ) {
- if (/* local_lock && */ pos >= st->st_size)
- break;
- } else if (io->ci_type == CIT_WRITE) {
- if (pos >= lli->lli_maxbytes) {
- GOTO(out, err = -EFBIG);
- }
- if (pos + count >= lli->lli_maxbytes)
- count = lli->lli_maxbytes - pos;
- } else {
- LBUG();
- }
-
- ret = llu_queue_pio(env, io, iogroup, buf, count, pos);
- if (ret < 0) {
- GOTO(out, err = ret);
- } else {
- io->ci_nob += ret;
- pos += ret;
- cnt -= ret;
- if (io->ci_type == CIT_WRITE) {
-// obd_adjust_kms(exp, lsm, pos, 0); // XXX
- if (pos > st->st_size)
- st->st_size = pos;
- }
- if (!cnt)
- break;
- }
- }
- LASSERT(cnt == 0 || io->ci_type == CIT_READ); /* libsysio should guarantee this */
-
- if (!iogroup->lig_rc)
- session->lis_rwcount += iogroup->lig_rwcount;
- else if (!session->lis_rc)
- session->lis_rc = iogroup->lig_rc;
- err = 0;
-
-out:
- put_io_group(iogroup);
- return err;
-}
-
-static const struct cl_io_operations ccc_io_ops = {
- .op = {
- [CIT_READ] = {
- .cio_fini = ccc_io_fini,
- .cio_lock = slp_io_rw_lock,
- .cio_start = slp_io_start,
- .cio_end = ccc_io_end,
- .cio_advance = ccc_io_advance
- },
- [CIT_WRITE] = {
- .cio_fini = ccc_io_fini,
- .cio_lock = slp_io_rw_lock,
- .cio_start = slp_io_start,
- .cio_end = ccc_io_end,
- .cio_advance = ccc_io_advance
- },
- [CIT_SETATTR] = {
- .cio_fini = ccc_io_fini,
- .cio_iter_init = slp_io_setattr_iter_init,
- .cio_start = slp_io_setattr_start
- },
- [CIT_MISC] = {
- .cio_fini = ccc_io_fini
- }
- }
-};
-
-static struct slp_io *cl2slp_io(const struct lu_env *env,
- const struct cl_io_slice *slice)
-{
- /* We call it just for assertion here */
- cl2ccc_io(env, slice);
-
- return slp_env_io(env);
-}
-
-/*****************************************************************************
- *
- * Temporary prototype thing: mirror obd-devices into cl devices.
- *
- */
-
-int cl_sb_init(struct llu_sb_info *sbi)
-{
- struct cl_device *cl;
- struct lu_env *env;
- int rc = 0;
- int refcheck;
-
- env = cl_env_get(&refcheck);
- if (IS_ERR(env))
- RETURN(PTR_ERR(env));
-
- cl = cl_type_setup(env, NULL, &slp_device_type,
- sbi->ll_dt_exp->exp_obd->obd_lu_dev);
- if (IS_ERR(cl))
- GOTO(out, rc = PTR_ERR(cl));
-
- sbi->ll_cl = cl;
- sbi->ll_site = cl2lu_dev(cl)->ld_site;
-out:
- cl_env_put(env, &refcheck);
- RETURN(rc);
-}
-
-int cl_sb_fini(struct llu_sb_info *sbi)
-{
- struct lu_env *env;
- int refcheck;
-
- ENTRY;
-
- env = cl_env_get(&refcheck);
- if (IS_ERR(env))
- RETURN(PTR_ERR(env));
-
- if (sbi->ll_cl != NULL) {
- cl_stack_fini(env, sbi->ll_cl);
- sbi->ll_cl = NULL;
- sbi->ll_site = NULL;
- }
- cl_env_put(env, &refcheck);
- cl_env_cache_purge(~0);
-
- RETURN(0);
-}
+++ /dev/null
-/*
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program 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
- * General Public License version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- *
- * Copyright (c) 2012, Intel Corporation.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- *
- * lustre/liblustre/llite_lib.c
- *
- * Lustre Light common routines
- */
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/mount.h>
-#include <libcfs/libcfs.h>
-#include <lustre/lustre_idl.h>
-#include <liblustre.h>
-#include <lnet/lnet.h>
-#include <lustre_cfg.h>
-#include <lustre_export.h>
-#include <lustre_log.h>
-#include <lustre_ver.h>
-#include <obd.h>
-#include <obd_class.h>
-#include <obd_support.h>
-#include "llite_lib.h"
-#include "lutil.h"
-
-static int lllib_init(void)
-{
- if (liblustre_init_current("liblustre") ||
- init_lib_portals() ||
- init_obdclass() ||
- ptlrpc_init() ||
- mgc_init() ||
- lmv_init() ||
- mdc_init() ||
- lov_init() ||
- osc_init() ||
- slp_global_init())
- return -1;
-
- return _sysio_fssw_register("lustre", &llu_fssw_ops);
-}
-
-int liblustre_process_log(struct config_llog_instance *cfg,
- char *mgsnid, char *profile,
- int allow_recov)
-{
- struct lustre_cfg_bufs bufs;
- struct lustre_cfg *lcfg;
- char *peer = "MGS_UUID";
- struct obd_device *obd;
- struct obd_export *exp;
- char *name = "mgc_dev";
- class_uuid_t uuid;
- struct obd_uuid mgc_uuid;
- struct llog_ctxt *ctxt;
- lnet_nid_t nid = 0;
- char *mdsnid;
- int err, rc = 0;
- struct obd_connect_data *ocd = NULL;
- ENTRY;
-
- ll_generate_random_uuid(uuid);
- class_uuid_unparse(uuid, &mgc_uuid);
-
- nid = libcfs_str2nid(mgsnid);
- if (nid == LNET_NID_ANY) {
- CERROR("Can't parse NID %s\n", mgsnid);
- RETURN(-EINVAL);
- }
-
- lustre_cfg_bufs_reset(&bufs, NULL);
- lustre_cfg_bufs_set_string(&bufs, 1, peer);
- lcfg = lustre_cfg_new(LCFG_ADD_UUID, &bufs);
- lcfg->lcfg_nid = nid;
- rc = class_process_config(lcfg);
- lustre_cfg_free(lcfg);
- if (rc < 0)
- GOTO(out, rc);
-
- lustre_cfg_bufs_reset(&bufs, name);
- lustre_cfg_bufs_set_string(&bufs, 1, LUSTRE_MGC_NAME);
- lustre_cfg_bufs_set_string(&bufs, 2, mgc_uuid.uuid);
- lcfg = lustre_cfg_new(LCFG_ATTACH, &bufs);
- rc = class_process_config(lcfg);
- lustre_cfg_free(lcfg);
- if (rc < 0)
- GOTO(out_del_uuid, rc);
-
- lustre_cfg_bufs_reset(&bufs, name);
- lustre_cfg_bufs_set_string(&bufs, 1, LUSTRE_MGS_OBDNAME);
- lustre_cfg_bufs_set_string(&bufs, 2, peer);
- lcfg = lustre_cfg_new(LCFG_SETUP, &bufs);
- rc = class_process_config(lcfg);
- lustre_cfg_free(lcfg);
- if (rc < 0)
- GOTO(out_detach, rc);
-
- while ((mdsnid = strsep(&mgsnid, ","))) {
- nid = libcfs_str2nid(mdsnid);
- lustre_cfg_bufs_reset(&bufs, NULL);
- lustre_cfg_bufs_set_string(&bufs, 1, libcfs_nid2str(nid));
- lcfg = lustre_cfg_new(LCFG_ADD_UUID, &bufs);
- lcfg->lcfg_nid = nid;
- rc = class_process_config(lcfg);
- lustre_cfg_free(lcfg);
- if (rc) {
- CERROR("Add uuid for %s failed %d\n",
- libcfs_nid2str(nid), rc);
- continue;
- }
-
- lustre_cfg_bufs_reset(&bufs, name);
- lustre_cfg_bufs_set_string(&bufs, 1, libcfs_nid2str(nid));
- lcfg = lustre_cfg_new(LCFG_ADD_CONN, &bufs);
- lcfg->lcfg_nid = nid;
- rc = class_process_config(lcfg);
- lustre_cfg_free(lcfg);
- if (rc) {
- CERROR("Add conn for %s failed %d\n",
- libcfs_nid2str(nid), rc);
- continue;
- }
- }
-
- obd = class_name2obd(name);
- if (obd == NULL)
- GOTO(out_cleanup, rc = -EINVAL);
-
- OBD_ALLOC(ocd, sizeof(*ocd));
- if (ocd == NULL)
- GOTO(out_cleanup, rc = -ENOMEM);
-
- ocd->ocd_connect_flags = OBD_CONNECT_VERSION | OBD_CONNECT_AT |
- OBD_CONNECT_FULL20;
- ocd->ocd_version = LUSTRE_VERSION_CODE;
-
- rc = obd_connect(NULL, &exp, obd, &mgc_uuid, ocd, NULL);
- if (rc) {
- CERROR("cannot connect to %s at %s: rc = %d\n",
- LUSTRE_MGS_OBDNAME, mgsnid, rc);
- GOTO(out_cleanup, rc);
- }
-
- ctxt = llog_get_context(exp->exp_obd, LLOG_CONFIG_REPL_CTXT);
- cfg->cfg_flags |= CFG_F_COMPAT146;
- rc = class_config_parse_llog(NULL, ctxt, profile, cfg);
- llog_ctxt_put(ctxt);
- if (rc) {
- CERROR("class_config_parse_llog failed: rc = %d\n", rc);
- }
-
- /* We don't so much care about errors in cleaning up the config llog
- * connection, as we have already read the config by this point. */
- err = obd_disconnect(exp);
- if (err)
- CERROR("obd_disconnect failed: rc = %d\n", err);
-
-out_cleanup:
- if (ocd)
- OBD_FREE(ocd, sizeof(*ocd));
-
- lustre_cfg_bufs_reset(&bufs, name);
- lcfg = lustre_cfg_new(LCFG_CLEANUP, &bufs);
- err = class_process_config(lcfg);
- lustre_cfg_free(lcfg);
- if (err)
- CERROR("md_cleanup failed: rc = %d\n", err);
-
-out_detach:
- lustre_cfg_bufs_reset(&bufs, name);
- lcfg = lustre_cfg_new(LCFG_DETACH, &bufs);
- err = class_process_config(lcfg);
- lustre_cfg_free(lcfg);
- if (err)
- CERROR("md_detach failed: rc = %d\n", err);
-
-out_del_uuid:
- lustre_cfg_bufs_reset(&bufs, name);
- lustre_cfg_bufs_set_string(&bufs, 1, peer);
- lcfg = lustre_cfg_new(LCFG_DEL_UUID, &bufs);
- err = class_process_config(lcfg);
- if (err)
- CERROR("del MDC UUID failed: rc = %d\n", err);
- lustre_cfg_free(lcfg);
-out:
-
- RETURN(rc);
-}
-
-/* parse host:/fsname string */
-int ll_parse_mount_target(const char *target, char **mgsnid,
- char **fsname)
-{
- static char buf[256];
- char *s;
-
- buf[255] = 0;
- strncpy(buf, target, 255);
-
- if ((s = strchr(buf, ':'))) {
- *mgsnid = buf;
- *s = '\0';
-
- while (*++s == '/')
- ;
- sprintf(s + strlen(s), "-client");
- *fsname = s;
-
- return 0;
- }
-
- return -1;
-}
-
-/*
- * early liblustre init
- * called from C startup in catamount apps, before main()
- *
- * The following is a skeleton sysio startup sequence,
- * as implemented in C startup (skipping error handling).
- * In this framework none of these calls need be made here
- * or in the apps themselves. The NAMESPACE_STRING specifying
- * the initial set of fs ops (creates, mounts, etc.) is passed
- * as an environment variable.
- *
- * _sysio_init();
- * _sysio_incore_init();
- * _sysio_native_init();
- * _sysio_lustre_init();
- * _sysio_boot(NAMESPACE_STRING);
- *
- * the name _sysio_lustre_init() follows the naming convention
- * established in other fs drivers from libsysio:
- * _sysio_incore_init(), _sysio_native_init()
- *
- * _sysio_lustre_init() must be called before _sysio_boot()
- * to enable libsysio's processing of namespace init strings containing
- * lustre filesystem operations
- */
-static int _sysio_lustre_init(void)
-{
- int err;
- char *envstr;
-#ifndef INIT_SYSIO
- extern void __liblustre_cleanup_(void);
-#endif
-
- liblustre_init_random();
-
- err = lllib_init();
- if (err) {
- perror("init llite driver");
- return err;
- }
-
- envstr = getenv("LIBLUSTRE_TIMEOUT");
- if (envstr != NULL) {
- obd_timeout = (unsigned int)strtol(envstr, NULL, 0);
- printf("LibLustre: obd timeout=%u seconds\n",
- obd_timeout);
- }
-
- /* debug peer on timeout? */
- envstr = getenv("LIBLUSTRE_DEBUG_PEER_ON_TIMEOUT");
- if (envstr != NULL) {
- obd_debug_peer_on_timeout =
- (unsigned int)strtol(envstr, NULL, 0);
- printf("LibLustre: debug peer on timeout=%d\n",
- obd_debug_peer_on_timeout ? 0 : 1);
- }
-
-#ifndef INIT_SYSIO
- (void)atexit(__liblustre_cleanup_);
-#endif
- return err;
-}
-
-extern int _sysio_native_init();
-
-static int mnt_retry = 0;
-
-char *lustre_path = NULL;
-
-void __liblustre_setup_(void)
-{
- char *target = NULL;
- char *lustre_driver = "lustre";
- unsigned mntflgs = 0;
- int err, count;
-
- lustre_path = getenv("LIBLUSTRE_MOUNT_POINT");
- if (!lustre_path) {
- lustre_path = "/mnt/lustre";
- }
-
- target = getenv("LIBLUSTRE_MOUNT_RETRY");
- if (target) {
- mnt_retry = atoi(target);
- if (mnt_retry < 0)
- mnt_retry = 0;
- }
-
- /* mount target */
- target = getenv("LIBLUSTRE_MOUNT_TARGET");
- if (!target) {
- printf("LibLustre: no mount target specified\n");
- exit(1);
- }
-
- CDEBUG(D_CONFIG, "LibLustre: mount point %s, target %s\n",
- lustre_path, target);
-
-#ifdef INIT_SYSIO
- /* initialize libsysio & mount rootfs */
- if (_sysio_init()) {
- perror("init sysio");
- exit(1);
- }
- _sysio_native_init();
-
- err = _sysio_mount_root("/", "native", mntflgs, NULL);
- if (err) {
- fprintf(stderr, "sysio mount failed: %s\n", strerror(errno));
- exit(1);
- }
-
- if (_sysio_lustre_init())
- exit(1);
-#endif /* INIT_SYSIO */
-
- count = mnt_retry;
- do {
- err = mount(target, lustre_path, lustre_driver, mntflgs, NULL);
- if (err && mnt_retry && (-- count)) {
- fprintf(stderr, "Lustre mount failed: %s. "
- "Will retry %d more times\n",
- strerror(errno), mnt_retry - count );
- sleep(2);
- }
- } while (err && count > 0);
- if (err) {
- fprintf(stderr, "Lustre mount failed: %s\n", strerror(errno));
- exit(1);
- }
-}
-
-void __liblustre_cleanup_(void)
-{
-#ifndef INIT_SYSIO
- /* guard against being called multiple times */
- static int cleaned = 0;
-
- if (cleaned)
- return;
- cleaned++;
-#endif
-
- /* user app might chdir to a lustre directory, and leave busy pnode
- * during finaly libsysio cleanup. here we chdir back to "/".
- * but it can't fix the situation that liblustre is mounted
- * at "/".
- */
- if (!chdir("/")) {}
-#if 0
- umount(lustre_path);
-#endif
- /* we can't call umount here, because libsysio will not cleanup
- * opening files for us. _sysio_shutdown() will cleanup fds at
- * first but which will also close the sockets we need for umount
- * liblutre. this dilema lead to another hack in
- * libsysio/src/file_hack.c FIXME
- */
-#ifdef INIT_SYSIO
- _sysio_shutdown();
- cleanup_lib_portals();
- LNetFini();
-#endif
-}
+++ /dev/null
-/*
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program 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
- * General Public License version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- *
- * Copyright (c) 2012, 2013, Intel Corporation.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- */
-
-#ifndef __LLU_H_
-#define __LLU_H_
-
-#include <fcntl.h>
-#include <limits.h>
-#include <stdbool.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <unistd.h>
-#include <sysio.h>
-#ifdef HAVE_XTIO_H
-# include <xtio.h>
-#endif
-#include <fs.h>
-#include <mount.h>
-#include <inode.h>
-#ifdef HAVE_FILE_H
-# include <file.h>
-#endif
-#include <libcfs/libcfs.h>
-#include <lustre/lustre_idl.h>
-#include <lclient.h>
-#include <lustre_lib.h>
-#include <lustre_lite.h>
-
-enum cl_req_type;
-
-/* This should not be "optimized" use ~0ULL because page->index is a long and
- * 32-bit systems are therefore limited to 16TB in a mapping */
-#define MAX_LFS_FILESIZE ((__u64)(~0UL) << PAGE_CACHE_SHIFT)
-struct ll_file_data {
- struct obd_client_handle fd_mds_och;
- __u32 fd_flags;
- struct ccc_grouplock fd_grouplock;
-};
-
-struct llu_sb_info {
- struct obd_uuid ll_sb_uuid;
- struct obd_export *ll_md_exp;
- struct obd_export *ll_dt_exp;
- struct lu_fid ll_root_fid;
- struct lustre_client_ocd ll_lco;
- cfs_list_t ll_conn_chain;
- struct lu_site *ll_site;
- struct cl_device *ll_cl;
-};
-
-enum lli_flags {
- /* MDS has an authority for the Size-on-MDS attributes. */
- LLIF_MDS_SIZE_LOCK = (1 << 0),
-};
-
-struct llu_inode_info {
- struct llu_sb_info *lli_sbi;
- struct lu_fid lli_fid;
-
- char *lli_symlink_name;
- __u64 lli_maxbytes;
- unsigned long lli_flags;
- __u64 lli_ioepoch;
-
- /* for libsysio */
- struct file_identifier lli_sysio_fid;
-
- struct lookup_intent *lli_it;
-
- /* XXX workaround for libsysio readdir */
- loff_t lli_dir_pos;
-
- /* in libsysio we have no chance to store data in file,
- * so place it here. since it's possible that an file
- * was opened several times without close, we track an
- * open_count here */
- struct ll_file_data *lli_file_data;
- /* checking lli_has_smd is reliable only inside an IO
- * i.e, lov stripe has been held. */
- bool lli_has_smd;
- int lli_open_flags;
- int lli_open_count;
-
- /* not for stat, change it later */
- int lli_st_flags;
- unsigned long lli_st_generation;
- struct cl_object *lli_clob;
- /* the most recent timestamps obtained from mds */
- struct ost_lvb lli_lvb;
-};
-
-static inline struct llu_sb_info *llu_fs2sbi(struct filesys *fs)
-{
- return (struct llu_sb_info*)(fs->fs_private);
-}
-
-static inline struct llu_inode_info *llu_i2info(struct inode *inode)
-{
- return (struct llu_inode_info*)(inode->i_private);
-}
-
-static inline int ll_inode_flags(struct inode *inode)
-{
- return llu_i2info(inode)->lli_st_flags;
-}
-
-static inline struct intnl_stat *llu_i2stat(struct inode *inode)
-{
- return &inode->i_stbuf;
-}
-
-#define ll_inode_blksize(inode) (llu_i2stat(inode)->st_blksize)
-
-static inline struct llu_sb_info *llu_i2sbi(struct inode *inode)
-{
- return llu_i2info(inode)->lli_sbi;
-}
-
-static inline struct obd_export *llu_i2obdexp(struct inode *inode)
-{
- return llu_i2info(inode)->lli_sbi->ll_dt_exp;
-}
-
-static inline struct obd_export *llu_i2mdexp(struct inode *inode)
-{
- return llu_i2info(inode)->lli_sbi->ll_md_exp;
-}
-
-static inline int llu_is_root_inode(struct inode *inode)
-{
- return (fid_seq(&llu_i2info(inode)->lli_fid) ==
- fid_seq(&llu_i2info(inode)->lli_sbi->ll_root_fid) &&
- fid_oid(&llu_i2info(inode)->lli_fid) ==
- fid_oid(&llu_i2info(inode)->lli_sbi->ll_root_fid));
-}
-
-#define LL_SAVE_INTENT(inode, it) \
-do { \
- struct lookup_intent *temp; \
- LASSERT(llu_i2info(inode)->lli_it == NULL); \
- OBD_ALLOC(temp, sizeof(*temp)); \
- memcpy(temp, it, sizeof(*temp)); \
- llu_i2info(inode)->lli_it = temp; \
- CDEBUG(D_DENTRY, "alloc intent %p to inode %p(ino %llu)\n", \
- temp, inode, (long long)llu_i2stat(inode)->st_ino); \
-} while(0)
-
-
-#define LL_GET_INTENT(inode, it) \
-do { \
- it = llu_i2info(inode)->lli_it; \
- \
- LASSERT(it); \
- llu_i2info(inode)->lli_it = NULL; \
- CDEBUG(D_DENTRY, "dettach intent %p from inode %p(ino %llu)\n", \
- it, inode, (long long)llu_i2stat(inode)->st_ino); \
-} while(0)
-
-static inline struct lu_fid *ll_inode2fid(struct inode *inode)
-{
- LASSERT(inode != NULL);
- return &llu_i2info(inode)->lli_fid;
-}
-
-void ll_i2gids(__u32 *suppgids, struct inode *i1,struct inode *i2);
-
-static inline __u64 ll_file_maxbytes(struct inode *inode)
-{
- return llu_i2info(inode)->lli_maxbytes;
-}
-
-#define IS_BAD_PTR(ptr) \
- ((unsigned long)(ptr) == 0 || (unsigned long)(ptr) > -1000UL)
-
-/* llite_lib.c */
-int liblustre_process_log(struct config_llog_instance *cfg, char *mgsnid,
- char *profile, int allow_recov);
-int ll_parse_mount_target(const char *target, char **mgsnid,
- char **fsname);
-extern char *lustre_path;
-
-/* super.c */
-void llu_update_inode(struct inode *inode, struct lustre_md *md);
-struct inode *llu_iget(struct filesys *fs, struct lustre_md *md);
-int llu_inode_getattr(struct inode *inode, struct obdo *obdo,
- __u64 ioepoch, int sync);
-int llu_md_setattr(struct inode *inode, struct md_op_data *op_data,
- struct md_open_data **mod);
-int llu_setattr_raw(struct inode *inode, struct iattr *attr);
-int llu_put_grouplock(struct inode *inode, unsigned long arg);
-
-extern struct fssw_ops llu_fssw_ops;
-
-/* file.c */
-void llu_prep_md_op_data(struct md_op_data *op_data, struct inode *i1,
- struct inode *i2, const char *name, int namelen,
- int mode, __u32 opc);
-int llu_local_open(struct llu_inode_info *lli, struct lookup_intent *it);
-int llu_iop_open(struct pnode *pnode, int flags, mode_t mode);
-void llu_done_writing_attr(struct inode *inode, struct md_op_data *op_data);
-int llu_md_close(struct obd_export *md_exp, struct inode *inode);
-void llu_pack_inode2opdata(struct inode *inode, struct md_op_data *op_data,
- struct lustre_handle *fh);
-int llu_file_release(struct inode *inode);
-int llu_som_update(struct inode *inode, struct md_op_data *op_data);
-int llu_iop_close(struct inode *inode);
-_SYSIO_OFF_T llu_iop_pos(struct inode *ino, _SYSIO_OFF_T off);
-void obdo_refresh_inode(struct inode *dst, struct obdo *src, obd_flag valid);
-int llu_objects_destroy(struct ptlrpc_request *request, struct inode *dir);
-void llu_ioepoch_open(struct llu_inode_info *lli, __u64 ioepoch);
-
-/* rw.c */
-int llu_iop_read(struct inode *ino, struct ioctx *ioctxp);
-int llu_iop_write(struct inode *ino, struct ioctx *ioctxp);
-int llu_iop_iodone(struct ioctx *ioctxp);
-
-/* namei.c */
-int llu_iop_lookup(struct pnode *pnode,
- struct inode **inop,
- struct intent *intnt,
- const char *path);
-struct inode *llu_inode_from_resource_lock(struct ldlm_lock *lock);
-int llu_md_blocking_ast(struct ldlm_lock *lock,
- struct ldlm_lock_desc *desc,
- void *data, int flag);
-
-/* dir.c */
-ssize_t llu_iop_filldirentries(struct inode *ino, _SYSIO_OFF_T *basep,
- char *buf, size_t nbytes);
-
-/* ext2 related */
-#define EXT2_NAME_LEN (255)
-
-struct ext2_dirent {
- __u32 inode;
- __u16 rec_len;
- __u8 name_len;
- __u8 file_type;
- char name[EXT2_NAME_LEN];
-};
-
-static inline struct ext2_dirent *ext2_next_entry(struct ext2_dirent *p)
-{
- return (struct ext2_dirent*)((char*) p + le16_to_cpu(p->rec_len));
-}
-
-int llu_merge_lvb(const struct lu_env *env, struct inode *inode);
-
-static inline void inode_init_lvb(struct inode *inode, struct ost_lvb *lvb)
-{
- struct intnl_stat *st = llu_i2stat(inode);
- lvb->lvb_size = st->st_size;
- lvb->lvb_blocks = st->st_blocks;
- lvb->lvb_mtime = st->st_mtime;
- lvb->lvb_atime = st->st_atime;
- lvb->lvb_ctime = st->st_ctime;
-}
-
-struct llu_io_session {
- struct inode *lis_inode;
- int lis_cmd;
- int lis_rc;
- __u64 lis_rwcount;
-};
-
-struct llu_io_group
-{
- int lig_rc;
- __u64 lig_rwcount;
-};
-
-struct llu_io_session;
-void put_io_group(struct llu_io_group *group);
-
-int cl_sb_init(struct llu_sb_info *sbi);
-int cl_sb_fini(struct llu_sb_info *sbi);
-
-void llu_io_init(struct cl_io *io, struct inode *inode, int write);
-
-struct slp_io {
- struct llu_io_session *sio_session;
-};
-
-struct slp_session {
- struct slp_io ss_ios;
-};
-
-int slp_global_init(void);
-void slp_global_fini(void);
-
-static inline struct slp_session *slp_env_session(const struct lu_env *env)
-{
- extern struct lu_context_key slp_session_key;
- struct slp_session *ses;
- ses = lu_context_key_get(env->le_ses, &slp_session_key);
- LASSERT(ses != NULL);
- return ses;
-}
-static inline struct slp_io *slp_env_io(const struct lu_env *env)
-{
- return &slp_env_session(env)->ss_ios;
-}
-
-/* lclient compat stuff */
-#define cl_inode_info llu_inode_info
-#define cl_i2info(info) llu_i2info(info)
-#define cl_inode_mode(inode) (llu_i2stat(inode)->st_mode)
-#define cl_i2sbi llu_i2sbi
-#define cl_isize_read(inode) (llu_i2stat(inode)->st_size)
-#define cl_isize_write(inode,kms) do{llu_i2stat(inode)->st_size = kms;}while(0)
-#define cl_isize_write_nolock(inode,kms) cl_isize_write(inode,kms)
-
-static inline struct ll_file_data *cl_iattr2fd(struct inode *inode,
- const struct iattr *attr)
-{
- return llu_i2info(inode)->lli_file_data;
-}
-
-static inline void cl_isize_lock(struct inode *inode)
-{
-}
-
-static inline void cl_isize_unlock(struct inode *inode)
-{
-}
-
-static inline int cl_merge_lvb(const struct lu_env *env, struct inode *inode)
-{
- return llu_merge_lvb(env, inode);
-}
-
-#define cl_inode_atime(inode) (llu_i2stat(inode)->st_atime)
-#define cl_inode_ctime(inode) (llu_i2stat(inode)->st_ctime)
-#define cl_inode_mtime(inode) (llu_i2stat(inode)->st_mtime)
-
-static inline struct obd_capa *cl_capa_lookup(struct inode *inode,
- enum cl_req_type crt)
-{
- return NULL;
-}
-
-static inline void cl_stats_tally(struct cl_device *dev, enum cl_req_type crt,
- int rc)
-{
-}
-
-static inline loff_t i_size_read(struct inode *inode)
-{
- return inode->i_stbuf.st_size;
-}
-
-static inline __u64 hash_x_index(__u64 hash, int hash64)
-{
- if (BITS_PER_LONG == 32 && hash64)
- hash >>= 32;
- /* save hash 0 with hash 1 */
- return ~0ULL - (hash + !hash);
-}
-#endif
+++ /dev/null
-/*
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program 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
- * General Public License version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- *
- * Copyright (c) 2012, Intel Corporation.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- */
-
-#include <byteswap.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <malloc.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <arpa/inet.h>
-#include <sys/socket.h>
-#include <sys/syscall.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <sys/utsname.h>
-#include <libcfs/libcfs.h>
-#include <lustre/lustre_idl.h>
-#include <liblustre.h>
-#include <lnet/lnet.h>
-#include <lustre_dlm.h>
-#include "lutil.h"
-
-struct task_struct *current;
-
-/*
- * random number generator stuff
- */
-
-#ifdef HAVE_GETHOSTBYNAME
-static int get_ipv4_addr()
-{
- struct utsname myname;
- struct hostent *hptr;
- int ip;
-
- if (uname(&myname) < 0)
- return 0;
-
- hptr = gethostbyname(myname.nodename);
- if (hptr == NULL ||
- hptr->h_addrtype != AF_INET ||
- *hptr->h_addr_list == NULL) {
- CWARN("Warning: fail to get local IPv4 address\n");
- return 0;
- }
-
- ip = ntohl(*((int *) *hptr->h_addr_list));
-
- return ip;
-}
-#endif
-
-void liblustre_init_random()
-{
- int seed[2];
- struct timeval tv;
-
-#ifdef LIBLUSTRE_USE_URANDOM
- int _rand_dev_fd;
- _rand_dev_fd = syscall(SYS_open, "/dev/urandom", O_RDONLY);
- if (_rand_dev_fd >= 0) {
- if (syscall(SYS_read, _rand_dev_fd,
- &seed, sizeof(seed)) == sizeof(seed)) {
- cfs_srand(seed[0], seed[1]);
- syscall(SYS_close, _rand_dev_fd);
- return;
- }
- syscall(SYS_close, _rand_dev_fd);
- }
-#endif /* LIBLUSTRE_USE_URANDOM */
-
-#ifdef HAVE_GETHOSTBYNAME
- seed[0] = get_ipv4_addr();
-#else
- seed[0] = _my_pnid;
-#endif
- gettimeofday(&tv, NULL);
- cfs_srand(tv.tv_sec ^ __swab32(seed[0]), tv.tv_usec ^__swab32(getpid()));
-}
-
-static void init_capability(__u32 *res)
-{
-#ifdef HAVE_LIBCAP
- cap_t syscap;
- cap_flag_value_t capval;
- int i;
-
- *res = 0;
-
- syscap = cap_get_proc();
- if (!syscap) {
- CWARN("Warning: failed to get system capability, "
- "set to minimal\n");
- return;
- }
-
- for (i = 0; i < sizeof(cap_value_t) * 8; i++) {
- if (!cap_get_flag(syscap, i, CAP_EFFECTIVE, &capval)) {
- if (capval == CAP_SET) {
- *res |= 1 << i;
- }
- }
- }
-#else
- /*
- * set fake cap flags to ship to linux server
- * from client platforms that have none (eg. catamount)
- * full capability for root
- * no capability for anybody else
- */
-#define FAKE_ROOT_CAP 0x1ffffeff
-#define FAKE_USER_CAP 0
-
- *res = (current->fsuid == 0) ? FAKE_ROOT_CAP: FAKE_USER_CAP;
-#endif
-}
-
-int in_group_p(gid_t gid)
-{
- int i;
-
- if (gid == current->fsgid)
- return 1;
-
- for (i = 0; i < current->ngroups; i++) {
- if (gid == current->groups[i])
- return 1;
- }
-
- return 0;
-}
-
-int liblustre_init_current(char *comm)
-{
- current = malloc(sizeof(*current));
- if (!current) {
- CERROR("Not enough memory\n");
- return -ENOMEM;
- }
-
- strncpy(current->comm, comm, sizeof(current->comm));
- current->pid = getpid();
- current->gid = getgid();
- current->fsuid = geteuid();
- current->fsgid = getegid();
-
- current->max_groups = sysconf(_SC_NGROUPS_MAX);
- current->groups = malloc(sizeof(gid_t) * current->max_groups);
- if (!current->groups) {
- CERROR("Not enough memory\n");
- return -ENOMEM;
- }
- current->ngroups = getgroups(current->max_groups, current->groups);
- if (current->ngroups < 0) {
- perror("Error getgroups");
- return -EINVAL;
- }
-
- init_capability(¤t->cap_effective);
-
- return 0;
-}
-
-void cfs_cap_raise(cfs_cap_t cap)
-{
- current->cap_effective |= (1 << cap);
-}
-
-void cfs_cap_lower(cfs_cap_t cap)
-{
- current->cap_effective &= ~(1 << cap);
-}
-
-int cfs_cap_raised(cfs_cap_t cap)
-{
- return current->cap_effective & (1 << cap);
-}
-
-cfs_cap_t cfs_curproc_cap_pack(void) {
- return current->cap_effective;
-}
-
-void cfs_curproc_cap_unpack(cfs_cap_t cap) {
- current->cap_effective = cap;
-}
-
-int cfs_capable(cfs_cap_t cap)
-{
- return cfs_cap_raised(cap);
-}
-
-int init_lib_portals()
-{
- int rc;
- ENTRY;
-
- rc = libcfs_debug_init(5 * 1024 * 1024);
- if (rc != 0) {
- CERROR("libcfs_debug_init() failed: %d\n", rc);
- RETURN (-ENXIO);
- }
-
- rc = LNetInit();
- if (rc != 0) {
- CERROR("LNetInit() failed: %d\n", rc);
- RETURN (-ENXIO);
- }
- RETURN(0);
-}
-
-extern void ptlrpc_exit_portals(void);
-void cleanup_lib_portals()
-{
- libcfs_debug_cleanup();
- ptlrpc_exit_portals();
-}
+++ /dev/null
-/*
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program 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
- * General Public License version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- */
-
-#ifndef __LUTIL_H_
-#define __LUTIL_H_
-
-void liblustre_init_random(void);
-int liblustre_init_current(char *comm);
-int init_lib_portals(void);
-void cleanup_lib_portals(void);
-
-#endif
+++ /dev/null
-/*
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program 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
- * General Public License version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- *
- * Copyright (c) 2011, 2012, Intel Corporation.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- *
- * lustre/liblustre/namei.c
- *
- * Lustre Light name resolution
- */
-
-#define DEBUG_SUBSYSTEM S_LLITE
-
-#include <assert.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <libcfs/libcfs.h>
-#include <lustre/lustre_idl.h>
-#include <liblustre.h>
-#include <lclient.h>
-#include <lustre_dlm.h>
-#include <lustre_fid.h>
-#include <lustre_mdc.h>
-#include <lustre_net.h>
-#include <obd.h>
-#include <obd_class.h>
-#include <obd_support.h>
-#include "llite_lib.h"
-
-static void ll_intent_drop_lock(struct lookup_intent *it)
-{
- struct lustre_handle *handle;
-
- if (it->it_op && it->d.lustre.it_lock_mode) {
- handle = (struct lustre_handle *)&it->d.lustre.it_lock_handle;
- CDEBUG(D_DLMTRACE, "releasing lock with cookie "LPX64
- " from it %p\n", handle->cookie, it);
- ldlm_lock_decref(handle, it->d.lustre.it_lock_mode);
-
- /* bug 494: intent_release may be called multiple times, from
- * this thread and we don't want to double-decref this lock */
- it->d.lustre.it_lock_mode = 0;
- }
-}
-
-static void ll_intent_release(struct lookup_intent *it)
-{
- ENTRY;
-
- ll_intent_drop_lock(it);
- it->it_magic = 0;
- it->it_op_release = 0;
- it->d.lustre.it_disposition = 0;
- it->d.lustre.it_data = NULL;
- EXIT;
-}
-
-static void
-llu_lookup_finish_locks(struct lookup_intent *it, struct pnode *pnode)
-{
- struct inode *inode;
- LASSERT(it);
- LASSERT(pnode);
-
- inode = pnode->p_base->pb_ino;
- if (it->d.lustre.it_lock_mode && inode != NULL) {
- struct llu_sb_info *sbi;
-
- CDEBUG(D_DLMTRACE, "setting l_data to inode %p (%llu/%lu)\n",
- inode, (long long)llu_i2stat(inode)->st_ino,
- llu_i2info(inode)->lli_st_generation);
-
- sbi = llu_i2sbi(inode);
- md_set_lock_data(sbi->ll_md_exp,
- &it->d.lustre.it_lock_handle, inode, NULL);
- }
-
- /* drop lookup/getattr locks */
- if (it->it_op & (IT_LOOKUP | IT_GETATTR))
- ll_intent_release(it);
-
-}
-
-static inline void llu_invalidate_inode_pages(struct inode * inode)
-{
- /* do nothing */
-}
-
-int llu_md_blocking_ast(struct ldlm_lock *lock,
- struct ldlm_lock_desc *desc,
- void *data, int flag)
-{
- struct lustre_handle lockh;
- int rc;
- ENTRY;
-
-
- switch (flag) {
- case LDLM_CB_BLOCKING:
- ldlm_lock2handle(lock, &lockh);
- rc = ldlm_cli_cancel(&lockh, 0);
- if (rc < 0) {
- CDEBUG(D_INODE, "ldlm_cli_cancel: %d\n", rc);
- RETURN(rc);
- }
- break;
- case LDLM_CB_CANCELING: {
- struct inode *inode = llu_inode_from_resource_lock(lock);
- struct llu_inode_info *lli;
- struct intnl_stat *st;
- __u64 bits = lock->l_policy_data.l_inodebits.bits;
- struct lu_fid *fid;
-
- /* Inode is set to lock->l_resource->lr_lvb_inode
- * for mdc - bug 24555 */
- LASSERT(lock->l_ast_data == NULL);
-
- /* Invalidate all dentries associated with this inode */
- if (inode == NULL)
- break;
-
- lli = llu_i2info(inode);
- st = llu_i2stat(inode);
-
- if (bits & MDS_INODELOCK_UPDATE)
- lli->lli_flags &= ~LLIF_MDS_SIZE_LOCK;
-
- fid = &lli->lli_fid;
- if (!fid_res_name_eq(fid, &lock->l_resource->lr_name))
- LDLM_ERROR(lock, "data mismatch with object "
- DFID" (%p)", PFID(fid), inode);
- if (S_ISDIR(st->st_mode) &&
- (bits & MDS_INODELOCK_UPDATE)) {
- CDEBUG(D_INODE, "invalidating inode %llu\n",
- (long long)st->st_ino);
-
- llu_invalidate_inode_pages(inode);
- }
-
-/*
- if (inode->i_sb->s_root &&
- inode != inode->i_sb->s_root->d_inode)
- ll_unhash_aliases(inode);
-*/
- I_RELE(inode);
- break;
- }
- default:
- LBUG();
- }
-
- RETURN(0);
-}
-
-static int pnode_revalidate_finish(struct ptlrpc_request *req,
- struct lookup_intent *it,
- struct pnode *pnode)
-{
- struct inode *inode = pnode->p_base->pb_ino;
- struct lustre_md md;
- int rc = 0;
- ENTRY;
-
- LASSERT(inode);
-
- if (!req)
- RETURN(0);
-
- if (it_disposition(it, DISP_LOOKUP_NEG))
- RETURN(-ENOENT);
-
- rc = md_get_lustre_md(llu_i2sbi(inode)->ll_md_exp, req,
- llu_i2sbi(inode)->ll_dt_exp,
- llu_i2sbi(inode)->ll_md_exp, &md);
- if (rc)
- RETURN(rc);
-
- llu_update_inode(inode, &md);
-
- RETURN(rc);
-}
-
-static int llu_pb_revalidate(struct pnode *pnode, int flags,
- struct lookup_intent *it)
-{
- struct pnode_base *pb = pnode->p_base;
- struct md_op_data op_data = {{ 0 }};
- struct ptlrpc_request *req = NULL;
- struct lookup_intent lookup_it = { .it_op = IT_LOOKUP };
- struct obd_export *exp;
- int rc;
- ENTRY;
-
- CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,intent=%x\n",
- (int)pb->pb_name.len, pb->pb_name.name, it ? it->it_op : 0);
-
- /* We don't want to cache negative dentries, so return 0 immediately.
- * We believe that this is safe, that negative dentries cannot be
- * pinned by someone else */
- if (pb->pb_ino == NULL) {
- CDEBUG(D_INODE, "negative pb\n");
- RETURN(0);
- }
-
- /* This is due to bad interaction with libsysio. remove this when we
- * switched to libbsdio XXX
- */
- {
- struct llu_inode_info *lli = llu_i2info(pb->pb_ino);
- struct intnl_stat *st = llu_i2stat(pb->pb_ino);
- if (lli->lli_it) {
- CDEBUG(D_INODE, "inode %llu still have intent "
- "%p(opc 0x%x), release it\n",
- (long long) st->st_ino, lli->lli_it,
- lli->lli_it->it_op);
- ll_intent_release(lli->lli_it);
- OBD_FREE(lli->lli_it, sizeof(*lli->lli_it));
- lli->lli_it = NULL;
- }
- }
-
- exp = llu_i2mdexp(pb->pb_ino);
-
- if (!it) {
- it = &lookup_it;
- it->it_op_release = ll_intent_release;
- }
-
- llu_prep_md_op_data(&op_data, pnode->p_parent->p_base->pb_ino,
- pb->pb_ino, pb->pb_name.name, pb->pb_name.len,
- 0, LUSTRE_OPC_ANY);
-
- rc = md_intent_lock(exp, &op_data, it, &req, &llu_md_blocking_ast,
- LDLM_FL_CANCEL_ON_BLOCK);
- /* If req is NULL, then md_intent_lock only tried to do a lock match;
- * if all was well, it will return 1 if it found locks, 0 otherwise. */
- if (req == NULL && rc >= 0)
- GOTO(out, rc);
-
- if (rc < 0)
- GOTO(out, rc = 0);
-
- rc = pnode_revalidate_finish(req, it, pnode);
- if (rc != 0) {
- ll_intent_release(it);
- GOTO(out, rc = 0);
- }
- rc = 1;
-
- /* Note: ll_intent_lock may cause a callback, check this! */
-
- if (it->it_op & IT_OPEN)
- LL_SAVE_INTENT(pb->pb_ino, it);
-
- out:
- if (req && rc == 1)
- ptlrpc_req_finished(req);
- if (rc == 0) {
- LASSERT(pb->pb_ino);
- I_RELE(pb->pb_ino);
- pb->pb_ino = NULL;
- } else {
- llu_lookup_finish_locks(it, pnode);
- }
- RETURN(rc);
-}
-
-static int lookup_it_finish(struct ptlrpc_request *request, int offset,
- struct lookup_intent *it,
- struct inode *parent, struct pnode *child)
-{
- struct llu_sb_info *sbi = llu_i2sbi(parent);
- struct inode *inode = NULL;
- int rc;
-
- /* libsysio require us generate inode right away if success.
- * so if mds created new inode for us we need make sure it
- * succeeded. thus for any error we can't delay to the
- * llu_file_open() time. */
- if (it_disposition(it, DISP_OPEN_CREATE) &&
- it_open_error(DISP_OPEN_CREATE, it)) {
- CDEBUG(D_INODE, "detect mds create error\n");
- return it_open_error(DISP_OPEN_CREATE, it);
- }
- if (it_disposition(it, DISP_OPEN_OPEN) &&
- it_open_error(DISP_OPEN_OPEN, it)) {
- CDEBUG(D_INODE, "detect mds open error\n");
- /* undo which did by md_intent_lock */
- if (it_disposition(it, DISP_OPEN_CREATE) &&
- !it_open_error(DISP_OPEN_CREATE, it)) {
- LASSERT(request);
- LASSERT(atomic_read(&request->rq_refcount) > 1);
- CDEBUG(D_INODE, "dec a ref of req %p\n", request);
- ptlrpc_req_finished(request);
- }
- return it_open_error(DISP_OPEN_OPEN, it);
- }
-
- /* NB 1 request reference will be taken away by ll_intent_lock()
- * when I return
- */
- if (!it_disposition(it, DISP_LOOKUP_NEG) || (it->it_op & IT_CREAT)) {
- struct lustre_md md;
- struct llu_inode_info *lli;
- struct intnl_stat *st;
- ENTRY;
-
- if (it_disposition(it, DISP_OPEN_CREATE))
- ptlrpc_req_finished(request);
-
- rc = md_get_lustre_md(sbi->ll_md_exp, request,
- sbi->ll_dt_exp, sbi->ll_md_exp, &md);
- if (rc)
- RETURN(rc);
-
- inode = llu_iget(parent->i_fs, &md);
- if (!inode || IS_ERR(inode)) {
- /* free the lsm if we allocated one above */
- if (md.lsm != NULL)
- obd_free_memmd(sbi->ll_dt_exp, &md.lsm);
- RETURN(inode ? PTR_ERR(inode) : -ENOMEM);
- } else if (md.lsm != NULL) {
- obd_free_memmd(sbi->ll_dt_exp, &md.lsm);
- }
-
- lli = llu_i2info(inode);
- st = llu_i2stat(inode);
-
- /* If this is a stat, get the authoritative file size */
- if (it->it_op == IT_GETATTR && S_ISREG(st->st_mode) &&
- lli->lli_has_smd) {
- ldlm_error_t rc;
-
- /* bug 2334: drop MDS lock before acquiring OST lock */
- ll_intent_drop_lock(it);
-
- rc = cl_glimpse_size(inode);
- if (rc) {
- I_RELE(inode);
- RETURN(rc);
- }
- }
- } else {
- ENTRY;
- }
-
- /* intent will be further used in cases of open()/getattr() */
- if (inode && (it->it_op & IT_OPEN))
- LL_SAVE_INTENT(inode, it);
-
- child->p_base->pb_ino = inode;
-
- RETURN(0);
-}
-
-struct inode *llu_inode_from_resource_lock(struct ldlm_lock *lock)
-{
- struct inode *inode;
- lock_res_and_lock(lock);
-
- if (lock->l_resource->lr_lvb_inode) {
- inode = (struct inode *)lock->l_resource->lr_lvb_inode;
- I_REF(inode);
- } else
- inode = NULL;
-
- unlock_res_and_lock(lock);
- return inode;
-}
-
-static int llu_lookup_it(struct inode *parent, struct pnode *pnode,
- struct lookup_intent *it, int flags)
-{
- struct md_op_data op_data = {{ 0 }};
- struct ptlrpc_request *req = NULL;
- struct lookup_intent lookup_it = { .it_op = IT_LOOKUP };
- __u32 opc;
- int rc;
- ENTRY;
-
- if (pnode->p_base->pb_name.len > EXT2_NAME_LEN)
- RETURN(-ENAMETOOLONG);
-
- if (!it) {
- it = &lookup_it;
- it->it_op_release = ll_intent_release;
- }
-
- if (it->it_op & IT_CREAT)
- opc = LUSTRE_OPC_CREATE;
- else
- opc = LUSTRE_OPC_ANY;
-
- llu_prep_md_op_data(&op_data, parent, NULL,
- pnode->p_base->pb_name.name,
- pnode->p_base->pb_name.len, flags, opc);
-
- rc = md_intent_lock(llu_i2mdexp(parent), &op_data, it, &req,
- &llu_md_blocking_ast, LDLM_FL_CANCEL_ON_BLOCK);
- if (rc < 0)
- GOTO(out, rc);
-
- rc = lookup_it_finish(req, DLM_REPLY_REC_OFF, it, parent, pnode);
- if (rc != 0) {
- ll_intent_release(it);
- GOTO(out, rc);
- }
-
- llu_lookup_finish_locks(it, pnode);
-
- out:
- if (req)
- ptlrpc_req_finished(req);
- return rc;
-}
-
-static struct lookup_intent*
-translate_lookup_intent(struct intent *intent, const char *path)
-{
- struct lookup_intent *it;
- int fmode;
-
- /* libsysio trick */
- if (!intent || path) {
- CDEBUG(D_VFSTRACE, "not intent needed\n");
- return NULL;
- }
-
- OBD_ALLOC(it, sizeof(*it));
- LASSERT(it);
-
- memset(it, 0, sizeof(*it));
-
- /* libsysio will assign intent like following:
- * NOTE: INT_CREAT has include INT_UPDPARENT
- *
- * open: INT_OPEN [| INT_CREAT]
- * mkdir: INT_CREAT
- * symlink: INT_CREAT
- * unlink: INT_UPDPARENT
- * rmdir: INT_UPDPARENT
- * mknod: INT_CREAT
- * stat: INT_GETATTR
- * setattr: NULL
- *
- * following logic is adjusted for libsysio
- */
-
- it->it_flags = intent->int_arg2 ? *((int*)intent->int_arg2) : 0;
-
- if (intent->int_opmask & INT_OPEN) {
- it->it_op |= IT_OPEN;
-
- /* convert access mode from O_ to FMODE_ */
- if (it->it_flags & O_WRONLY)
- fmode = FMODE_WRITE;
- else if (it->it_flags & O_RDWR)
- fmode = FMODE_READ | FMODE_WRITE;
- else
- fmode = FMODE_READ;
- it->it_flags &= ~O_ACCMODE;
- it->it_flags |= fmode;
- }
-
- /* XXX libsysio has strange code on intent handling,
- * more check later */
- if (it->it_flags & O_CREAT) {
- it->it_op |= IT_CREAT;
- it->it_create_mode = *((int*)intent->int_arg1);
- /* bug 7278: libsysio hack. For O_EXCL, libsysio depends on
- this lookup to return negative result, but then there is no
- way to find out original intent in ll_iop_open(). So we just
- clear O_EXCL from libsysio flags here to avoid checking
- for negative result. O_EXCL will be enforced by MDS. */
- *((int*)intent->int_arg2) &= ~O_EXCL;
- }
-
- if (intent->int_opmask & INT_GETATTR)
- it->it_op |= IT_GETATTR;
-
- LASSERT(!(intent->int_opmask & INT_SETATTR));
-
- /* libsysio is different to linux vfs when doing unlink/rmdir,
- * INT_UPDPARENT was passed down during name resolution. Here
- * we treat it as normal lookup, later unlink()/rmdir() will
- * do the actual work */
-
- /* conform to kernel code, if only IT_LOOKUP was set, don't
- * pass down it */
- if (!it->it_op || it->it_op & IT_LOOKUP) {
- OBD_FREE(it, sizeof(*it));
- it = NULL;
- }
- if (it)
- it->it_op_release = ll_intent_release;
-
- CDEBUG(D_VFSTRACE, "final intent 0x%x\n", it ? it->it_op : 0);
- return it;
-}
-
-int llu_iop_lookup(struct pnode *pnode,
- struct inode **inop,
- struct intent *intnt,
- const char *path)
-{
- struct lookup_intent *it;
- int rc;
- ENTRY;
-
- liblustre_wait_event(0);
-
- *inop = NULL;
-
- /* the mount root inode have no name, so don't call
- * remote in this case. but probably we need revalidate
- * it here? FIXME */
- if (pnode->p_mount->mnt_root == pnode) {
- struct inode *i = pnode->p_base->pb_ino;
- *inop = i;
- RETURN(0);
- }
-
- if (!pnode->p_base->pb_name.len)
- RETURN(-EINVAL);
-
- it = translate_lookup_intent(intnt, path);
-
- /* param flags is not used, let it be 0 */
- if (llu_pb_revalidate(pnode, 0, it)) {
- LASSERT(pnode->p_base->pb_ino);
- *inop = pnode->p_base->pb_ino;
- GOTO(out, rc = 0);
- }
-
- rc = llu_lookup_it(pnode->p_parent->p_base->pb_ino, pnode, it, 0);
- if (!rc) {
- if (!pnode->p_base->pb_ino)
- rc = -ENOENT;
- else
- *inop = pnode->p_base->pb_ino;
- }
-
-out:
- if (it)
- OBD_FREE(it, sizeof(*it));
- liblustre_wait_event(0);
- RETURN(rc);
-}
+++ /dev/null
-/*
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program 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
- * General Public License version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- *
- * Copyright (c) 2011, 2013, Intel Corporation.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- *
- * lustre/liblustre/rw.c
- *
- * Lustre Light block IO
- */
-
-#define DEBUG_SUBSYSTEM S_LLITE
-
-#include <assert.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/uio.h>
-#include <libcfs/libcfs.h>
-#include <lustre/lustre_idl.h>
-#include <liblustre.h>
-#include <cl_object.h>
-#include <lclient.h>
-#include <lustre_dlm.h>
-#include <obd.h>
-#include <obd_class.h>
-#include <obd_support.h>
-#include "llite_lib.h"
-
-int llu_merge_lvb(const struct lu_env *env, struct inode *inode)
-{
- struct llu_inode_info *lli = llu_i2info(inode);
- struct cl_object *obj = lli->lli_clob;
- struct intnl_stat *st = llu_i2stat(inode);
- struct cl_attr *attr = ccc_env_thread_attr(env);
- struct ost_lvb lvb;
- int rc;
- ENTRY;
-
- /* merge timestamps the most recently obtained from mds with
- timestamps obtained from osts */
- LTIME_S(inode->i_atime) = lli->lli_lvb.lvb_atime;
- LTIME_S(inode->i_mtime) = lli->lli_lvb.lvb_mtime;
- LTIME_S(inode->i_ctime) = lli->lli_lvb.lvb_ctime;
-
- inode_init_lvb(inode, &lvb);
-
- cl_object_attr_lock(obj);
- rc = cl_object_attr_get(env, obj, attr);
- cl_object_attr_unlock(obj);
- if (rc == 0) {
- if (lvb.lvb_atime < attr->cat_atime)
- lvb.lvb_atime = attr->cat_atime;
- if (lvb.lvb_ctime < attr->cat_ctime)
- lvb.lvb_ctime = attr->cat_ctime;
- if (lvb.lvb_mtime < attr->cat_mtime)
- lvb.lvb_mtime = attr->cat_mtime;
-
- st->st_size = lvb.lvb_size;
- st->st_blocks = lvb.lvb_blocks;
- st->st_mtime = lvb.lvb_mtime;
- st->st_atime = lvb.lvb_atime;
- st->st_ctime = lvb.lvb_ctime;
- }
-
- RETURN(rc);
-}
-
-static
-ssize_t llu_file_prwv(const struct iovec *iovec, int iovlen,
- _SYSIO_OFF_T pos, ssize_t len,
- void *private)
-{
- struct llu_io_session *session = (struct llu_io_session *) private;
- struct inode *inode = session->lis_inode;
- struct llu_inode_info *lli = llu_i2info(inode);
- int err;
- struct lu_env *env;
- struct cl_io *io;
- struct slp_io *sio;
- int refcheck;
- ENTRY;
-
- /* in a large iov read/write we'll be repeatedly called.
- * so give a chance to answer cancel ast here
- */
- liblustre_wait_event(0);
-
- if (len == 0 || iovlen == 0)
- RETURN(0);
-
- if (pos + len > lli->lli_maxbytes)
- RETURN(-ERANGE);
-
- env = cl_env_get(&refcheck);
- if (IS_ERR(env))
- RETURN(PTR_ERR(env));
-
- /* Do NOT call "ccc_env_thread_io()" again to prevent reinitializing */
- io = &ccc_env_info(env)->cti_io;
- if (cl_io_rw_init(env, io, session->lis_cmd == OBD_BRW_WRITE?CIT_WRITE:
- CIT_READ,
- pos, len) == 0) {
- struct ccc_io *cio;
- sio = slp_env_io(env);
- cio = ccc_env_io(env);
- /* XXX this is not right: cio->cui_iov can be modified. */
- cio->cui_iov = (struct iovec *)iovec;
- cio->cui_nrsegs = iovlen;
- cio->cui_tot_nrsegs = iovlen;
- sio->sio_session = session;
- err = cl_io_loop(env, io);
- } else {
- /* XXX WTF? */
- LBUG();
- }
- cl_io_fini(env, io);
- cl_env_put(env, &refcheck);
-
- if (err < 0)
- RETURN(err);
-
- RETURN(len);
-}
-
-static
-struct llu_io_session *get_io_session(struct inode *ino, int ngroups, int cmd)
-{
- struct llu_io_session *session;
-
- OBD_ALLOC_PTR(session);
- if (!session)
- return NULL;
-
- I_REF(ino);
- session->lis_inode = ino;
- session->lis_cmd = cmd;
- return session;
-}
-
-static void put_io_session(struct llu_io_session *session)
-{
- I_RELE(session->lis_inode);
- OBD_FREE_PTR(session);
-}
-
-static int llu_file_rwx(struct inode *ino,
- struct ioctx *ioctx,
- int read)
-{
- struct llu_io_session *session;
- ssize_t cc;
- int cmd = read ? OBD_BRW_READ : OBD_BRW_WRITE;
- ENTRY;
-
- LASSERT(ioctx->ioctx_iovlen > 0);
-
- liblustre_wait_event(0);
-
- if (ioctx->ioctx_xtvlen == 0)
- RETURN(0);
-
- /* XXX consider other types later */
- if (S_ISDIR(llu_i2stat(ino)->st_mode))
- RETURN(-EISDIR);
- if (!S_ISREG(llu_i2stat(ino)->st_mode))
- RETURN(-EOPNOTSUPP);
-
- session = get_io_session(ino, ioctx->ioctx_xtvlen * 2, cmd);
- if (!session)
- RETURN(-ENOMEM);
-
- cc = _sysio_enumerate_extents(ioctx->ioctx_xtv, ioctx->ioctx_xtvlen,
- ioctx->ioctx_iov, ioctx->ioctx_iovlen,
- llu_file_prwv, session);
-
- if (cc >= 0) {
- LASSERT(!ioctx->ioctx_cc);
- ioctx->ioctx_private = session;
- cc = 0;
- } else {
- put_io_session(session);
- }
-
- liblustre_wait_event(0);
- RETURN(cc);
-}
-
-void llu_io_init(struct cl_io *io, struct inode *inode, int write)
-{
- struct llu_inode_info *lli = llu_i2info(inode);
-
- io->u.ci_rw.crw_nonblock = lli->lli_open_flags & O_NONBLOCK;
- if (write)
- io->u.ci_wr.wr_append = lli->lli_open_flags & O_APPEND;
- io->ci_obj = llu_i2info(inode)->lli_clob;
-
- if ((lli->lli_open_flags & O_APPEND) && write)
- io->ci_lockreq = CILR_MANDATORY;
- else
- io->ci_lockreq = CILR_NEVER;
-}
-
-int llu_iop_read(struct inode *ino,
- struct ioctx *ioctx)
-{
- struct intnl_stat *st = llu_i2stat(ino);
- struct lu_env *env;
- struct cl_io *io;
- int refcheck;
- int ret;
-
- /* BUG: 5972 */
- st->st_atime = CFS_CURRENT_TIME;
-
- env = cl_env_get(&refcheck);
- if (IS_ERR(env))
- RETURN(PTR_ERR(env));
-
- io = ccc_env_thread_io(env);
- llu_io_init(io, ino, 0);
-
- ret = llu_file_rwx(ino, ioctx, 1);
-
- cl_env_put(env, &refcheck);
- return ret;
-}
-
-int llu_iop_write(struct inode *ino,
- struct ioctx *ioctx)
-{
- struct intnl_stat *st = llu_i2stat(ino);
- struct lu_env *env;
- struct cl_io *io;
- int refcheck;
- int ret;
-
- st->st_mtime = st->st_ctime = CFS_CURRENT_TIME;
-
- env = cl_env_get(&refcheck);
- if (IS_ERR(env))
- RETURN(PTR_ERR(env));
-
- io = ccc_env_thread_io(env);
- llu_io_init(io, ino, 1);
-
- ret = llu_file_rwx(ino, ioctx, 0);
- cl_env_put(env, &refcheck);
- return ret;
-}
-
-int llu_iop_iodone(struct ioctx *ioctx)
-{
- struct llu_io_session *session;
- struct lu_env *env;
- struct cl_io *io;
- int refcheck;
- ENTRY;
-
- liblustre_wait_event(0);
-
- env = cl_env_get(&refcheck);
- if (IS_ERR(env))
- RETURN(PTR_ERR(env));
-
- io = &ccc_env_info(env)->cti_io;
- cl_io_fini(env, io);
- cl_env_put(env, &refcheck);
- session = (struct llu_io_session *) ioctx->ioctx_private;
- LASSERT(session);
- LASSERT(!IS_ERR(session));
-
- if (session->lis_rc == 0) {
- ioctx->ioctx_cc = session->lis_rwcount;
- } else {
- LASSERT(session->lis_rc < 0);
- ioctx->ioctx_cc = -1;
- ioctx->ioctx_errno = -session->lis_rc;
- }
-
- put_io_session(session);
- ioctx->ioctx_private = NULL;
- liblustre_wait_event(0);
-
- RETURN(1);
-}
+++ /dev/null
-/*
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program 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
- * General Public License version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- *
- * Copyright (c) 2011, 2013, Intel Corporation.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- *
- * lustre/liblustre/super.c
- *
- * Lustre Light Super operations
- */
-
-#define DEBUG_SUBSYSTEM S_LLITE
-
-#include <assert.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdarg.h>
-#include <stdbool.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <libcfs/libcfs.h>
-#include <lustre/lustre_idl.h>
-#include <liblustre.h>
-#include <lclient.h>
-#include <lustre_dlm.h>
-#include <lustre_export.h>
-#include <lustre_lite.h>
-#include <lustre_mdc.h>
-#include <lustre_net.h>
-#include <lustre_req_layout.h>
-#include <lustre_ver.h>
-#include <obd.h>
-#include <obd_class.h>
-#include <obd_support.h>
-#include "llite_lib.h"
-
-#ifndef MAY_EXEC
-#define MAY_EXEC 1
-#define MAY_WRITE 2
-#define MAY_READ 4
-#endif
-
-#define S_IXUGO (S_IXUSR|S_IXGRP|S_IXOTH)
-
-static int ll_permission(struct inode *inode, int mask)
-{
- struct intnl_stat *st = llu_i2stat(inode);
- mode_t mode = st->st_mode;
-
- if (current->fsuid == st->st_uid)
- mode >>= 6;
- else if (in_group_p(st->st_gid))
- mode >>= 3;
-
- if ((mode & mask & (MAY_READ|MAY_WRITE|MAY_EXEC)) == mask)
- return 0;
-
- if ((mask & (MAY_READ|MAY_WRITE)) ||
- (st->st_mode & S_IXUGO))
- if (cfs_capable(CFS_CAP_DAC_OVERRIDE))
- return 0;
-
- if (mask == MAY_READ ||
- (S_ISDIR(st->st_mode) && !(mask & MAY_WRITE))) {
- if (cfs_capable(CFS_CAP_DAC_READ_SEARCH))
- return 0;
- }
-
- return -EACCES;
-}
-
-static void llu_fsop_gone(struct filesys *fs)
-{
- struct llu_sb_info *sbi = (struct llu_sb_info *) fs->fs_private;
- struct obd_device *obd = class_exp2obd(sbi->ll_md_exp);
- int next = 0;
- ENTRY;
-
- cfs_list_del(&sbi->ll_conn_chain);
- cl_sb_fini(sbi);
- obd_disconnect(sbi->ll_dt_exp);
- obd_disconnect(sbi->ll_md_exp);
-
- while ((obd = class_devices_in_group(&sbi->ll_sb_uuid, &next)) != NULL)
- class_manual_cleanup(obd);
-
- OBD_FREE(sbi, sizeof(*sbi));
-
- liblustre_wait_idle();
- EXIT;
-}
-
-static struct inode_ops llu_inode_ops;
-
-static ldlm_mode_t llu_take_md_lock(struct inode *inode, __u64 bits,
- struct lustre_handle *lockh)
-{
- ldlm_policy_data_t policy = { .l_inodebits = {bits}};
- struct lu_fid *fid;
- ldlm_mode_t rc;
- __u64 flags;
- ENTRY;
-
- fid = &llu_i2info(inode)->lli_fid;
- CDEBUG(D_INFO, "trying to match res "DFID"\n", PFID(fid));
-
- flags = LDLM_FL_BLOCK_GRANTED | LDLM_FL_CBPENDING;
- rc = md_lock_match(llu_i2mdexp(inode), flags, fid, LDLM_IBITS, &policy,
- LCK_CR|LCK_CW|LCK_PR|LCK_PW, lockh);
- RETURN(rc);
-}
-
-void llu_update_inode(struct inode *inode, struct lustre_md *md)
-{
- struct llu_inode_info *lli = llu_i2info(inode);
- struct mdt_body *body = md->body;
- struct lov_stripe_md *lsm = md->lsm;
- struct intnl_stat *st = llu_i2stat(inode);
-
- LASSERT ((lsm != NULL) == ((body->valid & OBD_MD_FLEASIZE) != 0));
-
- if (body->valid & OBD_MD_FLMODE)
- st->st_mode = (st->st_mode & S_IFMT)|(body->mode & ~S_IFMT);
- if (body->valid & OBD_MD_FLTYPE)
- st->st_mode = (st->st_mode & ~S_IFMT)|(body->mode & S_IFMT);
-
- if (lsm != NULL) {
- if (!lli->lli_has_smd) {
- cl_file_inode_init(inode, md);
- lli->lli_has_smd = true;
- lli->lli_maxbytes = lsm->lsm_maxbytes;
- if (lli->lli_maxbytes > MAX_LFS_FILESIZE)
- lli->lli_maxbytes = MAX_LFS_FILESIZE;
- }
- if (md->lsm != NULL)
- obd_free_memmd(llu_i2obdexp(inode), &md->lsm);
- }
-
- if (body->valid & OBD_MD_FLATIME) {
- if (body->atime > LTIME_S(st->st_atime))
- LTIME_S(st->st_atime) = body->atime;
- lli->lli_lvb.lvb_atime = body->atime;
- }
- if (body->valid & OBD_MD_FLMTIME) {
- if (body->mtime > LTIME_S(st->st_mtime))
- LTIME_S(st->st_mtime) = body->mtime;
- lli->lli_lvb.lvb_mtime = body->mtime;
- }
- if (body->valid & OBD_MD_FLCTIME) {
- if (body->ctime > LTIME_S(st->st_ctime))
- LTIME_S(st->st_ctime) = body->ctime;
- lli->lli_lvb.lvb_ctime = body->ctime;
- }
- if (S_ISREG(st->st_mode))
- st->st_blksize = min(2UL * PTLRPC_MAX_BRW_SIZE, LL_MAX_BLKSIZE);
- else
- st->st_blksize = 4096;
- if (body->valid & OBD_MD_FLUID)
- st->st_uid = body->uid;
- if (body->valid & OBD_MD_FLGID)
- st->st_gid = body->gid;
- if (body->valid & OBD_MD_FLNLINK)
- st->st_nlink = body->nlink;
- if (body->valid & OBD_MD_FLRDEV)
- st->st_rdev = body->rdev;
- if (body->valid & OBD_MD_FLFLAGS)
- lli->lli_st_flags = body->flags;
- if (body->valid & OBD_MD_FLSIZE) {
- if ((llu_i2sbi(inode)->ll_lco.lco_flags & OBD_CONNECT_SOM) &&
- S_ISREG(st->st_mode) && lli->lli_has_smd) {
- struct lustre_handle lockh;
- ldlm_mode_t mode;
-
- /* As it is possible a blocking ast has been processed
- * by this time, we need to check there is an UPDATE
- * lock on the client and set LLIF_MDS_SIZE_LOCK holding
- * it. */
- mode = llu_take_md_lock(inode, MDS_INODELOCK_UPDATE,
- &lockh);
- if (mode) {
- st->st_size = body->size;
- lli->lli_flags |= LLIF_MDS_SIZE_LOCK;
- ldlm_lock_decref(&lockh, mode);
- }
- } else {
- st->st_size = body->size;
- }
-
- if (body->valid & OBD_MD_FLBLOCKS)
- st->st_blocks = body->blocks;
- }
-}
-
-/**
- * Performs the getattr on the inode and updates its fields.
- * If @sync != 0, perform the getattr under the server-side lock.
- */
-int llu_inode_getattr(struct inode *inode, struct obdo *obdo,
- __u64 ioepoch, int sync)
-{
- struct ptlrpc_request_set *set;
- struct lov_stripe_md *lsm = NULL;
- struct obd_info oinfo = { { { 0 } } };
- int rc;
- ENTRY;
-
- lsm = ccc_inode_lsm_get(inode);
- LASSERT(lsm);
-
- oinfo.oi_md = lsm;
- oinfo.oi_oa = obdo;
- oinfo.oi_oa->o_oi = lsm->lsm_oi;
- oinfo.oi_oa->o_mode = S_IFREG;
- oinfo.oi_oa->o_ioepoch = ioepoch;
- oinfo.oi_oa->o_valid = OBD_MD_FLID | OBD_MD_FLTYPE |
- OBD_MD_FLSIZE | OBD_MD_FLBLOCKS |
- OBD_MD_FLBLKSZ | OBD_MD_FLMTIME |
- OBD_MD_FLCTIME | OBD_MD_FLGROUP |
- OBD_MD_FLATIME | OBD_MD_FLEPOCH;
- obdo_set_parent_fid(oinfo.oi_oa, &llu_i2info(inode)->lli_fid);
- if (sync) {
- oinfo.oi_oa->o_valid |= OBD_MD_FLFLAGS;
- oinfo.oi_oa->o_flags |= OBD_FL_SRVLOCK;
- }
-
- set = ptlrpc_prep_set();
- if (set == NULL) {
- CERROR ("ENOMEM allocing request set\n");
- rc = -ENOMEM;
- } else {
- rc = obd_getattr_async(llu_i2obdexp(inode), &oinfo, set);
- if (rc == 0)
- rc = ptlrpc_set_wait(set);
- ptlrpc_set_destroy(set);
- }
- ccc_inode_lsm_put(inode, lsm);
- if (rc)
- RETURN(rc);
-
- oinfo.oi_oa->o_valid = OBD_MD_FLBLOCKS | OBD_MD_FLBLKSZ |
- OBD_MD_FLMTIME | OBD_MD_FLCTIME |
- OBD_MD_FLSIZE;
-
- obdo_refresh_inode(inode, oinfo.oi_oa, oinfo.oi_oa->o_valid);
- CDEBUG(D_INODE, "objid "DOSTID" size %llu, blocks %llu, "
- "blksize %llu\n", POSTID(&oinfo.oi_oa->o_oi),
- (long long unsigned)llu_i2stat(inode)->st_size,
- (long long unsigned)llu_i2stat(inode)->st_blocks,
- (long long unsigned)llu_i2stat(inode)->st_blksize);
- RETURN(0);
-}
-
-static struct inode* llu_new_inode(struct filesys *fs,
- struct lu_fid *fid)
-{
- struct inode *inode;
- struct llu_inode_info *lli;
- struct intnl_stat st = {
- .st_dev = 0,
-#if 0
-#ifndef AUTOMOUNT_FILE_NAME
- .st_mode = fid->f_type & S_IFMT,
-#else
- .st_mode = fid->f_type /* all of the bits! */
-#endif
-#endif
- /* FIXME: fix this later */
- .st_mode = 0,
-
- .st_uid = geteuid(),
- .st_gid = getegid(),
- };
-
- OBD_ALLOC(lli, sizeof(*lli));
- if (!lli)
- return NULL;
-
- /* initialize lli here */
- lli->lli_sbi = llu_fs2sbi(fs);
- lli->lli_has_smd = false;
- lli->lli_symlink_name = NULL;
- lli->lli_flags = 0;
- lli->lli_maxbytes = (__u64)(~0UL);
- lli->lli_file_data = NULL;
-
- lli->lli_sysio_fid.fid_data = &lli->lli_fid;
- lli->lli_sysio_fid.fid_len = sizeof(lli->lli_fid);
- lli->lli_fid = *fid;
-
- /* file identifier is needed by functions like _sysio_i_find() */
- inode = _sysio_i_new(fs, &lli->lli_sysio_fid,
- &st, 0, &llu_inode_ops, lli);
-
- if (!inode)
- OBD_FREE(lli, sizeof(*lli));
-
- return inode;
-}
-
-static int llu_have_md_lock(struct inode *inode, __u64 lockpart)
-{
- struct lustre_handle lockh;
- ldlm_policy_data_t policy = { .l_inodebits = { lockpart } };
- struct lu_fid *fid;
- __u64 flags;
- ENTRY;
-
- LASSERT(inode);
-
- fid = &llu_i2info(inode)->lli_fid;
- CDEBUG(D_INFO, "trying to match res "DFID"\n", PFID(fid));
-
- flags = LDLM_FL_BLOCK_GRANTED | LDLM_FL_CBPENDING | LDLM_FL_TEST_LOCK;
- if (md_lock_match(llu_i2mdexp(inode), flags, fid, LDLM_IBITS, &policy,
- LCK_CR|LCK_CW|LCK_PR|LCK_PW, &lockh)) {
- RETURN(1);
- }
- RETURN(0);
-}
-
-static int llu_inode_revalidate(struct inode *inode)
-{
- struct llu_inode_info *lli = llu_i2info(inode);
- struct intnl_stat *st = llu_i2stat(inode);
- ENTRY;
-
- if (!llu_have_md_lock(inode, MDS_INODELOCK_UPDATE)) {
- struct lustre_md md;
- struct ptlrpc_request *req = NULL;
- struct llu_sb_info *sbi = llu_i2sbi(inode);
- struct md_op_data op_data = { { 0 } };
- unsigned long valid = OBD_MD_FLGETATTR;
- int rc, ealen = 0;
-
- /* Why don't we update all valid MDS fields here, if we're
- * doing an RPC anyways? -phil */
- if (S_ISREG(st->st_mode)) {
- ealen = obd_size_diskmd(sbi->ll_dt_exp, NULL);
- valid |= OBD_MD_FLEASIZE;
- }
-
- llu_prep_md_op_data(&op_data, inode, NULL, NULL, 0, ealen,
- LUSTRE_OPC_ANY);
- op_data.op_valid = valid;
-
- rc = md_getattr(sbi->ll_md_exp, &op_data, &req);
- if (rc) {
- CERROR("failure %d inode %llu\n", rc,
- (long long)st->st_ino);
- RETURN(-abs(rc));
- }
- rc = md_get_lustre_md(sbi->ll_md_exp, req,
- sbi->ll_dt_exp, sbi->ll_md_exp, &md);
-
- /* XXX Too paranoid? */
- if (((md.body->valid ^ valid) & OBD_MD_FLEASIZE) &&
- !((md.body->valid & OBD_MD_FLNLINK) &&
- (md.body->nlink == 0))) {
- CERROR("Asked for %s eadata but got %s (%d)\n",
- (valid & OBD_MD_FLEASIZE) ? "some" : "no",
- (md.body->valid & OBD_MD_FLEASIZE) ? "some":"none",
- md.body->eadatasize);
- }
- if (rc) {
- ptlrpc_req_finished(req);
- RETURN(rc);
- }
-
-
- llu_update_inode(inode, &md);
- if (md.lsm != NULL)
- obd_free_memmd(sbi->ll_dt_exp, &md.lsm);
- ptlrpc_req_finished(req);
- }
-
- if (!lli->lli_has_smd) {
- /* object not yet allocated, don't validate size */
- st->st_atime = lli->lli_lvb.lvb_atime;
- st->st_mtime = lli->lli_lvb.lvb_mtime;
- st->st_ctime = lli->lli_lvb.lvb_ctime;
- RETURN(0);
- }
-
- /* ll_glimpse_size will prefer locally cached writes if they extend
- * the file */
- RETURN(cl_glimpse_size(inode));
-}
-
-static void copy_stat_buf(struct inode *ino, struct intnl_stat *b)
-{
- *b = *llu_i2stat(ino);
-}
-
-static int llu_iop_getattr(struct pnode *pno,
- struct inode *ino,
- struct intnl_stat *b)
-{
- int rc;
- ENTRY;
-
- liblustre_wait_event(0);
-
- if (!ino) {
- LASSERT(pno);
- LASSERT(pno->p_base->pb_ino);
- ino = pno->p_base->pb_ino;
- } else {
- LASSERT(!pno || pno->p_base->pb_ino == ino);
- }
-
- /* libsysio might call us directly without intent lock,
- * we must re-fetch the attrs here
- */
- rc = llu_inode_revalidate(ino);
- if (!rc) {
- copy_stat_buf(ino, b);
- LASSERT(!llu_i2info(ino)->lli_it);
- }
-
- liblustre_wait_event(0);
- RETURN(rc);
-}
-
-static int null_if_equal(struct ldlm_lock *lock, void *data)
-{
- if (data == lock->l_ast_data) {
- lock->l_ast_data = NULL;
-
- if (lock->l_req_mode != lock->l_granted_mode)
- LDLM_ERROR(lock,"clearing inode with ungranted lock\n");
- }
-
- return LDLM_ITER_CONTINUE;
-}
-
-static void llu_clear_inode(struct inode *inode)
-{
- struct llu_inode_info *lli = llu_i2info(inode);
- struct llu_sb_info *sbi = llu_i2sbi(inode);
- struct lov_stripe_md *lsm;
- ENTRY;
-
- CDEBUG(D_VFSTRACE, "VFS Op:inode=%llu/%lu(%p)\n",
- (long long)llu_i2stat(inode)->st_ino, lli->lli_st_generation,
- inode);
-
- lli->lli_flags &= ~LLIF_MDS_SIZE_LOCK;
- md_null_inode(sbi->ll_md_exp, ll_inode2fid(inode));
-
- lsm = ccc_inode_lsm_get(inode);
- if (lsm != NULL)
- obd_change_cbdata(sbi->ll_dt_exp, lsm, null_if_equal, inode);
- ccc_inode_lsm_put(inode, lsm);
-
- cl_inode_fini(inode);
- lli->lli_has_smd = false;
-
- if (lli->lli_symlink_name) {
- OBD_FREE(lli->lli_symlink_name,
- strlen(lli->lli_symlink_name) + 1);
- lli->lli_symlink_name = NULL;
- }
-
- EXIT;
-}
-
-static void llu_iop_gone(struct inode *inode)
-{
- struct llu_inode_info *lli = llu_i2info(inode);
- ENTRY;
-
- liblustre_wait_event(0);
- llu_clear_inode(inode);
-
- OBD_FREE(lli, sizeof(*lli));
- EXIT;
-}
-
-static int inode_setattr(struct inode * inode, struct iattr * attr)
-{
- unsigned int ia_valid = attr->ia_valid;
- struct intnl_stat *st = llu_i2stat(inode);
- int error = 0;
-
- /*
- * inode_setattr() is only ever invoked with ATTR_SIZE (by
- * llu_setattr_raw()) when file has no bodies. Check this.
- */
- LASSERT(ergo(ia_valid & ATTR_SIZE, !llu_i2info(inode)->lli_has_smd));
-
- if (ia_valid & ATTR_SIZE)
- st->st_size = attr->ia_size;
- if (ia_valid & ATTR_UID)
- st->st_uid = attr->ia_uid;
- if (ia_valid & ATTR_GID)
- st->st_gid = attr->ia_gid;
- if (ia_valid & ATTR_ATIME)
- st->st_atime = attr->ia_atime;
- if (ia_valid & ATTR_MTIME)
- st->st_mtime = attr->ia_mtime;
- if (ia_valid & ATTR_CTIME)
- st->st_ctime = attr->ia_ctime;
- if (ia_valid & ATTR_MODE) {
- st->st_mode = attr->ia_mode;
- if (!in_group_p(st->st_gid) &&
- !cfs_capable(CFS_CAP_FSETID))
- st->st_mode &= ~S_ISGID;
- }
- /* mark_inode_dirty(inode); */
- return error;
-}
-
-int llu_md_setattr(struct inode *inode, struct md_op_data *op_data,
- struct md_open_data **mod)
-{
- struct lustre_md md;
- struct llu_sb_info *sbi = llu_i2sbi(inode);
- struct ptlrpc_request *request = NULL;
- int rc;
- ENTRY;
-
- llu_prep_md_op_data(op_data, inode, NULL, NULL, 0, 0, LUSTRE_OPC_ANY);
- rc = md_setattr(sbi->ll_md_exp, op_data, NULL, 0, NULL,
- 0, &request, mod);
-
- if (rc) {
- ptlrpc_req_finished(request);
- if (rc != -EPERM && rc != -EACCES)
- CERROR("md_setattr fails: rc = %d\n", rc);
- RETURN(rc);
- }
-
- rc = md_get_lustre_md(sbi->ll_md_exp, request,
- sbi->ll_dt_exp, sbi->ll_md_exp, &md);
- if (rc) {
- ptlrpc_req_finished(request);
- RETURN(rc);
- }
-
- /* We call inode_setattr to adjust timestamps.
- * If there is at least some data in file, we cleared ATTR_SIZE
- * above to avoid invoking vmtruncate, otherwise it is important
- * to call vmtruncate in inode_setattr to update inode->i_size
- * (bug 6196) */
- inode_setattr(inode, &op_data->op_attr);
- llu_update_inode(inode, &md);
- ptlrpc_req_finished(request);
-
- RETURN(rc);
-}
-
-/* Close IO epoch and send Size-on-MDS attribute update. */
-static int llu_setattr_done_writing(struct inode *inode,
- struct md_op_data *op_data,
- struct md_open_data *mod)
-{
- struct llu_inode_info *lli = llu_i2info(inode);
- struct intnl_stat *st = llu_i2stat(inode);
- int rc = 0;
- ENTRY;
-
- LASSERT(op_data != NULL);
- if (!S_ISREG(st->st_mode))
- RETURN(0);
-
- /* XXX: pass och here for the recovery purpose. */
- CDEBUG(D_INODE, "Epoch "LPU64" closed on "DFID" for truncate\n",
- op_data->op_ioepoch, PFID(&lli->lli_fid));
-
- op_data->op_flags = MF_EPOCH_CLOSE;
- llu_done_writing_attr(inode, op_data);
- llu_pack_inode2opdata(inode, op_data, NULL);
-
- rc = md_done_writing(llu_i2sbi(inode)->ll_md_exp, op_data, mod);
- if (rc == -EAGAIN) {
- /* MDS has instructed us to obtain Size-on-MDS attribute
- * from OSTs and send setattr to back to MDS. */
- rc = llu_som_update(inode, op_data);
- } else if (rc) {
- CERROR("inode %llu mdc truncate failed: rc = %d\n",
- (unsigned long long)st->st_ino, rc);
- }
- RETURN(rc);
-}
-
-/* If this inode has objects allocated to it (lsm != NULL), then the OST
- * object(s) determine the file size and mtime. Otherwise, the MDS will
- * keep these values until such a time that objects are allocated for it.
- * We do the MDS operations first, as it is checking permissions for us.
- * We don't to the MDS RPC if there is nothing that we want to store there,
- * otherwise there is no harm in updating mtime/atime on the MDS if we are
- * going to do an RPC anyways.
- *
- * If we are doing a truncate, we will send the mtime and ctime updates
- * to the OST with the punch RPC, otherwise we do an explicit setattr RPC.
- * I don't believe it is possible to get e.g. ATTR_MTIME_SET and ATTR_SIZE
- * at the same time.
- */
-int llu_setattr_raw(struct inode *inode, struct iattr *attr)
-{
- int has_lsm = llu_i2info(inode)->lli_has_smd;
- struct intnl_stat *st = llu_i2stat(inode);
- int ia_valid = attr->ia_valid;
- struct md_op_data op_data = { { 0 } };
- struct md_open_data *mod = NULL;
- int rc = 0, rc1 = 0;
- ENTRY;
-
- CDEBUG(D_VFSTRACE, "VFS Op:inode=%llu\n", (long long)st->st_ino);
-
- if (ia_valid & ATTR_SIZE) {
- if (attr->ia_size > ll_file_maxbytes(inode)) {
- CDEBUG(D_INODE, "file too large %llu > "LPU64"\n",
- (long long)attr->ia_size,
- ll_file_maxbytes(inode));
- RETURN(-EFBIG);
- }
-
- attr->ia_valid |= ATTR_MTIME | ATTR_CTIME;
- }
-
- /* We mark all of the fields "set" so MDS/OST does not re-set them */
- if (attr->ia_valid & ATTR_CTIME) {
- attr->ia_ctime = CFS_CURRENT_TIME;
- attr->ia_valid |= ATTR_CTIME_SET;
- }
- if (!(ia_valid & ATTR_ATIME_SET) && (attr->ia_valid & ATTR_ATIME)) {
- attr->ia_atime = CFS_CURRENT_TIME;
- attr->ia_valid |= ATTR_ATIME_SET;
- }
- if (!(ia_valid & ATTR_MTIME_SET) && (attr->ia_valid & ATTR_MTIME)) {
- attr->ia_mtime = CFS_CURRENT_TIME;
- attr->ia_valid |= ATTR_MTIME_SET;
- }
-
- if (attr->ia_valid & (ATTR_MTIME | ATTR_CTIME))
- CDEBUG(D_INODE, "setting mtime "CFS_TIME_T", ctime "CFS_TIME_T
- ", now = "CFS_TIME_T"\n",
- LTIME_S(attr->ia_mtime), LTIME_S(attr->ia_ctime),
- LTIME_S(CFS_CURRENT_TIME));
-
- /* NB: ATTR_SIZE will only be set after this point if the size
- * resides on the MDS, ie, this file has no objects. */
- if (has_lsm)
- attr->ia_valid &= ~ATTR_SIZE;
-
- /* If only OST attributes being set on objects, don't do MDS RPC.
- * In that case, we need to check permissions and update the local
- * inode ourselves so we can call obdo_from_inode() always. */
- if (ia_valid & (has_lsm ? ~(ATTR_FROM_OPEN | ATTR_RAW) : ~0)) {
- memcpy(&op_data.op_attr, attr, sizeof(*attr));
-
- /* Open epoch for truncate. */
- if (exp_connect_som(llu_i2mdexp(inode)) &&
- (ia_valid & ATTR_SIZE))
- op_data.op_flags = MF_EPOCH_OPEN;
- rc = llu_md_setattr(inode, &op_data, &mod);
- if (rc)
- RETURN(rc);
-
- llu_ioepoch_open(llu_i2info(inode), op_data.op_ioepoch);
- if (!has_lsm || !S_ISREG(st->st_mode)) {
- CDEBUG(D_INODE, "no lsm: not setting attrs on OST\n");
- GOTO(out, rc);
- }
- } else {
- /* The OST doesn't check permissions, but the alternative is
- * a gratuitous RPC to the MDS. We already rely on the client
- * to do read/write/truncate permission checks, so is mtime OK?
- */
- if (ia_valid & (ATTR_MTIME | ATTR_ATIME)) {
- /* from sys_utime() */
- if (!(ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET))) {
- if (current->fsuid != st->st_uid &&
- (rc = ll_permission(inode, MAY_WRITE)) != 0)
- RETURN(rc);
- } else {
- /* from inode_change_ok() */
- if (current->fsuid != st->st_uid &&
- !cfs_capable(CFS_CAP_FOWNER))
- RETURN(-EPERM);
- }
- }
-
-
- /* Won't invoke llu_vmtruncate(), as we already cleared
- * ATTR_SIZE */
- inode_setattr(inode, attr);
- }
-
- if (ia_valid & ATTR_SIZE)
- attr->ia_valid |= ATTR_SIZE;
- if (ia_valid & (ATTR_SIZE |
- ATTR_ATIME | ATTR_ATIME_SET |
- ATTR_MTIME | ATTR_MTIME_SET))
- /* on truncate and utimes send attributes to osts, setting
- * mtime/atime to past will be performed under PW 0:EOF extent
- * lock (new_size:EOF for truncate)
- * it may seem excessive to send mtime/atime updates to osts
- * when not setting times to past, but it is necessary due to
- * possible time de-synchronization */
- rc = cl_setattr_ost(inode, attr, NULL);
- EXIT;
-out:
- if (op_data.op_ioepoch)
- rc1 = llu_setattr_done_writing(inode, &op_data, mod);
- return rc ? rc : rc1;
-}
-
-/* here we simply act as a thin layer to glue it with
- * llu_setattr_raw(), which is copy from kernel
- */
-static int llu_iop_setattr(struct pnode *pno,
- struct inode *ino,
- unsigned mask,
- struct intnl_stat *stbuf)
-{
- struct iattr iattr;
- int rc;
- ENTRY;
-
- liblustre_wait_event(0);
-
- LASSERT(!(mask & ~(SETATTR_MTIME | SETATTR_ATIME |
- SETATTR_UID | SETATTR_GID |
- SETATTR_LEN | SETATTR_MODE)));
- memset(&iattr, 0, sizeof(iattr));
-
- if (mask & SETATTR_MODE) {
- iattr.ia_mode = stbuf->st_mode;
- iattr.ia_valid |= ATTR_MODE;
- }
- if (mask & SETATTR_MTIME) {
- iattr.ia_mtime = stbuf->st_mtime;
- iattr.ia_valid |= ATTR_MTIME | ATTR_MTIME_SET;
- }
- if (mask & SETATTR_ATIME) {
- iattr.ia_atime = stbuf->st_atime;
- iattr.ia_valid |= ATTR_ATIME | ATTR_ATIME_SET;
- }
- if (mask & SETATTR_UID) {
- iattr.ia_uid = stbuf->st_uid;
- iattr.ia_valid |= ATTR_UID;
- }
- if (mask & SETATTR_GID) {
- iattr.ia_gid = stbuf->st_gid;
- iattr.ia_valid |= ATTR_GID;
- }
- if (mask & SETATTR_LEN) {
- iattr.ia_size = stbuf->st_size; /* XXX signed expansion problem */
- iattr.ia_valid |= ATTR_SIZE;
- }
-
- iattr.ia_valid |= ATTR_RAW | ATTR_CTIME;
- iattr.ia_ctime = CFS_CURRENT_TIME;
-
- rc = llu_setattr_raw(ino, &iattr);
- liblustre_wait_idle();
- RETURN(rc);
-}
-
-#define EXT2_LINK_MAX 32000
-
-static int llu_iop_symlink_raw(struct pnode *pno, const char *tgt)
-{
- struct inode *dir = pno->p_base->pb_parent->pb_ino;
- struct qstr *qstr = &pno->p_base->pb_name;
- const char *name = qstr->name;
- int len = qstr->len;
- struct ptlrpc_request *request = NULL;
- struct llu_sb_info *sbi = llu_i2sbi(dir);
- struct md_op_data op_data = {{ 0 }};
- int err = -EMLINK;
- ENTRY;
-
- liblustre_wait_event(0);
- if (llu_i2stat(dir)->st_nlink >= EXT2_LINK_MAX)
- RETURN(err);
-
- llu_prep_md_op_data(&op_data, dir, NULL, name, len, 0,
- LUSTRE_OPC_SYMLINK);
-
- err = md_create(sbi->ll_md_exp, &op_data, tgt, strlen(tgt) + 1,
- S_IFLNK | S_IRWXUGO, current->fsuid, current->fsgid,
- cfs_curproc_cap_pack(), 0, &request);
- ptlrpc_req_finished(request);
- liblustre_wait_event(0);
- RETURN(err);
-}
-
-static int llu_readlink_internal(struct inode *inode,
- struct ptlrpc_request **request,
- char **symname)
-{
- struct llu_inode_info *lli = llu_i2info(inode);
- struct llu_sb_info *sbi = llu_i2sbi(inode);
- struct mdt_body *body;
- struct intnl_stat *st = llu_i2stat(inode);
- struct md_op_data op_data = {{ 0 }};
- int rc, symlen = st->st_size + 1;
- ENTRY;
-
- *request = NULL;
- *symname = NULL;
-
- if (lli->lli_symlink_name) {
- *symname = lli->lli_symlink_name;
- CDEBUG(D_INODE, "using cached symlink %s\n", *symname);
- RETURN(0);
- }
-
- llu_prep_md_op_data(&op_data, inode, NULL, NULL, 0, symlen,
- LUSTRE_OPC_ANY);
- op_data.op_valid = OBD_MD_LINKNAME;
-
- rc = md_getattr(sbi->ll_md_exp, &op_data, request);
- if (rc) {
- CERROR("inode %llu: rc = %d\n", (long long)st->st_ino, rc);
- RETURN(rc);
- }
-
- body = req_capsule_server_get(&(*request)->rq_pill, &RMF_MDT_BODY);
- LASSERT(body != NULL);
-
- if ((body->valid & OBD_MD_LINKNAME) == 0) {
- CERROR ("OBD_MD_LINKNAME not set on reply\n");
- GOTO (failed, rc = -EPROTO);
- }
-
- LASSERT(symlen != 0);
- if (body->eadatasize != symlen) {
- CERROR("inode %llu: symlink length %d not expected %d\n",
- (long long)st->st_ino, body->eadatasize - 1, symlen - 1);
- GOTO(failed, rc = -EPROTO);
- }
-
- *symname = req_capsule_server_get(&(*request)->rq_pill, &RMF_MDT_MD);
- if (*symname == NULL ||
- strnlen(*symname, symlen) != symlen - 1) {
- /* not full/NULL terminated */
- CERROR("inode %llu: symlink not NULL terminated string"
- "of length %d\n", (long long)st->st_ino, symlen - 1);
- GOTO(failed, rc = -EPROTO);
- }
-
- OBD_ALLOC(lli->lli_symlink_name, symlen);
- /* do not return an error if we cannot cache the symlink locally */
- if (lli->lli_symlink_name)
- memcpy(lli->lli_symlink_name, *symname, symlen);
-
- RETURN(0);
-
- failed:
- ptlrpc_req_finished (*request);
- RETURN (-EPROTO);
-}
-
-static int llu_iop_readlink(struct pnode *pno, char *data, size_t bufsize)
-{
- struct inode *inode = pno->p_base->pb_ino;
- struct ptlrpc_request *request;
- char *symname;
- int rc;
- ENTRY;
-
- liblustre_wait_event(0);
- rc = llu_readlink_internal(inode, &request, &symname);
- if (rc)
- GOTO(out, rc);
-
- LASSERT(symname);
- strncpy(data, symname, bufsize);
- rc = strlen(symname);
-
- ptlrpc_req_finished(request);
- out:
- liblustre_wait_event(0);
- RETURN(rc);
-}
-
-static int llu_iop_mknod_raw(struct pnode *pno,
- mode_t mode,
- dev_t dev)
-{
- struct ptlrpc_request *request = NULL;
- struct inode *dir = pno->p_parent->p_base->pb_ino;
- struct llu_sb_info *sbi = llu_i2sbi(dir);
- struct md_op_data op_data = {{ 0 }};
- int err = -EMLINK;
- ENTRY;
-
- liblustre_wait_event(0);
- CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%llu\n",
- (int)pno->p_base->pb_name.len, pno->p_base->pb_name.name,
- (long long)llu_i2stat(dir)->st_ino);
-
- if (llu_i2stat(dir)->st_nlink >= EXT2_LINK_MAX)
- RETURN(err);
-
- switch (mode & S_IFMT) {
- case 0:
- case S_IFREG:
- mode |= S_IFREG; /* for mode = 0 case, fallthrough */
- case S_IFCHR:
- case S_IFBLK:
- case S_IFIFO:
- case S_IFSOCK:
- llu_prep_md_op_data(&op_data, dir, NULL,
- pno->p_base->pb_name.name,
- pno->p_base->pb_name.len, 0,
- LUSTRE_OPC_MKNOD);
-
- err = md_create(sbi->ll_md_exp, &op_data, NULL, 0, mode,
- current->fsuid, current->fsgid,
- cfs_curproc_cap_pack(), dev, &request);
- ptlrpc_req_finished(request);
- break;
- case S_IFDIR:
- err = -EPERM;
- break;
- default:
- err = -EINVAL;
- }
- liblustre_wait_event(0);
- RETURN(err);
-}
-
-static int llu_iop_link_raw(struct pnode *old, struct pnode *new)
-{
- struct inode *src = old->p_base->pb_ino;
- struct inode *dir = new->p_parent->p_base->pb_ino;
- const char *name = new->p_base->pb_name.name;
- int namelen = new->p_base->pb_name.len;
- struct ptlrpc_request *request = NULL;
- struct md_op_data op_data = {{ 0 }};
- int rc;
- ENTRY;
-
- LASSERT(src);
- LASSERT(dir);
-
- liblustre_wait_event(0);
- llu_prep_md_op_data(&op_data, src, dir, name, namelen, 0,
- LUSTRE_OPC_ANY);
- rc = md_link(llu_i2sbi(src)->ll_md_exp, &op_data, &request);
- ptlrpc_req_finished(request);
- liblustre_wait_event(0);
-
- RETURN(rc);
-}
-
-/*
- * libsysio will clear the inode immediately after return
- */
-static int llu_iop_unlink_raw(struct pnode *pno)
-{
- struct inode *dir = pno->p_base->pb_parent->pb_ino;
- struct qstr *qstr = &pno->p_base->pb_name;
- const char *name = qstr->name;
- int len = qstr->len;
- struct inode *target = pno->p_base->pb_ino;
- struct ptlrpc_request *request = NULL;
- struct md_op_data op_data = { { 0 } };
- int rc;
- ENTRY;
-
- LASSERT(target);
-
- liblustre_wait_event(0);
- llu_prep_md_op_data(&op_data, dir, NULL, name, len, 0,
- LUSTRE_OPC_ANY);
- rc = md_unlink(llu_i2sbi(dir)->ll_md_exp, &op_data, &request);
- if (!rc)
- rc = llu_objects_destroy(request, dir);
- ptlrpc_req_finished(request);
- liblustre_wait_idle();
-
- RETURN(rc);
-}
-
-static int llu_iop_rename_raw(struct pnode *old, struct pnode *new)
-{
- struct inode *src = old->p_parent->p_base->pb_ino;
- struct inode *tgt = new->p_parent->p_base->pb_ino;
- const char *oldname = old->p_base->pb_name.name;
- int oldnamelen = old->p_base->pb_name.len;
- const char *newname = new->p_base->pb_name.name;
- int newnamelen = new->p_base->pb_name.len;
- struct ptlrpc_request *request = NULL;
- struct md_op_data op_data = { { 0 } };
- int rc;
- ENTRY;
-
- LASSERT(src);
- LASSERT(tgt);
-
- liblustre_wait_event(0);
- llu_prep_md_op_data(&op_data, src, tgt, NULL, 0, 0,
- LUSTRE_OPC_ANY);
- rc = md_rename(llu_i2sbi(src)->ll_md_exp, &op_data,
- oldname, oldnamelen, newname, newnamelen,
- &request);
- if (!rc) {
- rc = llu_objects_destroy(request, src);
- }
-
- ptlrpc_req_finished(request);
- liblustre_wait_idle();
-
- RETURN(rc);
-}
-
-#ifdef _HAVE_STATVFS
-static int llu_statfs_internal(struct llu_sb_info *sbi,
- struct obd_statfs *osfs, __u64 max_age)
-{
- struct obd_statfs obd_osfs;
- int rc;
- ENTRY;
-
- rc = obd_statfs(NULL, sbi->ll_md_exp, osfs, max_age, 0);
- if (rc) {
- CERROR("md_statfs fails: rc = %d\n", rc);
- RETURN(rc);
- }
-
- CDEBUG(D_SUPER, "MDC blocks "LPU64"/"LPU64" objects "LPU64"/"LPU64"\n",
- osfs->os_bavail, osfs->os_blocks, osfs->os_ffree,osfs->os_files);
-
- rc = obd_statfs_rqset(class_exp2obd(sbi->ll_dt_exp),
- &obd_statfs, max_age, 0);
- if (rc) {
- CERROR("obd_statfs fails: rc = %d\n", rc);
- RETURN(rc);
- }
-
- CDEBUG(D_SUPER, "OSC blocks "LPU64"/"LPU64" objects "LPU64"/"LPU64"\n",
- obd_osfs.os_bavail, obd_osfs.os_blocks, obd_osfs.os_ffree,
- obd_osfs.os_files);
-
- osfs->os_blocks = obd_osfs.os_blocks;
- osfs->os_bfree = obd_osfs.os_bfree;
- osfs->os_bavail = obd_osfs.os_bavail;
-
- /* If we don't have as many objects free on the OST as inodes
- * on the MDS, we reduce the total number of inodes to
- * compensate, so that the "inodes in use" number is correct.
- */
- if (obd_osfs.os_ffree < osfs->os_ffree) {
- osfs->os_files = (osfs->os_files - osfs->os_ffree) +
- obd_osfs.os_ffree;
- osfs->os_ffree = obd_osfs.os_ffree;
- }
-
- RETURN(rc);
-}
-
-static int llu_statfs(struct llu_sb_info *sbi, struct statfs *sfs)
-{
- struct obd_statfs osfs;
- int rc;
-
- CDEBUG(D_VFSTRACE, "VFS Op:\n");
-
- /* For now we will always get up-to-date statfs values, but in the
- * future we may allow some amount of caching on the client (e.g.
- * from QOS or lprocfs updates). */
- rc = llu_statfs_internal(sbi, &osfs,
- cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS));
- if (rc)
- return rc;
-
- statfs_unpack(sfs, &osfs);
-
- if (sizeof(sfs->f_blocks) == 4) {
- while (osfs.os_blocks > ~0UL) {
- sfs->f_bsize <<= 1;
-
- osfs.os_blocks >>= 1;
- osfs.os_bfree >>= 1;
- osfs.os_bavail >>= 1;
- }
- }
-
- sfs->f_blocks = osfs.os_blocks;
- sfs->f_bfree = osfs.os_bfree;
- sfs->f_bavail = osfs.os_bavail;
-
- return 0;
-}
-
-static int llu_iop_statvfs(struct pnode *pno,
- struct inode *ino,
- struct intnl_statvfs *buf)
-{
- struct statfs fs;
- int rc;
- ENTRY;
-
- liblustre_wait_event(0);
-
-#ifndef __CYGWIN__
- LASSERT(pno->p_base->pb_ino);
- rc = llu_statfs(llu_i2sbi(pno->p_base->pb_ino), &fs);
- if (rc)
- RETURN(rc);
-
- /* from native driver */
- buf->f_bsize = fs.f_bsize; /* file system block size */
- buf->f_frsize = fs.f_bsize; /* file system fundamental block size */
- buf->f_blocks = fs.f_blocks;
- buf->f_bfree = fs.f_bfree;
- buf->f_bavail = fs.f_bavail;
- buf->f_files = fs.f_files; /* Total number serial numbers */
- buf->f_ffree = fs.f_ffree; /* Number free serial numbers */
- buf->f_favail = fs.f_ffree; /* Number free ser num for non-privileged*/
- buf->f_fsid = fs.f_fsid.__val[1];
- buf->f_flag = 0; /* No equiv in statfs; maybe use type? */
- buf->f_namemax = fs.f_namelen;
-#endif
-
- liblustre_wait_event(0);
- RETURN(0);
-}
-#endif /* _HAVE_STATVFS */
-
-static int llu_iop_mkdir_raw(struct pnode *pno, mode_t mode)
-{
- struct inode *dir = pno->p_base->pb_parent->pb_ino;
- struct qstr *qstr = &pno->p_base->pb_name;
- const char *name = qstr->name;
- int len = qstr->len;
- struct ptlrpc_request *request = NULL;
- struct intnl_stat *st = llu_i2stat(dir);
- struct md_op_data op_data = {{ 0 }};
- int err = -EMLINK;
- ENTRY;
-
- liblustre_wait_event(0);
- CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%llu/%lu(%p)\n", len, name,
- (long long)st->st_ino, llu_i2info(dir)->lli_st_generation, dir);
-
- if (st->st_nlink >= EXT2_LINK_MAX)
- RETURN(err);
-
- llu_prep_md_op_data(&op_data, dir, NULL, name, len, 0,
- LUSTRE_OPC_MKDIR);
-
- err = md_create(llu_i2sbi(dir)->ll_md_exp, &op_data, NULL, 0,
- mode | S_IFDIR, current->fsuid, current->fsgid,
- cfs_curproc_cap_pack(), 0, &request);
- ptlrpc_req_finished(request);
- liblustre_wait_event(0);
- RETURN(err);
-}
-
-static int llu_iop_rmdir_raw(struct pnode *pno)
-{
- struct inode *dir = pno->p_base->pb_parent->pb_ino;
- struct qstr *qstr = &pno->p_base->pb_name;
- const char *name = qstr->name;
- int len = qstr->len;
- struct ptlrpc_request *request = NULL;
- struct md_op_data op_data = {{ 0 }};
- int rc;
- ENTRY;
-
- liblustre_wait_event(0);
- CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%llu/%lu(%p)\n", len, name,
- (long long)llu_i2stat(dir)->st_ino,
- llu_i2info(dir)->lli_st_generation, dir);
-
- llu_prep_md_op_data(&op_data, dir, NULL, name, len, S_IFDIR,
- LUSTRE_OPC_ANY);
- rc = md_unlink(llu_i2sbi(dir)->ll_md_exp, &op_data, &request);
- ptlrpc_req_finished(request);
-
- liblustre_wait_event(0);
- RETURN(rc);
-}
-
-#ifdef O_DIRECT
-#define FCNTL_FLMASK (O_APPEND|O_NONBLOCK|O_ASYNC|O_DIRECT)
-#else
-#define FCNTL_FLMASK (O_APPEND|O_NONBLOCK|O_ASYNC)
-#endif
-#define FCNTL_FLMASK_INVALID (O_NONBLOCK|O_ASYNC)
-
-/* refer to ll_file_flock() for details */
-static int llu_file_flock(struct inode *ino,
- int cmd,
- struct file_lock *file_lock)
-{
- struct llu_inode_info *lli = llu_i2info(ino);
- struct ldlm_res_id res_id =
- { .name = {fid_seq(&lli->lli_fid),
- fid_oid(&lli->lli_fid),
- fid_ver(&lli->lli_fid),
- LDLM_FLOCK} };
- struct ldlm_enqueue_info einfo = {
- .ei_type = LDLM_FLOCK,
- .ei_mode = 0,
- .ei_cb_cp = ldlm_flock_completion_ast,
- .ei_cbdata = file_lock,
- };
- struct intnl_stat *st = llu_i2stat(ino);
- struct lustre_handle lockh = {0};
- ldlm_policy_data_t flock;
- __u64 flags = 0;
- int rc;
-
- CDEBUG(D_VFSTRACE, "VFS Op:inode=%llu file_lock=%p\n",
- (unsigned long long)st->st_ino, file_lock);
-
- flock.l_flock.pid = file_lock->fl_pid;
- flock.l_flock.start = file_lock->fl_start;
- flock.l_flock.end = file_lock->fl_end;
-
- switch (file_lock->fl_type) {
- case F_RDLCK:
- einfo.ei_mode = LCK_PR;
- break;
- case F_UNLCK:
- einfo.ei_mode = LCK_NL;
- break;
- case F_WRLCK:
- einfo.ei_mode = LCK_PW;
- break;
- default:
- CERROR("unknown fcntl lock type: %d\n", file_lock->fl_type);
- LBUG();
- }
-
- switch (cmd) {
- case F_SETLKW:
-#ifdef F_SETLKW64
-#if F_SETLKW64 != F_SETLKW
- case F_SETLKW64:
-#endif
-#endif
- flags = 0;
- break;
- case F_SETLK:
-#ifdef F_SETLK64
-#if F_SETLK64 != F_SETLK
- case F_SETLK64:
-#endif
-#endif
- flags = LDLM_FL_BLOCK_NOWAIT;
- break;
- case F_GETLK:
-#ifdef F_GETLK64
-#if F_GETLK64 != F_GETLK
- case F_GETLK64:
-#endif
-#endif
- flags = LDLM_FL_TEST_LOCK;
- file_lock->fl_type = einfo.ei_mode;
- break;
- default:
- CERROR("unknown fcntl cmd: %d\n", cmd);
- LBUG();
- }
-
- CDEBUG(D_DLMTRACE, "inode=%llu, pid=%u, cmd=%d, flags="LPX64", "
- "mode=%u, start="LPX64", end="LPX64"\n",
- (unsigned long long)st->st_ino,
- flock.l_flock.pid, cmd, flags, einfo.ei_mode,
- flock.l_flock.start, flock.l_flock.end);
- {
- struct lmv_obd *lmv;
- struct obd_device *lmv_obd;
- lmv_obd = class_exp2obd(llu_i2mdexp(ino));
- lmv = &lmv_obd->u.lmv;
-
- if (lmv->desc.ld_tgt_count < 1)
- RETURN(rc = -ENODEV);
-
- if (lmv->tgts[0] != NULL && lmv->tgts[0]->ltd_exp != NULL)
- rc = ldlm_cli_enqueue(lmv->tgts[0]->ltd_exp, NULL,
- &einfo, &res_id, &flock, &flags,
- NULL, 0, LVB_T_NONE, &lockh, 0);
- else
- rc = -ENODEV;
- }
- RETURN(rc);
-}
-
-static int assign_type(struct file_lock *fl, int type)
-{
- switch (type) {
- case F_RDLCK:
- case F_WRLCK:
- case F_UNLCK:
- fl->fl_type = type;
- return 0;
- default:
- return -EINVAL;
- }
-}
-
-static int flock_to_posix_lock(struct inode *ino,
- struct file_lock *fl,
- struct flock *l)
-{
- switch (l->l_whence) {
- /* XXX: only SEEK_SET is supported in lustre */
- case SEEK_SET:
- fl->fl_start = 0;
- break;
- default:
- return -EINVAL;
- }
-
- fl->fl_end = l->l_len - 1;
- if (l->l_len < 0)
- return -EINVAL;
- if (l->l_len == 0)
- fl->fl_end = OFFSET_MAX;
-
- fl->fl_pid = getpid();
- fl->fl_flags = FL_POSIX;
- fl->fl_notify = NULL;
- fl->fl_insert = NULL;
- fl->fl_remove = NULL;
- /* XXX: these fields can't be filled with suitable values,
- but I think lustre doesn't use them.
- */
- fl->fl_owner = NULL;
- fl->fl_file = NULL;
-
- return assign_type(fl, l->l_type);
-}
-
-static int llu_fcntl_getlk(struct inode *ino, struct flock *flock)
-{
- struct file_lock fl;
- int error;
-
- error = EINVAL;
- if ((flock->l_type != F_RDLCK) && (flock->l_type != F_WRLCK))
- goto out;
-
- error = flock_to_posix_lock(ino, &fl, flock);
- if (error)
- goto out;
-
- error = llu_file_flock(ino, F_GETLK, &fl);
- if (error)
- goto out;
-
- flock->l_type = F_UNLCK;
- if (fl.fl_type != F_UNLCK) {
- flock->l_pid = fl.fl_pid;
- flock->l_start = fl.fl_start;
- flock->l_len = fl.fl_end == OFFSET_MAX ? 0:
- fl.fl_end - fl.fl_start + 1;
- flock->l_whence = SEEK_SET;
- flock->l_type = fl.fl_type;
- }
-
-out:
- return error;
-}
-
-static int llu_fcntl_setlk(struct inode *ino, int cmd, struct flock *flock)
-{
- struct file_lock fl;
- int flags = llu_i2info(ino)->lli_open_flags + 1;
- int error;
-
- error = flock_to_posix_lock(ino, &fl, flock);
- if (error)
- goto out;
- if (cmd == F_SETLKW)
- fl.fl_flags |= FL_SLEEP;
-
- error = -EBADF;
- switch (flock->l_type) {
- case F_RDLCK:
- if (!(flags & FMODE_READ))
- goto out;
- break;
- case F_WRLCK:
- if (!(flags & FMODE_WRITE))
- goto out;
- break;
- case F_UNLCK:
- break;
- default:
- error = -EINVAL;
- goto out;
- }
-
- error = llu_file_flock(ino, cmd, &fl);
- if (error)
- goto out;
-
-out:
- return error;
-}
-
-static int llu_iop_fcntl(struct inode *ino, int cmd, va_list ap, int *rtn)
-{
- struct llu_inode_info *lli = llu_i2info(ino);
- long flags;
- struct flock *flock;
- long err = 0;
-
- liblustre_wait_event(0);
- switch (cmd) {
- case F_GETFL:
- *rtn = lli->lli_open_flags;
- break;
- case F_SETFL:
- flags = va_arg(ap, long);
- flags &= FCNTL_FLMASK;
- if (flags & FCNTL_FLMASK_INVALID) {
- LCONSOLE_ERROR_MSG(0x010, "liblustre does not support "
- "the O_NONBLOCK or O_ASYNC flags. "
- "Please fix your application.\n");
- *rtn = -EINVAL;
- err = EINVAL;
- break;
- }
- lli->lli_open_flags = (int)(flags & FCNTL_FLMASK) |
- (lli->lli_open_flags & ~FCNTL_FLMASK);
- *rtn = 0;
- break;
- case F_GETLK:
-#ifdef F_GETLK64
-#if F_GETLK64 != F_GETLK
- case F_GETLK64:
-#endif
-#endif
- flock = va_arg(ap, struct flock *);
- err = llu_fcntl_getlk(ino, flock);
- *rtn = err? -1: 0;
- break;
- case F_SETLK:
-#ifdef F_SETLKW64
-#if F_SETLKW64 != F_SETLKW
- case F_SETLKW64:
-#endif
-#endif
- case F_SETLKW:
-#ifdef F_SETLK64
-#if F_SETLK64 != F_SETLK
- case F_SETLK64:
-#endif
-#endif
- flock = va_arg(ap, struct flock *);
- err = llu_fcntl_setlk(ino, cmd, flock);
- *rtn = err? -1: 0;
- break;
- default:
- CERROR("unsupported fcntl cmd %x\n", cmd);
- *rtn = -ENOSYS;
- err = ENOSYS;
- break;
- }
-
- liblustre_wait_event(0);
- return err;
-}
-
-static int llu_get_grouplock(struct inode *inode, unsigned long arg)
-{
- struct llu_inode_info *lli = llu_i2info(inode);
- struct ll_file_data *fd = lli->lli_file_data;
- int rc;
- struct ccc_grouplock grouplock;
- ENTRY;
-
- if (fd->fd_flags & LL_FILE_IGNORE_LOCK) {
- RETURN(-ENOTSUPP);
- }
- if (fd->fd_flags & LL_FILE_GROUP_LOCKED) {
- RETURN(-EINVAL);
- }
- LASSERT(fd->fd_grouplock.cg_lock == NULL);
-
- rc = cl_get_grouplock(cl_i2info(inode)->lli_clob,
- arg, (lli->lli_open_flags & O_NONBLOCK),
- &grouplock);
-
- if (rc)
- RETURN(rc);
-
- fd->fd_flags |= LL_FILE_GROUP_LOCKED;
- fd->fd_grouplock = grouplock;
-
- RETURN(0);
-}
-
-int llu_put_grouplock(struct inode *inode, unsigned long arg)
-{
- struct llu_inode_info *lli = llu_i2info(inode);
- struct ll_file_data *fd = lli->lli_file_data;
- struct ccc_grouplock grouplock;
- ENTRY;
-
- if (!(fd->fd_flags & LL_FILE_GROUP_LOCKED))
- RETURN(-EINVAL);
-
- LASSERT(fd->fd_grouplock.cg_lock != NULL);
-
- if (fd->fd_grouplock.cg_gid != arg)
- RETURN(-EINVAL);
-
- grouplock = fd->fd_grouplock;
- memset(&fd->fd_grouplock, 0, sizeof(fd->fd_grouplock));
- fd->fd_flags &= ~LL_FILE_GROUP_LOCKED;
-
- cl_put_grouplock(&grouplock);
-
- RETURN(0);
-}
-
-static int llu_lov_dir_setstripe(struct inode *ino, unsigned long arg)
-{
- struct llu_sb_info *sbi = llu_i2sbi(ino);
- struct ptlrpc_request *request = NULL;
- struct md_op_data op_data = {{ 0 }};
- struct lov_user_md lum, *lump = (struct lov_user_md *)arg;
- int rc = 0;
-
- llu_prep_md_op_data(&op_data, ino, NULL, NULL, 0, 0,
- LUSTRE_OPC_ANY);
-
- LASSERT(sizeof(lum) == sizeof(*lump));
- LASSERT(sizeof(lum.lmm_objects[0]) ==
- sizeof(lump->lmm_objects[0]));
- if (copy_from_user(&lum, lump, sizeof(lum)))
- return(-EFAULT);
-
- switch (lum.lmm_magic) {
- case LOV_USER_MAGIC_V1: {
- if (lum.lmm_magic != cpu_to_le32(LOV_USER_MAGIC_V1))
- lustre_swab_lov_user_md_v1(&lum);
- break;
- }
- case LOV_USER_MAGIC_V3: {
- if (lum.lmm_magic != cpu_to_le32(LOV_USER_MAGIC_V3))
- lustre_swab_lov_user_md_v3((struct lov_user_md_v3 *)&lum);
- break;
- }
- default: {
- CDEBUG(D_IOCTL, "bad userland LOV MAGIC:"
- " %#08x != %#08x nor %#08x\n",
- lum.lmm_magic, LOV_USER_MAGIC_V1,
- LOV_USER_MAGIC_V3);
- RETURN(-EINVAL);
- }
- }
-
- /* swabbing is done in lov_setstripe() on server side */
- rc = md_setattr(sbi->ll_md_exp, &op_data, &lum,
- sizeof(lum), NULL, 0, &request, NULL);
- if (rc) {
- ptlrpc_req_finished(request);
- if (rc != -EPERM && rc != -EACCES)
- CERROR("md_setattr fails: rc = %d\n", rc);
- return rc;
- }
- ptlrpc_req_finished(request);
-
- return rc;
-}
-
-static int llu_lov_setstripe_ea_info(struct inode *ino, int flags,
- struct lov_user_md *lum, int lum_size)
-{
- struct llu_sb_info *sbi = llu_i2sbi(ino);
- struct llu_inode_info *lli = llu_i2info(ino);
- struct lookup_intent oit = {.it_op = IT_OPEN, .it_flags = flags};
- struct ldlm_enqueue_info einfo = {
- .ei_type = LDLM_IBITS,
- .ei_mode = LCK_CR,
- .ei_cb_bl = llu_md_blocking_ast,
- .ei_cb_cp = ldlm_completion_ast,
- };
- struct ptlrpc_request *req = NULL;
- struct lustre_md md;
- struct md_op_data data = {{ 0 }};
- struct lustre_handle lockh;
- int rc = 0;
- ENTRY;
-
- if (lli->lli_has_smd) {
- CDEBUG(D_IOCTL, "stripe already exists for ino "DFID"\n",
- PFID(&lli->lli_fid));
- return -EEXIST;
- }
-
- llu_prep_md_op_data(&data, NULL, ino, NULL, 0, O_RDWR,
- LUSTRE_OPC_ANY);
- rc = md_enqueue(sbi->ll_md_exp, &einfo, NULL, &oit, &data, &lockh,
- LDLM_FL_INTENT_ONLY);
- if (rc)
- GOTO(out, rc);
-
- req = oit.d.lustre.it_data;
- rc = it_open_error(DISP_IT_EXECD, &oit);
- if (rc) {
- req->rq_replay = 0;
- GOTO(out, rc);
- }
-
- rc = it_open_error(DISP_OPEN_OPEN, &oit);
- if (rc) {
- req->rq_replay = 0;
- GOTO(out, rc);
- }
-
- rc = md_get_lustre_md(sbi->ll_md_exp, req,
- sbi->ll_dt_exp, sbi->ll_md_exp, &md);
- if (rc)
- GOTO(out, rc);
-
- llu_update_inode(ino, &md);
- llu_local_open(lli, &oit);
- /* release intent */
- if (lustre_handle_is_used(&lockh))
- ldlm_lock_decref(&lockh, LCK_CR);
- ptlrpc_req_finished(req);
- req = NULL;
- rc = llu_file_release(ino);
- EXIT;
-
-out:
- if (req != NULL)
- ptlrpc_req_finished(req);
- return rc;
-}
-
-static int llu_lov_file_setstripe(struct inode *ino, unsigned long arg)
-{
- struct lov_user_md lum, *lump = (struct lov_user_md *)arg;
- int rc;
- int flags = FMODE_WRITE;
- ENTRY;
-
- LASSERT(sizeof(lum) == sizeof(*lump));
- LASSERT(sizeof(lum.lmm_objects[0]) == sizeof(lump->lmm_objects[0]));
- if (copy_from_user(&lum, lump, sizeof(lum)))
- RETURN(-EFAULT);
-
- rc = llu_lov_setstripe_ea_info(ino, flags, &lum, sizeof(lum));
- RETURN(rc);
-}
-
-static int llu_lov_setstripe(struct inode *ino, unsigned long arg)
-{
- struct intnl_stat *st = llu_i2stat(ino);
- if (S_ISREG(st->st_mode))
- return llu_lov_file_setstripe(ino, arg);
- if (S_ISDIR(st->st_mode))
- return llu_lov_dir_setstripe(ino, arg);
-
- return -EINVAL;
-}
-
-static int llu_lov_getstripe(struct inode *ino, unsigned long arg)
-{
- struct lov_stripe_md *lsm = NULL;
- int rc = -ENODATA;
-
- lsm = ccc_inode_lsm_get(ino);
- if (lsm != NULL)
- rc = obd_iocontrol(LL_IOC_LOV_GETSTRIPE, llu_i2obdexp(ino), 0, lsm,
- (void *)arg);
- ccc_inode_lsm_put(ino, lsm);
- return rc;
-}
-
-static int llu_iop_ioctl(struct inode *ino, unsigned long int request,
- va_list ap)
-{
- unsigned long arg;
- int rc;
-
- liblustre_wait_event(0);
-
- switch (request) {
- case LL_IOC_GROUP_LOCK:
- arg = va_arg(ap, unsigned long);
- rc = llu_get_grouplock(ino, arg);
- break;
- case LL_IOC_GROUP_UNLOCK:
- arg = va_arg(ap, unsigned long);
- rc = llu_put_grouplock(ino, arg);
- break;
- case LL_IOC_LOV_SETSTRIPE:
- arg = va_arg(ap, unsigned long);
- rc = llu_lov_setstripe(ino, arg);
- break;
- case LL_IOC_LOV_GETSTRIPE:
- arg = va_arg(ap, unsigned long);
- rc = llu_lov_getstripe(ino, arg);
- break;
- default:
- CERROR("did not support ioctl cmd %lx\n", request);
- rc = -ENOSYS;
- break;
- }
-
- liblustre_wait_event(0);
- return rc;
-}
-
-/*
- * we already do syncronous read/write
- */
-static int llu_iop_sync(struct inode *inode)
-{
- liblustre_wait_event(0);
- return 0;
-}
-
-static int llu_iop_datasync(struct inode *inode)
-{
- liblustre_wait_event(0);
- return 0;
-}
-
-static struct filesys_ops llu_filesys_ops = {
- .fsop_gone = llu_fsop_gone,
-};
-
-struct inode *llu_iget(struct filesys *fs, struct lustre_md *md)
-{
- struct inode *inode;
- struct lu_fid fid;
- struct file_identifier fileid = {&fid, sizeof(fid)};
-
- if ((md->body->valid & (OBD_MD_FLID | OBD_MD_FLTYPE)) !=
- (OBD_MD_FLID | OBD_MD_FLTYPE)) {
- CERROR("bad md body valid mask "LPX64"\n", md->body->valid);
- LBUG();
- return ERR_PTR(-EPERM);
- }
-
- /* try to find existing inode */
- fid = md->body->fid1;
-
- inode = _sysio_i_find(fs, &fileid);
- if (inode) {
- if (inode->i_zombie/* ||
- lli->lli_st_generation != md->body->generation*/) {
- I_RELE(inode);
- }
- else {
- llu_update_inode(inode, md);
- return inode;
- }
- }
-
- inode = llu_new_inode(fs, &fid);
- if (inode)
- llu_update_inode(inode, md);
-
- return inode;
-}
-
-static int
-llu_fsswop_mount(const char *source,
- unsigned flags,
- const void *data __IS_UNUSED,
- struct pnode *tocover,
- struct mount **mntp)
-{
- struct filesys *fs;
- struct inode *root;
- struct pnode_base *rootpb;
- struct obd_device *obd;
- struct llu_sb_info *sbi;
- struct obd_statfs osfs;
- static struct qstr noname = { NULL, 0, 0 };
- struct ptlrpc_request *request = NULL;
- struct lustre_md md;
- class_uuid_t uuid;
- struct config_llog_instance cfg = {0, };
- struct lustre_profile *lprof;
- char *zconf_mgsnid, *zconf_profile;
- char *osc = NULL, *mdc = NULL;
- int async = 1, err = -EINVAL;
- struct obd_connect_data ocd = {0,};
- struct md_op_data op_data = {{0}};
- /* %p for void* in printf needs 16+2 characters: 0xffffffffffffffff */
- const int instlen = sizeof(cfg.cfg_instance) * 2 + 2;
-
- ENTRY;
-
- if (ll_parse_mount_target(source,
- &zconf_mgsnid,
- &zconf_profile)) {
- CERROR("mal-formed target %s\n", source);
- RETURN(err);
- }
- if (!zconf_mgsnid || !zconf_profile) {
- printf("Liblustre: invalid target %s\n", source);
- RETURN(err);
- }
- /* allocate & initialize sbi */
- OBD_ALLOC(sbi, sizeof(*sbi));
- if (!sbi)
- RETURN(-ENOMEM);
-
- CFS_INIT_LIST_HEAD(&sbi->ll_conn_chain);
- ll_generate_random_uuid(uuid);
- class_uuid_unparse(uuid, &sbi->ll_sb_uuid);
-
- /* generate a string unique to this super, let's try
- the address of the super itself.*/
- cfg.cfg_instance = sbi;
-
- /* retrive & parse config log */
- cfg.cfg_uuid = sbi->ll_sb_uuid;
- err = liblustre_process_log(&cfg, zconf_mgsnid, zconf_profile, 1);
- if (err < 0) {
- CERROR("Unable to process log: %s\n", zconf_profile);
- GOTO(out_free, err);
- }
-
- lprof = class_get_profile(zconf_profile);
- if (lprof == NULL) {
- CERROR("No profile found: %s\n", zconf_profile);
- GOTO(out_free, err = -EINVAL);
- }
- OBD_ALLOC(osc, strlen(lprof->lp_dt) + instlen + 2);
- sprintf(osc, "%s-%p", lprof->lp_dt, cfg.cfg_instance);
-
- OBD_ALLOC(mdc, strlen(lprof->lp_md) + instlen + 2);
- sprintf(mdc, "%s-%p", lprof->lp_md, cfg.cfg_instance);
-
- if (!osc) {
- CERROR("no osc\n");
- GOTO(out_free, err = -EINVAL);
- }
- if (!mdc) {
- CERROR("no mdc\n");
- GOTO(out_free, err = -EINVAL);
- }
-
- fs = _sysio_fs_new(&llu_filesys_ops, flags, sbi);
- if (!fs) {
- err = -ENOMEM;
- goto out_free;
- }
-
- obd = class_name2obd(mdc);
- if (!obd) {
- CERROR("MDC %s: not setup or attached\n", mdc);
- GOTO(out_free, err = -EINVAL);
- }
- obd_set_info_async(NULL, obd->obd_self_export, sizeof(KEY_ASYNC),
- KEY_ASYNC, sizeof(async), &async, NULL);
-
- ocd.ocd_connect_flags = OBD_CONNECT_IBITS | OBD_CONNECT_VERSION |
- OBD_CONNECT_FID | OBD_CONNECT_AT |
- OBD_CONNECT_VBR | OBD_CONNECT_FULL20 |
- OBD_CONNECT_LVB_TYPE;
-
-#ifdef LIBLUSTRE_POSIX_ACL
- ocd.ocd_connect_flags |= OBD_CONNECT_ACL;
-#endif
- ocd.ocd_ibits_known = MDS_INODELOCK_FULL;
- ocd.ocd_version = LUSTRE_VERSION_CODE;
-
- /* setup mdc */
- err = obd_connect(NULL, &sbi->ll_md_exp, obd, &sbi->ll_sb_uuid, &ocd, NULL);
- if (err) {
- CERROR("cannot connect to %s: rc = %d\n", mdc, err);
- GOTO(out_free, err);
- }
-
- err = obd_statfs(NULL, sbi->ll_md_exp, &osfs, 100000000, 0);
- if (err)
- GOTO(out_md, err);
-
- /*
- * FIXME fill fs stat data into sbi here!!! FIXME
- */
-
- /* setup osc */
- obd = class_name2obd(osc);
- if (!obd) {
- CERROR("OSC %s: not setup or attached\n", osc);
- GOTO(out_md, err = -EINVAL);
- }
- obd_set_info_async(NULL, obd->obd_self_export, sizeof(KEY_ASYNC),
- KEY_ASYNC, sizeof(async), &async, NULL);
-
- obd->obd_upcall.onu_owner = &sbi->ll_lco;
- obd->obd_upcall.onu_upcall = cl_ocd_update;
-
- ocd.ocd_connect_flags = OBD_CONNECT_SRVLOCK | OBD_CONNECT_REQPORTAL |
- OBD_CONNECT_VERSION | OBD_CONNECT_TRUNCLOCK |
- OBD_CONNECT_FID | OBD_CONNECT_AT |
- OBD_CONNECT_FULL20 | OBD_CONNECT_EINPROGRESS |
- OBD_CONNECT_LVB_TYPE;
-
- ocd.ocd_version = LUSTRE_VERSION_CODE;
- err = obd_connect(NULL, &sbi->ll_dt_exp, obd, &sbi->ll_sb_uuid, &ocd, NULL);
- if (err) {
- CERROR("cannot connect to %s: rc = %d\n", osc, err);
- GOTO(out_md, err);
- }
- sbi->ll_lco.lco_flags = ocd.ocd_connect_flags;
- sbi->ll_lco.lco_md_exp = sbi->ll_md_exp;
- sbi->ll_lco.lco_dt_exp = sbi->ll_dt_exp;
-
- fid_zero(&sbi->ll_root_fid);
- err = md_getstatus(sbi->ll_md_exp, &sbi->ll_root_fid, NULL);
- if (err) {
- CERROR("cannot mds_connect: rc = %d\n", err);
- GOTO(out_lock_cn_cb, err);
- }
- if (!fid_is_sane(&sbi->ll_root_fid)) {
- CERROR("Invalid root fid during mount\n");
- GOTO(out_lock_cn_cb, err = -EINVAL);
- }
- CDEBUG(D_SUPER, "rootfid "DFID"\n", PFID(&sbi->ll_root_fid));
-
- op_data.op_fid1 = sbi->ll_root_fid;
- op_data.op_valid = OBD_MD_FLGETATTR | OBD_MD_FLBLOCKS;
- /* fetch attr of root inode */
- err = md_getattr(sbi->ll_md_exp, &op_data, &request);
- if (err) {
- CERROR("md_getattr failed for root: rc = %d\n", err);
- GOTO(out_lock_cn_cb, err);
- }
-
- err = md_get_lustre_md(sbi->ll_md_exp, request,
- sbi->ll_dt_exp, sbi->ll_md_exp, &md);
- if (err) {
- CERROR("failed to understand root inode md: rc = %d\n",err);
- GOTO(out_request, err);
- }
-
- LASSERT(fid_is_sane(&sbi->ll_root_fid));
-
- root = llu_iget(fs, &md);
- if (!root || IS_ERR(root)) {
- CERROR("fail to generate root inode\n");
- GOTO(out_request, err = -EBADF);
- }
-
- /*
- * Generate base path-node for root.
- */
- rootpb = _sysio_pb_new(&noname, NULL, root);
- if (!rootpb) {
- err = -ENOMEM;
- goto out_inode;
- }
-
- err = _sysio_do_mount(fs, rootpb, flags, tocover, mntp);
- if (err) {
- _sysio_pb_gone(rootpb);
- goto out_inode;
- }
-
- cl_sb_init(sbi);
-
- ptlrpc_req_finished(request);
-
- CDEBUG(D_SUPER, "LibLustre: %s mounted successfully!\n", source);
- err = 0;
- goto out_free;
-
-out_inode:
- _sysio_i_gone(root);
-out_request:
- ptlrpc_req_finished(request);
-out_lock_cn_cb:
- obd_disconnect(sbi->ll_dt_exp);
-out_md:
- obd_disconnect(sbi->ll_md_exp);
-out_free:
- if (osc)
- OBD_FREE(osc, strlen(lprof->lp_dt) + instlen + 2);
- if (mdc)
- OBD_FREE(mdc, strlen(lprof->lp_md) + instlen + 2);
- if (err != 0)
- OBD_FREE(sbi, sizeof(*sbi));
- liblustre_wait_idle();
- return err;
-}
-
-struct fssw_ops llu_fssw_ops = {
- .fsswop_mount = llu_fsswop_mount,
-};
-
-static struct inode_ops llu_inode_ops = {
- .inop_lookup = llu_iop_lookup,
- .inop_getattr = llu_iop_getattr,
- .inop_setattr = llu_iop_setattr,
- .inop_filldirentries = llu_iop_filldirentries,
- .inop_mkdir = llu_iop_mkdir_raw,
- .inop_rmdir = llu_iop_rmdir_raw,
- .inop_symlink = llu_iop_symlink_raw,
- .inop_readlink = llu_iop_readlink,
- .inop_open = llu_iop_open,
- .inop_close = llu_iop_close,
- .inop_link = llu_iop_link_raw,
- .inop_unlink = llu_iop_unlink_raw,
- .inop_rename = llu_iop_rename_raw,
- .inop_pos = llu_iop_pos,
- .inop_read = llu_iop_read,
- .inop_write = llu_iop_write,
- .inop_iodone = llu_iop_iodone,
- .inop_fcntl = llu_iop_fcntl,
- .inop_sync = llu_iop_sync,
- .inop_datasync = llu_iop_datasync,
- .inop_ioctl = llu_iop_ioctl,
- .inop_mknod = llu_iop_mknod_raw,
-#ifdef _HAVE_STATVFS
- .inop_statvfs = llu_iop_statvfs,
-#endif
- .inop_gone = llu_iop_gone,
-};
+++ /dev/null
-/Makefile.in
-/echo_test
-/recovery_small
-/replay_ost_single
-/replay_single
-/sanity
+++ /dev/null
-## Liblustre excecutables & libraries Makefile
-
-AM_CPPFLAGS = -I$(SYSIO)/include -I/opt/lam/include $(LLCPPFLAGS) -I$(top_srcdir)/lnet/ulnds
-AM_CFLAGS = $(LLCFLAGS)
-AM_LIBS = $(LIBEFENCE) $(LIBREADLINE)
-
-LLIB_EXEC = $(top_builddir)/lustre/utils/liblustreapi.a $(top_builddir)/lustre/liblustre/liblustre.a $(CAP_LIBS) $(PTHREAD_LIBS)
-
-if LIBLUSTRE
-noinst_LIBRARIES = libtestcommon.a
-
-if LIBLUSTRE_TESTS
-if MPITESTS
-SUBDIRS = mpi
-endif # MPITESTS
-
-noinst_PROGRAMS = sanity
-
-noinst_PROGRAMS += recovery_small replay_single replay_ost_single
-
-liblustre_testdir=$(libdir)/lustre/liblustre/tests
-liblustre_test_PROGRAMS = $(noinst_PROGRAMS)
-liblustre_test_LIBRARIES = $(noinst_LIBRARIES)
-
-endif # LIBLUSTRE_TESTS
-endif # LIBLUSTRE
-
-DIST_SUBDIRS = mpi
-
-libtestcommon_a_SOURCES = test_common.c test_common.h
-
-sanity_SOURCES = sanity.c
-sanity_CFLAGS = $(LL_CFLAGS)
-sanity_LDADD := libtestcommon.a $(LLIB_EXEC)
-sanity_DEPENDENCIES = $(top_builddir)/lustre/liblustre/liblustre.a libtestcommon.a
-
-recovery_small_SOURCES = recovery_small.c
-recovery_small_CFLAGS = $(LL_CFLAGS)
-recovery_small_LDADD := libtestcommon.a $(LLIB_EXEC)
-recovery_small_DEPENDENCIES = $(top_builddir)/lustre/liblustre/liblustre.a libtestcommon.a
-
-replay_single_SOURCES = replay_single.c
-replay_single_CFLAGS = $(LL_CFLAGS)
-replay_single_LDADD := libtestcommon.a $(LLIB_EXEC)
-replay_single_DEPENDENCIES = $(top_builddir)/lustre/liblustre/liblustre.a libtestcommon.a
-
-replay_ost_single_SOURCES = replay_ost_single.c
-replay_ost_single_CFLAGS = $(LL_CFLAGS)
-replay_ost_single_LDADD := libtestcommon.a $(LLIB_EXEC)
-replay_ost_single_DEPENDENCIES = $(top_builddir)/lustre/liblustre/liblustre.a libtestcommon.a
+++ /dev/null
-/*
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program 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
- * General Public License version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- *
- * lustre/liblustre/tests/echo_test.c
- *
- * Lustre Light user test program
- */
-
-#include <liblustre.h>
-#include <obd.h>
-#include <obd_class.h>
-
-#define LIBLUSTRE_TEST 1
-#include "../utils/lctl.c"
-
-#include "../lutil.h"
-
-extern int class_handle_ioctl(unsigned int cmd, unsigned long arg);
-
-static int liblustre_ioctl(int dev_id, unsigned int opc, void *ptr)
-{
- int rc = -EINVAL;
-
- switch (dev_id) {
- default:
- fprintf(stderr, "Unexpected device id %d\n", dev_id);
- abort();
- break;
-
- case OBD_DEV_ID:
- rc = class_handle_ioctl(opc, (unsigned long)ptr);
- break;
- }
-
- return rc;
-}
-
-static char *echo_server_nid = NULL;
-static char *echo_server_ostname = "obd1";
-static char *osc_dev_name = "OSC_DEV_NAME";
-static char *echo_dev_name = "ECHO_CLIENT_DEV_NAME";
-
-static int connect_echo_client(void)
-{
- struct lustre_cfg *lcfg;
- struct lustre_cfg_bufs bufs;
- lnet_nid_t nid;
- char *peer = "ECHO_PEER_NID";
- class_uuid_t osc_uuid, echo_uuid;
- struct obd_uuid osc_uuid_str, echo_uuid_str;
- int err;
- ENTRY;
-
- ll_generate_random_uuid(osc_uuid);
- class_uuid_unparse(osc_uuid, &osc_uuid_str);
- ll_generate_random_uuid(echo_uuid);
- class_uuid_unparse(echo_uuid, &echo_uuid_str);
-
- nid = libcfs_str2nid(echo_server_nid);
- if (nid == LNET_NID_ANY) {
- CERROR("Can't parse NID %s\n", echo_server_nid);
- RETURN(-EINVAL);
- }
-
- /* add uuid */
- lustre_cfg_bufs_reset(&bufs, NULL);
- lustre_cfg_bufs_set_string(&bufs, 1, peer);
- lcfg = lustre_cfg_new(LCFG_ADD_UUID, &bufs);
- lcfg->lcfg_nid = nid;
- err = class_process_config(lcfg);
- lustre_cfg_free(lcfg);
- if (err < 0) {
- CERROR("failed add_uuid\n");
- RETURN(-EINVAL);
- }
-
- /* attach osc */
- lustre_cfg_bufs_reset(&bufs, osc_dev_name);
- lustre_cfg_bufs_set_string(&bufs, 1, LUSTRE_OSC_NAME);
- lustre_cfg_bufs_set_string(&bufs, 2, osc_uuid_str.uuid);
- lcfg = lustre_cfg_new(LCFG_ATTACH, &bufs);
- err = class_process_config(lcfg);
- lustre_cfg_free(lcfg);
- if (err < 0) {
- CERROR("failed attach osc\n");
- RETURN(-EINVAL);
- }
-
- /* setup osc */
- lustre_cfg_bufs_reset(&bufs, osc_dev_name);
- lustre_cfg_bufs_set_string(&bufs, 1, echo_server_ostname);
- lustre_cfg_bufs_set_string(&bufs, 2, peer);
- lcfg = lustre_cfg_new(LCFG_SETUP, &bufs);
- err = class_process_config(lcfg);
- lustre_cfg_free(lcfg);
- if (err < 0) {
- CERROR("failed setup osc\n");
- RETURN(-EINVAL);
- }
-
- /* attach echo_client */
- lustre_cfg_bufs_reset(&bufs, echo_dev_name);
- lustre_cfg_bufs_set_string(&bufs, 1, "echo_client");
- lustre_cfg_bufs_set_string(&bufs, 2, echo_uuid_str.uuid);
- lcfg = lustre_cfg_new(LCFG_ATTACH, &bufs);
- err = class_process_config(lcfg);
- lustre_cfg_free(lcfg);
- if (err < 0) {
- CERROR("failed attach echo_client\n");
- RETURN(-EINVAL);
- }
-
- /* setup echo_client */
- lustre_cfg_bufs_reset(&bufs, echo_dev_name);
- lustre_cfg_bufs_set_string(&bufs, 1, osc_dev_name);
- lustre_cfg_bufs_set_string(&bufs, 2, NULL);
- lcfg = lustre_cfg_new(LCFG_SETUP, &bufs);
- err = class_process_config(lcfg);
- lustre_cfg_free(lcfg);
- if (err < 0) {
- CERROR("failed setup echo_client\n");
- RETURN(-EINVAL);
- }
-
- RETURN(0);
-}
-
-static int disconnect_echo_client(void)
-{
- struct lustre_cfg_bufs bufs;
- struct lustre_cfg *lcfg = NULL;
- int err;
- ENTRY;
-
- /* cleanup echo_client */
- lustre_cfg_bufs_reset(&bufs, echo_dev_name);
- lcfg = lustre_cfg_new(LCFG_CLEANUP, &bufs);
- err = class_process_config(lcfg);
- if (err < 0) {
- lustre_cfg_free(lcfg);
- CERROR("failed cleanup echo_client\n");
- RETURN(-EINVAL);
- }
-
- /* detach echo_client */
- lcfg->lcfg_command = LCFG_DETACH;
- err = class_process_config(lcfg);
- lustre_cfg_free(lcfg);
- if (err < 0) {
- CERROR("failed detach echo_client\n");
- RETURN(-EINVAL);
- }
-
- /* cleanup osc */
- lustre_cfg_bufs_reset(&bufs, osc_dev_name);
- lcfg = lustre_cfg_new(LCFG_CLEANUP, &bufs);
- err = class_process_config(lcfg);
- if (err < 0) {
- lustre_cfg_free(lcfg);
- CERROR("failed cleanup osc device\n");
- RETURN(-EINVAL);
- }
-
- /* detach osc */
- lcfg->lcfg_command = LCFG_DETACH;
- err = class_process_config(lcfg);
- lustre_cfg_free(lcfg);
- if (err < 0) {
- CERROR("failed detach osc device\n");
- RETURN(-EINVAL);
- }
-
- RETURN(0);
-}
-
-static void usage(const char *s)
-{
- printf("Usage: %s -s ost_host_name [-n ost_name] [-x lctl_options ...]\n", s);
- printf(" ost_host_name: the host name of echo server\n");
- printf(" ost_name: ost name, default is \"obd1\"\n");
- printf(" lctl_options: options to pass to lctl.\n");
- printf(" (e.g. -x --device 1 test_getattr 10000 -5)\n");
-}
-
-extern int time_ptlwait1;
-extern int time_ptlwait2;
-extern int time_ptlselect;
-
-int main(int argc, char **argv)
-{
- int c, rc;
- int xindex = -1; /* index of -x option */
-
- /* loop until all options are consumed or we hit
- * a -x option
- */
- while ((c = getopt(argc, argv, "s:n:x:")) != -1 &&
- xindex == -1) {
- switch (c) {
- case 's':
- echo_server_nid = optarg;
- break;
- case 'n':
- echo_server_ostname = optarg;
- break;
- case 'x':
- xindex = optind-1;
- break;
- default:
- usage(argv[0]);
- return 1;
- }
- }
-
- /*
- * Only warn with usage() if the -x option isn't specificed
- * because when using -x this check is not valid.
- */
- if (optind != argc && xindex == -1)
- usage(argv[0]);
-
- if (!echo_server_nid) {
- usage(argv[0]);
- return 1;
- }
-
- libcfs_debug = 0;
- libcfs_subsystem_debug = 0;
-
- liblustre_init_random();
-
- if (liblustre_init_current(argv[0]) ||
- init_obdclass() || init_lib_portals() ||
- ptlrpc_init() ||
- lmv_init() ||
- mdc_init() ||
- lov_init() ||
- osc_init() ||
- echo_client_init()) {
- printf("error\n");
- return 1;
- }
-
- rc = connect_echo_client();
- if (rc)
- return rc;
-
- set_ioc_handler(liblustre_ioctl);
-
-
- /*
- * If the -x option is not specified pass no args to lctl
- * otherwise pass all the options after the "-x" to lctl
- *
- * HACK: in the case when the -x option is specified
- * lctl sees argv[0] == "-x" and not the real argv[0] seen
- * in this function. If that is a problem, a mapping will
- * have to be done to fix that. However for normal functioning
- * it seems to be irrelavant
- */
- if( xindex == -1 )
- rc = lctl_main(1, &argv[0]);
- else
- rc = lctl_main(argc-xindex+1, &argv[xindex-1]);
-
- rc |= disconnect_echo_client();
-
- return rc;
-}
+++ /dev/null
-/Makefile.in
-/test_lock_cancel
+++ /dev/null
-## Liblustre MPI tests Makefile
-
-AM_CPPFLAGS = -I$(SYSIO)/include $(LLCPPFLAGS) -I$(top_srcdir)/lnet/ulnds
-AM_CFLAGS = $(LLCFLAGS)
-
-LLIB_EXEC = $(top_builddir)/lustre/utils/liblustreapi.a $(top_builddir)/lustre/liblustre/liblustre.a $(CAP_LIBS) $(PTHREAD_LIBS)
-
-CC = @MPICC_WRAPPER@
-
-if LIBLUSTRE
-if LIBLUSTRE_TESTS
-noinst_PROGRAMS = test_lock_cancel
-endif # LIBLUSTRE_TESTS
-endif # LIBLUSTRE
-
-test_lock_cancel_SOURCES = test_lock_cancel.c
-test_lock_cancel_LDADD := $(LLIB_EXEC)
+++ /dev/null
-/*
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program 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
- * General Public License version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- *
- * lustre/liblustre/tests/test_lock_cancel.c
- *
- * Lustre Light user test program
- */
-
-#define _BSD_SOURCE
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <getopt.h>
-#include <string.h>
-#include <time.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/queue.h>
-
-#include <sysio.h>
-#include <mount.h>
-
-#include <../test_common.h>
-
-#include <mpi.h>
-
-/******************************************************************************/
-/*
- * MPI_CHECK will display a custom error message as well as an error string
- * from the MPI_STATUS and then exit the program
- */
-
-#define MPI_CHECK(MPI_STATUS, MSG) do { \
- char resultString[MPI_MAX_ERROR_STRING]; \
- int resultLength; \
- \
- if (MPI_STATUS != MPI_SUCCESS) { \
- fprintf(stdout, "** error **\n"); \
- fprintf(stdout, "ERROR in %s (line %d): %s.\n", \
- __FILE__, __LINE__, MSG); \
- MPI_Error_string(MPI_STATUS, resultString, &resultLength); \
- fprintf(stdout, "MPI %s\n", resultString); \
- fprintf(stdout, "** exiting **\n"); \
- MPI_Abort(MPI_COMM_WORLD, 1); \
- } \
-} while(0)
-
-int numTasks = 0, /* MPI variables */
- rank = 0,
- tasksPerNode = 0; /* tasks per node */
-
-
-
-
-static char *test_file_name = "/mnt/lustre/test_lock_cancel";
-
-extern void __liblustre_setup_(void);
-extern void __liblustre_cleanup_(void);
-
-void usage(char *cmd)
-{
- printf("Usage: \t%s --target mdsnid:/mdsname/profile\n", cmd);
- printf(" \t%s --dumpfile dumpfile\n", cmd);
- exit(-1);
-}
-
-int main(int argc, char *argv[])
-{
- int opt_index, c;
- static struct option long_opts[] = {
- {"target", 1, 0, 0},
- {"dumpfile", 1, 0, 0},
- {0, 0, 0, 0}
- };
- int fd;
- long time1, time2;
- struct stat statbuf;
-
- if (argc < 3)
- usage(argv[0]);
-
- while ((c = getopt_long(argc, argv, "", long_opts, &opt_index)) != -1) {
- switch (c) {
- case 0: {
- if (!optarg[0])
- usage(argv[0]);
-
- if (!strcmp(long_opts[opt_index].name, "target")) {
- setenv(ENV_LUSTRE_MNTTGT, optarg, 1);
- } else if (!strcmp(long_opts[opt_index].name, "dumpfile")) {
- setenv(ENV_LUSTRE_DUMPFILE, optarg, 1);
- } else
- usage(argv[0]);
- break;
- }
- default:
- usage(argv[0]);
- }
- }
-
- if (optind != argc)
- usage(argv[0]);
-
- __liblustre_setup_();
-
- MPI_CHECK(MPI_Init(&argc, &argv), "MPI_Init()");
- MPI_CHECK(MPI_Comm_size(MPI_COMM_WORLD, &numTasks), "MPI_Comm_size");
- MPI_CHECK(MPI_Comm_rank(MPI_COMM_WORLD, &rank), "MPI_Comm_rank");
-
- if (numTasks < 2) {
- printf("this demo can't run on single node!\n");
- goto cleanup;
- }
-
- if (rank == 0) {
- unlink(test_file_name);
- }
-
- MPI_Barrier(MPI_COMM_WORLD);
- if (rank == 1) {
- printf("Node 1: creating file %s ...\n", test_file_name);
- fflush(stdout);
-
- fd = open(test_file_name, O_CREAT|O_RDWR, 0755);
- if (fd < 0) {
- printf("Node %d: creat file err: %d", rank, fd);
- fflush(stdout);
- goto cleanup;
- }
- close(fd);
- printf("Node 1: done creation. perform stat on file %s ...\n", test_file_name);
- fflush(stdout);
-
- if (stat(test_file_name, &statbuf)) {
- printf("Node %d: stat file err: %d", rank, fd);
- fflush(stdout);
- goto cleanup;
- }
-
- printf("Node %d: done stat on file\n", rank);
- fflush(stdout);
- } else {
- printf("Node %d: waiting node 1 create & stat file\n", rank);
- fflush(stdout);
- }
-
- MPI_Barrier(MPI_COMM_WORLD);
-
- if (rank == 1) {
- printf("Node 1: file has been create+stat, abort excution here!!!!!!!\n");
- fflush(stdout);
- exit(0);
- }
-
- sleep(1);
- printf("Node %d: synced with Node 1. sleep 5 seconds...\n", rank);
- fflush(stdout);
- sleep(5);
- printf("Node %d: wakeup from sleep. perform unlink()...\n", rank);
- fflush(stdout);
-
- time1 = time(NULL);
- if (unlink(test_file_name)) {
- printf("Node %d: error unlink file: %s\n", rank, test_file_name);
- fflush(stdout);
- goto cleanup;
- }
- time2 = time(NULL);
- printf("Node %d: successfully unlink file, cost %ld seconds.\n",
- rank, time2 - time1);
- fflush(stdout);
-
-cleanup:
- __liblustre_cleanup_();
- printf("Node %d: end sucessfully.\n", rank);
- return 0;
-}
+++ /dev/null
-/*
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program 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
- * General Public License version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- *
- * lustre/liblustre/tests/recovery_small.c
- *
- * Lustre Light user test program
- */
-
-#define _BSD_SOURCE
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <getopt.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/queue.h>
-#include <getopt.h>
-#include <sys/wait.h>
-
-#include <sysio.h>
-#include <mount.h>
-
-#include "test_common.h"
-
-#define MAX_STRING_SIZE 2048
-
-static struct {
- const char *name;
- unsigned long code;
-} drop_arr [] =
-{
- {"MDS_REQUEST", 0x123},
- {"MDS_REPLY", 0x122},
- {NULL, 0}
-};
-
-static int drop_index = 0;
-
-static char mds_server[1024] = {0, };
-static char ssh_cmd[MAX_STRING_SIZE] = {0,};
-
-int do_stat(const char *name, struct stat *buf)
-{
- struct stat stat;
- int rc;
-
- rc = lstat(name, &stat);
- if (rc) {
- printf("error %d stat %s\n", rc, name);
- exit(1);
- }
- if (buf)
- memcpy(buf, &stat, sizeof(*buf));
-
- return 0;
-}
-
-void prepare_reg(const char *path)
-{
- int fd, rc;
-
- fd = open(path, O_RDWR|O_CREAT, 00644);
- if (fd < 0) {
- printf("error %d create %s\n", fd, path);
- exit(1);
- }
-
- rc = close(fd);
- if (rc) {
- printf("error %d close %s\n", rc, path);
- exit(1);
- }
-}
-
-void cleanup_reg(const char *path)
-{
- int rc;
-
- rc = unlink(path);
- if (rc) {
- printf("error %d unlink %s\n", rc, path);
- exit(1);
- }
-}
-
-void prepare_dir(const char *path)
-{
- int rc;
-
- rc = mkdir(path, 00644);
- if (rc < 0) {
- printf("error %d mkdir %s\n", rc, path);
- exit(1);
- }
-}
-
-void cleanup_dir(const char *path)
-{
- int rc;
-
- rc = rmdir(path);
- if (rc) {
- printf("error %d unlink %s\n", rc, path);
- exit(1);
- }
-}
-
-#define FAIL() \
- do { \
- char cmd[MAX_STRING_SIZE]; \
- int rc; \
- \
- if (drop_arr[drop_index].name) { \
- printf("server drops next %s\n", drop_arr[drop_index].name); \
- sprintf(cmd, \
- "%s %s \"lctl set_param fail_loc=%lu\"", \
- ssh_cmd, mds_server, drop_arr[drop_index].code); \
- if ((rc = system(cmd)) != 0) { \
- rc = WEXITSTATUS(rc); \
- printf("error excuting remote command: %d\n", rc); \
- exit(rc); \
- } \
- } \
- } while (0)
-
-#define RECOVER() \
- do { \
- char cmd[1024]; \
- \
- if (drop_arr[drop_index].name) { \
- sprintf(cmd, "%s %s \"lctl set_param fail_loc=0\"", \
- ssh_cmd, mds_server); \
- if (!system(cmd)) {} \
- } \
- } while (0)
-
-#define ENTRY(str) \
- do { \
- char buf[100]; \
- int len; \
- sprintf(buf, "===== START: %s ", (str)); \
- len = strlen(buf); \
- if (len < 79) { \
- memset(buf+len, '=', 100-len); \
- buf[79] = '\n'; \
- buf[80] = 0; \
- } \
- printf("%s", buf); \
- } while (0)
-
-#define LEAVE() \
- do { \
- printf("----- END TEST successfully ---"); \
- printf("-----------------------------"); \
- printf("-------------------\n"); \
- } while (0)
-
-
-void t1()
-{
- char *path="/mnt/lustre/test_t1";
- ENTRY("create/delete");
-
- FAIL();
- t_touch(path);
- RECOVER();
- FAIL();
- t_unlink(path);
- RECOVER();
- LEAVE();
-}
-
-void t2()
-{
- char *path="/mnt/lustre/test_t2";
- ENTRY("mkdir/rmdir");
-
- FAIL();
- t_mkdir(path);
- RECOVER();
- FAIL();
- t_rmdir(path);
- RECOVER();
- LEAVE();
-}
-
-void t3()
-{
- char *path="/mnt/lustre/test_t3";
- ENTRY("regular stat");
-
- t_touch(path);
- FAIL();
- t_check_stat(path, NULL);
- RECOVER();
- t_unlink(path);
- LEAVE();
-}
-
-void t4()
-{
- char *path="/mnt/lustre/test_t4";
- ENTRY("dir stat");
-
- t_mkdir(path);
- FAIL();
- t_check_stat(path, NULL);
- RECOVER();
- t_rmdir(path);
- LEAVE();
-}
-
-void t5()
-{
- char *path="/mnt/lustre/test_t5";
- const int bufsize = 4096;
- char wbuf[bufsize], rbuf[bufsize];
- int npages = 100;
- int fd, rc, i;
- ENTRY("sequential page aligned file I/O");
-
- t_touch(path);
-
- fd = t_open(path);
-
- for (i = 0; i < npages; i++ ) {
- memset(wbuf, i, bufsize);
- rc = write(fd, wbuf, bufsize);
- if (rc != bufsize) {
- printf("write error %d (i = %d)\n", rc, i);
- exit(1);
- }
- }
- printf("succefully write %d pages\n", npages);
-
- lseek(fd, 0, SEEK_SET);
-
- for (i = 0; i < npages; i++ ) {
- memset(rbuf, 0, bufsize);
- rc = read(fd, rbuf, bufsize);
- if (rc != bufsize) {
- printf("read error %d (i = %d)\n", rc, i);
- exit(1);
- }
- }
- printf("succefully read & verified %d pages\n", npages);
-
- t_close(fd);
-
- t_unlink(path);
- LEAVE();
-}
-
-void t6()
-{
- char *path="/mnt/lustre/test_t6";
- char *path2="/mnt/lustre/test_t6_link";
- ENTRY("symlink");
-
- t_touch(path);
- FAIL();
- t_symlink(path, path2);
- RECOVER();
- t_check_stat(path2, NULL);
- t_unlink(path2);
- t_unlink(path);
- LEAVE();
-}
-
-void t7()
-{
- char *path="/mnt/lustre/test_t7";
- ENTRY("mknod");
-
- FAIL();
- t_mknod(path, S_IFCHR | 0644, 5, 4);
- RECOVER();
- t_check_stat(path, NULL);
- t_unlink(path);
- LEAVE();
-}
-
-extern int libcfs_debug;
-extern int libcfs_subsystem_debug;
-
-extern void __liblustre_setup_(void);
-extern void __liblustre_cleanup_(void);
-
-void usage(const char *cmd)
-{
- printf("Usage: \t%s -s mds_hostname --target mdsnid:/mdsname/profile\n", cmd);
- printf(" \t%s -s mds_hostname --dumpfile dumpfile\n", cmd);
- exit(-1);
-}
-
-int main(int argc, char * argv[])
-{
- int opt_index, c;
- char cmd[1024];
- static struct option long_opts[] = {
- {"target", 1, 0, 0},
- {"dumpfile", 1, 0, 0},
- {"ssh", 1, 0, 0},
- {0, 0, 0, 0}
- };
-
- if (argc < 3 - (getenv(ENV_LUSTRE_MNTTGT)||getenv(ENV_LUSTRE_DUMPFILE)))
- usage(argv[0]);
-
- while ((c = getopt_long(argc, argv, "s:", long_opts, &opt_index)) != -1) {
- switch (c) {
- case 0: {
- if (!optarg[0])
- usage(argv[0]);
-
- if (!strcmp(long_opts[opt_index].name, "target")) {
- setenv(ENV_LUSTRE_MNTTGT, optarg, 1);
- } else if (!strcmp(long_opts[opt_index].name, "dumpfile")) {
- setenv(ENV_LUSTRE_DUMPFILE, optarg, 1);
- } else if (!strcmp(long_opts[opt_index].name, "ssh")) {
- safe_strncpy(ssh_cmd, optarg, MAX_STRING_SIZE);
- } else
- usage(argv[0]);
- break;
- }
- case 's':
- safe_strncpy(mds_server, optarg, MAX_STRING_SIZE);
- break;
- default:
- usage(argv[0]);
- }
- }
-
- if (optind != argc)
- usage(argv[0]);
-
- if (strlen(mds_server) == 0)
- usage(argv[0]);
-
- /* default to using ssh */
- if (!strlen(ssh_cmd)) {
- safe_strncpy(ssh_cmd, "ssh", MAX_STRING_SIZE);
- }
-
- sprintf(cmd, "%s %s cat /dev/null", ssh_cmd, mds_server);
- if (system(cmd)) {
- printf("Can't access server node: %s using method: %s\n", mds_server, ssh_cmd);
- exit(-1);
- }
-
- setenv(ENV_LUSTRE_TIMEOUT, "5", 1);
-
- __liblustre_setup_();
-
- while (drop_arr[drop_index].name) {
- t1();
- t2();
- t3();
- t4();
-#if 0
- t5();
-#endif
- t6();
- t7();
-
- drop_index++;
- }
-
- printf("liblustre is about shutdown\n");
- __liblustre_cleanup_();
-
- printf("complete successfully\n");
- return (0);
-}
+++ /dev/null
-/*
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program 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
- * General Public License version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- *
- * lustre/liblustre/tests/replay_ost_single.c
- *
- * Lustre Light user test program
- */
-
-#define _BSD_SOURCE
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <getopt.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/queue.h>
-#include <signal.h>
-
-#include <sysio.h>
-#include <mount.h>
-
-#include "test_common.h"
-
-
-
-static char mds_server[1024] = {0,};
-static char barrier_script[1024] = {0,};
-static char failover_script[1024] = {0,};
-static char barrier_cmd[1024] = {0,};
-static char failover_cmd[1024] = {0,};
-
-static void replay_barrier()
-{
- int rc;
-
- if ((rc = system(barrier_cmd))) {
- printf("excute barrier error: %d\n", rc);
- exit(rc);
- }
-}
-
-static void mds_failover()
-{
- int rc;
-
- if ((rc = system(failover_cmd))) {
- printf("excute failover error: %d\n", rc);
- exit(rc);
- }
-}
-
-
-#define ENTRY(str) \
- do { \
- char buf[100]; \
- int len; \
- sprintf(buf, "===== START: %s ", (str)); \
- len = strlen(buf); \
- if (len < 79) { \
- memset(buf+len, '=', 100-len); \
- buf[79] = '\n'; \
- buf[80] = 0; \
- } \
- printf("%s", buf); \
- } while (0)
-
-#define LEAVE() \
- do { \
- printf("----- END TEST successfully ---"); \
- printf("-----------------------------"); \
- printf("-------------------\n"); \
- } while (0)
-
-void t0()
-{
- const int bufsize = 4096;
- char *path = "/mnt/lustre/rp_ost_t0_file";
- char buf[bufsize];
- int fd, i, j, rc;
- ENTRY("open-failover-write-verification (no ping involved)");
-
- printf("create/open file...\n");
- t_touch(path);
- fd = t_open(path);
- printf("OST failover...\n");
- replay_barrier();
- mds_failover();
-
- printf("write file...\n");
- for (i = 0; i < 20; i++) {
- memset(buf, i, bufsize);
- if ((rc = write(fd, buf, bufsize)) != bufsize) {
- perror("write error after failover");
- printf("i = %d, rc = %d\n", i, rc);
- exit(-1);
- }
- }
-
- /* verify */
- printf("read & verify...\n");
- lseek(fd, 0, SEEK_SET);
- for (i = 0; i < 20; i++) {
- memset(buf, -1, bufsize);
- if ((rc = read(fd, buf, bufsize)) != bufsize) {
- perror("read error rc");
- printf("i = %d, rc = %d\n", i, rc);
- exit(-1);
- }
- for (j = 0; j < bufsize; j++) {
- if (buf[j] != i) {
- printf("verify error!\n");
- exit(-1);
- }
- }
- }
- t_close(fd);
- t_unlink(path);
- LEAVE();
-}
-
-void t1()
-{
- const int bufsize = 4096;
- char *path = "/mnt/lustre/rp_ost_t1_file";
- char buf[bufsize];
- int fd, i, j;
- ENTRY("open-write-close-open-failover-read (no ping involved)");
-
- printf("create/open file...\n");
- t_touch(path);
- fd = t_open(path);
- printf("write file...\n");
- for (i = 0; i < 20; i++) {
- memset(buf, i, bufsize);
- if (write(fd, buf, bufsize) != bufsize) {
- perror("write error");
- exit(-1);
- }
- }
- printf("close/reopen...\n");
- t_close(fd);
- fd = t_open(path);
- lseek(fd, 0, SEEK_SET);
-
- printf("OST failover...\n");
- replay_barrier();
- mds_failover();
-
- printf("read & verify...\n");
- for (i = 0; i < 20; i++) {
- memset(buf, -1, bufsize);
- if (read(fd, buf, bufsize) != bufsize) {
- perror("read error after failover");
- exit(-1);
- }
- for (j = 0; j < bufsize; j++) {
- if (buf[j] != i) {
- printf("verify error after failover\n");
- exit(-1);
- }
- }
- }
-
- t_close(fd);
- t_unlink(path);
- LEAVE();
-}
-
-void t2()
-{
- char *path = "/mnt/lustre/rp_ost_t2_file";
- char *str = "xxxxjoiwlsdf98lsjdfsjfoajflsjfajfoaidfojaj08eorje;";
- ENTRY("empty replay");
-
- replay_barrier();
- mds_failover();
-
- t_echo_create(path, str);
- t_grep(path, str);
- t_unlink(path);
-}
-
-void t3()
-{
- char *path = "/mnt/lustre/rp_ost_t3_file";
- char *str = "xxxxjoiwlsdf98lsjdfsjfoajflsjfajfoaidfojaj08eorje;";
- ENTRY("touch");
-
- printf("touch to create a file\n");
- t_echo_create(path, str);
- replay_barrier();
- mds_failover();
-
- printf("read & verify\n");
- t_grep(path, str);
- t_unlink(path);
- /* XXX have problem without this, seems server side problem XXX */
- sleep(5);
-}
-
-void t4()
-{
- char *path = "/mnt/lustre/rp_ost_t4_file";
- char namebuf[1024];
- char str[1024];
- int count = 10, i;
- ENTRY("|X| 10 open(CREAT)s (ping involved)");
-
- printf("create %d files\n", count);
- for (i = 0; i < count; i++) {
- sprintf(namebuf, "%s%02d", path, i);
- sprintf(str, "%s-%08d-%08x-AAAAA", "content", i, i);
- t_echo_create(namebuf, str);
- }
- replay_barrier();
- mds_failover();
-
- printf("read & verify\n");
- for (i = 0; i < count; i++) {
- sprintf(namebuf, "%s%02d", path, i);
- sprintf(str, "%s-%08d-%08x-AAAAA", "content", i, i);
- t_grep(namebuf, str);
- t_unlink(namebuf);
- }
-}
-
-extern int libcfs_debug;
-extern int libcfs_subsystem_debug;
-
-extern void __liblustre_setup_(void);
-extern void __liblustre_cleanup_(void);
-
-void usage(const char *cmd)
-{
- printf("Usage: \t%s --target mdsnid:/mdsname/profile -s ost_hostname "
- "-b \"barrier cmd\" -f \"failover cmd\"\n", cmd);
- printf(" \t%s --dumpfile dumpfile -s ost_hostname -b \"barrier cmd\" "
- "-f \"failover cmd\"\n", cmd);
- exit(-1);
-}
-
-void test_ssh()
-{
- char cmd[1024];
-
- sprintf(cmd, "ssh %s cat /dev/null", mds_server);
- if (system(cmd)) {
- printf("ssh can't access server node: %s\n", mds_server);
- exit(-1);
- }
-}
-
-int main(int argc, char * const argv[])
-{
- int opt_index, c;
- static struct option long_opts[] = {
- {"target", 1, 0, 0},
- {"dumpfile", 1, 0, 0},
- {0, 0, 0, 0}
- };
-
- if (argc < 4)
- usage(argv[0]);
-
- while ((c = getopt_long(argc, argv, "s:b:f:", long_opts, &opt_index)) != -1) {
- switch (c) {
- case 0: {
- if (!optarg[0])
- usage(argv[0]);
-
- if (!strcmp(long_opts[opt_index].name, "target")) {
- setenv(ENV_LUSTRE_MNTTGT, optarg, 1);
- } else if (!strcmp(long_opts[opt_index].name, "dumpfile")) {
- setenv(ENV_LUSTRE_DUMPFILE, optarg, 1);
- } else
- usage(argv[0]);
- break;
- }
- case 's':
- strcpy(mds_server, optarg);
- break;
- case 'b':
- strcpy(barrier_script, optarg);
- break;
- case 'f':
- strcpy(failover_script, optarg);
- break;
- default:
- usage(argv[0]);
- }
- }
-
- if (optind != argc)
- usage(argv[0]);
- if (!strlen(mds_server) || !strlen(barrier_script) ||
- !strlen(failover_script))
- usage(argv[0]);
-
- test_ssh();
-
- /* prepare remote command */
- sprintf(barrier_cmd, "ssh %s \"%s\"", mds_server, barrier_script);
- sprintf(failover_cmd, "ssh %s \"%s\"", mds_server, failover_script);
-
- setenv(ENV_LUSTRE_TIMEOUT, "5", 1);
-
- __liblustre_setup_();
-
- t0();
- t1();
- t2();
- t3();
- t4();
-
- printf("liblustre is about shutdown\n");
- __liblustre_cleanup_();
-
- printf("complete successfully\n");
- return 0;
-}
+++ /dev/null
-/*
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program 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
- * General Public License version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- *
- * lustre/liblustre/tests/replay_single.c
- *
- * Lustre Light user test program
- */
-
-#define _BSD_SOURCE
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <getopt.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/queue.h>
-#include <signal.h>
-
-#include <sysio.h>
-#include <mount.h>
-
-#include "test_common.h"
-
-#define MAX_STRING_SIZE 2048
-
-static char mds_server[MAX_STRING_SIZE] = {0,};
-static char barrier_script[MAX_STRING_SIZE] = {0,};
-static char failover_script[MAX_STRING_SIZE] = {0,};
-static char barrier_cmd[MAX_STRING_SIZE] = {0,};
-static char failover_cmd[MAX_STRING_SIZE] = {0,};
-static char ssh_cmd[MAX_STRING_SIZE] = {0,};
-
-static void replay_barrier()
-{
- int rc;
-
- if ((rc = system(barrier_cmd))) {
- printf("excute barrier error: %d\n", rc);
- exit(rc);
- }
-}
-
-static void mds_failover()
-{
- int rc;
-
- if ((rc = system(failover_cmd))) {
- printf("excute failover error: %d\n", rc);
- exit(rc);
- }
-}
-
-
-#define ENTRY(str) \
- do { \
- char buf[100]; \
- int len; \
- sprintf(buf, "===== START: %s ", (str)); \
- len = strlen(buf); \
- if (len < 79) { \
- memset(buf+len, '=', 100-len); \
- buf[79] = '\n'; \
- buf[80] = 0; \
- } \
- printf("%s", buf); \
- } while (0)
-
-#define LEAVE() \
- do { \
- printf("----- END TEST successfully ---"); \
- printf("-----------------------------"); \
- printf("-------------------\n"); \
- } while (0)
-
-void t0()
-{
- char *path="/mnt/lustre/f0";
- ENTRY("empty replay");
-
- replay_barrier();
- mds_failover();
- t_check_stat_fail(path);
- LEAVE();
-}
-
-void t1()
-{
- char *path="/mnt/lustre/f1";
- ENTRY("simple create");
-
- replay_barrier();
- t_create(path);
- mds_failover();
- t_check_stat(path, NULL);
- t_unlink(path);
- LEAVE();
-}
-
-void t2a()
-{
- char *path="/mnt/lustre/f2a";
- ENTRY("touch");
-
- replay_barrier();
- t_touch(path);
- mds_failover();
- t_check_stat(path, NULL);
- t_unlink(path);
- LEAVE();
-}
-
-void t2b()
-{
- char *path="/mnt/lustre/f2b";
- ENTRY("mcreate+touch");
-
- t_create(path);
- replay_barrier();
- t_touch(path);
- mds_failover();
- t_check_stat(path, NULL);
- t_unlink(path);
- LEAVE();
-}
-
-
-void n_create_delete(int nfiles)
-{
- char *base="/mnt/lustre/f3_";
- char path[100];
- char str[100];
- int i;
-
- replay_barrier();
- for (i = 0; i < nfiles; i++) {
- sprintf(path, "%s%d\n", base, i);
- sprintf(str, "TEST#%d CONTENT\n", i);
- t_echo_create(path, str);
- }
- mds_failover();
- for (i = 0; i < nfiles; i++) {
- sprintf(path, "%s%d\n", base, i);
- sprintf(str, "TEST#%d CONTENT\n", i);
- t_grep(path, str);
- }
- replay_barrier();
- for (i = 0; i < nfiles; i++) {
- sprintf(path, "%s%d\n", base, i);
- t_unlink(path);
- }
- mds_failover();
- for (i = 0; i < nfiles; i++) {
- sprintf(path, "%s%d\n", base, i);
- t_check_stat_fail(path);
- }
- LEAVE();
-}
-
-void t3a()
-{
- ENTRY("10 create/delete");
- n_create_delete(10);
- LEAVE();
-}
-
-void t3b()
-{
- ENTRY("30 create/delete(>1'st block precreated)");
- n_create_delete(30);
- LEAVE();
-}
-
-void t4()
-{
- char *dir="/mnt/lustre/d4";
- char *path="/mnt/lustre/d4/f1";
- ENTRY("mkdir + contained create");
-
- replay_barrier();
- t_mkdir(dir);
- t_create(path);
- mds_failover();
- t_check_stat(dir, NULL);
- t_check_stat(path, NULL);
- sleep(2); /* wait for log process thread */
-
- replay_barrier();
- t_unlink(path);
- t_rmdir(dir);
- mds_failover();
- t_check_stat_fail(dir);
- t_check_stat_fail(path);
- LEAVE();
-}
-
-void t5()
-{
- char *dir="/mnt/lustre/d5";
- char *path="/mnt/lustre/d5/f1";
- ENTRY("mkdir |X| contained create");
-
- t_mkdir(dir);
- replay_barrier();
- t_create(path);
- mds_failover();
- t_check_stat(dir, NULL);
- t_check_stat(path, NULL);
- t_unlink(path);
- t_rmdir(dir);
- LEAVE();
-}
-
-void t6()
-{
- char *path="/mnt/lustre/f6";
- int fd;
- ENTRY("open |X| close");
-
- replay_barrier();
- t_create(path);
- fd = t_open(path);
- sleep(1);
- mds_failover();
- t_check_stat(path, NULL);
- t_close(fd);
- t_unlink(path);
- LEAVE();
-}
-
-void t7()
-{
- char *path="/mnt/lustre/f7";
- char *path2="/mnt/lustre/f7-2";
- ENTRY("create |X| rename unlink");
-
- t_create(path);
- replay_barrier();
- t_rename(path, path2);
- mds_failover();
- t_check_stat_fail(path);
- t_check_stat(path2, NULL);
- t_unlink(path2);
-}
-
-void t8()
-{
- char *path="/mnt/lustre/f8";
- char *path2="/mnt/lustre/f8-2";
- ENTRY("create open write rename |X| create-old-name read");
-
- t_create(path);
- t_echo_create(path, "old");
- t_rename(path, path2);
- replay_barrier();
- t_echo_create(path, "new");
- mds_failover();
- t_grep(path, "new");
- t_grep(path2, "old");
- t_unlink(path);
- t_unlink(path2);
-}
-
-void t9()
-{
- char *path="/mnt/lustre/f9";
- char *path2="/mnt/lustre/f9-2";
- ENTRY("|X| open(O_CREAT), unlink, touch new, unlink new");
-
- replay_barrier();
- t_create(path);
- t_unlink(path);
- t_create(path2);
- mds_failover();
- t_check_stat_fail(path);
- t_check_stat(path2, NULL);
- t_unlink(path2);
-}
-
-void t10()
-{
- char *path="/mnt/lustre/f10";
- char *path2="/mnt/lustre/f10-2";
- ENTRY("|X| mcreate, open write, rename");
-
- replay_barrier();
- t_create(path);
- t_echo_create(path, "old");
- t_rename(path, path2);
- t_grep(path2, "old");
- mds_failover();
- t_grep(path2, "old");
- t_unlink(path2);
-}
-
-extern int libcfs_debug;
-extern int libcfs_subsystem_debug;
-
-extern void __liblustre_setup_(void);
-extern void __liblustre_cleanup_(void);
-
-void usage(const char *cmd)
-{
- printf("Usage: \t%s --target mdsnid:/mdsname/profile -s mds_hostname "
- "-b \"barrier cmd\" -f \"failover cmd\" [--rsh \"rsh_cmd\"]\n", cmd);
- printf(" \t%s --dumpfile dumpfile -s mds_hostname -b \"barrier cmd\" "
- "-f \"failover cmd\" [--rsh \"rsh_cmd\"]\n", cmd);
- exit(-1);
-}
-
-void test_ssh()
-{
- char cmd[MAX_STRING_SIZE];
-
- sprintf(cmd, "%s %s cat /dev/null", ssh_cmd, mds_server);
- if (system(cmd)) {
- printf("Can't access server node: %s using method: %s\n", mds_server, ssh_cmd);
- exit(-1);
- }
-}
-
-int main(int argc, char * const argv[])
-{
- int opt_index, c;
- static struct option long_opts[] = {
- {"target", 1, 0, 0},
- {"dumpfile", 1, 0, 0},
- {"ssh", 1, 0, 0},
- {0, 0, 0, 0}
- };
-
- if (argc < 4 - (getenv(ENV_LUSTRE_MNTTGT)||getenv(ENV_LUSTRE_DUMPFILE)))
- usage(argv[0]);
-
- while ((c = getopt_long(argc, argv, "s:b:f:", long_opts, &opt_index)) != -1) {
- switch (c) {
- case 0: {
- if (!optarg[0])
- usage(argv[0]);
-
- if (!strcmp(long_opts[opt_index].name, "target")) {
- setenv(ENV_LUSTRE_MNTTGT, optarg, 1);
- } else if (!strcmp(long_opts[opt_index].name, "dumpfile")) {
- setenv(ENV_LUSTRE_DUMPFILE, optarg, 1);
- } else if (!strcmp(long_opts[opt_index].name, "ssh")) {
- safe_strncpy(ssh_cmd, optarg, MAX_STRING_SIZE);
- } else
- usage(argv[0]);
- break;
- }
- case 's':
- safe_strncpy(mds_server, optarg, MAX_STRING_SIZE);
- break;
- case 'b':
- safe_strncpy(barrier_script, optarg, MAX_STRING_SIZE);
- break;
- case 'f':
- safe_strncpy(failover_script, optarg, MAX_STRING_SIZE);
- break;
- default:
- usage(argv[0]);
- }
- }
-
- if (optind != argc)
- usage(argv[0]);
- if (!strlen(mds_server) || !strlen(barrier_script) ||
- !strlen(failover_script))
- usage(argv[0]);
-
- /* default to using ssh */
- if (!strlen(ssh_cmd)) {
- safe_strncpy(ssh_cmd, "ssh", MAX_STRING_SIZE);
- }
-
- test_ssh();
-
- /* prepare remote command */
- sprintf(barrier_cmd, "%s %s \"%s\"",
- ssh_cmd, mds_server, barrier_script);
- sprintf(failover_cmd, "%s %s \"%s\"",
- ssh_cmd, mds_server, failover_script);
-
- setenv(ENV_LUSTRE_TIMEOUT, "10", 1);
-
- __liblustre_setup_();
-
- t0();
- t1();
- t2a();
- t2b();
- t3a();
- t3b();
- t4();
- t5();
- t6();
- t7();
- t8();
- t9();
- t10();
-
- printf("liblustre is about shutdown\n");
- __liblustre_cleanup_();
-
- printf("complete successfully\n");
- return 0;
-}
+++ /dev/null
-/*
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program 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
- * General Public License version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- *
- * Copyright (c) 2013, Intel Corporation.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- *
- * lustre/liblustre/tests/sanity.c
- *
- * Lustre Light user test program
- */
-
-#define _BSD_SOURCE
-#define _FILE_OFFSET_BITS 64
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <getopt.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <errno.h>
-#include <dirent.h>
-#include <sys/uio.h>
-#include <sys/time.h>
-#include <time.h>
-
-#include <liblustre.h>
-#include "test_common.h"
-#include <lustre/lustreapi.h>
-
-#define _npages (2048)
-
-void *buf_alloc;
-int buf_size;
-int opt_verbose;
-struct timeval start;
-
-extern char *lustre_path;
-
-#define ENTER(str) \
- do { \
- char buf[100]; \
- int len; \
- gettimeofday(&start, NULL); \
- sprintf(buf, "===== START %s: %s %ld", __FUNCTION__, \
- (str), (long)start.tv_sec); \
- len = strlen(buf); \
- if (len < 79) { \
- memset(buf+len, '=', 100-len); \
- buf[79] = '\n'; \
- buf[80] = 0; \
- } \
- printf("%s", buf); \
- } while (0)
-
-#define LEAVE() \
- do { \
- struct timeval stop; \
- char buf[100] = { '\0' }; \
- int len = sizeof(buf) - 1; \
- long usec; \
- gettimeofday(&stop, NULL); \
- usec = (stop.tv_sec - start.tv_sec) * 1000000 + \
- (stop.tv_usec - start.tv_usec); \
- len = snprintf(buf, len, \
- "===== END TEST %s: successfully (%gs)", \
- __FUNCTION__, (double)usec / 1000000); \
- if (len < 79) { \
- memset(buf+len, '=', sizeof(buf) - len); \
- buf[79] = '\n'; \
- buf[80] = 0; \
- } \
- printf("%s", buf); \
- return 0; \
- } while (0)
-
-#define MAX_PATH_LENGTH 4096
-
-int t1(char *name)
-{
- char path[MAX_PATH_LENGTH] = "";
-
- ENTER("touch+unlink");
- snprintf(path, MAX_PATH_LENGTH, "%s/test_t1", lustre_path);
-
- if (opt_verbose)
- printf("touch+unlink %s\n", path);
-
- t_touch(path);
- t_unlink(path);
- LEAVE();
-}
-
-int t2(char *name)
-{
- char path[MAX_PATH_LENGTH] = "";
-
- ENTER("mkdir/rmdir");
- snprintf(path, MAX_PATH_LENGTH, "%s/test_t2", lustre_path);
-
- t_mkdir(path);
- t_rmdir(path);
- LEAVE();
-}
-
-int t3(char *name)
-{
- char path[MAX_PATH_LENGTH] = "";
-
- ENTER("regular stat");
- snprintf(path, MAX_PATH_LENGTH, "%s/test_t3", lustre_path);
-
- t_touch(path);
- t_check_stat(path, NULL);
- t_unlink(path);
- LEAVE();
-}
-
-int t4(char *name)
-{
- char path[MAX_PATH_LENGTH] = "";
-
- ENTER("dir stat");
- snprintf(path, MAX_PATH_LENGTH, "%s/test_t4", lustre_path);
-
- t_mkdir(path);
- t_check_stat(path, NULL);
- t_rmdir(path);
- LEAVE();
-}
-
-int t6(char *name)
-{
- char path[MAX_PATH_LENGTH] = "";
- char path2[MAX_PATH_LENGTH] = "";
-
- ENTER("symlink");
- snprintf(path, MAX_PATH_LENGTH, "%s/test_t6", lustre_path);
- snprintf(path2, MAX_PATH_LENGTH, "%s/test_t6_link", lustre_path);
-
- t_touch(path);
- t_symlink(path, path2);
- t_check_stat(path2, NULL);
- t_unlink(path2);
- t_unlink(path);
- LEAVE();
-}
-
-int t6b(char *name)
-{
- char path[MAX_PATH_LENGTH] = "";
- char path2[MAX_PATH_LENGTH] = "";
- char cwd[MAX_PATH_LENGTH] = "";
- char *tmp;
- int fd;
-
- ENTER("symlink + chdir and open");
- snprintf(path, MAX_PATH_LENGTH, "%s/test_t6b", lustre_path);
- snprintf(path2, MAX_PATH_LENGTH, "%s/test_t6b_link", lustre_path);
-
- t_mkdir(path);
- t_symlink(path, path2);
- t_check_stat(path2, NULL);
-
- tmp = getcwd(cwd, MAX_PATH_LENGTH);
- if (tmp == NULL) {
- fprintf(stderr, "current path too long to fit in "
- "MAX_PATH_LENGTH?\n");
- LEAVE();
- }
- t_chdir(path2);
- t_chdir(cwd);
- t_rmdir(path);
- t_touch(path);
-
- fd = t_open(path2);
- t_close(fd);
-
- t_unlink(path2);
- t_unlink(path);
- LEAVE();
-}
-
-int t7(char *name)
-{
- char path[MAX_PATH_LENGTH] = "";
- int rc;
-
- ENTER("mknod");
- snprintf(path, MAX_PATH_LENGTH, "%s/test_t7", lustre_path);
-
- if (geteuid() != 0) {
- rc = mknod(path, S_IFCHR | 0644, (5<<8 | 4));
- if (rc != -1 || errno != EPERM) {
- printf("mknod shouldn't success: rc %d, errno %d\n",
- rc, errno);
- }
- } else {
- t_mknod(path, S_IFCHR | 0644, 5, 4);
- t_check_stat(path, NULL);
- t_unlink(path);
- }
- LEAVE();
-}
-
-int t8(char *name)
-{
- char path[MAX_PATH_LENGTH] = "";
-
- ENTER("chmod");
- snprintf(path, MAX_PATH_LENGTH, "%s/test_t8", lustre_path);
-
- /* Check file. */
- t_touch(path);
- t_chmod_raw(path, 0700);
- t_check_stat(path, NULL);
- t_unlink(path);
-
- /* Check dir. */
- t_mkdir(path);
- t_chmod_raw(path, 0700);
- t_check_stat(path, NULL);
- t_rmdir(path);
-
- LEAVE();
-}
-
-int t9(char *name)
-{
- char path[MAX_PATH_LENGTH] = "";
- char path2[MAX_PATH_LENGTH] = "";
-
- ENTER("hard link");
- snprintf(path, MAX_PATH_LENGTH, "%s/test_t9", lustre_path);
- snprintf(path2, MAX_PATH_LENGTH, "%s/test_t9_link", lustre_path);
-
- t_touch(path);
- t_link(path, path2);
- t_check_stat(path, NULL);
- t_check_stat(path2, NULL);
- t_unlink(path);
- t_unlink(path2);
- LEAVE();
-}
-
-int t10(char *name)
-{
- char dir1[MAX_PATH_LENGTH] = "";
- char dir2[MAX_PATH_LENGTH] = "";
- char path1[MAX_PATH_LENGTH] = "";
- char path2[MAX_PATH_LENGTH] = "";
- char rename1[MAX_PATH_LENGTH] = "";
- char rename2[MAX_PATH_LENGTH] = "";
- char rename3[MAX_PATH_LENGTH] = "";
-
- ENTER("rename");
- snprintf(dir1, MAX_PATH_LENGTH, "%s/test_t10_dir1", lustre_path);
- snprintf(dir2, MAX_PATH_LENGTH, "%s/test_t10_dir2", lustre_path);
- snprintf(path1, MAX_PATH_LENGTH, "%s/test_t10_reg1", lustre_path);
- snprintf(path2, MAX_PATH_LENGTH, "%s/test_t10_reg2", lustre_path);
- snprintf(rename1, MAX_PATH_LENGTH, "%s/test_t10_dir1/rename1", lustre_path);
- snprintf(rename2, MAX_PATH_LENGTH, "%s/test_t10_dir2/rename2", lustre_path);
- snprintf(rename3, MAX_PATH_LENGTH, "%s/test_t10_dir2/rename3", lustre_path);
-
- t_mkdir(dir1);
- t_mkdir(dir2);
- t_touch(path1);
- t_touch(path2);
- t_rename(path1, rename1);
- t_rename(path2, rename2);
- t_rename(rename1, rename2);
- t_rename(dir1, rename3);
- t_unlink(rename2);
- t_rmdir(rename3);
- t_rmdir(dir2);
- LEAVE();
-}
-
-int t11(char *name)
-{
- char *base=lustre_path;
- char path[MAX_PATH_LENGTH], path2[MAX_PATH_LENGTH];
- int i, j, level = 5, nreg = 5;
- ENTER("deep tree");
-
- safe_strncpy(path, base, MAX_PATH_LENGTH);
-
- for (i = 0; i < level; i++) {
- for (j = 0; j < nreg; j++) {
- sprintf(path2, "%s/file%d", path, j);
- t_touch(path2);
- }
-
- strcat(path, "/dir");
- t_mkdir(path);
- }
-
- for (i = level; i > 0; i--) {
- safe_strncpy(path, base, MAX_PATH_LENGTH);
- for (j = 1; j < i; j++)
- strcat(path, "/dir");
-
- for (j = 0; j < nreg; j++) {
- sprintf(path2, "%s/file%d", path, j);
- t_unlink(path2);
- }
-
- strcat(path, "/dir");
- t_rmdir(path);
- }
-
- LEAVE();
-}
-
-int t12(char *name)
-{
- char dir[MAX_PATH_LENGTH] = "";
- char buf[1024*128];
- int fd;
- ENTER("empty directory readdir");
- snprintf(dir, MAX_PATH_LENGTH, "%s/test_t12_dir", lustre_path);
-
- t_mkdir(dir);
- fd = t_opendir(dir);
- t_ls(fd, buf, sizeof(buf));
- t_close(fd);
- t_rmdir(dir);
- LEAVE();
-}
-
-int t13(char *name)
-{
- char dir[MAX_PATH_LENGTH] = "";
- char path[1024];
- char buf[1024];
- const int nfiles = 20;
- char *prefix = "test13_filename_prefix_";
- int fd, i;
- ENTER("multiple entries directory readdir");
- snprintf(dir, MAX_PATH_LENGTH, "%s/test_t13_dir/", lustre_path);
-
- t_mkdir(dir);
- printf("Creating %d files...\n", nfiles);
- for (i = 0; i < nfiles; i++) {
- sprintf(path, "%s%s%05d", dir, prefix, i);
- t_touch(path);
- }
- fd = t_opendir(dir);
- t_ls(fd, buf, sizeof(buf));
- t_close(fd);
- printf("Cleanup...\n");
- for (i = 0; i < nfiles; i++) {
- sprintf(path, "%s%s%05d", dir, prefix, i);
- t_unlink(path);
- }
- t_rmdir(dir);
- LEAVE();
-}
-
-int t14(char *name)
-{
- char dir[MAX_PATH_LENGTH] = "";
- char path[1024];
- char buf[1024];
- const int nfiles = 256;
- char *prefix = "test14_filename_long_prefix_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA___";
- struct dirent64 *ent;
- int fd, i, rc, pos, index;
- loff_t base = 0;
- ENTER(">1 block(4k) directory readdir");
- snprintf(dir, MAX_PATH_LENGTH, "%s/test_t14_dir/", lustre_path);
-
- rc = mkdir(dir, 0755);
- if (rc < 0 && errno != EEXIST) {
- printf("mkdir(%s) error: %s\n", dir, strerror(errno));
- exit(1);
- }
- printf("Creating %d files...\n", nfiles);
- for (i = 0; i < nfiles; i++) {
- sprintf(path, "%s%s%05d", dir, prefix, i);
- t_touch(path);
- }
- fd = t_opendir(dir);
- printf("Listing...\n");
- index = 0;
- while ((rc = getdirentries64(fd, buf, 1024, &base)) > 0) {
- pos = 0;
- while (pos < rc) {
- char *item;
-
- ent = (void *) buf + pos;
- item = (char *) ent->d_name;
- if (!strcmp(item, ".") || !strcmp(item, ".."))
- goto iter;
- if (strstr(item, prefix) != item) {
- printf("found bad name %s\n", item);
- return(-1);
- }
- printf("[%03d]: %s\t",
- index++, item + strlen(prefix));
-iter:
- pos += ent->d_reclen;
- }
- }
- printf("\n");
- if (rc < 0) {
- printf("getdents error %d\n", rc);
- return(-1);
- }
- if (index != nfiles) {
- printf("get %d files != %d\n", index, nfiles);
- return(-1);
- }
- t_close(fd);
- printf("Cleanup...\n");
- for (i = 0; i < nfiles; i++) {
- sprintf(path, "%s%s%05d", dir, prefix, i);
- t_unlink(path);
- }
- t_rmdir(dir);
- LEAVE();
-}
-
-int t15(char *name)
-{
- char file[MAX_PATH_LENGTH] = "";
- int fd;
- ENTER("open-stat-close");
- snprintf(file, MAX_PATH_LENGTH, "%s/test_t15_file", lustre_path);
-
- t_touch(file);
- fd = t_open(file);
- t_check_stat(file, NULL);
- t_close(fd);
- t_unlink(file);
- LEAVE();
-}
-
-int t16(char *name)
-{
- char file[MAX_PATH_LENGTH] = "";
- ENTER("small-write-read");
- snprintf(file, MAX_PATH_LENGTH, "%s/test_t16_file", lustre_path);
-
- t_echo_create(file, "aaaaaaaaaaaaaaaaaaaaaa");
- t_grep(file, "aaaaaaaaaaaaaaaaaaaaaa");
- t_unlink(file);
- LEAVE();
-}
-
-int t17(char *name)
-{
- char file[MAX_PATH_LENGTH] = "";
- int fd;
- ENTER("open-unlink without close");
- snprintf(file, MAX_PATH_LENGTH, "%s/test_t17_file", lustre_path);
-
- fd = open(file, O_WRONLY | O_CREAT, 0666);
- if (fd < 0) {
- printf("failed to create file: %s\n", strerror(errno));
- return(-1);
- }
- t_unlink(file);
- LEAVE();
-}
-
-int t18(char *name)
-{
- char file[MAX_PATH_LENGTH] = "";
- char buf[128];
- int fd, i;
- struct stat statbuf[3];
- ENTER("write should change mtime/ctime");
- snprintf(file, MAX_PATH_LENGTH, "%s/test_t18_file", lustre_path);
-
- for (i = 0; i < 3; i++) {
- fd = open(file, O_RDWR|O_CREAT|O_APPEND, (mode_t)0666);
- if (fd < 0) {
- printf("error open file: %s\n", strerror(errno));
- return(-1);
- }
- if (write(fd, buf, sizeof(buf)) != sizeof(buf)) {
- printf("error write file\n");
- return(-1);
- }
- close(fd);
- if(stat(file, &statbuf[i]) != 0) {
- printf("Error stat\n");
- return(1);
- }
- printf("ctime %lu, mtime %lu\n",
- statbuf[i].st_ctime, statbuf[i].st_mtime);
- sleep(2);
- }
-
- for (i = 1; i < 3; i++) {
- if ((statbuf[i].st_ctime <= statbuf[i-1].st_ctime) ||
- (statbuf[i].st_mtime <= statbuf[i-1].st_mtime)) {
- printf("time error\n");
- return(-1);
- }
- }
- t_unlink(file);
- LEAVE();
-}
-
-int t18b(char *name)
-{
- char file[MAX_PATH_LENGTH] = "";
- int i;
- struct stat statbuf[3];
- ENTER("utime should change mtime/atime/ctime");
- snprintf(file, MAX_PATH_LENGTH, "%s/test_t18b_file", lustre_path);
- t_touch(file);
-
- for (i = 0; i < 3; i++) {
- t_utime(file, NULL);
- if(stat(file, &statbuf[i]) != 0) {
- printf("Error stat\n");
- return(1);
- }
- printf("atime %lu, mtime %lu, ctime %lu\n",
- statbuf[i].st_atime, statbuf[i].st_mtime,
- statbuf[i].st_ctime);
- sleep(2);
- }
-
- for (i = 1; i < 3; i++) {
- if ((statbuf[i].st_atime <= statbuf[i-1].st_atime) ||
- (statbuf[i].st_mtime <= statbuf[i-1].st_mtime) ||
- (statbuf[i].st_ctime <= statbuf[i-1].st_ctime)) {
- printf("time error\n");
- return(-1);
- }
- }
- t_unlink(file);
- LEAVE();
-}
-
-static int check_file_size(char *file, long long size)
-{
- struct stat statbuf;
-
- if (stat(file, &statbuf) != 0) {
- printf("Error stat(%s)\n", file);
- return(1);
- }
- if (statbuf.st_size != size) {
- printf("size of %s: %lld != %lld\n", file,
- (long long)statbuf.st_size, (long long )size);
- return(-1);
- }
- return 0;
-}
-
-int t19(char *name)
-{
- char file[MAX_PATH_LENGTH] = "";
- int fd;
- int result;
- ENTER("open(O_TRUNC) should truncate file to 0-length");
- snprintf(file, MAX_PATH_LENGTH, "%s/test_t19_file", lustre_path);
-
- t_echo_create(file, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
-
- fd = open(file, O_RDWR|O_CREAT|O_TRUNC, (mode_t)0666);
- if (fd < 0) {
- printf("error open file: %s\n", strerror(errno));
- return(-1);
- }
- close(fd);
- result = check_file_size(file, 0);
- if (result != 0)
- return result;
- t_unlink(file);
- LEAVE();
-}
-
-int t20(char *name)
-{
- char file[MAX_PATH_LENGTH] = "";
- int fd;
- struct iovec iov[2];
- char buf[100];
- long ret;
- ENTER("trap app's general bad pointer for file i/o");
- snprintf(file, MAX_PATH_LENGTH, "%s/test_t20_file", lustre_path);
-
- fd = open(file, O_RDWR|O_CREAT, (mode_t)0666);
- if (fd < 0) {
- printf("error open file: %s\n", strerror(errno));
- return(-1);
- }
-
- ret = write(fd, NULL, 20);
- if (ret != -1 || errno != EFAULT) {
- printf("write 1: ret %lld, errno %d\n", (long long)ret, errno);
- return(1);
- }
- ret = write(fd, (void *)-1, 20);
- if (ret != -1 || errno != EFAULT) {
- printf("write 2: ret %lld, errno %d\n", (long long)ret, errno);
- return(1);
- }
- iov[0].iov_base = NULL;
- iov[0].iov_len = 10;
- iov[1].iov_base = (void *)-1;
- iov[1].iov_len = 10;
- ret = writev(fd, iov, 2);
- if (ret != -1 || errno != EFAULT) {
- printf("writev 1: ret %lld, errno %d\n", (long long)ret, errno);
- return(1);
- }
- iov[0].iov_base = NULL;
- iov[0].iov_len = 0;
- iov[1].iov_base = buf;
- iov[1].iov_len = sizeof(buf);
- ret = writev(fd, iov, 2);
- if (ret != sizeof(buf)) {
- printf("writev 2: ret %lld, error %d\n", (long long)ret, errno);
- return(1);
- }
- lseek(fd, 0, SEEK_SET);
-
- ret = read(fd, NULL, 20);
- if (ret != -1 || errno != EFAULT) {
- printf("read 1: ret %lld, errno %d\n", (long long)ret, errno);
- return(1);
- }
- ret = read(fd, (void *)-1, 20);
- if (ret != -1 || errno != EFAULT) {
- printf("read 2: ret %lld, error %d\n", (long long)ret, errno);
- return(1);
- }
- iov[0].iov_base = NULL;
- iov[0].iov_len = 10;
- iov[1].iov_base = (void *)-1;
- iov[1].iov_len = 10;
- ret = readv(fd, iov, 2);
- if (ret != -1 || errno != EFAULT) {
- printf("readv 1: ret %lld, error %d\n", (long long)ret, errno);
- return(1);
- }
- iov[0].iov_base = NULL;
- iov[0].iov_len = 0;
- iov[1].iov_base = buf;
- iov[1].iov_len = sizeof(buf);
- ret = readv(fd, iov, 2);
- if (ret != sizeof(buf)) {
- printf("readv 2: ret %lld, error %d\n", (long long)ret, errno);
- return(1);
- }
-
- close(fd);
- t_unlink(file);
- LEAVE();
-}
-
-int t21(char *name)
-{
- char file[MAX_PATH_LENGTH] = "";
- int fd, ret;
- struct flock lock = {
- .l_type = F_RDLCK,
- .l_whence = SEEK_SET,
- };
-
- ENTER("basic fcntl support");
- snprintf(file, MAX_PATH_LENGTH, "%s/test_t21_file", lustre_path);
-
- fd = open(file, O_RDWR|O_CREAT, (mode_t)0666);
- if (fd < 0) {
- printf("error open file: %s\n", file);
- return(-1);
- }
-
- t_fcntl(fd, F_SETFL, O_APPEND);
- ret = t_fcntl(fd, F_GETFL);
- if ((ret & O_APPEND) == 0) {
- printf("error get flag: ret %o\n", ret);
- return(-1);
- }
-
- t_fcntl(fd, F_SETLK, &lock);
- t_fcntl(fd, F_GETLK, &lock);
- lock.l_type = F_WRLCK;
- t_fcntl(fd, F_SETLKW, &lock);
- t_fcntl(fd, F_GETLK, &lock);
- lock.l_type = F_UNLCK;
- t_fcntl(fd, F_SETLK, &lock);
-
- close(fd);
- t_unlink(file);
- LEAVE();
-}
-
-int t22(char *name)
-{
- char file[MAX_PATH_LENGTH] = "";
- int fd;
- char *str = "1234567890";
- char buf[100];
- long ret;
- ENTER("make sure O_APPEND take effect");
- snprintf(file, MAX_PATH_LENGTH, "%s/test_t22_file", lustre_path);
-
- fd = open(file, O_TRUNC|O_RDWR|O_CREAT|O_APPEND, (mode_t)0666);
- if (fd < 0) {
- printf("error open file: %s\n", strerror(errno));
- return(-1);
- }
-
- lseek(fd, 100, SEEK_SET);
- ret = write(fd, str, strlen(str));
- if (ret != strlen(str)) {
- printf("write 1: ret %lld, errno %d\n", (long long)ret, errno);
- return(1);
- }
-
- lseek(fd, 0, SEEK_SET);
- ret = read(fd, buf, sizeof(buf));
- if (ret != strlen(str)) {
- printf("read 1: ret %lld\n", (long long)ret);
- return(1);
- }
-
- if (memcmp(buf, str, strlen(str))) {
- printf("read 1 data err\n");
- return(1);
- }
-
- if (fcntl(fd, F_SETFL, 0)) {
- printf("fcntl err: %s\n", strerror(errno));
- return(1);
- }
-
- lseek(fd, 100, SEEK_SET);
- ret = write(fd, str, strlen(str));
- if (ret != strlen(str)) {
- printf("write 2: ret %lld, errno %d\n", (long long)ret, errno);
- return(1);
- }
-
- lseek(fd, 100, SEEK_SET);
- ret = read(fd, buf, sizeof(buf));
- if (ret != strlen(str)) {
- printf("read 2: ret %lld\n", (long long)ret);
- return(1);
- }
-
- if (memcmp(buf, str, strlen(str))) {
- printf("read 2 data err\n");
- return(1);
- }
-
- close(fd);
- t_unlink(file);
- LEAVE();
-}
-
-int t23(char *name)
-{
- char path[MAX_PATH_LENGTH];
- int fd;
- long long ret;
- loff_t off;
-
- ENTER("handle seek > 2GB");
- snprintf(path, MAX_PATH_LENGTH, "%s/f%s", lustre_path, name);
-
- fd = open(path, O_WRONLY | O_CREAT | O_LARGEFILE, 0666);
- if (fd < 0) {
- printf("failed to create file %s: %s\n", path, strerror(errno));
- return(-1);
- }
-
- off = 2048ULL * 1024 * 1024 - buf_size / 2;
- ret = lseek(fd, off, SEEK_SET);
- if (ret != off) {
- printf("seek error for initial %llu != %llu\n",
- ret, (long long)off);
- return -1;
- }
-
- ret = write(fd, buf_alloc, buf_size);
- if (ret != buf_size) {
- printf("write error for %d != %llubytes @ %llu\n",
- buf_size, ret, (long long)off);
- if (ret == -1)
- perror("write");
- return -1;
- }
-
- ret = lseek(fd, off, SEEK_SET);
- if (ret != off) {
- printf("seek < 2GB error for %llu != %llu\n",
- ret, (long long)off);
- if (ret == -1)
- perror("seek < 2GB");
- return -1;
- }
-
- ret = lseek(fd, off + buf_size - 2, SEEK_SET);
- if (ret != off + buf_size - 2) {
- printf("seek > 2GB error for %llu != %llu\n",
- ret, (long long)off);
- if (ret == -1)
- perror("seek > 2GB");
- return -1;
- }
-
- ret = lseek(fd, -buf_size + 2, SEEK_CUR);
- if (ret != off) {
- printf("relative seek error for %d %llu != %llu\n",
- -buf_size + 2, ret, (unsigned long long) off);
- if (ret == -1)
- perror("relative seek");
- return -1;
- }
-
- ret = lseek(fd, 0, SEEK_END);
- if (ret != off + buf_size) {
- printf("end seek error for %llu != %llu\n",
- ret, (long long)off + buf_size);
- if (ret == -1)
- perror("end seek");
- return -1;
- }
-
- ret = lseek(fd, 0, SEEK_SET);
- if (ret != 0) {
- printf("seek 0 error for %llu != 0\n", ret);
- if (ret == -1)
- perror("seek 0");
- return -1;
- }
-
- off = 2048ULL * 1024 * 1024, SEEK_SET;
- ret = lseek(fd, off, SEEK_SET);
- if (ret != off) {
- printf("seek 2GB error for %llu != %llu\n", ret, (unsigned long long) off);
- if (ret == -1)
- perror("seek 2GB");
- return -1;
- }
-
- close(fd);
- t_unlink(path);
- LEAVE();
-}
-
-/* pos: i/o start from
- * xfer: npages per transfer
- */
-static int pages_io(int xfer, loff_t pos)
-{
- char path[MAX_PATH_LENGTH] = "";
-
- int check_sum[_npages] = {0,}, *buf;
- int fd, rc, i, j, data_error = 0;
- struct timeval tw1, tw2, tr1, tr2;
- double tw, tr;
- loff_t ret;
-
- snprintf(path, MAX_PATH_LENGTH, "%s/test_t50", lustre_path);
-
- memset(buf_alloc, 0, buf_size);
-
- /* create sample data */
- for (i = 0, buf = buf_alloc; i < _npages; i++) {
- for (j = 0; j < PAGE_CACHE_SIZE/sizeof(int); j++, buf++) {
- *buf = rand();
- }
- }
-
- /* compute checksum */
- for (i = 0, buf = buf_alloc; i < _npages; i++) {
- for (j = 0; j < PAGE_CACHE_SIZE/sizeof(int); j++, buf++) {
- check_sum[i] += *buf;
- }
- }
-
- unlink(path);
- t_touch(path);
-
- fd = t_open(path);
-
- /* write */
- ret = lseek(fd, pos, SEEK_SET);
- if (ret != pos) {
- perror("write seek");
- return 1;
- }
- gettimeofday(&tw1, NULL);
- for (i = 0, buf = buf_alloc; i < _npages;
- i += xfer, buf += xfer * PAGE_CACHE_SIZE / sizeof(int)) {
- rc = write(fd, buf, PAGE_CACHE_SIZE * xfer);
- if (rc != PAGE_CACHE_SIZE * xfer) {
- printf("write error (i %d, rc %d): %s\n", i, rc,
- strerror(errno));
- return(1);
- }
- }
- gettimeofday(&tw2, NULL);
-
- memset(buf_alloc, 0, buf_size);
-
- /* read */
- ret = lseek(fd, pos, SEEK_SET);
- if (ret != pos) {
- perror("read seek");
- return 1;
- }
- gettimeofday(&tr1, NULL);
- for (i = 0, buf = buf_alloc; i < _npages;
- i += xfer, buf += xfer * PAGE_CACHE_SIZE / sizeof(int)) {
- rc = read(fd, buf, PAGE_CACHE_SIZE * xfer);
- if (rc != PAGE_CACHE_SIZE * xfer) {
- printf("read error (i %d, rc %d): %s\n", i, rc,
- strerror(errno));
- return(1);
- }
- }
- gettimeofday(&tr2, NULL);
-
- /* compute checksum */
- for (i = 0, buf = buf_alloc; i < _npages; i++) {
- int sum = 0;
- for (j = 0; j < PAGE_CACHE_SIZE/sizeof(int); j++, buf++) {
- sum += *buf;
- }
- if (sum != check_sum[i]) {
- data_error = 1;
- printf("chunk %d checksum error expected %#x got %#x\n",
- i, check_sum[i], sum);
- }
- }
-
- t_close(fd);
- t_unlink(path);
- tw = (tw2.tv_sec - tw1.tv_sec) * 1000000 + (tw2.tv_usec - tw1.tv_usec);
- tr = (tr2.tv_sec - tr1.tv_sec) * 1000000 + (tr2.tv_usec - tr1.tv_usec);
- printf(" (R:%.3fM/s, W:%.3fM/s)\n",
- (_npages * PAGE_CACHE_SIZE) / (tw / 1000000.0) / (1024 * 1024),
- (_npages * PAGE_CACHE_SIZE) / (tr / 1000000.0) / (1024 * 1024));
-
- if (data_error)
- return 1;
-
- return 0;
-}
-
-int t50(char *name)
-{
- int np = 1;
- loff_t offset = 0;
-
- ENTER("4k aligned i/o sanity");
- while (np <= _npages) {
- printf("%3d per xfer(total %d)...\t", np, _npages);
- fflush(stdout);
- if (pages_io(np, offset) != 0)
- return 1;
- np += np;
- }
- LEAVE();
-}
-
-int t50b(char *name)
-{
- loff_t off_array[] = {1, 17, 255, 258, 4095, 4097, 8191,
- 1024*1024*1024*1024ULL};
- int i;
- long long offset;
-
- ENTER("4k un-aligned i/o sanity");
- for (i = 0; i < sizeof(off_array)/sizeof(loff_t); i++) {
- offset = off_array[i];
- printf("16 per xfer(total %d), offset %10lld...\t",
- _npages, offset);
- if (pages_io(16, offset) != 0)
- return 1;
- }
-
- LEAVE();
-}
-
-enum {
- T51_STEP = 42,
- T51_NR = 1000
-};
-
-/*
- * truncate(2) checks.
- */
-int t51(char *name)
-{
- char file[MAX_PATH_LENGTH] = "";
- int fd;
- long long size;
- int result;
-
- ENTER("truncate() should truncate file to proper length");
- snprintf(file, MAX_PATH_LENGTH, "%s/test_t51_file", lustre_path);
-
- for (size = 0; size < T51_NR * T51_STEP; size += T51_STEP) {
- t_echo_create(file, "");
- if (truncate(file, size) != 0) {
- printf("\nerror truncating file: %s\n",strerror(errno));
- return(-1);
- }
- result = check_file_size(file, size);
- if (result != 0)
- return result;
- t_unlink(file);
-
- t_echo_create(file, "");
- fd = open(file, O_RDWR|O_CREAT, (mode_t)0666);
- if (fd < 0) {
- printf("\nerror open file: %s\n", strerror(errno));
- return(-1);
- }
- if (ftruncate(fd, size) != 0) {
- printf("\nerror ftruncating file:%s\n",strerror(errno));
- return(-1);
- }
- close(fd);
- result = check_file_size(file, size);
- if (result != 0)
- return result;
- t_unlink(file);
- if (size % (T51_STEP * (T51_NR / 75)) == 0) {
- printf(".");
- fflush(stdout);
- }
- }
- printf("\n");
- LEAVE();
-}
-/*
- * check atime update during read
- */
-int t52(char *name)
-{
- char file[MAX_PATH_LENGTH] = "";
- char buf[16];
- struct stat statbuf;
- time_t atime;
- time_t diff;
- int fd, i;
-
- ENTER("atime should be updated during read");
- snprintf(file, MAX_PATH_LENGTH, "%s/test_t52_file", lustre_path);
-
- t_echo_create(file, "check atime update during read");
- fd = open(file, O_RDONLY);
- if (fd < 0) {
- printf("\nerror open file: %s\n", strerror(errno));
- return(-1);
- }
- stat(file, &statbuf);
- printf("st_atime=%s", ctime(&statbuf.st_atime));
- atime = statbuf.st_atime;
- for (i = 0; i < 3; i++) {
- ssize_t num_read;
- sleep(2);
- /* should not ignore read(2)'s return value */
- num_read = read(fd, buf, sizeof(buf));
- if (num_read < 0 ) {
- printf("read from %s: %s\n", file, strerror(errno));
- return -1;
- }
- stat(file, &statbuf);
- printf("st_atime=%s", ctime(&statbuf.st_atime));
- diff = statbuf.st_atime - atime;
- if (diff <= 0) {
- printf("atime doesn't updated! failed!\n");
- close(fd);
- t_unlink(file);
- return -1;
- }
- atime = statbuf.st_atime;
- }
- close(fd);
- t_unlink(file);
- LEAVE();
-}
-
-#define NEW_TIME 10000
-int t53(char *name)
-{
- char file[MAX_PATH_LENGTH] = "";
- struct utimbuf times; /* struct. buffer for utime() */
- struct stat stat_buf; /* struct buffer to hold file info. */
- time_t mtime, atime;
-
- ENTER("mtime/atime should be updated by utime() call");
- snprintf(file, MAX_PATH_LENGTH, "%s/test_t53_file", lustre_path);
-
- t_echo_create(file, "check mtime/atime update by utime() call");
-
- /* Initialize the modification and access time in the times arg */
- times.actime = NEW_TIME+10;
- times.modtime = NEW_TIME;
-
- /* file modification/access time */
- utime(file, ×);
-
- if (stat(file, &stat_buf) < 0) {
- printf("stat(2) of %s failed, error:%d %s\n",
- file, errno, strerror(errno));
- }
- mtime = stat_buf.st_mtime;
- atime = stat_buf.st_atime;
-
- if ((mtime == NEW_TIME) && (atime == NEW_TIME + 10)) {
- t_unlink(file);
- LEAVE();
- }
-
- printf("mod time %ld, expected %ld\n", mtime, (long)NEW_TIME);
- printf("acc time %ld, expected %ld\n", atime, (long)NEW_TIME + 10);
-
- t_unlink(file);
- return (-1);
-}
-
-int t54(char *name)
-{
- char file[MAX_PATH_LENGTH] = "";
- struct flock lock;
- int fd, err;
-
- ENTER("fcntl should return 0 when succeed in getting flock");
- snprintf(file, MAX_PATH_LENGTH, "%s/test_t54_file", lustre_path);
-
- t_echo_create(file, "fcntl should return 0 when succeed");
-
- fd = open(file, O_RDWR);
- if (fd < 0) {
- printf("\nerror open file: %s\n", strerror(errno));
- return(-1);
- }
- lock.l_type = F_WRLCK;
- lock.l_start = 0;
- lock.l_whence = 0;
- lock.l_len = 1;
- if ((err = t_fcntl(fd, F_SETLKW, &lock)) != 0) {
- fprintf(stderr, "fcntl returned: %d (%s)\n",
- err, strerror(err));
- close(fd);
- t_unlink(file);
- return (-1);
- }
-
- lock.l_type = F_UNLCK;
- t_fcntl(fd, F_SETLKW, &lock);
- close(fd);
- t_unlink(file);
- LEAVE();
-}
-
-/* for O_DIRECTORY */
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-
-#define STRIPE_SIZE (2048 * 2048)
-#define STRIPE_OFFSET 0
-#define STRIPE_COUNT 1
-int t55(char *name)
-{
- char path[MAX_PATH_LENGTH] = "";
- char file[MAX_PATH_LENGTH] = "";
- struct lov_user_md *lum = NULL;
- struct lov_user_ost_data *lo = NULL;
- int index, fd, buflen, rc;
-
- ENTER("setstripe/getstripe");
- snprintf(path, MAX_PATH_LENGTH, "%s/test_t55", lustre_path);
- snprintf(file, MAX_PATH_LENGTH, "%s/test_t55/file_t55", lustre_path);
-
- buflen = sizeof(struct lov_user_md);
- buflen += STRIPE_COUNT * sizeof(struct lov_user_ost_data);
- lum = (struct lov_user_md *)malloc(buflen);
- if (!lum) {
- printf("out of memory!\n");
- return -1;
- }
- memset(lum, 0, buflen);
-
- t_mkdir(path);
- rc = llapi_file_create(path, STRIPE_SIZE, STRIPE_OFFSET,
- STRIPE_COUNT, LOV_PATTERN_RAID0);
- if (rc) {
- printf("llapi_file_create failed: rc = %d (%s) \n",
- rc, strerror(-rc));
- t_rmdir(path);
- free(lum);
- return -1;
- }
-
- fd = open(file, O_CREAT | O_RDWR, 0644);
- if (fd < 0) {
- printf("open file(%s) failed: rc = %d (%s) \n)",
- file, fd, strerror(errno));
- t_rmdir(path);
- free(lum);
- return -1;
- }
-
- lum->lmm_magic = LOV_USER_MAGIC;
- lum->lmm_stripe_count = STRIPE_COUNT;
- rc = ioctl(fd, LL_IOC_LOV_GETSTRIPE, lum);
- if (rc) {
- printf("dir:ioctl(LL_IOC_LOV_GETSTRIPE) failed: rc = %d(%s)\n",
- rc, strerror(errno));
- close(fd);
- t_unlink(file);
- t_rmdir(path);
- free(lum);
- return -1;
- }
-
- close(fd);
-
- if (opt_verbose) {
- printf("lmm_magic: 0x%08X\n", lum->lmm_magic);
- printf("lmm_object_id: "LPX64"\n",
- lmm_oi_id(&lum->lmm_oi));
- printf("lmm_object_seq: "LPX64"\n",
- lmm_oi_seq(&lum->lmm_oi));
- printf("lmm_stripe_count: %u\n", (int)lum->lmm_stripe_count);
- printf("lmm_stripe_size: %u\n", lum->lmm_stripe_size);
- printf("lmm_stripe_pattern: %x\n", lum->lmm_pattern);
-
- for (index = 0; index < lum->lmm_stripe_count; index++) {
- lo = lum->lmm_objects + index;
- printf("object %d:\n", index);
- printf("\tobject_oid: "DOSTID"\n",
- POSTID(&lo->l_ost_oi));
- printf("\tost_gen: %#x\n", lo->l_ost_gen);
- printf("\tost_idx: %u\n", lo->l_ost_idx);
- }
- }
-
- if (lum->lmm_magic != LOV_USER_MAGIC ||
- lum->lmm_pattern != LOV_PATTERN_RAID0 ||
- lum->lmm_stripe_size != STRIPE_SIZE ||
- lum->lmm_objects[0].l_ost_idx != STRIPE_OFFSET ||
- lum->lmm_stripe_count != STRIPE_COUNT) {
- printf("incorrect striping information!\n");
- t_unlink(file);
- t_rmdir(path);
- free(lum);
- return -1;
- }
- t_unlink(file);
-
- /* setstripe on regular file */
- rc = llapi_file_create(file, STRIPE_SIZE, STRIPE_OFFSET,
- STRIPE_COUNT, LOV_PATTERN_RAID0);
- if (rc) {
- printf("llapi_file_create failed: rc = %d (%s) \n",
- rc, strerror(-rc));
- t_unlink(file);
- t_rmdir(path);
- free(lum);
- return -1;
- }
- fd = open(file, O_RDWR, 0644);
- if (fd < 0) {
- printf("failed to open(%s): rc = %d (%s)\n",
- file, fd, strerror(errno));
- t_unlink(file);
- t_rmdir(path);
- free(lum);
- return -1;
- }
-
- lum->lmm_magic = LOV_USER_MAGIC;
- lum->lmm_stripe_count = STRIPE_COUNT;
- rc = ioctl(fd, LL_IOC_LOV_GETSTRIPE, lum);
- if (rc) {
- printf("file:ioctl(LL_IOC_LOV_GETSTRIPE) failed: rc = %d(%s)\n",
- rc, strerror(errno));
- close(fd);
- t_unlink(file);
- t_rmdir(path);
- free(lum);
- return -1;
- }
- close(fd);
-
- if (opt_verbose) {
- printf("lmm_magic: 0x%08X\n", lum->lmm_magic);
- printf("lmm_object_id: "LPX64"\n",
- lmm_oi_id(&lum->lmm_oi));
- printf("lmm_object_seq: "LPX64"\n",
- lmm_oi_seq(&lum->lmm_oi));
- printf("lmm_stripe_count: %u\n", (int)lum->lmm_stripe_count);
- printf("lmm_stripe_size: %u\n", lum->lmm_stripe_size);
- printf("lmm_stripe_pattern: %x\n", lum->lmm_pattern);
-
- for (index = 0; index < lum->lmm_stripe_count; index++) {
- lo = lum->lmm_objects + index;
- printf("object %d:\n", index);
- printf("\tobject_oid: "DOSTID"\n",
- POSTID(&lo->l_ost_oi));
- printf("\tost_gen: %#x\n", lo->l_ost_gen);
- printf("\tost_idx: %u\n", lo->l_ost_idx);
- }
- }
-
- if (lum->lmm_magic != LOV_USER_MAGIC ||
- lum->lmm_pattern != LOV_PATTERN_RAID0 ||
- lum->lmm_stripe_size != STRIPE_SIZE ||
- lum->lmm_objects[0].l_ost_idx != STRIPE_OFFSET ||
- lum->lmm_stripe_count != STRIPE_COUNT) {
- printf("incorrect striping information!\n");
- t_unlink(file);
- t_rmdir(path);
- free(lum);
- return -1;
- }
-
- t_unlink(file);
- t_rmdir(path);
- free(lum);
- LEAVE();
-}
-
-/*
- * getdirentries should return -1 and set errno to EINVAL when the size
- * specified as an argument is too small to contain at least one entry
- * (see bugzilla ticket 12229)
- */
-int t56(char *name)
-{
- int fd;
- size_t nbytes;
- off_t basep = 0;
- long rc = 0;
- struct dirent64 dir;
-
- ENTER("getdirentries should fail if nbytes is too small");
-
- /* Set count to be very small. The result should be EINVAL */
- nbytes = 8;
-
- /* open the directory and call getdirentries */
- fd = t_opendir(lustre_path);
-
- rc = getdirentries(fd, (char *)&dir, nbytes, &basep);
-
- if (rc != -1) {
- printf("Test failed: getdirentries returned %lld\n",
- (long long)rc);
- t_close(fd);
- return -1;
- }
- if (errno != EINVAL) {
- printf("Test failed: getdirentries returned %lld but errno is "
- "set to %d (should be EINVAL)\n", (long long)rc, errno);
- t_close(fd);
- return -1;
- }
- t_close(fd);
-
- LEAVE();
-}
-
-extern void __liblustre_setup_(void);
-extern void __liblustre_cleanup_(void);
-
-
-void usage(char *cmd)
-{
- printf("\n"
- "usage: %s [-o test][-e test][-v] --target mgsnid:/fsname\n",
- cmd);
- printf(" %s --dumpfile dumpfile\n", cmd);
- exit(-1);
-}
-
-struct testlist {
- int (*test)(char *name);
- char *name;
-} testlist[] = {
- { t1, "1" },
- { t2, "2" },
- { t3, "3" },
- { t4, "4" },
- { t6, "6" },
- { t6b, "6b" },
- { t7, "7" },
- { t8, "8" },
- { t9, "9" },
- { t10, "10" },
- { t11, "11" },
- { t12, "12" },
- { t13, "13" },
- { t14, "14" },
- { t15, "15" },
- { t16, "16" },
- { t17, "17" },
- { t18, "18" },
- { t18b, "t8b" },
- { t19, "19" },
- { t20, "20" },
- { t21, "21" },
- { t22, "22" },
- { t23, "23" },
- { t50, "50" },
- { t50b, "50b" },
- { t51, "51" },
- { t53, "53" },
- { t54, "54" },
- { t55, "55" },
- { t56, "56" },
- { NULL, NULL }
-};
-
-int main(int argc, char * const argv[])
-{
- struct testlist *test;
- int opt_index, c, rc = 0, numonly = 0, numexcept = 0;
- char *only[100], *except[100];
- static struct option long_opts[] = {
- {"dumpfile", 1, 0, 'd'},
- {"only", 1, 0, 'o'},
- {"except", 1, 0, 'e'},
- {"target", 1, 0, 't'},
- {"verbose", 1, 0, 'v'},
- {0, 0, 0, 0}
- };
-
- while ((c = getopt_long(argc, argv, "d:e:o:t:v", long_opts, &opt_index)) != -1) {
- switch (c) {
- case 'd':
- setenv(ENV_LUSTRE_DUMPFILE, optarg, 1);
- break;
- case 'e':
- if (numexcept == 0)
- printf("Not running test(s): ");
- printf("%s ", optarg);
- except[numexcept++] = optarg;
- break;
- case 'o':
- if (numonly == 0)
- printf("Only running test(s): ");
- printf("%s ", optarg);
- only[numonly++] = optarg;
- break;
- case 't':
- setenv(ENV_LUSTRE_MNTTGT, optarg, 1);
- break;
- case 'v':
- opt_verbose++;
- break;
- default:
- usage(argv[0]);
- break;
- }
- }
-
- if (getenv(ENV_LUSTRE_MNTTGT) == NULL &&
- getenv(ENV_LUSTRE_DUMPFILE) == NULL)
- usage(argv[0]);
-
- if (optind != argc)
- usage(argv[0]);
-
- printf("\n");
-
- __liblustre_setup_();
-
- buf_size = _npages * PAGE_CACHE_SIZE;
- if (opt_verbose)
- printf("allocating %d bytes buffer\n", buf_size);
- buf_alloc = calloc(1, buf_size);
- if (buf_alloc == NULL) {
- fprintf(stderr, "error allocating %d\n", buf_size);
- exit(-ENOMEM);
- }
-
- for (test = testlist; test->test != NULL; test++) {
- int run = 1, i;
- int len, olen;
-
- if (numexcept > 0) {
- len = strlen(test->name);
- for (i = 0; i < numexcept; i++) {
- olen = strlen(except[i]);
-
- if (len < olen)
- continue;
-
- if (strncmp(except[i], test->name, olen) == 0) {
- switch(test->name[olen]) {
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- case '8': case '9':
- break;
- default:
- run = 0;
- break;
- }
- }
- }
- }
-
- if (numonly > 0) {
- run = 0;
- len = strlen(test->name);
- for (i = 0; i < numonly; i++) {
- olen = strlen(only[i]);
-
- if (len < olen)
- continue;
-
- if (strncmp(only[i], test->name, olen) == 0) {
- switch(test->name[olen]) {
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- case '8': case '9':
- break;
- default:
- run = 1;
- break;
- }
- }
- }
- }
- if (run && (rc = (test->test)(test->name)) != 0)
- break;
- }
-
- free(buf_alloc);
-
- printf("liblustre is about to shutdown\n");
- __liblustre_cleanup_();
-
- printf("complete successfully\n");
- return rc;
-}
+++ /dev/null
-/*
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program 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
- * General Public License version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- */
-
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <string.h>
-#include <errno.h>
-#include <dirent.h>
-#include <utime.h>
-#include <stdarg.h>
-
-#include <liblustre.h>
-
-#include "test_common.h"
-
-int exit_on_err = 1;
-
-/******************************************************************
- * util functions
- ******************************************************************/
-
-#ifdef EXIT
-#undef EXIT
-#endif
-
-#define EXIT(err) \
- do { \
- if (exit_on_err) \
- exit(err); \
- } while (0)
-
-#define EXIT_RET(err) \
- do { \
- if (exit_on_err) \
- exit(err); \
- else \
- return (err); \
- } while (0)
-
-
-void t_touch(const char *path)
-{
- int fd, rc;
-
- fd = open(path, O_RDWR|O_CREAT, 0644);
- if (fd < 0) {
- printf("open(%s) error: %s\n", path, strerror(errno));
- EXIT(fd);
- }
-
- rc = close(fd);
- if (rc) {
- printf("close(%s) error: %s\n", path, strerror(errno));
- EXIT(rc);
- }
-}
-
-/* XXX Now libsysio don't support mcreate */
-void t_create(const char *path)
-{
- return t_touch(path);
-#if 0
- int rc;
-
- rc = mknod(path, S_IFREG | 0644, 0);
- if (rc) {
- printf("mknod(%s) error: %s\n", path, strerror(errno));
- exit(-1);
- }
-#endif
-}
-
-void t_link(const char *src, const char *dst)
-{
- int rc;
-
- rc = link(src, dst);
- if (rc) {
- printf("link(%s -> %s) error: %s\n", src, dst, strerror(errno));
- EXIT(1);
- }
-}
-
-void t_unlink(const char *path)
-{
- int rc;
-
- rc = unlink(path);
- if (rc) {
- printf("unlink(%s) error: %s\n", path, strerror(errno));
- EXIT(-1);
- }
-}
-
-void t_mkdir(const char *path)
-{
- int rc;
-
- rc = mkdir(path, 00755);
- if (rc < 0) {
- printf("mkdir(%s) error: %s\n", path, strerror(errno));
- EXIT(1);
- }
-}
-
-void t_rmdir(const char *path)
-{
- int rc;
-
- rc = rmdir(path);
- if (rc) {
- printf("rmdir(%s) error: %s\n", path, strerror(errno));
- EXIT(1);
- }
-}
-
-void t_symlink(const char *src, const char *new)
-{
- int rc;
-
- rc = symlink(src, new);
- if (rc) {
- printf("symlink(%s<-%s) error: %s\n", src, new, strerror(errno));
- EXIT(1);
- }
-}
-
-#define MKDEV(a,b) (((a) << 8) | (b))
-void t_mknod(const char *path, mode_t mode, int major, int minor)
-{
- int rc;
-
- rc = mknod(path, mode, MKDEV(5, 4));
- if (rc) {
- printf("mknod(%s) error: %s\n", path, strerror(errno));
- EXIT(1);
- }
-}
-
-void t_chmod_raw(const char *path, mode_t mode)
-{
- int rc;
-
- rc = chmod(path, mode);
- if (rc) {
- printf("chmod(%s) error: %s\n", path, strerror(errno));
- EXIT(1);
- }
-}
-
-void t_chmod(const char *path, const char *format, ...)
-{
-}
-
-void t_rename(const char *oldpath, const char *newpath)
-{
- int rc;
-
- rc = rename(oldpath, newpath);
- if (rc) {
- printf("rename(%s -> %s) error: %s\n",
- oldpath, newpath, strerror(errno));
- EXIT(1);
- }
-}
-
-int t_open_readonly(const char *path)
-{
- int fd;
-
- fd = open(path, O_RDONLY);
- if (fd < 0) {
- printf("open(%s) error: %s\n", path, strerror(errno));
- EXIT_RET(fd);
- }
- return fd;
-}
-
-int t_open(const char *path)
-{
- int fd;
-
- fd = open(path, O_RDWR | O_LARGEFILE);
- if (fd < 0) {
- printf("open(%s) error: %s\n", path, strerror(errno));
- EXIT_RET(fd);
- }
- return fd;
-}
-
-int t_chdir(const char *path)
-{
- int rc = chdir(path);
- if (rc < 0) {
- printf("chdir(%s) error: %s\n", path, strerror(errno));
- EXIT_RET(rc);
- }
- return rc;
-}
-
-int t_utime(const char *path, const struct utimbuf *buf)
-{
- int rc = utime(path, buf);
- if (rc < 0) {
- printf("utime(%s, %p) error: %s\n", path, buf,
- strerror(errno));
- EXIT_RET(rc);
- }
- return rc;
-}
-
-int t_opendir(const char *path)
-{
- int fd;
-
- fd = open(path, O_RDONLY);
- if (fd < 0) {
- printf("opendir(%s) error: %s\n", path, strerror(errno));
- EXIT_RET(fd);
- }
- return fd;
-}
-
-void t_close(int fd)
-{
- int rc;
-
- rc = close(fd);
- if (rc < 0) {
- printf("close(%d) error: %s\n", fd, strerror(errno));
- EXIT(1);
- }
-}
-
-int t_check_stat(const char *name, struct stat *buf)
-{
- struct stat stat;
- int rc;
-
- memset(&stat, 0, sizeof(stat));
-
- rc = lstat(name, &stat);
- if (rc) {
- printf("error %d stat %s\n", rc, name);
- EXIT_RET(rc);
- }
- if (buf)
- memcpy(buf, &stat, sizeof(*buf));
- if (stat.st_blksize == 0) {
- printf("error: blksize is 0\n");
- EXIT_RET(-EINVAL);
- }
-
- return 0;
-}
-
-int t_check_stat_fail(const char *name)
-{
- struct stat stat;
- int rc;
-
- rc = lstat(name, &stat);
- if (!rc) {
- printf("%s still exists\n", name);
- EXIT(-1);
- }
-
- return 0;
-}
-
-void t_echo_create(const char *path, const char *str)
-{
- int fd, rc;
-
- fd = open(path, O_RDWR|O_CREAT, 0644);
- if (fd < 0) {
- printf("open(%s) error: %s\n", path, strerror(errno));
- EXIT(fd);
- }
-
- if (write(fd, str, strlen(str)+1) != strlen(str)+1) {
- printf("write(%s) error: %s\n", path, strerror(errno));
- EXIT(fd);
- }
-
- rc = close(fd);
- if (rc) {
- printf("close(%s) error: %s\n", path, strerror(errno));
- EXIT(rc);
- }
-}
-
-static void _t_grep(const char *path, char *str, int should_contain)
-{
- char buf[1024];
- int fd;
- int rc;
-
- fd = t_open_readonly(path);
- if (lseek(fd, 0, SEEK_SET) == -1) {
- printf("pread_once: seek to 0 error: %s\n", strerror(errno));
- EXIT(fd);
- }
-
- rc = read(fd, buf, 1023);
- if (rc < 0) {
- printf("grep: read error: %s\n", strerror(errno));
- EXIT(-1);
- }
- close(fd);
- buf[rc] = 0;
-
- if ((strstr(buf, str) != 0) ^ should_contain) {
- printf("grep: can't find string %s\n", str);
- EXIT(-1);
- }
-}
-
-void t_grep(const char *path, char *str)
-{
- _t_grep(path, str, 1);
-}
-
-void t_grep_v(const char *path, char *str)
-{
- _t_grep(path, str, 0);
-}
-
-void t_ls(int fd, char *buf, int size)
-{
- struct dirent64 *ent;
- int rc, pos;
- loff_t base = 0;
-
- printf("dir entries listing...\n");
- while ((rc = getdirentries64(fd, buf, size, &base)) > 0) {
- pos = 0;
- while (pos < rc) {
- ent = (struct dirent64 *)((char *)buf + pos);
- printf("%s\n", ent->d_name);
- pos += ent->d_reclen;
- }
- }
-
- if (rc < 0) {
- printf("getdents error %d\n", rc);
- EXIT(-1);
- }
-}
-
-int t_fcntl(int fd, int cmd, ...)
-{
- va_list ap;
- long arg;
- struct flock *lock;
- int rc = -1;
-
- va_start(ap, cmd);
- switch (cmd) {
- case F_GETFL:
- va_end(ap);
- rc = fcntl(fd, cmd);
- if (rc == -1) {
- printf("fcntl GETFL failed: %s\n",
- strerror(errno));
- EXIT(1);
- }
- break;
- case F_SETFL:
- arg = va_arg(ap, long);
- va_end(ap);
- rc = fcntl(fd, cmd, arg);
- if (rc == -1) {
- printf("fcntl SETFL %ld failed: %s\n",
- arg, strerror(errno));
- EXIT(1);
- }
- break;
- case F_GETLK:
-#ifdef F_GETLK64
-#if F_GETLK64 != F_GETLK
- case F_GETLK64:
-#endif
-#endif
- case F_SETLK:
-#ifdef F_SETLK64
-#if F_SETLK64 != F_SETLK
- case F_SETLK64:
-#endif
-#endif
- case F_SETLKW:
-#ifdef F_SETLKW64
-#if F_SETLKW64 != F_SETLKW
- case F_SETLKW64:
-#endif
-#endif
- lock = va_arg(ap, struct flock *);
- va_end(ap);
- rc = fcntl(fd, cmd, lock);
- if (rc == -1) {
- printf("fcntl cmd %d failed: %s\n",
- cmd, strerror(errno));
- EXIT(1);
- }
- break;
- case F_DUPFD:
- arg = va_arg(ap, long);
- va_end(ap);
- rc = fcntl(fd, cmd, arg);
- if (rc == -1) {
- printf("fcntl F_DUPFD %d failed: %s\n",
- (int)arg, strerror(errno));
- EXIT(1);
- }
- break;
- default:
- va_end(ap);
- printf("fcntl cmd %d not supported\n", cmd);
- EXIT(1);
- }
- return rc;
-}
-
-char *safe_strncpy(char *dst, char *src, int max_size)
-{
- int src_size;
- src_size=strlen(src);
- if (src_size >= max_size) {
- src_size=max_size-1;
- }
- memcpy(dst, src, src_size);
- dst[src_size]=0;
-
- return(dst);
-}
+++ /dev/null
-/*
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program 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
- * General Public License version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- */
-
-#ifndef __TEST_COMMON__H
-#define __TEST_COMMON__H
-
-#define ENV_LUSTRE_MNTPNT "LIBLUSTRE_MOUNT_POINT"
-#define ENV_LUSTRE_MNTTGT "LIBLUSTRE_MOUNT_TARGET"
-#define ENV_LUSTRE_TIMEOUT "LIBLUSTRE_TIMEOUT"
-#define ENV_LUSTRE_DUMPFILE "LIBLUSTRE_DUMPFILE"
-
-extern int exit_on_err;
-
-#include <utime.h> /* for utimbuf */
-
-void t_touch(const char *path);
-void t_create(const char *path);
-void t_link(const char *src, const char *dst);
-void t_unlink(const char *path);
-void t_mkdir(const char *path);
-void t_rmdir(const char *path);
-void t_symlink(const char *src, const char *new);
-void t_mknod(const char *path, mode_t mode, int major, int minor);
-void t_chmod_raw(const char *path, mode_t mode);
-void t_chmod(const char *path, const char *format, ...);
-void t_rename(const char *oldpath, const char *newpath);
-int t_open_readonly(const char *path);
-int t_open(const char *path);
-int t_chdir(const char *path);
-int t_utime(const char *path, const struct utimbuf *buf);
-int t_opendir(const char *path);
-void t_close(int fd);
-int t_check_stat(const char *name, struct stat *buf);
-int t_check_stat_fail(const char *name);
-void t_echo_create(const char *path, const char *str);
-void t_grep(const char *path, char *str);
-void t_grep_v(const char *path, char *str);
-void t_ls(int fd, char *buf, int size);
-int t_fcntl(int fd, int cmd, ...);
-
-char *safe_strncpy(char *dst, char *src, int max_size);
-
-#endif
noinst_SCRIPTS += recovery-mds-scale.sh run_dd.sh run_tar.sh run_iozone.sh
noinst_SCRIPTS += run_dbench.sh run_IOR.sh recovery-double-scale.sh
noinst_SCRIPTS += recovery-random-scale.sh parallel-scale.sh metadata-updates.sh
-noinst_SCRIPTS += lustre-rsync-test.sh ost-pools.sh rpc.sh yaml.sh liblustre.sh
+noinst_SCRIPTS += lustre-rsync-test.sh ost-pools.sh rpc.sh yaml.sh
noinst_SCRIPTS += lnet-selftest.sh obdfilter-survey.sh mmp.sh mmp_mark.sh
noinst_SCRIPTS += sgpdd-survey.sh maloo_upload.sh auster setup-nfs.sh
noinst_SCRIPTS += mds-survey.sh parallel-scale-nfs.sh large-lun.sh
+++ /dev/null
-#!/bin/bash
-#
-#set -vx
-
-set -e
-
-LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
-. $LUSTRE/tests/test-framework.sh
-init_test_env $@
-. ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
-init_logging
-
-LIBLUSTRETESTS=${LIBLUSTRETESTS:-$LUSTRE/liblustre/tests}
-
-assert_env MGSNID MOUNT2
-export LIBLUSTRE_MOUNT_POINT=$MOUNT2
-export LIBLUSTRE_MOUNT_RETRY=5
-export LIBLUSTRE_MOUNT_TARGET=$MGSNID:/$FSNAME
-export LIBLUSTRE_TIMEOUT=`lctl get_param -n timeout`
-#export LIBLUSTRE_DEBUG_MASK=`lctl get_param -n debug`
-
-test_1() {
- if ! check_versions; then
- skip "liblustre version mismatch: cli $(lustre_version_code client), \
- mds $(lustre_version_code $SINGLEMDS), ost $(lustre_version_code ost1)"
- elif ! [ "$NETTYPE" = "tcp" -o "$NETTYPE" = "ptl" ]; then
- skip "NETTYPE=$NETTYPE unsupported for liblustre"
- elif [ ! -x $LIBLUSTRETESTS/sanity ]; then
- skip "$LIBLUSTRETESTS/sanity: not found"
- else
- mkdir -p $MOUNT2
- echo $LIBLUSTRETESTS/sanity --target=$LIBLUSTRE_MOUNT_TARGET
- $LIBLUSTRETESTS/sanity --target=$LIBLUSTRE_MOUNT_TARGET
- if [ "$LIBLUSTRE_EXCEPT" ]; then
- LIBLUSTRE_OPT="$LIBLUSTRE_OPT \
- $(echo ' '$LIBLUSTRE_EXCEPT | sed -re 's/\s+/ -e /g')"
- fi
- echo $LIBLUSTRETESTS/sanity --target=$LIBLUSTRE_MOUNT_TARGET $LIBLUSTRE_OPT
- $LIBLUSTRETESTS/sanity --target=$LIBLUSTRE_MOUNT_TARGET $LIBLUSTRE_OPT
- fi
-}
-run_test 1 "liblustre sanity"
-
-complete $SECONDS
-check_and_cleanup_lustre
-exit_status