mirror of
https://github.com/AuxXxilium/eudev.git
synced 2024-11-23 15:00:56 +07:00
Final step of revamping the build system
The structure of the source tree is basically correct and this is about as far as we can go without hacking at the C code.
This commit is contained in:
parent
c47f33a498
commit
eb203b01c9
339
COPYING
Normal file
339
COPYING
Normal file
@ -0,0 +1,339 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Lesser General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, 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 or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
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 give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
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 Program, 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 Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) 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; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, 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 executable. However, as a
|
||||||
|
special exception, the source code 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.
|
||||||
|
|
||||||
|
If distribution of executable or 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 counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program 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.
|
||||||
|
|
||||||
|
5. 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 Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program 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 to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. 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 Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program 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 Program.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program 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.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the 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 Program
|
||||||
|
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 Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, 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
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. 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 program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
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 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.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Lesser General
|
||||||
|
Public License instead of this License.
|
10
Makefile.am
10
Makefile.am
@ -1,10 +1,2 @@
|
|||||||
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
||||||
#SUBDIRS = docs keymaps keymaps-force-release man rules src test
|
SUBDIRS = src docs keymaps keymaps-force-release man rules test
|
||||||
|
|
||||||
SUBDIRS = keymaps keymaps-force-release
|
|
||||||
|
|
||||||
if ENABLE_GTK_DOC
|
|
||||||
SUBDIRS += \
|
|
||||||
docs/libudev
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
@ -1,10 +1,14 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
if type -p gtkdocize > /dev/null; then
|
||||||
|
gtkdocize --docdir docs
|
||||||
|
gtkdocargs=--enable-gtk-doc
|
||||||
|
fi
|
||||||
|
|
||||||
aclocal && \
|
aclocal && \
|
||||||
autoheader && \
|
autoheader && \
|
||||||
autoconf && \
|
autoconf && \
|
||||||
libtoolize --copy && \
|
libtoolize --copy && \
|
||||||
gtkdocize --docdir docs && \
|
|
||||||
automake --add-missing --copy
|
automake --add-missing --copy
|
||||||
|
@ -29,9 +29,14 @@ AC_PROG_INSTALL
|
|||||||
AC_PROG_LN_S
|
AC_PROG_LN_S
|
||||||
AC_PROG_MAKE_SET
|
AC_PROG_MAKE_SET
|
||||||
|
|
||||||
|
GTK_DOC_CHECK([1.18],[--flavour no-tmpl])
|
||||||
|
|
||||||
AC_PATH_PROG([M4], [m4])
|
AC_PATH_PROG([M4], [m4])
|
||||||
AC_PATH_PROG([XSLTPROC], [xsltproc])
|
AC_PATH_PROG([XSLTPROC], [xsltproc])
|
||||||
GTK_DOC_CHECK([1.18],[--flavour no-tmpl])
|
AC_PATH_TOOL(GPERF, gperf)
|
||||||
|
if test -z "$GPERF" ; then
|
||||||
|
AC_MSG_ERROR([*** gperf not found])
|
||||||
|
fi
|
||||||
|
|
||||||
# TODO check this --- we don't want kmod necessarily
|
# TODO check this --- we don't want kmod necessarily
|
||||||
# PKG_CHECK_MODULES(KMOD, [libkmod >= 5])
|
# PKG_CHECK_MODULES(KMOD, [libkmod >= 5])
|
||||||
@ -265,4 +270,5 @@ AC_CONFIG_FILES([Makefile
|
|||||||
src/test/Makefile
|
src/test/Makefile
|
||||||
src/udev/Makefile
|
src/udev/Makefile
|
||||||
test/Makefile])
|
test/Makefile])
|
||||||
|
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
if ENABLE_GUDEV
|
if ENABLE_GTK_DOC
|
||||||
SUBDIRS = \
|
SUBDIRS = \
|
||||||
libudev
|
libudev
|
||||||
if ENABLE_GTK_DOC
|
if ENABLE_GUDEV
|
||||||
SUBDIRS += \
|
SUBDIRS += \
|
||||||
gudev
|
gudev
|
||||||
endif
|
endif
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
||||||
|
|
||||||
if ENABLE_KEYMAP
|
rootprefix=@rootprefix@
|
||||||
|
udevlibexecdir=$(rootprefix)/lib/udev
|
||||||
udevkeymapforcereldir = $(udevlibexecdir)/keymaps/force-release
|
udevkeymapforcereldir = $(udevlibexecdir)/keymaps/force-release
|
||||||
|
|
||||||
|
if ENABLE_KEYMAP
|
||||||
dist_udevkeymapforcerel_DATA = \
|
dist_udevkeymapforcerel_DATA = \
|
||||||
dell-touchpad \
|
dell-touchpad \
|
||||||
dell-xps \
|
dell-xps \
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
||||||
|
|
||||||
if ENABLE_KEYMAP
|
rootprefix=@rootprefix@
|
||||||
|
udevlibexecdir=$(rootprefix)/lib/udev
|
||||||
udevkeymapdir = $(udevlibexecdir)/keymaps
|
udevkeymapdir = $(udevlibexecdir)/keymaps
|
||||||
|
|
||||||
|
if ENABLE_KEYMAP
|
||||||
dist_udevkeymap_DATA = \
|
dist_udevkeymap_DATA = \
|
||||||
acer \
|
acer \
|
||||||
acer-aspire_5720 \
|
acer-aspire_5720 \
|
||||||
@ -63,5 +66,6 @@ dist_udevkeymap_DATA = \
|
|||||||
toshiba-satellite_a110 \
|
toshiba-satellite_a110 \
|
||||||
toshiba-satellite_m30x \
|
toshiba-satellite_m30x \
|
||||||
zepto-znote
|
zepto-znote
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -1,60 +0,0 @@
|
|||||||
# This file is part of systemd.
|
|
||||||
#
|
|
||||||
# systemd 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.
|
|
||||||
|
|
||||||
ACTION=="remove", GOTO="systemd_end"
|
|
||||||
|
|
||||||
SUBSYSTEM=="tty", KERNEL=="tty[a-zA-Z]*|hvc*|xvc*|hvsi*", TAG+="systemd"
|
|
||||||
|
|
||||||
KERNEL=="vport*", TAG+="systemd"
|
|
||||||
|
|
||||||
SUBSYSTEM=="block", KERNEL!="ram*|loop*", TAG+="systemd"
|
|
||||||
SUBSYSTEM=="block", KERNEL!="ram*|loop*", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=="1", ENV{SYSTEMD_READY}="0"
|
|
||||||
|
|
||||||
# Ignore encrypted devices with no identified superblock on it, since
|
|
||||||
# we are probably still calling mke2fs or mkswap on it.
|
|
||||||
SUBSYSTEM=="block", KERNEL!="ram*|loop*", ENV{DM_UUID}=="CRYPT-*", ENV{ID_PART_TABLE_TYPE}=="", ENV{ID_FS_USAGE}=="", ENV{SYSTEMD_READY}="0"
|
|
||||||
|
|
||||||
# Ignore raid devices that are not yet assembled and started
|
|
||||||
SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", KERNEL=="md*", TEST!="md/array_state", ENV{SYSTEMD_READY}="0"
|
|
||||||
SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", KERNEL=="md*", ATTR{md/array_state}=="|clear|inactive", ENV{SYSTEMD_READY}="0"
|
|
||||||
|
|
||||||
# Ignore nbd devices in the "add" event, with "change" the nbd is ready
|
|
||||||
ACTION=="add", SUBSYSTEM=="block", KERNEL=="nbd*", ENV{SYSTEMD_READY}="0"
|
|
||||||
|
|
||||||
# We need a hardware independent way to identify network devices. We
|
|
||||||
# use the /sys/subsystem path for this. Current vanilla kernels don't
|
|
||||||
# actually support that hierarchy right now, however upcoming kernels
|
|
||||||
# will. HAL and udev internally support /sys/subsystem already, hence
|
|
||||||
# it should be safe to use this here, too. This is mostly just an
|
|
||||||
# identification string for systemd, so whether the path actually is
|
|
||||||
# accessible or not does not matter as long as it is unique and in the
|
|
||||||
# filesystem namespace.
|
|
||||||
#
|
|
||||||
# http://cgit.freedesktop.org/systemd/systemd/tree/src/libudev/libudev-enumerate.c#n922
|
|
||||||
|
|
||||||
SUBSYSTEM=="net", KERNEL!="lo", TAG+="systemd", ENV{SYSTEMD_ALIAS}+="/sys/subsystem/net/devices/$name"
|
|
||||||
SUBSYSTEM=="bluetooth", TAG+="systemd", ENV{SYSTEMD_ALIAS}+="/sys/subsystem/bluetooth/devices/%k"
|
|
||||||
|
|
||||||
SUBSYSTEM=="bluetooth", TAG+="systemd", ENV{SYSTEMD_WANTS}+="bluetooth.target"
|
|
||||||
ENV{ID_SMARTCARD_READER}=="*?", TAG+="systemd", ENV{SYSTEMD_WANTS}+="smartcard.target"
|
|
||||||
SUBSYSTEM=="sound", KERNEL=="card*", TAG+="systemd", ENV{SYSTEMD_WANTS}+="sound.target"
|
|
||||||
|
|
||||||
SUBSYSTEM=="printer", TAG+="systemd", ENV{SYSTEMD_WANTS}+="printer.target"
|
|
||||||
SUBSYSTEM=="usb", KERNEL=="lp*", TAG+="systemd", ENV{SYSTEMD_WANTS}+="printer.target"
|
|
||||||
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{ID_USB_INTERFACES}=="*:0701??:*", TAG+="systemd", ENV{SYSTEMD_WANTS}+="printer.target"
|
|
||||||
|
|
||||||
# Apply sysctl variables to network devices (and only to those) as they appear.
|
|
||||||
|
|
||||||
SUBSYSTEM=="net", KERNEL!="lo", RUN+="@rootlibexecdir@/systemd-sysctl --prefix=/proc/sys/net/ipv4/conf/$name --prefix=/proc/sys/net/ipv4/neigh/$name --prefix=/proc/sys/net/ipv6/conf/$name --prefix=/proc/sys/net/ipv6/neigh/$name"
|
|
||||||
|
|
||||||
# Asynchronously mount file systems implemented by these modules as
|
|
||||||
# soon as they are loaded.
|
|
||||||
|
|
||||||
SUBSYSTEM=="module", KERNEL=="fuse", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}+="sys-fs-fuse-connections.mount"
|
|
||||||
SUBSYSTEM=="module", KERNEL=="configfs", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}+="sys-kernel-config.mount"
|
|
||||||
|
|
||||||
LABEL="systemd_end"
|
|
@ -5,7 +5,6 @@ udevlibexecdir=$(rootprefix)/lib/udev
|
|||||||
udevrulesdir = $(udevlibexecdir)/rules.d
|
udevrulesdir = $(udevlibexecdir)/rules.d
|
||||||
|
|
||||||
dist_udevrules_DATA = \
|
dist_udevrules_DATA = \
|
||||||
99-systemd.rules \
|
|
||||||
42-usb-hid-pm.rules \
|
42-usb-hid-pm.rules \
|
||||||
50-udev-default.rules \
|
50-udev-default.rules \
|
||||||
60-cdrom_id.rules \
|
60-cdrom_id.rules \
|
||||||
@ -26,6 +25,6 @@ dist_udevrules_DATA = \
|
|||||||
|
|
||||||
if ENABLE_KEYMAP
|
if ENABLE_KEYMAP
|
||||||
dist_udevrules_DATA += \
|
dist_udevrules_DATA += \
|
||||||
95-keymap.rules \
|
95-keymap.rules \
|
||||||
95-keyboard-force-release.rules
|
95-keyboard-force-release.rules
|
||||||
endif
|
endif
|
||||||
|
@ -4,6 +4,9 @@ LIBUDEV_CURRENT=3
|
|||||||
LIBUDEV_REVISION=0
|
LIBUDEV_REVISION=0
|
||||||
LIBUDEV_AGE=2
|
LIBUDEV_AGE=2
|
||||||
|
|
||||||
|
AM_CPPFLAGS = \
|
||||||
|
-I $(top_srcdir)/src/shared
|
||||||
|
|
||||||
lib_LTLIBRARIES = \
|
lib_LTLIBRARIES = \
|
||||||
libudev.la
|
libudev.la
|
||||||
|
|
||||||
@ -28,17 +31,6 @@ libudev_la_LDFLAGS = \
|
|||||||
-version-info $(LIBUDEV_CURRENT):$(LIBUDEV_REVISION):$(LIBUDEV_AGE) \
|
-version-info $(LIBUDEV_CURRENT):$(LIBUDEV_REVISION):$(LIBUDEV_AGE) \
|
||||||
-Wl,--version-script=libudev.sym
|
-Wl,--version-script=libudev.sym
|
||||||
|
|
||||||
pkgconfiglibdir=$(libdir)/pkgconfig
|
|
||||||
pkgconfiglib_DATA = \
|
|
||||||
libudev.pc
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
|
||||||
libudev.pc.in \
|
|
||||||
libudev.sym
|
|
||||||
|
|
||||||
CLEANFILES = \
|
|
||||||
libudev.pc
|
|
||||||
|
|
||||||
noinst_LTLIBRARIES = \
|
noinst_LTLIBRARIES = \
|
||||||
libudev-private.la
|
libudev-private.la
|
||||||
|
|
||||||
@ -51,3 +43,13 @@ libudev_private_la_CFLAGS = \
|
|||||||
$(AM_CFLAGS) \
|
$(AM_CFLAGS) \
|
||||||
-fvisibility=default
|
-fvisibility=default
|
||||||
|
|
||||||
|
pkgconfiglibdir=$(libdir)/pkgconfig
|
||||||
|
pkgconfiglib_DATA = \
|
||||||
|
libudev.pc
|
||||||
|
|
||||||
|
EXTRA_DIST = \
|
||||||
|
libudev.pc.in \
|
||||||
|
libudev.sym
|
||||||
|
|
||||||
|
CLEANFILES = \
|
||||||
|
libudev.pc
|
||||||
|
139
src/shared/log.h
Normal file
139
src/shared/log.h
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/***
|
||||||
|
This file is part of systemd.
|
||||||
|
|
||||||
|
Copyright 2010 Lennart Poettering
|
||||||
|
|
||||||
|
systemd 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.
|
||||||
|
|
||||||
|
systemd 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 systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
***/
|
||||||
|
|
||||||
|
#include <syslog.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "macro.h"
|
||||||
|
|
||||||
|
typedef enum LogTarget{
|
||||||
|
LOG_TARGET_CONSOLE,
|
||||||
|
LOG_TARGET_KMSG,
|
||||||
|
LOG_TARGET_JOURNAL,
|
||||||
|
LOG_TARGET_JOURNAL_OR_KMSG,
|
||||||
|
LOG_TARGET_SYSLOG,
|
||||||
|
LOG_TARGET_SYSLOG_OR_KMSG,
|
||||||
|
LOG_TARGET_AUTO, /* console if stderr is tty, JOURNAL_OR_KMSG otherwise */
|
||||||
|
LOG_TARGET_SAFE, /* console if stderr is tty, KMSG otherwise */
|
||||||
|
LOG_TARGET_NULL,
|
||||||
|
_LOG_TARGET_MAX,
|
||||||
|
_LOG_TARGET_INVALID = -1
|
||||||
|
} LogTarget;
|
||||||
|
|
||||||
|
void log_set_target(LogTarget target);
|
||||||
|
void log_set_max_level(int level);
|
||||||
|
void log_set_facility(int facility);
|
||||||
|
|
||||||
|
int log_set_target_from_string(const char *e);
|
||||||
|
int log_set_max_level_from_string(const char *e);
|
||||||
|
|
||||||
|
void log_show_color(bool b);
|
||||||
|
void log_show_location(bool b);
|
||||||
|
|
||||||
|
int log_show_color_from_string(const char *e);
|
||||||
|
int log_show_location_from_string(const char *e);
|
||||||
|
|
||||||
|
LogTarget log_get_target(void);
|
||||||
|
int log_get_max_level(void);
|
||||||
|
|
||||||
|
int log_open(void);
|
||||||
|
void log_close(void);
|
||||||
|
void log_forget_fds(void);
|
||||||
|
|
||||||
|
void log_close_syslog(void);
|
||||||
|
void log_close_journal(void);
|
||||||
|
void log_close_kmsg(void);
|
||||||
|
void log_close_console(void);
|
||||||
|
|
||||||
|
void log_parse_environment(void);
|
||||||
|
|
||||||
|
int log_meta(
|
||||||
|
int level,
|
||||||
|
const char*file,
|
||||||
|
int line,
|
||||||
|
const char *func,
|
||||||
|
const char *format, ...) _printf_attr_(5,6);
|
||||||
|
|
||||||
|
int log_metav(
|
||||||
|
int level,
|
||||||
|
const char*file,
|
||||||
|
int line,
|
||||||
|
const char *func,
|
||||||
|
const char *format,
|
||||||
|
va_list ap);
|
||||||
|
|
||||||
|
int log_struct_internal(
|
||||||
|
int level,
|
||||||
|
const char *file,
|
||||||
|
int line,
|
||||||
|
const char *func,
|
||||||
|
const char *format, ...) _sentinel_;
|
||||||
|
|
||||||
|
int log_oom_internal(
|
||||||
|
const char *file,
|
||||||
|
int line,
|
||||||
|
const char *func);
|
||||||
|
|
||||||
|
/* This modifies the buffer passed! */
|
||||||
|
int log_dump_internal(
|
||||||
|
int level,
|
||||||
|
const char*file,
|
||||||
|
int line,
|
||||||
|
const char *func,
|
||||||
|
char *buffer);
|
||||||
|
|
||||||
|
_noreturn_ void log_assert_failed(
|
||||||
|
const char *text,
|
||||||
|
const char *file,
|
||||||
|
int line,
|
||||||
|
const char *func);
|
||||||
|
|
||||||
|
_noreturn_ void log_assert_failed_unreachable(
|
||||||
|
const char *text,
|
||||||
|
const char *file,
|
||||||
|
int line,
|
||||||
|
const char *func);
|
||||||
|
|
||||||
|
#define log_full(level, ...) log_meta(level, __FILE__, __LINE__, __func__, __VA_ARGS__)
|
||||||
|
|
||||||
|
#define log_debug(...) log_meta(LOG_DEBUG, __FILE__, __LINE__, __func__, __VA_ARGS__)
|
||||||
|
#define log_info(...) log_meta(LOG_INFO, __FILE__, __LINE__, __func__, __VA_ARGS__)
|
||||||
|
#define log_notice(...) log_meta(LOG_NOTICE, __FILE__, __LINE__, __func__, __VA_ARGS__)
|
||||||
|
#define log_warning(...) log_meta(LOG_WARNING, __FILE__, __LINE__, __func__, __VA_ARGS__)
|
||||||
|
#define log_error(...) log_meta(LOG_ERR, __FILE__, __LINE__, __func__, __VA_ARGS__)
|
||||||
|
|
||||||
|
#define log_struct(level, ...) log_struct_internal(level, __FILE__, __LINE__, __func__, __VA_ARGS__)
|
||||||
|
|
||||||
|
#define log_oom() log_oom_internal(__FILE__, __LINE__, __func__)
|
||||||
|
|
||||||
|
/* This modifies the buffer passed! */
|
||||||
|
#define log_dump(level, buffer) log_dump_internal(level, __FILE__, __LINE__, __func__, buffer)
|
||||||
|
|
||||||
|
bool log_on_console(void);
|
||||||
|
|
||||||
|
const char *log_target_to_string(LogTarget target);
|
||||||
|
LogTarget log_target_from_string(const char *s);
|
||||||
|
|
||||||
|
#define MESSAGE_ID(x) "MESSAGE_ID=" SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(x)
|
242
src/shared/macro.h
Normal file
242
src/shared/macro.h
Normal file
@ -0,0 +1,242 @@
|
|||||||
|
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/***
|
||||||
|
This file is part of systemd.
|
||||||
|
|
||||||
|
Copyright 2010 Lennart Poettering
|
||||||
|
|
||||||
|
systemd 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.
|
||||||
|
|
||||||
|
systemd 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 systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
***/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/uio.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
#define _printf_attr_(a,b) __attribute__ ((format (printf, a, b)))
|
||||||
|
#define _sentinel_ __attribute__ ((sentinel))
|
||||||
|
#define _noreturn_ __attribute__((noreturn))
|
||||||
|
#define _unused_ __attribute__ ((unused))
|
||||||
|
#define _destructor_ __attribute__ ((destructor))
|
||||||
|
#define _pure_ __attribute__ ((pure))
|
||||||
|
#define _const_ __attribute__ ((const))
|
||||||
|
#define _deprecated_ __attribute__ ((deprecated))
|
||||||
|
#define _packed_ __attribute__ ((packed))
|
||||||
|
#define _malloc_ __attribute__ ((malloc))
|
||||||
|
#define _weak_ __attribute__ ((weak))
|
||||||
|
#define _likely_(x) (__builtin_expect(!!(x),1))
|
||||||
|
#define _unlikely_(x) (__builtin_expect(!!(x),0))
|
||||||
|
#define _public_ __attribute__ ((visibility("default")))
|
||||||
|
#define _hidden_ __attribute__ ((visibility("hidden")))
|
||||||
|
#define _weakref_(x) __attribute__((weakref(#x)))
|
||||||
|
#define _introspect_(x) __attribute__((section("introspect." x)))
|
||||||
|
#define _alignas_(x) __attribute__((aligned(__alignof(x))))
|
||||||
|
|
||||||
|
#define XSTRINGIFY(x) #x
|
||||||
|
#define STRINGIFY(x) XSTRINGIFY(x)
|
||||||
|
|
||||||
|
/* Rounds up */
|
||||||
|
#define ALIGN(l) ALIGN_TO((l), sizeof(void*))
|
||||||
|
static inline size_t ALIGN_TO(size_t l, size_t ali) {
|
||||||
|
return ((l + ali - 1) & ~(ali - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ELEMENTSOF(x) (sizeof(x)/sizeof((x)[0]))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* container_of - cast a member of a structure out to the containing structure
|
||||||
|
* @ptr: the pointer to the member.
|
||||||
|
* @type: the type of the container struct this is embedded in.
|
||||||
|
* @member: the name of the member within the struct.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define container_of(ptr, type, member) ({ \
|
||||||
|
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
|
||||||
|
(type *)( (char *)__mptr - offsetof(type,member) );})
|
||||||
|
|
||||||
|
#ifndef MAX
|
||||||
|
#define MAX(a,b) \
|
||||||
|
__extension__ ({ \
|
||||||
|
typeof(a) _a = (a); \
|
||||||
|
typeof(b) _b = (b); \
|
||||||
|
_a > _b ? _a : _b; \
|
||||||
|
})
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MAX3(a,b,c) \
|
||||||
|
MAX(MAX(a,b),c)
|
||||||
|
|
||||||
|
#ifndef MIN
|
||||||
|
#define MIN(a,b) \
|
||||||
|
__extension__ ({ \
|
||||||
|
typeof(a) _a = (a); \
|
||||||
|
typeof(b) _b = (b); \
|
||||||
|
_a < _b ? _a : _b; \
|
||||||
|
})
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MIN3(a,b,c) \
|
||||||
|
MIN(MIN(a,b),c)
|
||||||
|
|
||||||
|
#define CLAMP(x, low, high) \
|
||||||
|
__extension__ ({ \
|
||||||
|
typeof(x) _x = (x); \
|
||||||
|
typeof(low) _low = (low); \
|
||||||
|
typeof(high) _high = (high); \
|
||||||
|
((_x > _high) ? _high : ((_x < _low) ? _low : _x)); \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define assert_se(expr) \
|
||||||
|
do { \
|
||||||
|
if (_unlikely_(!(expr))) \
|
||||||
|
log_assert_failed(#expr, __FILE__, __LINE__, __PRETTY_FUNCTION__); \
|
||||||
|
} while (false) \
|
||||||
|
|
||||||
|
/* We override the glibc assert() here. */
|
||||||
|
#undef assert
|
||||||
|
#ifdef NDEBUG
|
||||||
|
#define assert(expr) do {} while(false)
|
||||||
|
#else
|
||||||
|
#define assert(expr) assert_se(expr)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define assert_not_reached(t) \
|
||||||
|
do { \
|
||||||
|
log_assert_failed_unreachable(t, __FILE__, __LINE__, __PRETTY_FUNCTION__); \
|
||||||
|
} while (false)
|
||||||
|
|
||||||
|
#define assert_cc(expr) \
|
||||||
|
do { \
|
||||||
|
switch (0) { \
|
||||||
|
case 0: \
|
||||||
|
case !!(expr): \
|
||||||
|
; \
|
||||||
|
} \
|
||||||
|
} while (false)
|
||||||
|
|
||||||
|
#define PTR_TO_UINT(p) ((unsigned int) ((uintptr_t) (p)))
|
||||||
|
#define UINT_TO_PTR(u) ((void*) ((uintptr_t) (u)))
|
||||||
|
|
||||||
|
#define PTR_TO_UINT32(p) ((uint32_t) ((uintptr_t) (p)))
|
||||||
|
#define UINT32_TO_PTR(u) ((void*) ((uintptr_t) (u)))
|
||||||
|
|
||||||
|
#define PTR_TO_ULONG(p) ((unsigned long) ((uintptr_t) (p)))
|
||||||
|
#define ULONG_TO_PTR(u) ((void*) ((uintptr_t) (u)))
|
||||||
|
|
||||||
|
#define PTR_TO_INT(p) ((int) ((intptr_t) (p)))
|
||||||
|
#define INT_TO_PTR(u) ((void*) ((intptr_t) (u)))
|
||||||
|
|
||||||
|
#define TO_INT32(p) ((int32_t) ((intptr_t) (p)))
|
||||||
|
#define INT32_TO_PTR(u) ((void*) ((intptr_t) (u)))
|
||||||
|
|
||||||
|
#define PTR_TO_LONG(p) ((long) ((intptr_t) (p)))
|
||||||
|
#define LONG_TO_PTR(u) ((void*) ((intptr_t) (u)))
|
||||||
|
|
||||||
|
#define memzero(x,l) (memset((x), 0, (l)))
|
||||||
|
#define zero(x) (memzero(&(x), sizeof(x)))
|
||||||
|
|
||||||
|
#define char_array_0(x) x[sizeof(x)-1] = 0;
|
||||||
|
|
||||||
|
#define IOVEC_SET_STRING(i, s) \
|
||||||
|
do { \
|
||||||
|
struct iovec *_i = &(i); \
|
||||||
|
char *_s = (char *)(s); \
|
||||||
|
_i->iov_base = _s; \
|
||||||
|
_i->iov_len = strlen(_s); \
|
||||||
|
} while(false)
|
||||||
|
|
||||||
|
static inline size_t IOVEC_TOTAL_SIZE(const struct iovec *i, unsigned n) {
|
||||||
|
unsigned j;
|
||||||
|
size_t r = 0;
|
||||||
|
|
||||||
|
for (j = 0; j < n; j++)
|
||||||
|
r += i[j].iov_len;
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline size_t IOVEC_INCREMENT(struct iovec *i, unsigned n, size_t k) {
|
||||||
|
unsigned j;
|
||||||
|
|
||||||
|
for (j = 0; j < n; j++) {
|
||||||
|
size_t sub;
|
||||||
|
|
||||||
|
if (_unlikely_(k <= 0))
|
||||||
|
break;
|
||||||
|
|
||||||
|
sub = MIN(i[j].iov_len, k);
|
||||||
|
i[j].iov_len -= sub;
|
||||||
|
i[j].iov_base = (uint8_t*) i[j].iov_base + sub;
|
||||||
|
k -= sub;
|
||||||
|
}
|
||||||
|
|
||||||
|
return k;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define _cleanup_free_ __attribute__((cleanup(freep)))
|
||||||
|
#define _cleanup_fclose_ __attribute__((cleanup(fclosep)))
|
||||||
|
#define _cleanup_close_ __attribute__((cleanup(closep)))
|
||||||
|
#define _cleanup_closedir_ __attribute__((cleanup(closedirp)))
|
||||||
|
#define _cleanup_umask_ __attribute__((cleanup(umaskp)))
|
||||||
|
#define _cleanup_strv_free_ __attribute__((cleanup(strv_freep)))
|
||||||
|
|
||||||
|
#define VA_FORMAT_ADVANCE(format, ap) \
|
||||||
|
do { \
|
||||||
|
int _argtypes[128]; \
|
||||||
|
size_t _i, _k; \
|
||||||
|
_k = parse_printf_format((format), ELEMENTSOF(_argtypes), _argtypes); \
|
||||||
|
assert(_k < ELEMENTSOF(_argtypes)); \
|
||||||
|
for (_i = 0; _i < _k; _i++) { \
|
||||||
|
if (_argtypes[_i] & PA_FLAG_PTR) { \
|
||||||
|
(void) va_arg(ap, void*); \
|
||||||
|
continue; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
switch (_argtypes[_i]) { \
|
||||||
|
case PA_INT: \
|
||||||
|
case PA_INT|PA_FLAG_SHORT: \
|
||||||
|
case PA_CHAR: \
|
||||||
|
(void) va_arg(ap, int); \
|
||||||
|
break; \
|
||||||
|
case PA_INT|PA_FLAG_LONG: \
|
||||||
|
(void) va_arg(ap, long int); \
|
||||||
|
break; \
|
||||||
|
case PA_INT|PA_FLAG_LONG_LONG: \
|
||||||
|
(void) va_arg(ap, long long int); \
|
||||||
|
break; \
|
||||||
|
case PA_WCHAR: \
|
||||||
|
(void) va_arg(ap, wchar_t); \
|
||||||
|
break; \
|
||||||
|
case PA_WSTRING: \
|
||||||
|
case PA_STRING: \
|
||||||
|
case PA_POINTER: \
|
||||||
|
(void) va_arg(ap, void*); \
|
||||||
|
break; \
|
||||||
|
case PA_FLOAT: \
|
||||||
|
case PA_DOUBLE: \
|
||||||
|
(void) va_arg(ap, double); \
|
||||||
|
break; \
|
||||||
|
case PA_DOUBLE|PA_FLAG_LONG_DOUBLE: \
|
||||||
|
(void) va_arg(ap, long double); \
|
||||||
|
break; \
|
||||||
|
default: \
|
||||||
|
assert_not_reached("Unknown format string argument."); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} while(false)
|
||||||
|
|
||||||
|
#include "log.h"
|
255
src/shared/missing.h
Normal file
255
src/shared/missing.h
Normal file
@ -0,0 +1,255 @@
|
|||||||
|
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/***
|
||||||
|
This file is part of systemd.
|
||||||
|
|
||||||
|
Copyright 2010 Lennart Poettering
|
||||||
|
|
||||||
|
systemd 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.
|
||||||
|
|
||||||
|
systemd 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 systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
***/
|
||||||
|
|
||||||
|
/* Missing glibc definitions to access certain kernel APIs */
|
||||||
|
|
||||||
|
#include <sys/resource.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <linux/oom.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_AUDIT
|
||||||
|
#include <libaudit.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "macro.h"
|
||||||
|
|
||||||
|
#ifdef ARCH_MIPS
|
||||||
|
#include <asm/sgidefs.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef RLIMIT_RTTIME
|
||||||
|
#define RLIMIT_RTTIME 15
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef F_LINUX_SPECIFIC_BASE
|
||||||
|
#define F_LINUX_SPECIFIC_BASE 1024
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef F_SETPIPE_SZ
|
||||||
|
#define F_SETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 7)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef F_GETPIPE_SZ
|
||||||
|
#define F_GETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 8)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef IP_FREEBIND
|
||||||
|
#define IP_FREEBIND 15
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef OOM_SCORE_ADJ_MIN
|
||||||
|
#define OOM_SCORE_ADJ_MIN (-1000)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef OOM_SCORE_ADJ_MAX
|
||||||
|
#define OOM_SCORE_ADJ_MAX 1000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef AUDIT_SERVICE_START
|
||||||
|
#define AUDIT_SERVICE_START 1130 /* Service (daemon) start */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef AUDIT_SERVICE_STOP
|
||||||
|
#define AUDIT_SERVICE_STOP 1131 /* Service (daemon) stop */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TIOCVHANGUP
|
||||||
|
#define TIOCVHANGUP 0x5437
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef IP_TRANSPARENT
|
||||||
|
#define IP_TRANSPARENT 19
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !HAVE_DECL_PIVOT_ROOT
|
||||||
|
static inline int pivot_root(const char *new_root, const char *put_old) {
|
||||||
|
return syscall(SYS_pivot_root, new_root, put_old);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __x86_64__
|
||||||
|
# ifndef __NR_fanotify_init
|
||||||
|
# define __NR_fanotify_init 300
|
||||||
|
# endif
|
||||||
|
# ifndef __NR_fanotify_mark
|
||||||
|
# define __NR_fanotify_mark 301
|
||||||
|
# endif
|
||||||
|
#elif defined _MIPS_SIM
|
||||||
|
# if _MIPS_SIM == _MIPS_SIM_ABI32
|
||||||
|
# ifndef __NR_fanotify_init
|
||||||
|
# define __NR_fanotify_init 4336
|
||||||
|
# endif
|
||||||
|
# ifndef __NR_fanotify_mark
|
||||||
|
# define __NR_fanotify_mark 4337
|
||||||
|
# endif
|
||||||
|
# elif _MIPS_SIM == _MIPS_SIM_NABI32
|
||||||
|
# ifndef __NR_fanotify_init
|
||||||
|
# define __NR_fanotify_init 6300
|
||||||
|
# endif
|
||||||
|
# ifndef __NR_fanotify_mark
|
||||||
|
# define __NR_fanotify_mark 6301
|
||||||
|
# endif
|
||||||
|
# elif _MIPS_SIM == _MIPS_SIM_ABI64
|
||||||
|
# ifndef __NR_fanotify_init
|
||||||
|
# define __NR_fanotify_init 5295
|
||||||
|
# endif
|
||||||
|
# ifndef __NR_fanotify_mark
|
||||||
|
# define __NR_fanotify_mark 5296
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# ifndef __NR_fanotify_init
|
||||||
|
# define __NR_fanotify_init 338
|
||||||
|
# endif
|
||||||
|
# ifndef __NR_fanotify_mark
|
||||||
|
# define __NR_fanotify_mark 339
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_FANOTIFY_INIT
|
||||||
|
static inline int fanotify_init(unsigned int flags, unsigned int event_f_flags) {
|
||||||
|
return syscall(__NR_fanotify_init, flags, event_f_flags);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_FANOTIFY_MARK
|
||||||
|
static inline int fanotify_mark(int fanotify_fd, unsigned int flags, uint64_t mask,
|
||||||
|
int dfd, const char *pathname) {
|
||||||
|
#if defined _MIPS_SIM && _MIPS_SIM == _MIPS_SIM_ABI32 || defined __powerpc__ && !defined __powerpc64__
|
||||||
|
union {
|
||||||
|
uint64_t _64;
|
||||||
|
uint32_t _32[2];
|
||||||
|
} _mask;
|
||||||
|
_mask._64 = mask;
|
||||||
|
|
||||||
|
return syscall(__NR_fanotify_mark, fanotify_fd, flags,
|
||||||
|
_mask._32[0], _mask._32[1], dfd, pathname);
|
||||||
|
#else
|
||||||
|
return syscall(__NR_fanotify_mark, fanotify_fd, flags, mask, dfd, pathname);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef BTRFS_IOCTL_MAGIC
|
||||||
|
#define BTRFS_IOCTL_MAGIC 0x94
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef BTRFS_PATH_NAME_MAX
|
||||||
|
#define BTRFS_PATH_NAME_MAX 4087
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct btrfs_ioctl_vol_args {
|
||||||
|
int64_t fd;
|
||||||
|
char name[BTRFS_PATH_NAME_MAX + 1];
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifndef BTRFS_IOC_DEFRAG
|
||||||
|
#define BTRFS_IOC_DEFRAG _IOW(BTRFS_IOCTL_MAGIC, 2, struct btrfs_ioctl_vol_args)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef BTRFS_SUPER_MAGIC
|
||||||
|
#define BTRFS_SUPER_MAGIC 0x9123683E
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MS_MOVE
|
||||||
|
#define MS_MOVE 8192
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MS_PRIVATE
|
||||||
|
#define MS_PRIVATE (1 << 18)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !HAVE_DECL_GETTID
|
||||||
|
static inline pid_t gettid(void) {
|
||||||
|
return (pid_t) syscall(SYS_gettid);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SCM_SECURITY
|
||||||
|
#define SCM_SECURITY 0x03
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MS_STRICTATIME
|
||||||
|
#define MS_STRICTATIME (1<<24)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef PR_SET_NO_NEW_PRIVS
|
||||||
|
#define PR_SET_NO_NEW_PRIVS 38
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef PR_SET_CHILD_SUBREAPER
|
||||||
|
#define PR_SET_CHILD_SUBREAPER 36
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MAX_HANDLE_SZ
|
||||||
|
#define MAX_HANDLE_SZ 128
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined __x86_64__
|
||||||
|
# ifndef __NR_name_to_handle_at
|
||||||
|
# define __NR_name_to_handle_at 303
|
||||||
|
# endif
|
||||||
|
#elif defined __i386__
|
||||||
|
# ifndef __NR_name_to_handle_at
|
||||||
|
# define __NR_name_to_handle_at 341
|
||||||
|
# endif
|
||||||
|
#elif defined __arm__
|
||||||
|
# ifndef __NR_name_to_handle_at
|
||||||
|
# define __NR_name_to_handle_at 370
|
||||||
|
# endif
|
||||||
|
#elif defined __powerpc__
|
||||||
|
# ifndef __NR_name_to_handle_at
|
||||||
|
# define __NR_name_to_handle_at 345
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# ifndef __NR_name_to_handle_at
|
||||||
|
# error __NR_name_to_handle_at is not defined
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !HAVE_DECL_NAME_TO_HANDLE_AT
|
||||||
|
struct file_handle {
|
||||||
|
unsigned int handle_bytes;
|
||||||
|
int handle_type;
|
||||||
|
unsigned char f_handle[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline int name_to_handle_at(int fd, const char *name, struct file_handle *handle, int *mnt_id, int flags) {
|
||||||
|
return syscall(__NR_name_to_handle_at, fd, name, handle, mnt_id, flags);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_SECURE_GETENV
|
||||||
|
# ifdef HAVE___SECURE_GETENV
|
||||||
|
# define secure_getenv __secure_getenv
|
||||||
|
# else
|
||||||
|
# error neither secure_getenv nor __secure_getenv are available
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CIFS_MAGIC_NUMBER
|
||||||
|
#define CIFS_MAGIC_NUMBER 0xFF534D42
|
||||||
|
#endif
|
32
src/shared/mkdir.h
Normal file
32
src/shared/mkdir.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||||
|
|
||||||
|
#ifndef foomkdirhfoo
|
||||||
|
#define foomkdirhfoo
|
||||||
|
|
||||||
|
/***
|
||||||
|
This file is part of systemd.
|
||||||
|
|
||||||
|
Copyright 2010 Lennart Poettering
|
||||||
|
|
||||||
|
systemd 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.
|
||||||
|
|
||||||
|
systemd 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 systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
***/
|
||||||
|
|
||||||
|
int mkdir_label(const char *path, mode_t mode);
|
||||||
|
int mkdir_safe(const char *path, mode_t mode, uid_t uid, gid_t gid);
|
||||||
|
int mkdir_safe_label(const char *path, mode_t mode, uid_t uid, gid_t gid);
|
||||||
|
int mkdir_parents(const char *path, mode_t mode);
|
||||||
|
int mkdir_parents_label(const char *path, mode_t mode);
|
||||||
|
int mkdir_p(const char *path, mode_t mode);
|
||||||
|
int mkdir_p_label(const char *path, mode_t mode);
|
||||||
|
#endif
|
615
src/shared/util.h
Normal file
615
src/shared/util.h
Normal file
@ -0,0 +1,615 @@
|
|||||||
|
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/***
|
||||||
|
This file is part of systemd.
|
||||||
|
|
||||||
|
Copyright 2010 Lennart Poettering
|
||||||
|
|
||||||
|
systemd 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.
|
||||||
|
|
||||||
|
systemd 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 systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
***/
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <sys/resource.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#include "macro.h"
|
||||||
|
|
||||||
|
typedef uint64_t usec_t;
|
||||||
|
typedef uint64_t nsec_t;
|
||||||
|
|
||||||
|
typedef struct dual_timestamp {
|
||||||
|
usec_t realtime;
|
||||||
|
usec_t monotonic;
|
||||||
|
} dual_timestamp;
|
||||||
|
|
||||||
|
union dirent_storage {
|
||||||
|
struct dirent de;
|
||||||
|
uint8_t storage[offsetof(struct dirent, d_name) +
|
||||||
|
((NAME_MAX + 1 + sizeof(long)) & ~(sizeof(long) - 1))];
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MSEC_PER_SEC 1000ULL
|
||||||
|
#define USEC_PER_SEC 1000000ULL
|
||||||
|
#define USEC_PER_MSEC 1000ULL
|
||||||
|
#define NSEC_PER_SEC 1000000000ULL
|
||||||
|
#define NSEC_PER_MSEC 1000000ULL
|
||||||
|
#define NSEC_PER_USEC 1000ULL
|
||||||
|
|
||||||
|
#define USEC_PER_MINUTE (60ULL*USEC_PER_SEC)
|
||||||
|
#define NSEC_PER_MINUTE (60ULL*NSEC_PER_SEC)
|
||||||
|
#define USEC_PER_HOUR (60ULL*USEC_PER_MINUTE)
|
||||||
|
#define NSEC_PER_HOUR (60ULL*NSEC_PER_MINUTE)
|
||||||
|
#define USEC_PER_DAY (24ULL*USEC_PER_HOUR)
|
||||||
|
#define NSEC_PER_DAY (24ULL*NSEC_PER_HOUR)
|
||||||
|
#define USEC_PER_WEEK (7ULL*USEC_PER_DAY)
|
||||||
|
#define NSEC_PER_WEEK (7ULL*NSEC_PER_DAY)
|
||||||
|
#define USEC_PER_MONTH (2629800ULL*USEC_PER_SEC)
|
||||||
|
#define NSEC_PER_MONTH (2629800ULL*NSEC_PER_SEC)
|
||||||
|
#define USEC_PER_YEAR (31557600ULL*USEC_PER_SEC)
|
||||||
|
#define NSEC_PER_YEAR (31557600ULL*NSEC_PER_SEC)
|
||||||
|
|
||||||
|
/* What is interpreted as whitespace? */
|
||||||
|
#define WHITESPACE " \t\n\r"
|
||||||
|
#define NEWLINE "\n\r"
|
||||||
|
#define QUOTES "\"\'"
|
||||||
|
#define COMMENTS "#;\n"
|
||||||
|
|
||||||
|
#define FORMAT_TIMESTAMP_MAX (5+11+9+4+1)
|
||||||
|
#define FORMAT_TIMESTAMP_PRETTY_MAX 256
|
||||||
|
#define FORMAT_TIMESPAN_MAX 64
|
||||||
|
#define FORMAT_BYTES_MAX 8
|
||||||
|
|
||||||
|
#define ANSI_HIGHLIGHT_ON "\x1B[1;39m"
|
||||||
|
#define ANSI_HIGHLIGHT_RED_ON "\x1B[1;31m"
|
||||||
|
#define ANSI_HIGHLIGHT_GREEN_ON "\x1B[1;32m"
|
||||||
|
#define ANSI_HIGHLIGHT_YELLOW_ON "\x1B[1;33m"
|
||||||
|
#define ANSI_HIGHLIGHT_OFF "\x1B[0m"
|
||||||
|
|
||||||
|
bool is_efiboot(void);
|
||||||
|
|
||||||
|
usec_t now(clockid_t clock);
|
||||||
|
|
||||||
|
dual_timestamp* dual_timestamp_get(dual_timestamp *ts);
|
||||||
|
dual_timestamp* dual_timestamp_from_realtime(dual_timestamp *ts, usec_t u);
|
||||||
|
|
||||||
|
#define dual_timestamp_is_set(ts) ((ts)->realtime > 0)
|
||||||
|
|
||||||
|
usec_t timespec_load(const struct timespec *ts);
|
||||||
|
struct timespec *timespec_store(struct timespec *ts, usec_t u);
|
||||||
|
|
||||||
|
usec_t timeval_load(const struct timeval *tv);
|
||||||
|
struct timeval *timeval_store(struct timeval *tv, usec_t u);
|
||||||
|
|
||||||
|
size_t page_size(void);
|
||||||
|
#define PAGE_ALIGN(l) ALIGN_TO((l), page_size())
|
||||||
|
|
||||||
|
#define streq(a,b) (strcmp((a),(b)) == 0)
|
||||||
|
#define strneq(a, b, n) (strncmp((a), (b), (n)) == 0)
|
||||||
|
|
||||||
|
bool streq_ptr(const char *a, const char *b);
|
||||||
|
|
||||||
|
#define new(t, n) ((t*) malloc_multiply(sizeof(t), (n)))
|
||||||
|
|
||||||
|
#define new0(t, n) ((t*) calloc((n), sizeof(t)))
|
||||||
|
|
||||||
|
#define newa(t, n) ((t*) alloca(sizeof(t)*(n)))
|
||||||
|
|
||||||
|
#define newdup(t, p, n) ((t*) memdup_multiply(p, sizeof(t), (n)))
|
||||||
|
|
||||||
|
#define malloc0(n) (calloc((n), 1))
|
||||||
|
|
||||||
|
static inline const char* yes_no(bool b) {
|
||||||
|
return b ? "yes" : "no";
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline const char* strempty(const char *s) {
|
||||||
|
return s ? s : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline const char* strnull(const char *s) {
|
||||||
|
return s ? s : "(null)";
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline const char *strna(const char *s) {
|
||||||
|
return s ? s : "n/a";
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool isempty(const char *p) {
|
||||||
|
return !p || !p[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
char *endswith(const char *s, const char *postfix);
|
||||||
|
char *startswith(const char *s, const char *prefix);
|
||||||
|
char *startswith_no_case(const char *s, const char *prefix);
|
||||||
|
|
||||||
|
bool first_word(const char *s, const char *word);
|
||||||
|
|
||||||
|
int close_nointr(int fd);
|
||||||
|
void close_nointr_nofail(int fd);
|
||||||
|
void close_many(const int fds[], unsigned n_fd);
|
||||||
|
|
||||||
|
int parse_boolean(const char *v);
|
||||||
|
int parse_usec(const char *t, usec_t *usec);
|
||||||
|
int parse_nsec(const char *t, nsec_t *nsec);
|
||||||
|
int parse_bytes(const char *t, off_t *bytes);
|
||||||
|
int parse_pid(const char *s, pid_t* ret_pid);
|
||||||
|
int parse_uid(const char *s, uid_t* ret_uid);
|
||||||
|
#define parse_gid(s, ret_uid) parse_uid(s, ret_uid)
|
||||||
|
|
||||||
|
int safe_atou(const char *s, unsigned *ret_u);
|
||||||
|
int safe_atoi(const char *s, int *ret_i);
|
||||||
|
|
||||||
|
int safe_atollu(const char *s, unsigned long long *ret_u);
|
||||||
|
int safe_atolli(const char *s, long long int *ret_i);
|
||||||
|
|
||||||
|
#if __WORDSIZE == 32
|
||||||
|
static inline int safe_atolu(const char *s, unsigned long *ret_u) {
|
||||||
|
assert_cc(sizeof(unsigned long) == sizeof(unsigned));
|
||||||
|
return safe_atou(s, (unsigned*) ret_u);
|
||||||
|
}
|
||||||
|
static inline int safe_atoli(const char *s, long int *ret_u) {
|
||||||
|
assert_cc(sizeof(long int) == sizeof(int));
|
||||||
|
return safe_atoi(s, (int*) ret_u);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline int safe_atolu(const char *s, unsigned long *ret_u) {
|
||||||
|
assert_cc(sizeof(unsigned long) == sizeof(unsigned long long));
|
||||||
|
return safe_atollu(s, (unsigned long long*) ret_u);
|
||||||
|
}
|
||||||
|
static inline int safe_atoli(const char *s, long int *ret_u) {
|
||||||
|
assert_cc(sizeof(long int) == sizeof(long long int));
|
||||||
|
return safe_atolli(s, (long long int*) ret_u);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline int safe_atou32(const char *s, uint32_t *ret_u) {
|
||||||
|
assert_cc(sizeof(uint32_t) == sizeof(unsigned));
|
||||||
|
return safe_atou(s, (unsigned*) ret_u);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int safe_atoi32(const char *s, int32_t *ret_i) {
|
||||||
|
assert_cc(sizeof(int32_t) == sizeof(int));
|
||||||
|
return safe_atoi(s, (int*) ret_i);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int safe_atou64(const char *s, uint64_t *ret_u) {
|
||||||
|
assert_cc(sizeof(uint64_t) == sizeof(unsigned long long));
|
||||||
|
return safe_atollu(s, (unsigned long long*) ret_u);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int safe_atoi64(const char *s, int64_t *ret_i) {
|
||||||
|
assert_cc(sizeof(int64_t) == sizeof(long long int));
|
||||||
|
return safe_atolli(s, (long long int*) ret_i);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *split(const char *c, size_t *l, const char *separator, char **state);
|
||||||
|
char *split_quoted(const char *c, size_t *l, char **state);
|
||||||
|
|
||||||
|
#define FOREACH_WORD(word, length, s, state) \
|
||||||
|
for ((state) = NULL, (word) = split((s), &(length), WHITESPACE, &(state)); (word); (word) = split((s), &(length), WHITESPACE, &(state)))
|
||||||
|
|
||||||
|
#define FOREACH_WORD_SEPARATOR(word, length, s, separator, state) \
|
||||||
|
for ((state) = NULL, (word) = split((s), &(length), (separator), &(state)); (word); (word) = split((s), &(length), (separator), &(state)))
|
||||||
|
|
||||||
|
#define FOREACH_WORD_QUOTED(word, length, s, state) \
|
||||||
|
for ((state) = NULL, (word) = split_quoted((s), &(length), &(state)); (word); (word) = split_quoted((s), &(length), &(state)))
|
||||||
|
|
||||||
|
pid_t get_parent_of_pid(pid_t pid, pid_t *ppid);
|
||||||
|
int get_starttime_of_pid(pid_t pid, unsigned long long *st);
|
||||||
|
|
||||||
|
int write_one_line_file(const char *fn, const char *line);
|
||||||
|
int write_one_line_file_atomic(const char *fn, const char *line);
|
||||||
|
int read_one_line_file(const char *fn, char **line);
|
||||||
|
int read_full_file(const char *fn, char **contents, size_t *size);
|
||||||
|
|
||||||
|
int parse_env_file(const char *fname, const char *separator, ...) _sentinel_;
|
||||||
|
int load_env_file(const char *fname, char ***l);
|
||||||
|
int write_env_file(const char *fname, char **l);
|
||||||
|
|
||||||
|
char *strappend(const char *s, const char *suffix);
|
||||||
|
char *strnappend(const char *s, const char *suffix, size_t length);
|
||||||
|
|
||||||
|
char *replace_env(const char *format, char **env);
|
||||||
|
char **replace_env_argv(char **argv, char **env);
|
||||||
|
|
||||||
|
int readlink_malloc(const char *p, char **r);
|
||||||
|
int readlink_and_make_absolute(const char *p, char **r);
|
||||||
|
int readlink_and_canonicalize(const char *p, char **r);
|
||||||
|
|
||||||
|
int reset_all_signal_handlers(void);
|
||||||
|
|
||||||
|
char *strstrip(char *s);
|
||||||
|
char *delete_chars(char *s, const char *bad);
|
||||||
|
char *truncate_nl(char *s);
|
||||||
|
|
||||||
|
char *file_in_same_dir(const char *path, const char *filename);
|
||||||
|
|
||||||
|
int rmdir_parents(const char *path, const char *stop);
|
||||||
|
|
||||||
|
int get_process_comm(pid_t pid, char **name);
|
||||||
|
int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line);
|
||||||
|
int get_process_exe(pid_t pid, char **name);
|
||||||
|
int get_process_uid(pid_t pid, uid_t *uid);
|
||||||
|
int get_process_gid(pid_t pid, gid_t *gid);
|
||||||
|
|
||||||
|
char hexchar(int x);
|
||||||
|
int unhexchar(char c);
|
||||||
|
char octchar(int x);
|
||||||
|
int unoctchar(char c);
|
||||||
|
char decchar(int x);
|
||||||
|
int undecchar(char c);
|
||||||
|
|
||||||
|
char *cescape(const char *s);
|
||||||
|
char *cunescape(const char *s);
|
||||||
|
char *cunescape_length(const char *s, size_t length);
|
||||||
|
char *cunescape_length_with_prefix(const char *s, size_t length, const char *prefix);
|
||||||
|
|
||||||
|
char *xescape(const char *s, const char *bad);
|
||||||
|
|
||||||
|
char *bus_path_escape(const char *s);
|
||||||
|
char *bus_path_unescape(const char *s);
|
||||||
|
|
||||||
|
char *ascii_strlower(char *path);
|
||||||
|
|
||||||
|
bool dirent_is_file(const struct dirent *de);
|
||||||
|
bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix);
|
||||||
|
|
||||||
|
bool ignore_file(const char *filename);
|
||||||
|
|
||||||
|
bool chars_intersect(const char *a, const char *b);
|
||||||
|
|
||||||
|
char *format_timestamp(char *buf, size_t l, usec_t t);
|
||||||
|
char *format_timestamp_pretty(char *buf, size_t l, usec_t t);
|
||||||
|
char *format_timespan(char *buf, size_t l, usec_t t);
|
||||||
|
|
||||||
|
int make_stdio(int fd);
|
||||||
|
int make_null_stdio(void);
|
||||||
|
int make_console_stdio(void);
|
||||||
|
|
||||||
|
unsigned long long random_ull(void);
|
||||||
|
|
||||||
|
/* For basic lookup tables with strictly enumerated entries */
|
||||||
|
#define __DEFINE_STRING_TABLE_LOOKUP(name,type,scope) \
|
||||||
|
scope const char *name##_to_string(type i) { \
|
||||||
|
if (i < 0 || i >= (type) ELEMENTSOF(name##_table)) \
|
||||||
|
return NULL; \
|
||||||
|
return name##_table[i]; \
|
||||||
|
} \
|
||||||
|
scope type name##_from_string(const char *s) { \
|
||||||
|
type i; \
|
||||||
|
assert(s); \
|
||||||
|
for (i = 0; i < (type)ELEMENTSOF(name##_table); i++) \
|
||||||
|
if (name##_table[i] && \
|
||||||
|
streq(name##_table[i], s)) \
|
||||||
|
return i; \
|
||||||
|
return (type) -1; \
|
||||||
|
} \
|
||||||
|
struct __useless_struct_to_allow_trailing_semicolon__
|
||||||
|
|
||||||
|
#define DEFINE_STRING_TABLE_LOOKUP(name,type) __DEFINE_STRING_TABLE_LOOKUP(name,type,)
|
||||||
|
#define DEFINE_PRIVATE_STRING_TABLE_LOOKUP(name,type) __DEFINE_STRING_TABLE_LOOKUP(name,type,static)
|
||||||
|
|
||||||
|
/* For string conversions where numbers are also acceptable */
|
||||||
|
#define DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(name,type,max) \
|
||||||
|
int name##_to_string_alloc(type i, char **str) { \
|
||||||
|
char *s; \
|
||||||
|
int r; \
|
||||||
|
if (i < 0 || i > max) \
|
||||||
|
return -ERANGE; \
|
||||||
|
if (i < (type) ELEMENTSOF(name##_table)) { \
|
||||||
|
s = strdup(name##_table[i]); \
|
||||||
|
if (!s) \
|
||||||
|
return log_oom(); \
|
||||||
|
} else { \
|
||||||
|
r = asprintf(&s, "%u", i); \
|
||||||
|
if (r < 0) \
|
||||||
|
return log_oom(); \
|
||||||
|
} \
|
||||||
|
*str = s; \
|
||||||
|
return 0; \
|
||||||
|
} \
|
||||||
|
type name##_from_string(const char *s) { \
|
||||||
|
type i; \
|
||||||
|
unsigned u = 0; \
|
||||||
|
assert(s); \
|
||||||
|
for (i = 0; i < (type)ELEMENTSOF(name##_table); i++) \
|
||||||
|
if (name##_table[i] && \
|
||||||
|
streq(name##_table[i], s)) \
|
||||||
|
return i; \
|
||||||
|
if (safe_atou(s, &u) >= 0 && u <= max) \
|
||||||
|
return (type) u; \
|
||||||
|
return (type) -1; \
|
||||||
|
} \
|
||||||
|
struct __useless_struct_to_allow_trailing_semicolon__
|
||||||
|
|
||||||
|
int fd_nonblock(int fd, bool nonblock);
|
||||||
|
int fd_cloexec(int fd, bool cloexec);
|
||||||
|
|
||||||
|
int close_all_fds(const int except[], unsigned n_except);
|
||||||
|
|
||||||
|
bool fstype_is_network(const char *fstype);
|
||||||
|
|
||||||
|
int chvt(int vt);
|
||||||
|
|
||||||
|
int read_one_char(FILE *f, char *ret, usec_t timeout, bool *need_nl);
|
||||||
|
int ask(char *ret, const char *replies, const char *text, ...);
|
||||||
|
|
||||||
|
int reset_terminal_fd(int fd, bool switch_to_text);
|
||||||
|
int reset_terminal(const char *name);
|
||||||
|
|
||||||
|
int open_terminal(const char *name, int mode);
|
||||||
|
int acquire_terminal(const char *name, bool fail, bool force, bool ignore_tiocstty_eperm, usec_t timeout);
|
||||||
|
int release_terminal(void);
|
||||||
|
|
||||||
|
int flush_fd(int fd);
|
||||||
|
|
||||||
|
int ignore_signals(int sig, ...);
|
||||||
|
int default_signals(int sig, ...);
|
||||||
|
int sigaction_many(const struct sigaction *sa, ...);
|
||||||
|
|
||||||
|
int close_pipe(int p[]);
|
||||||
|
int fopen_temporary(const char *path, FILE **_f, char **_temp_path);
|
||||||
|
|
||||||
|
ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll);
|
||||||
|
ssize_t loop_write(int fd, const void *buf, size_t nbytes, bool do_poll);
|
||||||
|
|
||||||
|
bool is_device_path(const char *path);
|
||||||
|
|
||||||
|
int dir_is_empty(const char *path);
|
||||||
|
|
||||||
|
void rename_process(const char name[8]);
|
||||||
|
|
||||||
|
void sigset_add_many(sigset_t *ss, ...);
|
||||||
|
|
||||||
|
bool hostname_is_set(void);
|
||||||
|
|
||||||
|
char* gethostname_malloc(void);
|
||||||
|
char* getlogname_malloc(void);
|
||||||
|
char* getusername_malloc(void);
|
||||||
|
|
||||||
|
int getttyname_malloc(int fd, char **r);
|
||||||
|
int getttyname_harder(int fd, char **r);
|
||||||
|
|
||||||
|
int get_ctty_devnr(pid_t pid, dev_t *d);
|
||||||
|
int get_ctty(pid_t, dev_t *_devnr, char **r);
|
||||||
|
|
||||||
|
int chmod_and_chown(const char *path, mode_t mode, uid_t uid, gid_t gid);
|
||||||
|
int fchmod_and_fchown(int fd, mode_t mode, uid_t uid, gid_t gid);
|
||||||
|
|
||||||
|
int rm_rf_children(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev);
|
||||||
|
int rm_rf_children_dangerous(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev);
|
||||||
|
int rm_rf(const char *path, bool only_dirs, bool delete_root, bool honour_sticky);
|
||||||
|
int rm_rf_dangerous(const char *path, bool only_dirs, bool delete_root, bool honour_sticky);
|
||||||
|
|
||||||
|
int pipe_eof(int fd);
|
||||||
|
|
||||||
|
cpu_set_t* cpu_set_malloc(unsigned *ncpus);
|
||||||
|
|
||||||
|
int status_vprintf(const char *status, bool ellipse, const char *format, va_list ap);
|
||||||
|
int status_printf(const char *status, bool ellipse, const char *format, ...);
|
||||||
|
int status_welcome(void);
|
||||||
|
|
||||||
|
int fd_columns(int fd);
|
||||||
|
unsigned columns(void);
|
||||||
|
int fd_lines(int fd);
|
||||||
|
unsigned lines(void);
|
||||||
|
void columns_lines_cache_reset(int _unused_ signum);
|
||||||
|
|
||||||
|
bool on_tty(void);
|
||||||
|
|
||||||
|
int running_in_chroot(void);
|
||||||
|
|
||||||
|
char *ellipsize(const char *s, size_t length, unsigned percent);
|
||||||
|
char *ellipsize_mem(const char *s, size_t old_length, size_t new_length, unsigned percent);
|
||||||
|
|
||||||
|
int touch(const char *path);
|
||||||
|
|
||||||
|
char *unquote(const char *s, const char *quotes);
|
||||||
|
char *normalize_env_assignment(const char *s);
|
||||||
|
|
||||||
|
int wait_for_terminate(pid_t pid, siginfo_t *status);
|
||||||
|
int wait_for_terminate_and_warn(const char *name, pid_t pid);
|
||||||
|
|
||||||
|
_noreturn_ void freeze(void);
|
||||||
|
|
||||||
|
bool null_or_empty(struct stat *st);
|
||||||
|
int null_or_empty_path(const char *fn);
|
||||||
|
|
||||||
|
DIR *xopendirat(int dirfd, const char *name, int flags);
|
||||||
|
|
||||||
|
void dual_timestamp_serialize(FILE *f, const char *name, dual_timestamp *t);
|
||||||
|
void dual_timestamp_deserialize(const char *value, dual_timestamp *t);
|
||||||
|
|
||||||
|
char *fstab_node_to_udev_node(const char *p);
|
||||||
|
|
||||||
|
bool tty_is_vc(const char *tty);
|
||||||
|
bool tty_is_vc_resolve(const char *tty);
|
||||||
|
bool tty_is_console(const char *tty);
|
||||||
|
int vtnr_from_tty(const char *tty);
|
||||||
|
const char *default_term_for_tty(const char *tty);
|
||||||
|
|
||||||
|
void execute_directory(const char *directory, DIR *_d, char *argv[]);
|
||||||
|
|
||||||
|
int kill_and_sigcont(pid_t pid, int sig);
|
||||||
|
|
||||||
|
bool nulstr_contains(const char*nulstr, const char *needle);
|
||||||
|
|
||||||
|
bool plymouth_running(void);
|
||||||
|
|
||||||
|
bool hostname_is_valid(const char *s);
|
||||||
|
char* hostname_cleanup(char *s);
|
||||||
|
|
||||||
|
char* strshorten(char *s, size_t l);
|
||||||
|
|
||||||
|
int terminal_vhangup_fd(int fd);
|
||||||
|
int terminal_vhangup(const char *name);
|
||||||
|
|
||||||
|
int vt_disallocate(const char *name);
|
||||||
|
|
||||||
|
int copy_file(const char *from, const char *to);
|
||||||
|
|
||||||
|
int symlink_atomic(const char *from, const char *to);
|
||||||
|
|
||||||
|
int fchmod_umask(int fd, mode_t mode);
|
||||||
|
|
||||||
|
bool display_is_local(const char *display);
|
||||||
|
int socket_from_display(const char *display, char **path);
|
||||||
|
|
||||||
|
int get_user_creds(const char **username, uid_t *uid, gid_t *gid, const char **home, const char **shell);
|
||||||
|
int get_group_creds(const char **groupname, gid_t *gid);
|
||||||
|
|
||||||
|
int in_group(const char *name);
|
||||||
|
|
||||||
|
int glob_exists(const char *path);
|
||||||
|
|
||||||
|
int dirent_ensure_type(DIR *d, struct dirent *de);
|
||||||
|
|
||||||
|
int in_search_path(const char *path, char **search);
|
||||||
|
int get_files_in_directory(const char *path, char ***list);
|
||||||
|
|
||||||
|
char *strjoin(const char *x, ...) _sentinel_;
|
||||||
|
|
||||||
|
bool is_main_thread(void);
|
||||||
|
|
||||||
|
bool in_charset(const char *s, const char* charset);
|
||||||
|
|
||||||
|
int block_get_whole_disk(dev_t d, dev_t *ret);
|
||||||
|
|
||||||
|
int file_is_priv_sticky(const char *p);
|
||||||
|
|
||||||
|
int strdup_or_null(const char *a, char **b);
|
||||||
|
|
||||||
|
#define NULSTR_FOREACH(i, l) \
|
||||||
|
for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1)
|
||||||
|
|
||||||
|
#define NULSTR_FOREACH_PAIR(i, j, l) \
|
||||||
|
for ((i) = (l), (j) = strchr((i), 0)+1; (i) && *(i); (i) = strchr((j), 0)+1, (j) = *(i) ? strchr((i), 0)+1 : (i))
|
||||||
|
|
||||||
|
int ioprio_class_to_string_alloc(int i, char **s);
|
||||||
|
int ioprio_class_from_string(const char *s);
|
||||||
|
|
||||||
|
const char *sigchld_code_to_string(int i);
|
||||||
|
int sigchld_code_from_string(const char *s);
|
||||||
|
|
||||||
|
int log_facility_unshifted_to_string_alloc(int i, char **s);
|
||||||
|
int log_facility_unshifted_from_string(const char *s);
|
||||||
|
|
||||||
|
int log_level_to_string_alloc(int i, char **s);
|
||||||
|
int log_level_from_string(const char *s);
|
||||||
|
|
||||||
|
int sched_policy_to_string_alloc(int i, char **s);
|
||||||
|
int sched_policy_from_string(const char *s);
|
||||||
|
|
||||||
|
const char *rlimit_to_string(int i);
|
||||||
|
int rlimit_from_string(const char *s);
|
||||||
|
|
||||||
|
int ip_tos_to_string_alloc(int i, char **s);
|
||||||
|
int ip_tos_from_string(const char *s);
|
||||||
|
|
||||||
|
const char *signal_to_string(int i);
|
||||||
|
int signal_from_string(const char *s);
|
||||||
|
|
||||||
|
int signal_from_string_try_harder(const char *s);
|
||||||
|
|
||||||
|
extern int saved_argc;
|
||||||
|
extern char **saved_argv;
|
||||||
|
|
||||||
|
bool kexec_loaded(void);
|
||||||
|
|
||||||
|
int prot_from_flags(int flags);
|
||||||
|
|
||||||
|
char *format_bytes(char *buf, size_t l, off_t t);
|
||||||
|
|
||||||
|
int fd_wait_for_event(int fd, int event, usec_t timeout);
|
||||||
|
|
||||||
|
void* memdup(const void *p, size_t l) _malloc_;
|
||||||
|
|
||||||
|
int is_kernel_thread(pid_t pid);
|
||||||
|
|
||||||
|
int fd_inc_sndbuf(int fd, size_t n);
|
||||||
|
int fd_inc_rcvbuf(int fd, size_t n);
|
||||||
|
|
||||||
|
int fork_agent(pid_t *pid, const int except[], unsigned n_except, const char *path, ...);
|
||||||
|
|
||||||
|
int setrlimit_closest(int resource, const struct rlimit *rlim);
|
||||||
|
|
||||||
|
int getenv_for_pid(pid_t pid, const char *field, char **_value);
|
||||||
|
|
||||||
|
int can_sleep(const char *type);
|
||||||
|
int can_sleep_disk(const char *type);
|
||||||
|
|
||||||
|
bool is_valid_documentation_url(const char *url);
|
||||||
|
|
||||||
|
bool in_initrd(void);
|
||||||
|
|
||||||
|
void warn_melody(void);
|
||||||
|
|
||||||
|
int get_shell(char **ret);
|
||||||
|
int get_home_dir(char **ret);
|
||||||
|
|
||||||
|
void freep(void *p);
|
||||||
|
void fclosep(FILE **f);
|
||||||
|
void closep(int *fd);
|
||||||
|
void closedirp(DIR **d);
|
||||||
|
void umaskp(mode_t *u);
|
||||||
|
|
||||||
|
_malloc_ static inline void *malloc_multiply(size_t a, size_t b) {
|
||||||
|
if (_unlikely_(b == 0 || a > ((size_t) -1) / b))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return malloc(a * b);
|
||||||
|
}
|
||||||
|
|
||||||
|
_malloc_ static inline void *memdup_multiply(const void *p, size_t a, size_t b) {
|
||||||
|
if (_unlikely_(b == 0 || a > ((size_t) -1) / b))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return memdup(p, a * b);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool filename_is_safe(const char *p);
|
||||||
|
bool string_is_safe(const char *p);
|
||||||
|
|
||||||
|
int parse_timestamp(const char *t, usec_t *usec);
|
||||||
|
|
||||||
|
void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
|
||||||
|
int (*compar) (const void *, const void *, void *),
|
||||||
|
void *arg);
|
||||||
|
|
||||||
|
bool is_locale_utf8(void);
|
||||||
|
|
||||||
|
typedef enum DrawSpecialChar {
|
||||||
|
DRAW_TREE_VERT,
|
||||||
|
DRAW_TREE_BRANCH,
|
||||||
|
DRAW_TREE_RIGHT,
|
||||||
|
DRAW_TRIANGULAR_BULLET,
|
||||||
|
_DRAW_SPECIAL_CHAR_MAX
|
||||||
|
} DrawSpecialChar;
|
||||||
|
const char *draw_special_char(DrawSpecialChar ch);
|
||||||
|
|
||||||
|
char *strreplace(const char *text, const char *old_string, const char *new_string);
|
@ -7,7 +7,7 @@ AM_CPPFLAGS = \
|
|||||||
-DROOTPREFIX=\"$(rootprefix)\" \
|
-DROOTPREFIX=\"$(rootprefix)\" \
|
||||||
-I $(top_srcdir)/src/libudev \
|
-I $(top_srcdir)/src/libudev \
|
||||||
-I $(top_srcdir)/src/udev \
|
-I $(top_srcdir)/src/udev \
|
||||||
$(OUR_CPPFLAGS)
|
-I $(top_srcdir)/src/shared
|
||||||
|
|
||||||
sbin_PROGRAMS = \
|
sbin_PROGRAMS = \
|
||||||
udevd \
|
udevd \
|
||||||
|
Loading…
Reference in New Issue
Block a user