2019-10-02 16:51:19 +00:00
|
|
|
#
|
2024-02-16 14:09:45 +00:00
|
|
|
# Rules for running syntax-check, derived from gnulib's top/maint.mk
|
2019-10-02 16:51:19 +00:00
|
|
|
#
|
2022-05-23 12:33:01 +00:00
|
|
|
# Specifically, all shared code should match gnulib commit
|
|
|
|
#
|
2024-02-16 14:09:45 +00:00
|
|
|
# d5191e456737661d4a0df5287f6c2064ab74dbbe (2024-02-15)
|
2022-05-23 12:33:01 +00:00
|
|
|
#
|
2019-01-03 15:31:37 +00:00
|
|
|
# Copyright (C) 2008-2019 Red Hat, Inc.
|
2024-02-16 14:09:45 +00:00
|
|
|
# Copyright (C) 2001-2024 Free Software Foundation, Inc.
|
2008-01-29 17:42:39 +00:00
|
|
|
|
|
|
|
# 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 3 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
|
2012-07-26 22:58:02 +00:00
|
|
|
# along with this program. If not, see
|
|
|
|
# <http://www.gnu.org/licenses/>.
|
2008-01-29 17:42:39 +00:00
|
|
|
|
2019-10-02 16:51:19 +00:00
|
|
|
|
2022-05-23 14:20:31 +00:00
|
|
|
all:
|
|
|
|
@echo "Do not call this file directly, use 'meson test' instead" >&2; \
|
|
|
|
exit 1
|
|
|
|
|
|
|
|
|
2022-05-23 14:23:59 +00:00
|
|
|
## ----- ##
|
|
|
|
## Rules ##
|
|
|
|
## ----- ##
|
2019-10-02 16:51:19 +00:00
|
|
|
|
2010-11-30 20:29:19 +00:00
|
|
|
# Files that should never cause syntax check failures.
|
2011-07-08 15:13:53 +00:00
|
|
|
VC_LIST_ALWAYS_EXCLUDE_REGEX = \
|
2022-05-23 12:41:08 +00:00
|
|
|
\.(po|ico|png)$$
|
2010-11-30 20:29:19 +00:00
|
|
|
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
# Avoid uses of write(2). Either switch to streams (fwrite), or use
|
|
|
|
# the safewrite wrapper.
|
|
|
|
sc_avoid_write:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<write *\(' \
|
2022-02-14 15:39:00 +00:00
|
|
|
exclude='sc_avoid_write' \
|
2017-11-03 12:09:47 +00:00
|
|
|
in_vc_files='\.c$$' \
|
|
|
|
halt='consider using safewrite instead of write' \
|
2010-05-19 10:51:11 +00:00
|
|
|
$(_sc_search_regexp)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
2011-07-08 15:18:48 +00:00
|
|
|
# In debug statements, print flags as bitmask and mode_t as octal.
|
|
|
|
sc_flags_debug:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<mode=%[0-9.]*[diuxo]' \
|
|
|
|
halt='use \"0%o\" to debug mode_t values' \
|
2011-07-08 15:18:48 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='[Ff]lags=%[0-9.]*l*[dioux]' \
|
|
|
|
halt='use \"0x%x\" to debug flag values' \
|
2011-07-07 17:57:43 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Prefer 'unsigned int flags', along with checks for unknown flags.
|
|
|
|
# For historical reasons, we are stuck with 'unsigned long flags' in
|
|
|
|
# migration, so check for those known 4 instances and no more in public
|
|
|
|
# API. Also check that no flags are marked unused, and 'unsigned' should
|
|
|
|
# appear before any declaration of a flags variable (achieved by
|
|
|
|
# prohibiting the word prior to the type from ending in anything other
|
|
|
|
# than d). The existence of long long, and of documentation about
|
|
|
|
# flags, makes the regex in the third test slightly harder.
|
|
|
|
sc_flags_usage:
|
2020-06-25 21:29:43 +00:00
|
|
|
@test "$$(cat $(top_srcdir)/include/libvirt/libvirt-domain.h \
|
|
|
|
$(top_srcdir)/include/libvirt/virterror.h \
|
|
|
|
$(top_srcdir)/include/libvirt/libvirt-qemu.h \
|
|
|
|
$(top_srcdir)/include/libvirt/libvirt-lxc.h \
|
|
|
|
$(top_srcdir)/include/libvirt/libvirt-admin.h \
|
2019-01-03 15:31:37 +00:00
|
|
|
| $(GREP) -c '\(long\|unsigned\) flags')" != 4 && \
|
2022-05-23 13:55:16 +00:00
|
|
|
{ echo 'new API should use "unsigned int flags"' 1>&2; \
|
2011-07-07 17:57:43 +00:00
|
|
|
exit 1; } || :
|
2019-10-14 13:02:40 +00:00
|
|
|
@prohibit=' flags G_GNUC_UNUSED' \
|
2019-01-23 10:50:33 +00:00
|
|
|
exclude='virSecurityDomainImageLabelFlags' \
|
2017-11-03 12:09:47 +00:00
|
|
|
halt='flags should be checked with virCheckFlags' \
|
2011-07-07 17:57:43 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='^[^@]*([^d] (int|long long)|[^dg] long) flags[;,)]' \
|
|
|
|
halt='flags should be unsigned' \
|
2011-07-08 15:18:48 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2011-09-20 18:11:32 +00:00
|
|
|
# Avoid functions that should only be called via macro counterparts.
|
|
|
|
sc_prohibit_internal_functions:
|
util: add VIR_(APPEND|INSERT|DELETE)_ELEMENT
I noticed when writing the backend functions for virNetworkUpdate that
I was repeating the same sequence of memmove, VIR_REALLOC, nXXX-- (and
messed up the args to memmove at least once), and had seen the same
sequence in a lot of other places, so I decided to write a few
utility functions/macros - see the .h file for full documentation.
The intent is to reduce the number of lines of code, but more
importantly to eliminate the need to check the element size and
element count arithmetic every time we need to do this (I *always*
make at least one mistake.)
VIR_INSERT_ELEMENT: insert one element at an arbitrary index within an
array of objects. The size of each object is determined
automatically by the macro using sizeof(*array). The new element's
contents are copied into the inserted space, then the original copy
of contents are 0'ed out (if everything else was
successful). Compile-time assignment and size compatibility between
the array and the new element is guaranteed (see explanation below
[*])
VIR_INSERT_ELEMENT_COPY: identical to VIR_INSERT_ELEMENT, except that
the original contents of newelem are not cleared to 0 (i.e. a copy
is made).
VIR_APPEND_ELEMENT: This is just a special case of VIR_INSERT_ELEMENT
that "inserts" one past the current last element.
VIR_APPEND_ELEMENT_COPY: identical to VIR_APPEND_ELEMENT, except that
the original contents of newelem are not cleared to 0 (i.e. a copy
is made).
VIR_DELETE_ELEMENT: delete one element at an arbitrary index within an
array of objects. It's assumed that the element being deleted is
already saved elsewhere (or cleared, if that's what is appropriate).
All five of these macros have an _INPLACE variant, which skips the
memory re-allocation of the array, assuming that the caller has
already done it (when inserting) or will do it later (when deleting).
Note that VIR_DELETE_ELEMENT* can return a failure, but only if an
invalid index is given (index + amount to delete is > current array
size), so in most cases you can safely ignore the return (that's why
the helper function virDeleteElementsN isn't declared with
ATTRIBUTE_RETURN_CHECK). A warning is logged if this ever happens,
since it is surely a coding error.
[*] One initial problem with the INSERT and APPEND macros was that,
due to both the array pointer and newelem pointer being cast to void*
when passing to virInsertElementsN(), any chance of type-checking was
lost. If we were going to move in newelem with a memmove anyway, we
would be no worse off for this. However, most current open-coded
insert/append operations use direct struct assignment to move the new
element into place (or just populate the new element directly) - thus
use of the new macros would open a possibility for new usage errors
that didn't exist before (e.g. accidentally sending &newelemptr rather
than newelemptr - I actually did this quite a lot in my test
conversions of existing code).
But thanks to Eric Blake's clever thinking, I was able to modify the
INSERT and APPEND macros so that they *do* check for both assignment
and size compatibility of *ptr (an element in the array) and newelem
(the element being copied into the new position of the array). This is
done via clever use of the C89-guaranteed fact that the sizeof()
operator must have *no* side effects (so an assignment inside sizeof()
is checked for validity, but not actually evaluated), and the fact
that virInsertElementsN has a "# of new elements" argument that we
want to always be 1.
2012-10-08 17:33:35 +00:00
|
|
|
@prohibit='vir(Free|AllocN?|ReallocN|(Insert|Delete)ElementsN|File(Close|Fclose|Fdopen)) *\(' \
|
2017-11-03 12:09:47 +00:00
|
|
|
halt='use VIR_ macros instead of internal functions' \
|
2011-09-20 18:11:32 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2018-04-13 14:41:17 +00:00
|
|
|
sc_prohibit_raw_virclassnew:
|
|
|
|
@prohibit='virClassNew *\(' \
|
|
|
|
halt='use VIR_CLASS_NEW instead of virClassNew' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2012-02-02 22:47:04 +00:00
|
|
|
# Avoid raw malloc and free, except in documentation comments.
|
|
|
|
sc_prohibit_raw_allocation:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='^.[^*].*\<((m|c|re)alloc|free) *\([^)]' \
|
|
|
|
halt='use VIR_ macros from viralloc.h instead of malloc/free' \
|
2012-02-02 22:47:04 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2010-11-20 00:25:23 +00:00
|
|
|
# Avoid functions that can lead to double-close bugs.
|
|
|
|
sc_prohibit_close:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='([^>.]|^)\<[fp]?close *\(' \
|
|
|
|
halt='use VIR_{FORCE_}[F]CLOSE instead of [f]close' \
|
2010-11-20 00:25:23 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<fdopen *\(' \
|
|
|
|
halt='use VIR_FDOPEN instead of fdopen' \
|
2010-11-20 00:25:23 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
maint: reject raw close, popen in 'make syntax-check'
commit f1fe9671e was supposed to make sure we use files.h
macros to avoid double close, but it didn't work.
Meanwhile, virCommand is vastly superior to system(), fork(),
and popen() (also to virExec, but we haven't completed that
conversion), so enforce that, too.
* cfg.mk (sc_prohibit_close): Fix typo that excluded close, and
add pclose.
(sc_prohibit_fork_wrappers): New rule, for fork, system, and popen.
* .x-sc_prohibit_close: More exemptions.
* .x-sc_prohibit_fork_wrappers: New file.
* Makefile.am (syntax_check_exceptions): Ship new file.
* src/datatypes.c (virReleaseConnect): Tweak comment to avoid
false positive.
* src/util/files.h (VIR_CLOSE): Likewise.
2011-01-27 22:16:14 +00:00
|
|
|
# Prefer virCommand for all child processes.
|
|
|
|
sc_prohibit_fork_wrappers:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='= *\<(fork|popen|system) *\(' \
|
|
|
|
halt='use virCommand for child processes' \
|
maint: reject raw close, popen in 'make syntax-check'
commit f1fe9671e was supposed to make sure we use files.h
macros to avoid double close, but it didn't work.
Meanwhile, virCommand is vastly superior to system(), fork(),
and popen() (also to virExec, but we haven't completed that
conversion), so enforce that, too.
* cfg.mk (sc_prohibit_close): Fix typo that excluded close, and
add pclose.
(sc_prohibit_fork_wrappers): New rule, for fork, system, and popen.
* .x-sc_prohibit_close: More exemptions.
* .x-sc_prohibit_fork_wrappers: New file.
* Makefile.am (syntax_check_exceptions): Ship new file.
* src/datatypes.c (virReleaseConnect): Tweak comment to avoid
false positive.
* src/util/files.h (VIR_CLOSE): Likewise.
2011-01-27 22:16:14 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-11-14 13:44:24 +00:00
|
|
|
# Prefer g_mkostemp_full with O_CLOEXEC.
|
2012-10-31 14:13:47 +00:00
|
|
|
sc_prohibit_mkstemp:
|
2019-11-14 13:44:24 +00:00
|
|
|
@prohibit='[^"]\<mko?stemps? *\(' \
|
|
|
|
in_vc_files='\.[chx]$$' \
|
|
|
|
halt='use g_mkstemp_full with O_CLOEXEC instead of mkstemp' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
sc_prohibit_mkdtemp:
|
|
|
|
@prohibit='[^"]\<mkdtemp *\(' \
|
|
|
|
in_vc_files='\.[chx]$$' \
|
|
|
|
halt='use g_mkdtemp instead of mkdtemp' \
|
2012-10-31 14:13:47 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2011-03-18 20:41:13 +00:00
|
|
|
# access with X_OK accepts directories, but we can't exec() those.
|
|
|
|
# access with F_OK or R_OK is okay, though.
|
|
|
|
sc_prohibit_access_xok:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='access(at)? *\(.*X_OK' \
|
2019-08-30 12:22:54 +00:00
|
|
|
in_vc_files='\.[ch]$$' \
|
2017-11-03 12:09:47 +00:00
|
|
|
halt='use virFileIsExecutable instead of access(,X_OK)' \
|
2011-03-18 20:41:13 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2010-11-17 23:41:31 +00:00
|
|
|
# Use STREQLEN or STRPREFIX rather than comparing strncmp == 0, or != 0.
|
2012-02-24 19:01:15 +00:00
|
|
|
snp_ = strncmp *\(.+\)
|
2010-11-17 23:41:31 +00:00
|
|
|
sc_prohibit_strncmp:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='! *strncmp *\(|\<$(snp_) *[!=]=|[!=]= *$(snp_)' \
|
|
|
|
exclude=':# *define STR(N?EQLEN|PREFIX)\(' \
|
|
|
|
halt='use STREQLEN or STRPREFIX instead of strncmp' \
|
2012-03-02 00:21:08 +00:00
|
|
|
$(_sc_search_regexp)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
2012-04-19 00:06:59 +00:00
|
|
|
# strtol and friends are too easy to misuse
|
|
|
|
sc_prohibit_strtol:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\bstrto(u?ll?|[ui]max) *\(' \
|
|
|
|
exclude='exempt from syntax-check' \
|
|
|
|
halt='use virStrToLong_*, not strtol variants' \
|
2012-04-19 00:06:59 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\bstrto[df] *\(' \
|
|
|
|
exclude='exempt from syntax-check' \
|
|
|
|
halt='use virStrToDouble, not strtod variants' \
|
2012-04-19 00:06:59 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-10-22 11:17:18 +00:00
|
|
|
# Use g_strdup_printf rather than as'printf since *strp is undefined on error.
|
|
|
|
# But for plain %s, g_strdup_printf is overkill compared to g_strdup.
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
sc_prohibit_asprintf:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<v?a[s]printf\>' \
|
2019-10-22 11:17:18 +00:00
|
|
|
halt='use g_strdup_printf, not asprintf' \
|
2010-08-18 23:31:39 +00:00
|
|
|
$(_sc_search_regexp)
|
2019-10-22 11:17:18 +00:00
|
|
|
@prohibit='g_strdup_printf.*, *"%s",' \
|
|
|
|
halt='use g_strdup instead of g_strdup_printf with "%s"' \
|
2013-04-04 18:16:43 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-11-13 09:21:29 +00:00
|
|
|
sc_prohobit_vsnprintf:
|
|
|
|
@prohibit='\<vsnprintf\>' \
|
|
|
|
in_vc_files='\.[chx]$$' \
|
|
|
|
halt='use g_vsnprintf, not vsnprintf' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-04-04 18:16:43 +00:00
|
|
|
sc_prohibit_strdup:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<strn?dup\> *\(' \
|
2022-02-03 14:15:33 +00:00
|
|
|
halt='use g_str(n)dup, not str(n)dup' \
|
2013-05-02 19:35:26 +00:00
|
|
|
$(_sc_search_regexp)
|
2010-08-18 23:31:39 +00:00
|
|
|
|
2011-06-22 22:18:01 +00:00
|
|
|
# Prefer virSetUIDGID.
|
|
|
|
sc_prohibit_setuid:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<set(re)?[ug]id\> *\(' \
|
|
|
|
halt='use virSetUIDGID, not raw set*id' \
|
2011-06-22 22:18:01 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-03-14 22:28:29 +00:00
|
|
|
# Don't compare *id_t against raw -1.
|
|
|
|
sc_prohibit_risky_id_promotion:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\b(user|group|[ug]id) *[=!]= *-' \
|
|
|
|
halt='cast -1 to ([ug]id_t) before comparing against id' \
|
2013-03-14 22:28:29 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2010-08-18 23:31:39 +00:00
|
|
|
sc_prohibit_sprintf:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<[s]printf\>' \
|
2019-08-30 12:22:54 +00:00
|
|
|
in_vc_files='\.[ch]$$' \
|
2019-11-13 16:33:26 +00:00
|
|
|
halt='use g_snprintf, not sprintf' \
|
build: import latest gnulib
A lot of syntax check rules have to be rewritten, but the
result is easier to maintain. I tested each syntax rule
by intentionally introducing a temporary violation of the rule.
Additionally, some false positives for unmarked_diagnostics
crept in, and an improved copyright_format test caught some bugs.
* .gnulib: Update to latest.
* cfg.mk (sc_prohibit_test_minus_ao): Delete, it was moved into
gnulib's maint.mk.
(sc_avoid_write, sc_prohibit_strcmp_and_strncmp)
(sc_prohibit_asprintf, sc_prohibit_strncpy, sc_prohibit_readlink)
(sc_prohibit_gethostname, sc_prohibit_gettext_noop)
(sc_prohibit_VIR_ERR_NO_MEMORY, sc_prohibit_nonreentrant)
(sc_prohibit_ctype_h, sc_TAB_in_indentation)
(sc_avoid_ctype_macros)
(sc_prohibit_virBufferAdd_with_string_literal)
(sc_prohibit_gethostby, sc_copyright_format): Rewrite in terms of
new maint.mk macros.
(sc_libvirt_unmarked_diagnostics): Fix whitespace.
* .x-sc_unmarked_diagnostics: New file.
* tests/object-locking.ml: Fix copyright.
* tools/virt-pki-validate.in: Likewise.
* tools/virt-xml-validate.in: Likewise.
2010-03-31 23:02:10 +00:00
|
|
|
$(_sc_search_regexp)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
2019-11-13 16:33:27 +00:00
|
|
|
sc_prohibit_snprintf:
|
|
|
|
@prohibit='\<snprintf\>' \
|
|
|
|
halt='use g_snprintf, not snprintf' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2009-12-21 19:14:46 +00:00
|
|
|
sc_prohibit_readlink:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<readlink *\(' \
|
|
|
|
halt='use virFileResolveLink, not readlink' \
|
build: import latest gnulib
A lot of syntax check rules have to be rewritten, but the
result is easier to maintain. I tested each syntax rule
by intentionally introducing a temporary violation of the rule.
Additionally, some false positives for unmarked_diagnostics
crept in, and an improved copyright_format test caught some bugs.
* .gnulib: Update to latest.
* cfg.mk (sc_prohibit_test_minus_ao): Delete, it was moved into
gnulib's maint.mk.
(sc_avoid_write, sc_prohibit_strcmp_and_strncmp)
(sc_prohibit_asprintf, sc_prohibit_strncpy, sc_prohibit_readlink)
(sc_prohibit_gethostname, sc_prohibit_gettext_noop)
(sc_prohibit_VIR_ERR_NO_MEMORY, sc_prohibit_nonreentrant)
(sc_prohibit_ctype_h, sc_TAB_in_indentation)
(sc_avoid_ctype_macros)
(sc_prohibit_virBufferAdd_with_string_literal)
(sc_prohibit_gethostby, sc_copyright_format): Rewrite in terms of
new maint.mk macros.
(sc_libvirt_unmarked_diagnostics): Fix whitespace.
* .x-sc_unmarked_diagnostics: New file.
* tests/object-locking.ml: Fix copyright.
* tools/virt-pki-validate.in: Likewise.
* tools/virt-xml-validate.in: Likewise.
2010-03-31 23:02:10 +00:00
|
|
|
$(_sc_search_regexp)
|
2009-12-21 19:14:46 +00:00
|
|
|
|
2009-10-23 10:13:20 +00:00
|
|
|
sc_prohibit_gethostname:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='gethostname *\(' \
|
2022-01-07 16:29:36 +00:00
|
|
|
in_vc_files='\.[ch]$$' \
|
2017-11-03 12:09:47 +00:00
|
|
|
halt='use virGetHostname, not gethostname' \
|
build: import latest gnulib
A lot of syntax check rules have to be rewritten, but the
result is easier to maintain. I tested each syntax rule
by intentionally introducing a temporary violation of the rule.
Additionally, some false positives for unmarked_diagnostics
crept in, and an improved copyright_format test caught some bugs.
* .gnulib: Update to latest.
* cfg.mk (sc_prohibit_test_minus_ao): Delete, it was moved into
gnulib's maint.mk.
(sc_avoid_write, sc_prohibit_strcmp_and_strncmp)
(sc_prohibit_asprintf, sc_prohibit_strncpy, sc_prohibit_readlink)
(sc_prohibit_gethostname, sc_prohibit_gettext_noop)
(sc_prohibit_VIR_ERR_NO_MEMORY, sc_prohibit_nonreentrant)
(sc_prohibit_ctype_h, sc_TAB_in_indentation)
(sc_avoid_ctype_macros)
(sc_prohibit_virBufferAdd_with_string_literal)
(sc_prohibit_gethostby, sc_copyright_format): Rewrite in terms of
new maint.mk macros.
(sc_libvirt_unmarked_diagnostics): Fix whitespace.
* .x-sc_unmarked_diagnostics: New file.
* tests/object-locking.ml: Fix copyright.
* tools/virt-pki-validate.in: Likewise.
* tools/virt-xml-validate.in: Likewise.
2010-03-31 23:02:10 +00:00
|
|
|
$(_sc_search_regexp)
|
2009-10-23 10:13:20 +00:00
|
|
|
|
2014-04-21 22:33:15 +00:00
|
|
|
sc_prohibit_readdir:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\b(read|close|open)dir *\(' \
|
|
|
|
exclude='exempt from syntax-check' \
|
2021-07-14 14:53:04 +00:00
|
|
|
halt='use virDirOpen, virDirRead and g_autoptr(DIR)' \
|
2014-04-21 22:33:15 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2010-03-18 13:05:44 +00:00
|
|
|
sc_prohibit_gettext_noop:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='gettext_noop *\(' \
|
|
|
|
halt='use N_, not gettext_noop' \
|
build: import latest gnulib
A lot of syntax check rules have to be rewritten, but the
result is easier to maintain. I tested each syntax rule
by intentionally introducing a temporary violation of the rule.
Additionally, some false positives for unmarked_diagnostics
crept in, and an improved copyright_format test caught some bugs.
* .gnulib: Update to latest.
* cfg.mk (sc_prohibit_test_minus_ao): Delete, it was moved into
gnulib's maint.mk.
(sc_avoid_write, sc_prohibit_strcmp_and_strncmp)
(sc_prohibit_asprintf, sc_prohibit_strncpy, sc_prohibit_readlink)
(sc_prohibit_gethostname, sc_prohibit_gettext_noop)
(sc_prohibit_VIR_ERR_NO_MEMORY, sc_prohibit_nonreentrant)
(sc_prohibit_ctype_h, sc_TAB_in_indentation)
(sc_avoid_ctype_macros)
(sc_prohibit_virBufferAdd_with_string_literal)
(sc_prohibit_gethostby, sc_copyright_format): Rewrite in terms of
new maint.mk macros.
(sc_libvirt_unmarked_diagnostics): Fix whitespace.
* .x-sc_unmarked_diagnostics: New file.
* tests/object-locking.ml: Fix copyright.
* tools/virt-pki-validate.in: Likewise.
* tools/virt-xml-validate.in: Likewise.
2010-03-31 23:02:10 +00:00
|
|
|
$(_sc_search_regexp)
|
2010-03-18 13:05:44 +00:00
|
|
|
|
2012-05-25 13:14:07 +00:00
|
|
|
sc_prohibit_PATH_MAX:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<PATH_MAX\>' \
|
|
|
|
halt='dynamically allocate paths, do not use PATH_MAX' \
|
2012-05-25 13:14:07 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2020-06-25 21:29:43 +00:00
|
|
|
include $(top_srcdir)/build-aux/Makefile.nonreentrant
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
sc_prohibit_nonreentrant:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit="\\<(${NON_REENTRANT_RE}) *\\(" \
|
2021-03-12 16:26:51 +00:00
|
|
|
exclude='exempt from syntax-check' \
|
2017-11-03 12:09:47 +00:00
|
|
|
halt="use re-entrant functions (usually ending with _r)" \
|
2016-06-14 12:27:51 +00:00
|
|
|
$(_sc_search_regexp)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
2013-05-13 13:43:20 +00:00
|
|
|
sc_prohibit_select:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<select *\(' \
|
|
|
|
halt='use poll(), not select()' \
|
2013-05-13 13:43:20 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
# Prohibit the inclusion of <ctype.h>.
|
|
|
|
sc_prohibit_ctype_h:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='^# *include *<ctype\.h>' \
|
2019-11-18 15:20:17 +00:00
|
|
|
halt='use Glib g_ascii_* function instead of ctype.h' \
|
2010-05-19 10:51:11 +00:00
|
|
|
$(_sc_search_regexp)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
2018-04-30 14:55:57 +00:00
|
|
|
# We have our own wrapper for mocking purposes
|
|
|
|
sc_prohibit_canonicalize_file_name:
|
|
|
|
@prohibit='\<canonicalize_file_name\(' \
|
|
|
|
exclude='exempt from syntax-check' \
|
|
|
|
halt='use virFileCanonicalizePath() instead of canonicalize_file_name()' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2023-11-23 09:54:57 +00:00
|
|
|
# qsort from glibc has unstable sort ordering for "equal" members
|
|
|
|
sc_prohibit_qsort:
|
|
|
|
@prohibit='\<(qsort|qsort_r) *\(' \
|
|
|
|
exclude='exempt from syntax-check' \
|
|
|
|
halt='use g_qsort_with_data instead of qsort' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
build: use correct type for pid and similar types
No thanks to 64-bit windows, with 64-bit pid_t, we have to avoid
constructs like 'int pid'. Our API in libvirt-qemu cannot be
changed without breaking ABI; but then again, libvirt-qemu can
only be used on systems that support UNIX sockets, which rules
out Windows (even if qemu could be compiled there) - so for all
points on the call chain that interact with this API decision,
we require a different variable name to make it clear that we
audited the use for safety.
Adding a syntax-check rule only solves half the battle; anywhere
that uses printf on a pid_t still needs to be converted, but that
will be a separate patch.
* cfg.mk (sc_correct_id_types): New syntax check.
* src/libvirt-qemu.c (virDomainQemuAttach): Document why we didn't
use pid_t for pid, and validate for overflow.
* include/libvirt/libvirt-qemu.h (virDomainQemuAttach): Tweak name
for syntax check.
* src/vmware/vmware_conf.c (vmwareExtractPid): Likewise.
* src/driver.h (virDrvDomainQemuAttach): Likewise.
* tools/virsh.c (cmdQemuAttach): Likewise.
* src/remote/qemu_protocol.x (qemu_domain_attach_args): Likewise.
* src/qemu_protocol-structs (qemu_domain_attach_args): Likewise.
* src/util/cgroup.c (virCgroupPidCode, virCgroupKillInternal):
Likewise.
* src/qemu/qemu_command.c(qemuParseProcFileStrings): Likewise.
(qemuParseCommandLinePid): Use pid_t for pid.
* daemon/libvirtd.c (daemonForkIntoBackground): Likewise.
* src/conf/domain_conf.h (_virDomainObj): Likewise.
* src/probes.d (rpc_socket_new): Likewise.
* src/qemu/qemu_command.h (qemuParseCommandLinePid): Likewise.
* src/qemu/qemu_driver.c (qemudGetProcessInfo, qemuDomainAttach):
Likewise.
* src/qemu/qemu_process.c (qemuProcessAttach): Likewise.
* src/qemu/qemu_process.h (qemuProcessAttach): Likewise.
* src/uml/uml_driver.c (umlGetProcessInfo): Likewise.
* src/util/virnetdev.h (virNetDevSetNamespace): Likewise.
* src/util/virnetdev.c (virNetDevSetNamespace): Likewise.
* tests/testutils.c (virtTestCaptureProgramOutput): Likewise.
* src/conf/storage_conf.h (_virStoragePerms): Use mode_t, uid_t,
and gid_t rather than int.
* src/security/security_dac.c (virSecurityDACSetOwnership): Likewise.
* src/conf/storage_conf.c (virStorageDefParsePerms): Avoid
compiler warning.
2012-02-10 23:08:11 +00:00
|
|
|
# Insist on correct types for [pug]id.
|
|
|
|
sc_correct_id_types:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<(int|long) *[pug]id\>' \
|
2018-11-08 11:00:19 +00:00
|
|
|
exclude='exempt from syntax-check' \
|
2017-11-03 12:09:47 +00:00
|
|
|
halt='use pid_t for pid, uid_t for uid, gid_t for gid' \
|
build: use correct type for pid and similar types
No thanks to 64-bit windows, with 64-bit pid_t, we have to avoid
constructs like 'int pid'. Our API in libvirt-qemu cannot be
changed without breaking ABI; but then again, libvirt-qemu can
only be used on systems that support UNIX sockets, which rules
out Windows (even if qemu could be compiled there) - so for all
points on the call chain that interact with this API decision,
we require a different variable name to make it clear that we
audited the use for safety.
Adding a syntax-check rule only solves half the battle; anywhere
that uses printf on a pid_t still needs to be converted, but that
will be a separate patch.
* cfg.mk (sc_correct_id_types): New syntax check.
* src/libvirt-qemu.c (virDomainQemuAttach): Document why we didn't
use pid_t for pid, and validate for overflow.
* include/libvirt/libvirt-qemu.h (virDomainQemuAttach): Tweak name
for syntax check.
* src/vmware/vmware_conf.c (vmwareExtractPid): Likewise.
* src/driver.h (virDrvDomainQemuAttach): Likewise.
* tools/virsh.c (cmdQemuAttach): Likewise.
* src/remote/qemu_protocol.x (qemu_domain_attach_args): Likewise.
* src/qemu_protocol-structs (qemu_domain_attach_args): Likewise.
* src/util/cgroup.c (virCgroupPidCode, virCgroupKillInternal):
Likewise.
* src/qemu/qemu_command.c(qemuParseProcFileStrings): Likewise.
(qemuParseCommandLinePid): Use pid_t for pid.
* daemon/libvirtd.c (daemonForkIntoBackground): Likewise.
* src/conf/domain_conf.h (_virDomainObj): Likewise.
* src/probes.d (rpc_socket_new): Likewise.
* src/qemu/qemu_command.h (qemuParseCommandLinePid): Likewise.
* src/qemu/qemu_driver.c (qemudGetProcessInfo, qemuDomainAttach):
Likewise.
* src/qemu/qemu_process.c (qemuProcessAttach): Likewise.
* src/qemu/qemu_process.h (qemuProcessAttach): Likewise.
* src/uml/uml_driver.c (umlGetProcessInfo): Likewise.
* src/util/virnetdev.h (virNetDevSetNamespace): Likewise.
* src/util/virnetdev.c (virNetDevSetNamespace): Likewise.
* tests/testutils.c (virtTestCaptureProgramOutput): Likewise.
* src/conf/storage_conf.h (_virStoragePerms): Use mode_t, uid_t,
and gid_t rather than int.
* src/security/security_dac.c (virSecurityDACSetOwnership): Likewise.
* src/conf/storage_conf.c (virStorageDefParsePerms): Avoid
compiler warning.
2012-02-10 23:08:11 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-09-24 16:41:54 +00:00
|
|
|
# "const fooPtr a" is the same as "foo * const a", even though it is
|
|
|
|
# usually desired to have "foo const *a". It's easier to just prevent
|
|
|
|
# the confusing mix of typedef vs. const placement.
|
2013-10-29 19:57:19 +00:00
|
|
|
# Also requires that all 'fooPtr' typedefs are actually pointers.
|
2013-09-24 16:41:54 +00:00
|
|
|
sc_forbid_const_pointer_typedef:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='(^|[^"])const \w*Ptr' \
|
|
|
|
halt='"const fooPtr var" does not declare what you meant' \
|
2013-09-24 16:41:54 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='typedef [^(]+ [^*]\w*Ptr\b' \
|
|
|
|
halt='use correct style and type for Ptr typedefs' \
|
2013-10-29 19:57:19 +00:00
|
|
|
$(_sc_search_regexp)
|
2013-09-24 16:41:54 +00:00
|
|
|
|
2012-03-29 09:52:04 +00:00
|
|
|
# Forbid sizeof foo or sizeof (foo), require sizeof(foo)
|
|
|
|
sc_size_of_brackets:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='sizeof\s' \
|
|
|
|
halt='use sizeof(foo), not sizeof (foo) or sizeof foo' \
|
2012-03-29 09:52:04 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2011-02-04 18:16:35 +00:00
|
|
|
# Ensure that no C source file, docs, or rng schema uses TABs for
|
2020-01-17 16:00:27 +00:00
|
|
|
# indentation. Also match *.h.in files, to get libvirt.h.in.
|
2019-12-11 14:40:31 +00:00
|
|
|
space_indent_files=(\.(aug(\.in)?|rng|s?[ch](\.in)?|html.in|py|pl|syms)|tools/.*\.in)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
sc_TAB_in_indentation:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='^ * ' \
|
|
|
|
in_vc_files='$(space_indent_files)$$' \
|
2012-01-26 14:30:36 +00:00
|
|
|
halt='indent with space, not TAB, in C, sh, html, py, syms and RNG schemas' \
|
2010-05-19 10:51:11 +00:00
|
|
|
$(_sc_search_regexp)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
|
|
|
ctype_re = isalnum|isalpha|isascii|isblank|iscntrl|isdigit|isgraph|islower\
|
|
|
|
|isprint|ispunct|isspace|isupper|isxdigit|tolower|toupper
|
|
|
|
|
|
|
|
sc_avoid_ctype_macros:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\b($(ctype_re)) *\(' \
|
2018-03-20 06:48:52 +00:00
|
|
|
in_vc_files='\.[ch]$$' \
|
2019-11-18 15:20:17 +00:00
|
|
|
halt='use Glib g_ascii_ macros instead of ctype macros' \
|
2010-05-19 10:51:11 +00:00
|
|
|
$(_sc_search_regexp)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
2011-03-31 02:26:27 +00:00
|
|
|
sc_avoid_strcase:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\bstrn?case(cmp|str) *\(' \
|
2019-11-20 14:18:59 +00:00
|
|
|
halt='use GLib strcase functions instead of raw strcase functions' \
|
2011-03-31 02:26:27 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
sc_prohibit_virBufferAdd_with_string_literal:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<virBufferAdd *\([^,]+, *"[^"]' \
|
build: import latest gnulib
A lot of syntax check rules have to be rewritten, but the
result is easier to maintain. I tested each syntax rule
by intentionally introducing a temporary violation of the rule.
Additionally, some false positives for unmarked_diagnostics
crept in, and an improved copyright_format test caught some bugs.
* .gnulib: Update to latest.
* cfg.mk (sc_prohibit_test_minus_ao): Delete, it was moved into
gnulib's maint.mk.
(sc_avoid_write, sc_prohibit_strcmp_and_strncmp)
(sc_prohibit_asprintf, sc_prohibit_strncpy, sc_prohibit_readlink)
(sc_prohibit_gethostname, sc_prohibit_gettext_noop)
(sc_prohibit_VIR_ERR_NO_MEMORY, sc_prohibit_nonreentrant)
(sc_prohibit_ctype_h, sc_TAB_in_indentation)
(sc_avoid_ctype_macros)
(sc_prohibit_virBufferAdd_with_string_literal)
(sc_prohibit_gethostby, sc_copyright_format): Rewrite in terms of
new maint.mk macros.
(sc_libvirt_unmarked_diagnostics): Fix whitespace.
* .x-sc_unmarked_diagnostics: New file.
* tests/object-locking.ml: Fix copyright.
* tools/virt-pki-validate.in: Likewise.
* tools/virt-xml-validate.in: Likewise.
2010-03-31 23:02:10 +00:00
|
|
|
halt='use virBufferAddLit, not virBufferAdd, with a string literal' \
|
|
|
|
$(_sc_search_regexp)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
2013-05-07 11:42:40 +00:00
|
|
|
sc_prohibit_virBufferAsprintf_with_string_literal:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<virBufferAsprintf *\([^,]+, *"([^%"\]|\\.|%%)*"\)' \
|
2013-05-07 11:42:40 +00:00
|
|
|
halt='use virBufferAddLit, not virBufferAsprintf, with a string literal' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2014-03-13 00:05:31 +00:00
|
|
|
sc_forbid_manual_xml_indent:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='virBuffer.*" +<' \
|
2014-03-13 00:05:31 +00:00
|
|
|
halt='use virBufferAdjustIndent instead of spaces when indenting xml' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-04-25 20:24:42 +00:00
|
|
|
# dirname and basename from <libgen.h> are not required to be thread-safe
|
|
|
|
sc_prohibit_libgen:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='( (base|dir)name *\(|include .libgen\.h)' \
|
2019-12-23 15:37:45 +00:00
|
|
|
halt='use functions from GLib, not <libgen.h>' \
|
2013-04-25 20:24:42 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2010-11-24 20:08:55 +00:00
|
|
|
# raw xmlGetProp requires some nasty casts
|
|
|
|
sc_prohibit_xmlGetProp:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<xmlGetProp *\(' \
|
|
|
|
halt='use virXMLPropString, not xmlGetProp' \
|
2010-11-24 20:08:55 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2012-02-24 18:48:55 +00:00
|
|
|
# xml(ParseURI|SaveUri) doesn't handle IPv6 URIs well
|
|
|
|
sc_prohibit_xmlURI:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<xml(ParseURI|SaveUri) *\(' \
|
|
|
|
halt='use virURI(Parse|Format), not xml(ParseURI|SaveUri)' \
|
2012-02-24 18:48:55 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2012-03-23 07:34:09 +00:00
|
|
|
# we don't want old old-style return with parentheses around argument
|
|
|
|
sc_prohibit_return_as_function:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<return *\(([^()]*(\([^()]*\)[^()]*)*)\) *;' \
|
|
|
|
halt='avoid extra () with return statements' \
|
2012-03-23 07:34:09 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-10-14 13:02:40 +00:00
|
|
|
# G_GNUC_UNUSED should only be applied in implementations, not
|
2011-07-08 21:58:28 +00:00
|
|
|
# header declarations
|
2019-10-14 13:02:40 +00:00
|
|
|
sc_avoid_g_gnuc_unused_in_header:
|
|
|
|
@prohibit='^[^#]*G_GNUC_UNUSED([^:]|$$)' \
|
2017-11-03 12:09:47 +00:00
|
|
|
in_vc_files='\.h$$' \
|
2019-10-14 13:02:40 +00:00
|
|
|
halt='use G_GNUC_UNUSED in .c rather than .h files' \
|
2011-07-08 21:58:28 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2015-04-14 11:37:41 +00:00
|
|
|
sc_prohibit_int_index:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<(int|unsigned)\s*\*?index\>(\s|,|;)' \
|
|
|
|
halt='use different name than 'index' for declaration' \
|
2015-04-14 11:37:41 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-07-08 14:17:29 +00:00
|
|
|
sc_prohibit_int_ijk:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<(int|unsigned) ([^(=]* )*(i|j|k)\>(\s|,|;)' \
|
|
|
|
exclude='exempt from syntax-check' \
|
|
|
|
halt='use size_t, not int/unsigned int for loop vars i, j, k' \
|
2013-07-08 14:17:29 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
sc_prohibit_loop_iijjkk:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<(int|unsigned) ([^=]+ )*(ii|jj|kk)\>(\s|,|;)' \
|
|
|
|
halt='use i, j, k for loop iterators, not ii, jj, kk' \
|
2013-07-08 14:17:29 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-08-07 22:44:58 +00:00
|
|
|
# RHEL 5 gcc can't grok "for (int i..."
|
|
|
|
sc_prohibit_loop_var_decl:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<for *\(\w+[ *]+\w+' \
|
|
|
|
in_vc_files='\.[ch]$$' \
|
|
|
|
halt='declare loop iterators outside the for statement' \
|
2013-08-07 22:44:58 +00:00
|
|
|
$(_sc_search_regexp)
|
2014-11-17 23:39:48 +00:00
|
|
|
|
|
|
|
# Use 'bool', not 'int', when assigning true or false
|
|
|
|
sc_prohibit_int_assign_bool:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<int\>.*= *(true|false)' \
|
|
|
|
halt='use bool type for boolean values' \
|
2014-11-17 23:39:48 +00:00
|
|
|
$(_sc_search_regexp)
|
2013-07-08 14:17:29 +00:00
|
|
|
|
2016-10-06 14:54:41 +00:00
|
|
|
sc_prohibit_unsigned_pid:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<unsigned\> [^,=;(]+pid' \
|
|
|
|
halt='use signed type for pid values' \
|
2016-10-06 14:54:41 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
# Many of the function names below came from this filter:
|
|
|
|
# git grep -B2 '\<_('|grep -E '\.c- *[[:alpha:]_][[:alnum:]_]* ?\(.*[,;]$' \
|
|
|
|
# |sed 's/.*\.c- *//'|perl -pe 's/ ?\(.*//'|sort -u \
|
lib: Replace qsort() with g_qsort_with_data()
While glibc provides qsort(), which usually is just a mergesort,
until sorting arrays so huge that temporary array used by
mergesort would not fit into physical memory (which in our case
is never), we are not guaranteed it'll use mergesort. The
advantage of mergesort is clear - it's stable. IOW, if we have an
array of values parsed from XML, qsort() it and produce some
output based on those values, we can then compare the output with
some expected output, line by line.
But with newer glibc this is all history. After [1], qsort() is
no longer mergesort but introsort instead, which is not stable.
This is suboptimal, because in some cases we want to preserve
order of equal items. For instance, in ebiptablesApplyNewRules(),
nwfilter rules are sorted by their priority. But if two rules
have the same priority, we want to keep them in the order they
appear in the XML. Since it's hard/needless work to identify
places where stable or unstable sorting is needed, let's just
play it safe and use stable sorting everywhere.
Fortunately, glib provides g_qsort_with_data() which indeed
implement mergesort and it's a drop in replacement for qsort(),
almost. It accepts fifth argument (pointer to opaque data), that
is passed to comparator function, which then accepts three
arguments.
We have to keep one occurance of qsort() though - in NSS module
which deliberately does not link with glib.
1: https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=03bf8357e8291857a435afcc3048e0b697b6cc04
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
2023-11-22 13:58:49 +00:00
|
|
|
# |grep -vE '^(if|close|assert|fputc|free|N_|vir.*GetName|.*Unlock|virNodeListDevices|virHashRemoveEntry|freeaddrinfo|.*[fF]ree|xdrmem_create|xmlXPathFreeObject|virUUIDFormat|openvzSetProgramSentinal|polkit_action_unref)$'
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
|
|
|
msg_gen_function =
|
2011-04-17 06:30:49 +00:00
|
|
|
msg_gen_function += VIR_ERROR
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
msg_gen_function += lxcError
|
|
|
|
msg_gen_function += regerror
|
2010-05-12 17:23:06 +00:00
|
|
|
msg_gen_function += vah_error
|
|
|
|
msg_gen_function += vah_warning
|
2023-01-19 16:34:12 +00:00
|
|
|
msg_gen_function += vboxReportError
|
2011-04-17 06:30:49 +00:00
|
|
|
msg_gen_function += virGenericReportError
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
msg_gen_function += virRaiseError
|
2012-07-18 10:23:56 +00:00
|
|
|
msg_gen_function += virReportError
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
msg_gen_function += virReportErrorHelper
|
|
|
|
msg_gen_function += virReportSystemError
|
2019-06-11 09:23:48 +00:00
|
|
|
msg_gen_function += virLastErrorPrefixMessage
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
2020-08-17 06:47:42 +00:00
|
|
|
# Uncomment the following and run "ninja test" to see diagnostics
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
# that are not yet marked for translation, but that need to be rewritten
|
|
|
|
# so that they are translatable.
|
|
|
|
# msg_gen_function += fprintf
|
|
|
|
# msg_gen_function += testError
|
|
|
|
# msg_gen_function += vshPrint
|
|
|
|
# msg_gen_function += vshError
|
|
|
|
|
2020-03-13 18:39:25 +00:00
|
|
|
space = $(null) $(null)
|
2016-06-16 10:05:35 +00:00
|
|
|
func_re= ($(subst $(space),|,$(msg_gen_function)))
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
|
|
|
# Look for diagnostics that aren't marked for translation.
|
|
|
|
# This won't find any for which error's format string is on a separate line.
|
|
|
|
# The sed filters eliminate false-positives like these:
|
|
|
|
# _("...: "
|
|
|
|
# "%s", _("no storage vol w..."
|
|
|
|
sc_libvirt_unmarked_diagnostics:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<$(func_re) *\([^"]*"[^"]*[a-z]{3}' \
|
|
|
|
exclude='_\(' \
|
|
|
|
halt='found unmarked diagnostic(s)' \
|
2012-03-02 00:21:08 +00:00
|
|
|
$(_sc_search_regexp)
|
2019-01-03 19:30:39 +00:00
|
|
|
@{ $(VC_LIST_EXCEPT) | xargs \
|
|
|
|
$(GREP) -nE '\<$(func_re) *\(.*;$$' /dev/null; \
|
|
|
|
$(VC_LIST_EXCEPT) | xargs \
|
|
|
|
$(GREP) -A1 -nE '\<$(func_re) *\(.*,$$' /dev/null; } \
|
2019-01-08 14:24:36 +00:00
|
|
|
| $(SED) -E 's/_\("([^\"]|\\.)+"//;s/"%s"//' \
|
|
|
|
| $(GREP) '"' && \
|
2022-05-23 13:55:16 +00:00
|
|
|
{ echo 'found unmarked diagnostic(s)' 1>&2; \
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
exit 1; } || :
|
2009-07-07 16:08:45 +00:00
|
|
|
|
2010-05-20 09:13:41 +00:00
|
|
|
# Like the above, but prohibit a newline at the end of a diagnostic.
|
|
|
|
# This is subject to false positives partly because it naively looks for
|
|
|
|
# `\n"', which may not be the end of the string, and also because it takes
|
|
|
|
# two lines of context (the -A2) after the line with the function name.
|
|
|
|
# FIXME: this rule might benefit from a separate function list, in case
|
|
|
|
# there are functions to which this one applies but that do not get marked
|
|
|
|
# diagnostics.
|
|
|
|
sc_prohibit_newline_at_end_of_diagnostic:
|
2019-01-03 19:30:39 +00:00
|
|
|
@$(VC_LIST_EXCEPT) | xargs $(GREP) -A2 -nE \
|
|
|
|
'\<$(func_re) *\(' /dev/null \
|
2019-01-03 15:31:37 +00:00
|
|
|
| $(GREP) '\\n"' \
|
2022-05-23 13:55:16 +00:00
|
|
|
&& { echo 'newline at end of message(s)' 1>&2; \
|
2010-05-20 09:13:41 +00:00
|
|
|
exit 1; } || :
|
|
|
|
|
2023-08-28 10:56:36 +00:00
|
|
|
# Disallow translated messages on multiple lines, except when
|
|
|
|
# they end with '\n'.
|
|
|
|
sc_prohibit_error_message_on_multiple_lines:
|
|
|
|
@prohibit='[^N]_\(".*"$$' \
|
|
|
|
exclude='\\n"$$' \
|
|
|
|
halt='found error message on multiple lines' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
maint: don't permit format strings without %
Any time we have a string with no % passed through gettext, a
translator can inject a % to cause a stack overread. When there
is nothing to format, it's easier to ask for a string that cannot
be used as a formatter, by using a trivial "%s" format instead.
In the past, we have used --disable-nls to catch some of the
offenders, but that doesn't get run very often, and many more
uses have crept in. Syntax check to the rescue!
The syntax check can catch uses such as
virReportError(code,
_("split "
"string"));
by using a sed script to fold context lines into one pattern
space before checking for a string without %.
This patch is just mechanical insertion of %s; there are probably
several messages touched by this patch where we would be better
off giving the user more information than a fixed string.
* cfg.mk (sc_prohibit_diagnostic_without_format): New rule.
* src/datatypes.c (virUnrefConnect, virGetDomain)
(virUnrefDomain, virGetNetwork, virUnrefNetwork, virGetInterface)
(virUnrefInterface, virGetStoragePool, virUnrefStoragePool)
(virGetStorageVol, virUnrefStorageVol, virGetNodeDevice)
(virGetSecret, virUnrefSecret, virGetNWFilter, virUnrefNWFilter)
(virGetDomainSnapshot, virUnrefDomainSnapshot): Add %s wrapper.
* src/lxc/lxc_driver.c (lxcDomainSetBlkioParameters)
(lxcDomainGetBlkioParameters): Likewise.
* src/conf/domain_conf.c (virSecurityDeviceLabelDefParseXML)
(virDomainDiskDefParseXML, virDomainGraphicsDefParseXML):
Likewise.
* src/conf/network_conf.c (virNetworkDNSHostsDefParseXML)
(virNetworkDefParseXML): Likewise.
* src/conf/nwfilter_conf.c (virNWFilterIsValidChainName):
Likewise.
* src/conf/nwfilter_params.c (virNWFilterVarValueCreateSimple)
(virNWFilterVarAccessParse): Likewise.
* src/libvirt.c (virDomainSave, virDomainSaveFlags)
(virDomainRestore, virDomainRestoreFlags)
(virDomainSaveImageGetXMLDesc, virDomainSaveImageDefineXML)
(virDomainCoreDump, virDomainGetXMLDesc)
(virDomainMigrateVersion1, virDomainMigrateVersion2)
(virDomainMigrateVersion3, virDomainMigrate, virDomainMigrate2)
(virStreamSendAll, virStreamRecvAll)
(virDomainSnapshotGetXMLDesc): Likewise.
* src/nwfilter/nwfilter_dhcpsnoop.c (virNWFilterSnoopReqLeaseDel)
(virNWFilterDHCPSnoopReq): Likewise.
* src/openvz/openvz_driver.c (openvzUpdateDevice): Likewise.
* src/openvz/openvz_util.c (openvzKBPerPages): Likewise.
* src/qemu/qemu_cgroup.c (qemuSetupCgroup): Likewise.
* src/qemu/qemu_command.c (qemuBuildHubDevStr, qemuBuildChrChardevStr)
(qemuBuildCommandLine): Likewise.
* src/qemu/qemu_driver.c (qemuDomainGetPercpuStats): Likewise.
* src/qemu/qemu_hotplug.c (qemuDomainAttachNetDevice): Likewise.
* src/rpc/virnetsaslcontext.c (virNetSASLSessionGetIdentity):
Likewise.
* src/rpc/virnetsocket.c (virNetSocketNewConnectUNIX)
(virNetSocketSendFD, virNetSocketRecvFD): Likewise.
* src/storage/storage_backend_disk.c
(virStorageBackendDiskBuildPool): Likewise.
* src/storage/storage_backend_fs.c
(virStorageBackendFileSystemProbe)
(virStorageBackendFileSystemBuild): Likewise.
* src/storage/storage_backend_rbd.c
(virStorageBackendRBDOpenRADOSConn): Likewise.
* src/storage/storage_driver.c (storageVolumeResize): Likewise.
* src/test/test_driver.c (testInterfaceChangeBegin)
(testInterfaceChangeCommit, testInterfaceChangeRollback):
Likewise.
* src/vbox/vbox_tmpl.c (vboxListAllDomains): Likewise.
* src/xenxs/xen_sxpr.c (xenFormatSxprDisk, xenFormatSxpr):
Likewise.
* src/xenxs/xen_xm.c (xenXMConfigGetUUID, xenFormatXMDisk)
(xenFormatXM): Likewise.
2012-07-23 20:33:08 +00:00
|
|
|
# Look for diagnostics that lack a % in the format string, except that we
|
|
|
|
# allow VIR_ERROR to do this, and ignore functions that take a single
|
|
|
|
# string rather than a format argument.
|
|
|
|
sc_prohibit_diagnostic_without_format:
|
2019-01-03 19:30:39 +00:00
|
|
|
@{ $(VC_LIST_EXCEPT) | xargs \
|
|
|
|
$(GREP) -nE '\<$(func_re) *\(.*;$$' /dev/null; \
|
|
|
|
$(VC_LIST_EXCEPT) | xargs \
|
|
|
|
$(GREP) -A2 -nE '\<$(func_re) *\(.*,$$' /dev/null; } \
|
2017-11-03 12:09:47 +00:00
|
|
|
| $(SED) -rn -e ':l; /[,"]$$/ {N;b l;}' \
|
2019-09-03 04:24:00 +00:00
|
|
|
-e '/(vah_(error|warning))/d' \
|
2017-11-03 12:09:47 +00:00
|
|
|
-e '/\<$(func_re) *\([^"]*"([^%"]|"\n[^"]*")*"[,)]/p' \
|
2019-01-03 15:31:37 +00:00
|
|
|
| $(GREP) -vE 'VIR_ERROR' && \
|
2022-05-23 13:55:16 +00:00
|
|
|
{ echo 'found diagnostic without %' 1>&2; \
|
maint: don't permit format strings without %
Any time we have a string with no % passed through gettext, a
translator can inject a % to cause a stack overread. When there
is nothing to format, it's easier to ask for a string that cannot
be used as a formatter, by using a trivial "%s" format instead.
In the past, we have used --disable-nls to catch some of the
offenders, but that doesn't get run very often, and many more
uses have crept in. Syntax check to the rescue!
The syntax check can catch uses such as
virReportError(code,
_("split "
"string"));
by using a sed script to fold context lines into one pattern
space before checking for a string without %.
This patch is just mechanical insertion of %s; there are probably
several messages touched by this patch where we would be better
off giving the user more information than a fixed string.
* cfg.mk (sc_prohibit_diagnostic_without_format): New rule.
* src/datatypes.c (virUnrefConnect, virGetDomain)
(virUnrefDomain, virGetNetwork, virUnrefNetwork, virGetInterface)
(virUnrefInterface, virGetStoragePool, virUnrefStoragePool)
(virGetStorageVol, virUnrefStorageVol, virGetNodeDevice)
(virGetSecret, virUnrefSecret, virGetNWFilter, virUnrefNWFilter)
(virGetDomainSnapshot, virUnrefDomainSnapshot): Add %s wrapper.
* src/lxc/lxc_driver.c (lxcDomainSetBlkioParameters)
(lxcDomainGetBlkioParameters): Likewise.
* src/conf/domain_conf.c (virSecurityDeviceLabelDefParseXML)
(virDomainDiskDefParseXML, virDomainGraphicsDefParseXML):
Likewise.
* src/conf/network_conf.c (virNetworkDNSHostsDefParseXML)
(virNetworkDefParseXML): Likewise.
* src/conf/nwfilter_conf.c (virNWFilterIsValidChainName):
Likewise.
* src/conf/nwfilter_params.c (virNWFilterVarValueCreateSimple)
(virNWFilterVarAccessParse): Likewise.
* src/libvirt.c (virDomainSave, virDomainSaveFlags)
(virDomainRestore, virDomainRestoreFlags)
(virDomainSaveImageGetXMLDesc, virDomainSaveImageDefineXML)
(virDomainCoreDump, virDomainGetXMLDesc)
(virDomainMigrateVersion1, virDomainMigrateVersion2)
(virDomainMigrateVersion3, virDomainMigrate, virDomainMigrate2)
(virStreamSendAll, virStreamRecvAll)
(virDomainSnapshotGetXMLDesc): Likewise.
* src/nwfilter/nwfilter_dhcpsnoop.c (virNWFilterSnoopReqLeaseDel)
(virNWFilterDHCPSnoopReq): Likewise.
* src/openvz/openvz_driver.c (openvzUpdateDevice): Likewise.
* src/openvz/openvz_util.c (openvzKBPerPages): Likewise.
* src/qemu/qemu_cgroup.c (qemuSetupCgroup): Likewise.
* src/qemu/qemu_command.c (qemuBuildHubDevStr, qemuBuildChrChardevStr)
(qemuBuildCommandLine): Likewise.
* src/qemu/qemu_driver.c (qemuDomainGetPercpuStats): Likewise.
* src/qemu/qemu_hotplug.c (qemuDomainAttachNetDevice): Likewise.
* src/rpc/virnetsaslcontext.c (virNetSASLSessionGetIdentity):
Likewise.
* src/rpc/virnetsocket.c (virNetSocketNewConnectUNIX)
(virNetSocketSendFD, virNetSocketRecvFD): Likewise.
* src/storage/storage_backend_disk.c
(virStorageBackendDiskBuildPool): Likewise.
* src/storage/storage_backend_fs.c
(virStorageBackendFileSystemProbe)
(virStorageBackendFileSystemBuild): Likewise.
* src/storage/storage_backend_rbd.c
(virStorageBackendRBDOpenRADOSConn): Likewise.
* src/storage/storage_driver.c (storageVolumeResize): Likewise.
* src/test/test_driver.c (testInterfaceChangeBegin)
(testInterfaceChangeCommit, testInterfaceChangeRollback):
Likewise.
* src/vbox/vbox_tmpl.c (vboxListAllDomains): Likewise.
* src/xenxs/xen_sxpr.c (xenFormatSxprDisk, xenFormatSxpr):
Likewise.
* src/xenxs/xen_xm.c (xenXMConfigGetUUID, xenFormatXMDisk)
(xenFormatXM): Likewise.
2012-07-23 20:33:08 +00:00
|
|
|
exit 1; } || :
|
|
|
|
|
2023-03-08 09:58:23 +00:00
|
|
|
sc_require_permutable_format_in_translation:
|
|
|
|
@prohibit='\<N?_ *\("[^"]*%[^%$$ ]*[a-zA-Z][^"]*"' \
|
|
|
|
halt='non-permutable format string(s)' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2012-07-10 21:43:08 +00:00
|
|
|
# The strings "" and "%s" should never be marked for translation.
|
2012-08-20 14:26:58 +00:00
|
|
|
# Files under tests/ and examples/ should not be translated.
|
2012-07-10 21:43:08 +00:00
|
|
|
sc_prohibit_useless_translation:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='_\("(%s)?"\)' \
|
|
|
|
halt='found useless translation' \
|
2012-08-20 14:26:58 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<N?_ *\(' \
|
|
|
|
in_vc_files='(tests|examples)/' \
|
|
|
|
halt='no translations in tests or examples' \
|
2012-07-10 21:43:08 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2012-09-12 16:54:42 +00:00
|
|
|
# When splitting a diagnostic across lines, ensure that there is a space
|
|
|
|
# or \n on one side of the split.
|
|
|
|
sc_require_whitespace_in_translation:
|
2019-01-03 19:30:39 +00:00
|
|
|
@$(VC_LIST_EXCEPT) | xargs $(GREP) -n -A1 '"$$' /dev/null \
|
2017-11-03 12:09:47 +00:00
|
|
|
| $(SED) -ne ':l; /"$$/ {N;b l;}; s/"\n[^"]*"/""/g; s/\\n/ /g' \
|
2019-01-03 15:31:37 +00:00
|
|
|
-e '/_(.*[^\ ]""[^\ ]/p' | $(GREP) . && \
|
2022-05-23 13:55:16 +00:00
|
|
|
{ echo 'missing whitespace at line split' 1>&2; \
|
2012-09-12 16:54:42 +00:00
|
|
|
exit 1; } || :
|
|
|
|
|
2010-03-09 21:22:14 +00:00
|
|
|
# Enforce recommended preprocessor indentation style.
|
|
|
|
sc_preprocessor_indentation:
|
2017-11-03 12:09:47 +00:00
|
|
|
@if cppi --version >/dev/null 2>&1; then \
|
2019-01-03 15:31:37 +00:00
|
|
|
$(VC_LIST_EXCEPT) | $(GREP) -E '\.[ch](\.in)?$$' | xargs cppi -a -c \
|
2022-05-23 13:55:16 +00:00
|
|
|
|| { echo 'incorrect preprocessor indentation' 1>&2; \
|
2017-11-03 12:09:47 +00:00
|
|
|
exit 1; }; \
|
|
|
|
else \
|
2022-05-23 13:55:16 +00:00
|
|
|
echo 'skipping test $@: cppi not installed' 1>&2; \
|
2010-03-09 21:22:14 +00:00
|
|
|
fi
|
|
|
|
|
2013-01-09 20:50:03 +00:00
|
|
|
# Enforce similar spec file indentation style, by running cppi on a
|
|
|
|
# (comment-only) C file that mirrors the same layout as the spec file.
|
|
|
|
sc_spec_indentation:
|
2017-11-03 12:09:47 +00:00
|
|
|
@if cppi --version >/dev/null 2>&1; then \
|
2019-01-03 15:31:37 +00:00
|
|
|
for f in $$($(VC_LIST_EXCEPT) | $(GREP) '\.spec\.in$$'); do \
|
2017-11-03 12:09:47 +00:00
|
|
|
$(SED) -e 's|#|// #|; s|%ifn*\(arch\)* |#if a // |' \
|
|
|
|
-e 's/%\(else\|endif\|define\)/#\1/' \
|
|
|
|
-e 's/^\( *\)\1\1\1#/#\1/' \
|
|
|
|
-e 's|^\( *[^#/ ]\)|// \1|; s|^\( */[^/]\)|// \1|' $$f \
|
|
|
|
| cppi -a -c 2>&1 | $(SED) "s|standard input|$$f|"; \
|
2019-01-03 15:31:37 +00:00
|
|
|
done | { if $(GREP) . >&2; then false; else :; fi; } \
|
2022-05-23 13:55:16 +00:00
|
|
|
|| { echo 'incorrect preprocessor indentation' 1>&2; \
|
2017-11-03 12:09:47 +00:00
|
|
|
exit 1; }; \
|
|
|
|
else \
|
2022-05-23 13:55:16 +00:00
|
|
|
echo 'skipping test $@: cppi not installed' 1>&2; \
|
2013-01-09 20:50:03 +00:00
|
|
|
fi
|
|
|
|
|
2013-07-17 17:47:01 +00:00
|
|
|
|
2012-07-26 22:58:02 +00:00
|
|
|
# Prefer the new URL listing over the old street address listing when
|
2013-05-14 23:41:15 +00:00
|
|
|
# calling out where to get a copy of the [L]GPL. Also, while we have
|
|
|
|
# to ship COPYING (GPL) alongside COPYING.LESSER (LGPL), we want any
|
|
|
|
# source file that calls out a top-level file to call out the LGPL
|
|
|
|
# version. Note that our typical copyright boilerplate refers to the
|
|
|
|
# license by name, not by reference to a top-level file.
|
|
|
|
sc_copyright_usage:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit=Boston,' MA' \
|
|
|
|
halt='Point to <http://www.gnu.org/licenses/>, not an address' \
|
2012-07-26 22:58:02 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@require='COPYING\.LESSER' \
|
|
|
|
containing='COPYING' \
|
|
|
|
halt='Refer to COPYING.LESSER for LGPL' \
|
2013-05-14 23:41:15 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='COPYING\.LIB' \
|
|
|
|
halt='Refer to COPYING.LESSER for LGPL' \
|
2013-05-14 23:41:15 +00:00
|
|
|
$(_sc_search_regexp)
|
2012-07-26 22:58:02 +00:00
|
|
|
|
2010-05-19 10:51:11 +00:00
|
|
|
# Some functions/macros produce messages intended solely for developers
|
|
|
|
# and maintainers. Do not mark them for translation.
|
|
|
|
sc_prohibit_gettext_markup:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<VIR_(WARN|INFO|DEBUG) *\(_\(' \
|
|
|
|
halt='do not mark these strings for translation' \
|
2010-05-19 10:51:11 +00:00
|
|
|
$(_sc_search_regexp)
|
2010-03-18 17:25:01 +00:00
|
|
|
|
2012-03-02 00:21:08 +00:00
|
|
|
# Our code is divided into modular subdirectories for a reason, and
|
|
|
|
# lower-level code must not include higher-level headers.
|
2020-06-25 21:29:43 +00:00
|
|
|
cross_dirs=$(patsubst $(top_srcdir)/src/%.,%,$(wildcard $(top_srcdir)/src/*/.))
|
2012-03-02 00:21:08 +00:00
|
|
|
cross_dirs_re=($(subst / ,/|,$(cross_dirs)))
|
2018-01-25 10:53:54 +00:00
|
|
|
mid_dirs=access|admin|conf|cpu|locking|logging|rpc|security
|
2012-03-02 00:21:08 +00:00
|
|
|
sc_prohibit_cross_inclusion:
|
2017-11-03 12:09:47 +00:00
|
|
|
@for dir in $(cross_dirs); do \
|
|
|
|
case $$dir in \
|
|
|
|
util/) safe="util";; \
|
|
|
|
access/ | conf/) safe="($$dir|conf|util)";; \
|
2018-10-02 13:08:28 +00:00
|
|
|
cpu/| network/| node_device/| rpc/| security/| storage/) \
|
2017-11-03 12:09:47 +00:00
|
|
|
safe="($$dir|util|conf|storage)";; \
|
2020-02-22 17:02:42 +00:00
|
|
|
*) safe="($$dir|$(mid_dirs)|hypervisor|util)";; \
|
2017-11-03 12:09:47 +00:00
|
|
|
esac; \
|
2020-02-11 00:07:29 +00:00
|
|
|
in_vc_files="src/$$dir" \
|
2017-11-03 12:09:47 +00:00
|
|
|
prohibit='^# *include .$(cross_dirs_re)' \
|
|
|
|
exclude="# *include .$$safe" \
|
|
|
|
halt='unsafe cross-directory include' \
|
|
|
|
$(_sc_search_regexp) \
|
2012-03-02 00:21:08 +00:00
|
|
|
done
|
|
|
|
|
2012-01-20 21:00:58 +00:00
|
|
|
# When converting an enum to a string, make sure that we track any new
|
|
|
|
# elements added to the enum by using a _LAST marker.
|
|
|
|
sc_require_enum_last_marker:
|
2019-01-03 19:30:39 +00:00
|
|
|
@$(VC_LIST_EXCEPT) | xargs \
|
|
|
|
$(GREP) -A1 -nE '^[^#]*VIR_ENUM_IMPL *\(' /dev/null \
|
2019-04-07 23:04:08 +00:00
|
|
|
| $(SED) -ne '/VIR_ENUM_IMPL.*,$$/N' \
|
|
|
|
-e '/VIR_ENUM_IMPL[^,]*,[^,]*,[^,]*[^_,][^L,][^A,][^S,][^T,],/p' \
|
2017-11-03 12:09:47 +00:00
|
|
|
-e '/VIR_ENUM_IMPL[^,]*,[^,]\{0,4\},/p' \
|
2019-01-03 15:31:37 +00:00
|
|
|
| $(GREP) . && \
|
2022-05-23 13:55:16 +00:00
|
|
|
{ echo 'enum impl needs _LAST marker on second line' 1>&2; \
|
2012-01-20 21:00:58 +00:00
|
|
|
exit 1; } || :
|
|
|
|
|
2023-02-20 10:12:44 +00:00
|
|
|
sc_prohibit_python_without_env:
|
|
|
|
@prohibit='#!/usr/.*/py''thon' \
|
|
|
|
halt='always call python via /usr/bin/env' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-10-08 09:38:29 +00:00
|
|
|
# We're intentionally ignoring a few warnings
|
|
|
|
#
|
2023-01-17 18:01:59 +00:00
|
|
|
# E302: whitespace before ':'. This is something that is
|
|
|
|
# desirable when indexing array slices and is used by the
|
|
|
|
# 'black' formatting tool
|
|
|
|
#
|
2019-10-08 09:38:29 +00:00
|
|
|
# E501: Force breaking lines at < 80 characters results in
|
|
|
|
# some really unnatural code formatting which harms
|
|
|
|
# readability.
|
|
|
|
#
|
2023-01-17 18:01:59 +00:00
|
|
|
# W503: line break before binary operator, because this
|
|
|
|
# is contrary to what 'black' formatting tool wants
|
|
|
|
#
|
2019-10-08 09:38:29 +00:00
|
|
|
# W504: Knuth code style requires the operators "or" and "and" etc
|
|
|
|
# to be at the start of line in a multi-line conditional.
|
|
|
|
# This the opposite to what is normal libvirt practice.
|
|
|
|
#
|
2023-01-17 18:01:59 +00:00
|
|
|
FLAKE8_IGNORE = E203,E501,W503,W504
|
2019-09-24 11:50:43 +00:00
|
|
|
|
2019-09-18 04:19:43 +00:00
|
|
|
sc_flake8:
|
|
|
|
@if [ -n "$(FLAKE8)" ]; then \
|
2021-03-19 13:24:19 +00:00
|
|
|
DOT_PY=$$($(VC_LIST_EXCEPT) | $(GREP) '\.py$$'); \
|
|
|
|
BANG_PY=$$($(VC_LIST_EXCEPT) | xargs grep -l '^#!/usr/bin/env python3$$'); \
|
|
|
|
ALL_PY=$$(printf "%s\n%s" "$$DOT_PY" "$$BANG_PY" | sort -u); \
|
|
|
|
echo "$$ALL_PY" | xargs $(FLAKE8) --ignore $(FLAKE8_IGNORE) --show-source; \
|
2019-09-18 04:19:43 +00:00
|
|
|
else \
|
2022-05-23 13:55:16 +00:00
|
|
|
echo 'skipping test $@: flake8 not installed' 1>&2; \
|
2019-09-18 04:19:43 +00:00
|
|
|
fi
|
2013-02-07 07:01:52 +00:00
|
|
|
|
2023-02-01 16:19:16 +00:00
|
|
|
sc_black:
|
|
|
|
if [ -n "$(BLACK)" ]; then \
|
|
|
|
DOT_PY=$$($(VC_LIST_EXCEPT) | $(GREP) '\.py$$'); \
|
|
|
|
BANG_PY=$$($(VC_LIST_EXCEPT) | xargs grep -l '^#!/usr/bin/env python3$$'); \
|
|
|
|
ALL_PY=$$(printf "%s\n%s" "$$DOT_PY" "$$BANG_PY" | sort -u); \
|
|
|
|
echo "$$ALL_PY" | xargs --no-run-if-empty $(BLACK) --check; \
|
|
|
|
else \
|
|
|
|
echo 'skipping test $@: black not installed' 1>&2; \
|
|
|
|
fi
|
|
|
|
|
2013-02-22 22:42:39 +00:00
|
|
|
# mymain() in test files should use return, not exit, for nicer output
|
|
|
|
sc_prohibit_exit_in_tests:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<exit *\(' \
|
|
|
|
in_vc_files='tests/.*\.c$$' \
|
2020-04-23 09:57:14 +00:00
|
|
|
exclude='exempt from syntax-check' \
|
2017-11-03 12:09:47 +00:00
|
|
|
halt='use return, not exit(), in tests' \
|
2013-02-22 22:42:39 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-04-17 10:19:18 +00:00
|
|
|
# Don't include "libvirt/*.h" in "" form.
|
2013-04-17 10:19:19 +00:00
|
|
|
sc_prohibit_include_public_headers_quote:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='# *include *"libvirt/.*\.h"' \
|
|
|
|
in_vc_files='\.[ch]$$' \
|
|
|
|
halt='Do not include libvirt/*.h in internal source' \
|
2013-04-17 10:19:19 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Don't include "libvirt/*.h" in <> form. Except for external tools,
|
|
|
|
# e.g. Python binding, examples and tools subdirectories.
|
|
|
|
sc_prohibit_include_public_headers_brackets:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='# *include *<libvirt/.*\.h>' \
|
|
|
|
in_vc_files='\.[ch]$$' \
|
|
|
|
halt='Do not include libvirt/*.h in internal source' \
|
2013-04-17 10:19:18 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-05-31 17:52:51 +00:00
|
|
|
# <config.h> is only needed in .c files; .h files do not need it since
|
|
|
|
# .c files must include config.h before any other .h.
|
|
|
|
sc_prohibit_config_h_in_headers:
|
2022-05-23 13:46:24 +00:00
|
|
|
@prohibit='^# *include *[<"]config\.h' \
|
2017-11-03 12:09:47 +00:00
|
|
|
in_vc_files='\.h$$' \
|
|
|
|
halt='headers should not include <config.h>' \
|
2013-05-31 17:52:51 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-08-19 14:17:20 +00:00
|
|
|
sc_prohibit_unbounded_arrays_in_rpc:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='<>' \
|
|
|
|
in_vc_files='\.x$$' \
|
|
|
|
halt='Arrays in XDR must have a upper limit set for <NNN>' \
|
2013-08-19 14:17:20 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-11-14 16:14:26 +00:00
|
|
|
sc_prohibit_atoi:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\bato(i|f|l|ll|q) *\(' \
|
2013-11-14 16:14:26 +00:00
|
|
|
halt='Use virStrToLong* instead of atoi, atol, atof, atoq, atoll' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2014-03-07 13:38:51 +00:00
|
|
|
sc_prohibit_wrong_filename_in_comment:
|
2019-01-03 19:30:39 +00:00
|
|
|
@$(VC_LIST_EXCEPT) | $(GREP) '\.[ch]$$' | xargs awk 'BEGIN { \
|
2017-11-03 12:09:47 +00:00
|
|
|
fail=0; \
|
|
|
|
} FNR < 3 { \
|
2014-03-07 13:38:51 +00:00
|
|
|
n=match($$0, /[[:space:]][^[:space:]]*[.][ch][[:space:]:]/); \
|
2017-11-03 12:09:47 +00:00
|
|
|
if (n > 0) { \
|
|
|
|
A=substr($$0, RSTART+1, RLENGTH-2); \
|
|
|
|
n=split(FILENAME, arr, "/"); \
|
|
|
|
if (A != arr[n]) { \
|
|
|
|
print "in " FILENAME ": " A " mentioned in comments "; \
|
|
|
|
fail=1; \
|
|
|
|
} \
|
|
|
|
} \
|
|
|
|
} END { \
|
|
|
|
if (fail == 1) { \
|
|
|
|
exit 1; \
|
|
|
|
} \
|
2022-05-23 13:55:16 +00:00
|
|
|
}' || { echo 'The file name in comments must match the' \
|
2019-01-03 19:30:39 +00:00
|
|
|
'actual file name' 1>&2; exit 1; }
|
2014-03-07 13:38:51 +00:00
|
|
|
|
2014-03-07 10:15:39 +00:00
|
|
|
sc_prohibit_virConnectOpen_in_virsh:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\bvirConnectOpen[a-zA-Z]* *\(' \
|
|
|
|
in_vc_files='tools/virsh-.*\.[ch]$$' \
|
|
|
|
halt='Use vshConnect() in virsh instead of virConnectOpen*' \
|
2014-03-07 10:15:39 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2014-03-21 12:07:03 +00:00
|
|
|
sc_require_space_before_label:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='^( ?)?[_a-zA-Z0-9]+:$$' \
|
|
|
|
in_vc_files='\.[ch]$$' \
|
|
|
|
halt='Top-level labels should be indented by one space' \
|
2014-03-21 12:07:03 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2015-11-02 11:12:22 +00:00
|
|
|
# Allow for up to three spaces before the label: this is to avoid running
|
|
|
|
# into situations where neither this rule nor require_space_before_label
|
|
|
|
# would apply, eg. a line matching ^[a-zA-Z0-9]+ :$
|
|
|
|
sc_prohibit_space_in_label:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='^ {0,3}[_a-zA-Z0-9]+ +:$$' \
|
|
|
|
in_vc_files='\.[ch]$$' \
|
|
|
|
halt='There should be no space between label name and colon' \
|
2015-11-02 11:12:22 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2014-09-03 17:17:01 +00:00
|
|
|
# Doesn't catch all cases of mismatched braces across if-else, but it helps
|
|
|
|
sc_require_if_else_matching_braces:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='( else( if .*\))? {|} else( if .*\))?$$)' \
|
|
|
|
in_vc_files='\.[chx]$$' \
|
|
|
|
halt='if one side of if-else uses {}, both sides must use it' \
|
2014-09-03 17:17:01 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-09-20 15:56:38 +00:00
|
|
|
sc_curly_braces_style:
|
2019-01-03 19:30:39 +00:00
|
|
|
@if $(VC_LIST_EXCEPT) | $(GREP) '\.[ch]$$' | xargs $(GREP) -nHP \
|
2017-11-03 12:09:47 +00:00
|
|
|
'^\s*(?!([a-zA-Z_]*for_?each[a-zA-Z_]*) ?\()([_a-zA-Z0-9]+( [_a-zA-Z0-9]+)* ?\()?(\*?[_a-zA-Z0-9]+(,? \*?[_a-zA-Z0-9\[\]]+)+|void)\) ?\{' \
|
2019-01-03 19:30:39 +00:00
|
|
|
/dev/null; then \
|
2022-05-23 13:55:16 +00:00
|
|
|
echo 'Non-K&R style used for curly braces around' \
|
2017-11-03 12:09:47 +00:00
|
|
|
'function body' 1>&2; exit 1; \
|
|
|
|
fi; \
|
2019-01-03 19:30:39 +00:00
|
|
|
if $(VC_LIST_EXCEPT) | $(GREP) '\.[ch]$$' | xargs \
|
|
|
|
$(GREP) -A1 -En ' ((if|for|while|switch) \(|(else|do)\b)[^{]*$$' \
|
|
|
|
/dev/null | $(GREP) '^[^ ]*- *{'; then \
|
2022-05-23 13:55:16 +00:00
|
|
|
echo 'Use hanging braces for compound statements' 1>&2; exit 1; \
|
2014-09-03 22:18:19 +00:00
|
|
|
fi
|
2013-11-14 16:14:26 +00:00
|
|
|
|
2014-03-29 11:16:38 +00:00
|
|
|
sc_prohibit_windows_special_chars_in_filename:
|
2019-01-03 19:30:39 +00:00
|
|
|
@$(VC_LIST_EXCEPT) | $(GREP) '[:*?"<>|]' && \
|
2022-05-23 13:55:16 +00:00
|
|
|
{ echo 'Windows special chars in filename not allowed' 1>&2; echo exit 1; } || :
|
2014-03-29 11:16:38 +00:00
|
|
|
|
2014-03-13 12:00:16 +00:00
|
|
|
sc_prohibit_mixed_case_abbreviations:
|
2021-10-20 08:30:31 +00:00
|
|
|
@prohibit='Pci|Usb|Scsi|Vpd' \
|
2017-11-03 12:09:47 +00:00
|
|
|
in_vc_files='\.[ch]$$' \
|
2021-10-20 08:30:31 +00:00
|
|
|
halt='Use PCI, USB, SCSI, VPD, not Pci, Usb, Scsi, Vpd' \
|
2014-03-13 12:00:16 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2014-06-04 08:57:21 +00:00
|
|
|
# Require #include <locale.h> in all files that call setlocale()
|
|
|
|
sc_require_locale_h:
|
2017-11-03 12:09:47 +00:00
|
|
|
@require='include.*locale\.h' \
|
|
|
|
containing='setlocale *(' \
|
|
|
|
halt='setlocale() requires <locale.h>' \
|
2014-06-04 17:07:59 +00:00
|
|
|
$(_sc_search_regexp)
|
2014-06-04 08:57:21 +00:00
|
|
|
|
2014-03-18 10:29:12 +00:00
|
|
|
sc_prohibit_empty_first_line:
|
2019-01-03 19:30:39 +00:00
|
|
|
@$(VC_LIST_EXCEPT) | xargs awk 'BEGIN { fail=0; } \
|
2021-06-14 16:57:58 +00:00
|
|
|
FNR == 1 { maybe_fail = $$0 == ""; } \
|
|
|
|
FNR == 2 { if (maybe_fail == 1) { print FILENAME ":1:"; fail=1; } } \
|
2017-11-03 12:09:47 +00:00
|
|
|
END { if (fail == 1) { \
|
2022-05-23 13:55:16 +00:00
|
|
|
print "Prohibited empty first line" > "/dev/stderr"; \
|
2019-01-03 19:30:39 +00:00
|
|
|
} exit fail; }'
|
2014-03-18 10:29:12 +00:00
|
|
|
|
2014-08-20 11:00:30 +00:00
|
|
|
sc_prohibit_paren_brace:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\)\{$$' \
|
|
|
|
in_vc_files='\.[chx]$$' \
|
|
|
|
halt='Put space between closing parenthesis and opening brace' \
|
2014-08-20 11:00:30 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2014-10-28 18:22:03 +00:00
|
|
|
# C guarantees that static variables are zero initialized, and some compilers
|
|
|
|
# waste space by sticking explicit initializers in .data instead of .bss
|
|
|
|
sc_prohibit_static_zero_init:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\bstatic\b.*= *(0[^xX0-9]|NULL|false)' \
|
|
|
|
in_vc_files='\.[chx](\.in)?$$' \
|
2014-10-28 18:22:03 +00:00
|
|
|
halt='static variables do not need explicit zero initialization'\
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2014-10-01 14:07:46 +00:00
|
|
|
# FreeBSD exports the "devname" symbol which produces a warning.
|
|
|
|
sc_prohibit_devname:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\bdevname\b' \
|
2014-10-01 14:07:46 +00:00
|
|
|
exclude='sc_prohibit_devname' \
|
2016-04-11 14:45:53 +00:00
|
|
|
halt='avoid using devname as FreeBSD exports the symbol' \
|
2014-10-01 14:07:46 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2014-11-28 08:37:42 +00:00
|
|
|
sc_prohibit_system_error_with_vir_err:
|
|
|
|
@prohibit='\bvirReportSystemError *\(VIR_ERR_' \
|
|
|
|
halt='do not use virReportSystemError with VIR_ERR_* error codes' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2014-11-30 14:57:02 +00:00
|
|
|
# Rule to prohibit usage of virXXXFree within library, daemon, remote, etc.
|
|
|
|
# functions. There's a corresponding exclude to allow usage within tests,
|
|
|
|
# docs, examples, tools, src/libvirt-*.c, and include/libvirt/libvirt-*.h
|
|
|
|
sc_prohibit_virXXXFree:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\bvir(Domain|Network|NodeDevice|StorageVol|StoragePool|Stream|Secret|NWFilter|Interface|DomainSnapshot)Free\b' \
|
2014-11-30 14:57:02 +00:00
|
|
|
exclude='sc_prohibit_virXXXFree' \
|
2016-04-11 14:45:53 +00:00
|
|
|
halt='avoid using virXXXFree, use virObjectUnref instead' \
|
2014-11-30 14:57:02 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2015-02-02 10:26:49 +00:00
|
|
|
sc_prohibit_sysconf_pagesize:
|
|
|
|
@prohibit='sysconf\(_SC_PAGESIZE' \
|
|
|
|
halt='use virGetSystemPageSize[KB] instead of sysconf(_SC_PAGESIZE)' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2021-03-11 07:29:42 +00:00
|
|
|
sc_prohibit_virSecurityManager:
|
2019-01-03 19:30:39 +00:00
|
|
|
@$(VC_LIST_EXCEPT) | $(GREP) 'src/qemu/' | \
|
|
|
|
$(GREP) -v 'src/qemu/qemu_security' | \
|
2021-03-11 07:29:42 +00:00
|
|
|
xargs $(GREP) -Pn 'virSecurityManager\S*\(' /dev/null && \
|
2022-05-23 13:55:16 +00:00
|
|
|
{ echo 'prefer qemuSecurity wrappers' 1>&2; exit 1; } || :
|
2017-02-13 13:36:53 +00:00
|
|
|
|
2015-03-20 15:25:15 +00:00
|
|
|
sc_prohibit_pthread_create:
|
|
|
|
@prohibit='\bpthread_create\b' \
|
|
|
|
exclude='sc_prohibit_pthread_create' \
|
2016-04-11 14:45:53 +00:00
|
|
|
halt='avoid using pthread_create, use virThreadCreate instead' \
|
2015-03-20 15:25:15 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2015-10-20 16:15:12 +00:00
|
|
|
sc_prohibit_not_streq:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='! *STRN?EQ *\(.*\)' \
|
|
|
|
halt='Use STRNEQ instead of !STREQ and STREQ instead of !STRNEQ' \
|
2015-10-20 16:15:12 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2016-02-03 08:48:40 +00:00
|
|
|
sc_prohibit_verbose_strcat:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='strncat\([^,]*,\s+([^,]*),\s+strlen\(\1\)\)' \
|
|
|
|
in_vc_files='\.[ch]$$' \
|
2016-02-03 08:48:40 +00:00
|
|
|
halt='Use strcat(a, b) instead of strncat(a, b, strlen(b))' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2016-04-12 22:29:52 +00:00
|
|
|
# Ensure that each .c file containing a "main" function also
|
|
|
|
# calls virGettextInitialize
|
|
|
|
sc_gettext_init:
|
2017-11-03 12:09:47 +00:00
|
|
|
@require='virGettextInitialize *\(' \
|
|
|
|
in_vc_files='\.c$$' \
|
|
|
|
containing='\<main *(' \
|
|
|
|
halt='the above files do not call virGettextInitialize' \
|
2016-04-12 22:29:52 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2017-04-11 10:16:52 +00:00
|
|
|
sc_prohibit_obj_free_apis_in_virsh:
|
2021-09-26 11:27:26 +00:00
|
|
|
@prohibit='\bvir(Domain|DomainSnapshot|Interface|Network|NodeDevice|NWFilter|Secret|StoragePool|StorageVol|Stream)Free\b' \
|
2017-11-03 12:09:47 +00:00
|
|
|
in_vc_files='virsh.*\.[ch]$$' \
|
2017-04-11 10:16:52 +00:00
|
|
|
exclude='sc_prohibit_obj_free_apis_in_virsh' \
|
2021-09-26 06:20:54 +00:00
|
|
|
halt='avoid using public virXXXFree in virsh, use virsh-prefixed wrappers instead' \
|
2017-04-11 10:16:52 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2020-08-25 21:58:22 +00:00
|
|
|
# Links in various schemas
|
|
|
|
http_sites = libvirt.org.*\/schemas\/
|
|
|
|
http_sites += \.dtd
|
|
|
|
http_sites += libosinfo
|
|
|
|
http_sites += localhost
|
|
|
|
http_sites += rdf:resource
|
|
|
|
http_sites += schemas.dmtf.org
|
|
|
|
http_sites += schemas.microsoft.com
|
|
|
|
http_sites += schemas.xmlsoap.org
|
|
|
|
http_sites += www.inkscape.org
|
|
|
|
http_sites += www.innotek.de
|
|
|
|
http_sites += www.w3.org
|
|
|
|
http_sites += xmlns
|
|
|
|
|
|
|
|
# Links in licenses
|
|
|
|
http_sites += scripts.sil.org
|
|
|
|
http_sites += www.gnu.org\/licenses\/
|
|
|
|
http_sites += www.sun.com
|
|
|
|
|
|
|
|
# Example links
|
|
|
|
http_sites += example.com
|
|
|
|
http_sites += example.org
|
|
|
|
http_sites += herp.derp
|
|
|
|
|
|
|
|
# HTTP-only sites
|
|
|
|
http_sites += mah.everybody.org
|
|
|
|
http_sites += etallen.com
|
|
|
|
|
2022-05-24 07:45:21 +00:00
|
|
|
# HTTP-only dead sites accessed via archive.org
|
2020-08-25 21:58:22 +00:00
|
|
|
http_sites += blog.lystor.org.ua
|
|
|
|
http_sites += blog.mes-stats.fr
|
|
|
|
http_sites += www.javvin.com
|
|
|
|
http_sites += kerneltrap.org
|
|
|
|
|
|
|
|
http_re= ($(subst $(space),|,$(http_sites)))
|
2017-10-13 15:30:41 +00:00
|
|
|
|
|
|
|
sc_prohibit_http_urls:
|
2020-08-25 21:58:22 +00:00
|
|
|
@prohibit='http://\w' \
|
|
|
|
exclude="$(http_re)" \
|
2017-10-13 15:30:41 +00:00
|
|
|
halt='Links must use https:// protocol' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2018-12-13 11:23:42 +00:00
|
|
|
sc_prohibit_author:
|
|
|
|
@prohibit="(\*|#)\s*(A|a)uthors?:" \
|
|
|
|
halt="Author: statements are prohibited in source comments" \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2017-12-04 10:12:06 +00:00
|
|
|
# Alignment is usually achieved through spaces (at least two of them)
|
|
|
|
# or tabs (at least one of them) right before the trailing backslash
|
2017-10-31 13:12:52 +00:00
|
|
|
sc_prohibit_backslash_alignment:
|
2017-12-04 10:12:06 +00:00
|
|
|
@prohibit='( | )\\$$' \
|
2017-10-31 13:12:52 +00:00
|
|
|
halt='Do not attempt to right-align backslashes' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2018-07-13 17:54:40 +00:00
|
|
|
# Some syntax rules pertaining to the usage of cleanup macros
|
|
|
|
# implementing GNU C's cleanup attribute
|
|
|
|
|
2019-01-04 15:44:32 +00:00
|
|
|
# Rule to ensure that variables declared using a cleanup macro are
|
2018-07-13 17:54:40 +00:00
|
|
|
# always initialized.
|
|
|
|
sc_require_attribute_cleanup_initialization:
|
2021-11-05 09:13:07 +00:00
|
|
|
@prohibit='((g_auto(ptr|free|slist)?)|VIR_AUTOCLOSE) *[^=]+;' \
|
2018-07-13 17:54:40 +00:00
|
|
|
in_vc_files='\.[chx]$$' \
|
|
|
|
halt='variable declared with a cleanup macro must be initialized' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-03-12 08:08:00 +00:00
|
|
|
# "class" in headers is not good because by default Vim treats it as a keyword
|
|
|
|
# Let's prohibit it in source files as well.
|
|
|
|
sc_prohibit_class:
|
|
|
|
@prohibit=' +_?class *;' \
|
|
|
|
in_vc_files='\.[chx]$$' \
|
|
|
|
halt='use klass instead of class or _class' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-04-02 12:33:06 +00:00
|
|
|
# The dirent "d_type" field is non-portable and even when it
|
|
|
|
# exists some filesystems will only ever return DT_UNKNOWN.
|
|
|
|
# This field should only be used by code which is exclusively
|
|
|
|
# run platforms supporting "d_type" and must expect DT_UNKNOWN.
|
|
|
|
# We blacklist it to discourage accidental usage which has
|
|
|
|
# happened many times. Add an exclude rule if it is genuinely
|
|
|
|
# needed and the above restrictions are acceptable.
|
|
|
|
sc_prohibit_dirent_d_type:
|
|
|
|
@prohibit='(->|\.)d_type' \
|
|
|
|
in_vc_files='\.[chx]$$' \
|
|
|
|
halt='do not use the d_type field in "struct dirent"' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-10-02 16:51:19 +00:00
|
|
|
sc_cast_of_argument_to_free:
|
2022-05-23 15:01:00 +00:00
|
|
|
@prohibit='\<free *\( *\(' halt="don't cast free argument" \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
sc_cast_of_x_alloc_return_value:
|
2022-05-23 15:01:00 +00:00
|
|
|
@prohibit='\*\) *x(m|c|re)alloc\>' \
|
|
|
|
halt="don't cast x*alloc return value" \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Use STREQ rather than comparing strcmp == 0, or != 0.
|
|
|
|
sp_ = strcmp *\(.+\)
|
|
|
|
sc_prohibit_strcmp:
|
2022-05-23 15:01:00 +00:00
|
|
|
@prohibit='! *strcmp *\(|\<$(sp_) *[!=]=|[!=]= *$(sp_)' \
|
|
|
|
exclude='# *define STRN?EQ\(' \
|
|
|
|
halt='replace strcmp calls above with STREQ/STRNEQ' \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Really. You don't want to use this function.
|
|
|
|
# It may fail to NUL-terminate the destination,
|
|
|
|
# and always NUL-pads out to the specified length.
|
|
|
|
sc_prohibit_strncpy:
|
2022-05-23 15:01:00 +00:00
|
|
|
@prohibit='\<strncpy *\(' \
|
|
|
|
halt='do not use strncpy, period' \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Pass EXIT_*, not number, to usage, exit, and error (when exiting)
|
|
|
|
# Convert all uses automatically, via these two commands:
|
|
|
|
# git grep -l '\<exit *(1)' \
|
|
|
|
# | grep -vEf .x-sc_prohibit_magic_number_exit \
|
|
|
|
# | xargs --no-run-if-empty \
|
|
|
|
# perl -pi -e 's/(^|[^.])\b(exit ?)\(1\)/$1$2(EXIT_FAILURE)/'
|
|
|
|
# git grep -l '\<exit *(0)' \
|
|
|
|
# | grep -vEf .x-sc_prohibit_magic_number_exit \
|
|
|
|
# | xargs --no-run-if-empty \
|
|
|
|
# perl -pi -e 's/(^|[^.])\b(exit ?)\(0\)/$1$2(EXIT_SUCCESS)/'
|
|
|
|
sc_prohibit_magic_number_exit:
|
2022-05-23 15:01:00 +00:00
|
|
|
@prohibit='(^|[^.])\<(usage|exit|error) ?\(-?[0-9]+[,)]' \
|
|
|
|
exclude='exit \(77\)|error ?\(((0|77),|[^,]*)' \
|
|
|
|
halt='use EXIT_* values rather than magic number' \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# "FATAL:" should be fully upper-cased in error messages
|
|
|
|
# "WARNING:" should be fully upper-cased, or fully lower-cased
|
|
|
|
sc_error_message_warn_fatal:
|
2022-05-23 15:01:00 +00:00
|
|
|
@$(VC_LIST_EXCEPT) \
|
|
|
|
| xargs $(GREP) -nEA2 '[^rp]error *\(' /dev/null \
|
|
|
|
| $(GREP) -E '"Warning|"Fatal|"fatal' \
|
|
|
|
&& { echo 'use FATAL, WARNING or warning' 1>&2; \
|
|
|
|
exit 1; } \
|
2019-10-02 16:51:19 +00:00
|
|
|
|| :
|
|
|
|
|
|
|
|
# Error messages should not end with a period
|
|
|
|
sc_error_message_period:
|
2022-05-23 15:01:00 +00:00
|
|
|
@$(VC_LIST_EXCEPT) \
|
|
|
|
| xargs $(GREP) -nEA2 '[^rp]error *\(' /dev/null \
|
|
|
|
| $(GREP) -E '[^."]\."' \
|
|
|
|
&& { echo 'found error message ending in period' 1>&2; \
|
|
|
|
exit 1; } \
|
2019-10-02 16:51:19 +00:00
|
|
|
|| :
|
|
|
|
|
|
|
|
# Don't use cpp tests of this symbol. All code assumes config.h is included.
|
|
|
|
sc_prohibit_have_config_h:
|
2022-05-23 15:01:00 +00:00
|
|
|
@prohibit='^# *if.*HAVE''_CONFIG_H' \
|
|
|
|
halt='found use of HAVE''_CONFIG_H; remove' \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Nearly all .c files must include <config.h>. However, we also permit this
|
|
|
|
# via inclusion of a package-specific header, if syntax-check.mk specified one.
|
|
|
|
# config_h_header must be suitable for grep -E.
|
|
|
|
config_h_header ?= <config\.h>
|
|
|
|
sc_require_config_h:
|
2022-05-23 15:01:00 +00:00
|
|
|
@require='^# *include $(config_h_header)' \
|
|
|
|
in_vc_files='\.c$$' \
|
|
|
|
halt='the above files do not include <config.h>' \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Print each file name for which the first #include does not match
|
|
|
|
# $(config_h_header). Like grep -m 1, this only looks at the first match.
|
2022-05-23 15:01:00 +00:00
|
|
|
perl_config_h_first_ = \
|
|
|
|
-e 'BEGIN {$$ret = 0}' \
|
|
|
|
-e 'if (/^\# *include\b/) {' \
|
|
|
|
-e ' if (not m{^\# *include $(config_h_header)}) {' \
|
|
|
|
-e ' print "$$ARGV\n";' \
|
|
|
|
-e ' $$ret = 1;' \
|
|
|
|
-e ' }' \
|
|
|
|
-e ' \# Move on to next file after first include' \
|
|
|
|
-e ' close ARGV;' \
|
|
|
|
-e '}' \
|
2019-10-02 16:51:19 +00:00
|
|
|
-e 'END {exit $$ret}'
|
|
|
|
|
|
|
|
# You must include <config.h> before including any other header file.
|
|
|
|
# This can possibly be via a package-specific header, if given by syntax-check.mk.
|
|
|
|
sc_require_config_h_first:
|
2022-05-23 15:01:00 +00:00
|
|
|
@if $(VC_LIST_EXCEPT) | $(GREP) '\.c$$' > /dev/null; then \
|
|
|
|
files=$$($(VC_LIST_EXCEPT) | $(GREP) '\.c$$') && \
|
|
|
|
perl -n $(perl_config_h_first_) $$files || \
|
|
|
|
{ echo 'the above files include some other header' \
|
|
|
|
'before <config.h>' 1>&2; exit 1; } || :; \
|
|
|
|
else :; \
|
2019-10-02 16:51:19 +00:00
|
|
|
fi
|
|
|
|
|
|
|
|
# To use this "command" macro, you must first define two shell variables:
|
|
|
|
# h: the header name, with no enclosing <> or ""
|
|
|
|
# re: a regular expression that matches IFF something provided by $h is used.
|
|
|
|
define _sc_header_without_use
|
2022-05-23 15:01:00 +00:00
|
|
|
dummy=; : so we do not need a semicolon before each use; \
|
|
|
|
h_esc=`echo '[<"]'"$$h"'[">]'|$(SED) 's/\./\\\\./g'`; \
|
|
|
|
if $(VC_LIST_EXCEPT) | $(GREP) '\.c$$' > /dev/null; then \
|
|
|
|
files=$$($(GREP) -l '^# *include '"$$h_esc" \
|
|
|
|
$$($(VC_LIST_EXCEPT) | $(GREP) '\.c$$')) && \
|
|
|
|
$(GREP) -LE "$$re" $$files | $(GREP) . && \
|
|
|
|
{ echo "the above files include $$h but don't use it" \
|
|
|
|
1>&2; exit 1; } || :; \
|
|
|
|
else :; \
|
2019-10-02 16:51:19 +00:00
|
|
|
fi
|
|
|
|
endef
|
|
|
|
|
|
|
|
# Prohibit the inclusion of assert.h without an actual use of assert.
|
|
|
|
sc_prohibit_assert_without_use:
|
|
|
|
@h='assert.h' re='\<assert *\(' $(_sc_header_without_use)
|
|
|
|
|
|
|
|
# Prohibit the inclusion of getopt.h without an actual use.
|
|
|
|
sc_prohibit_getopt_without_use:
|
|
|
|
@h='getopt.h' re='\<getopt(_long)? *\(' $(_sc_header_without_use)
|
|
|
|
|
|
|
|
# The following list was generated by running:
|
|
|
|
# man signal.h|col -b|perl -ne '/bsd_signal.*;/.../sigwaitinfo.*;/ and print' \
|
|
|
|
# | perl -lne '/^\s+(?:int|void).*?(\w+).*/ and print $1' | fmt
|
|
|
|
_sig_functions = \
|
|
|
|
bsd_signal kill killpg pthread_kill pthread_sigmask raise sigaction \
|
|
|
|
sigaddset sigaltstack sigdelset sigemptyset sigfillset sighold sigignore \
|
|
|
|
siginterrupt sigismember signal sigpause sigpending sigprocmask sigqueue \
|
|
|
|
sigrelse sigset sigsuspend sigtimedwait sigwait sigwaitinfo
|
|
|
|
_sig_function_re = $(subst $(_sp),|,$(strip $(_sig_functions)))
|
|
|
|
# The following were extracted from "man signal.h" manually.
|
2022-05-23 15:01:00 +00:00
|
|
|
_sig_types_and_consts = \
|
|
|
|
MINSIGSTKSZ SA_NOCLDSTOP SA_NOCLDWAIT SA_NODEFER SA_ONSTACK \
|
|
|
|
SA_RESETHAND SA_RESTART SA_SIGINFO SIGEV_NONE SIGEV_SIGNAL \
|
|
|
|
SIGEV_THREAD SIGSTKSZ SIG_BLOCK SIG_SETMASK SIG_UNBLOCK SS_DISABLE \
|
|
|
|
SS_ONSTACK mcontext_t pid_t sig_atomic_t sigevent siginfo_t sigset_t \
|
2019-10-02 16:51:19 +00:00
|
|
|
sigstack sigval stack_t ucontext_t
|
|
|
|
# generated via this:
|
|
|
|
# perl -lne '/^#ifdef (SIG\w+)/ and print $1' lib/sig2str.c|sort -u|fmt -70
|
2022-05-23 15:01:00 +00:00
|
|
|
_sig_names = \
|
|
|
|
SIGABRT SIGALRM SIGALRM1 SIGBUS SIGCANCEL SIGCHLD SIGCLD SIGCONT \
|
|
|
|
SIGDANGER SIGDIL SIGEMT SIGFPE SIGFREEZE SIGGRANT SIGHUP SIGILL \
|
|
|
|
SIGINFO SIGINT SIGIO SIGIOT SIGKAP SIGKILL SIGKILLTHR SIGLOST SIGLWP \
|
|
|
|
SIGMIGRATE SIGMSG SIGPHONE SIGPIPE SIGPOLL SIGPRE SIGPROF SIGPWR \
|
|
|
|
SIGQUIT SIGRETRACT SIGSAK SIGSEGV SIGSOUND SIGSTKFLT SIGSTOP SIGSYS \
|
|
|
|
SIGTERM SIGTHAW SIGTRAP SIGTSTP SIGTTIN SIGTTOU SIGURG SIGUSR1 \
|
|
|
|
SIGUSR2 SIGVIRT SIGVTALRM SIGWAITING SIGWINCH SIGWIND SIGWINDOW \
|
2019-10-02 16:51:19 +00:00
|
|
|
SIGXCPU SIGXFSZ
|
|
|
|
_sig_syms_re = $(subst $(_sp),|,$(strip $(_sig_names) $(_sig_types_and_consts)))
|
|
|
|
|
|
|
|
# Prohibit the inclusion of signal.h without an actual use.
|
|
|
|
sc_prohibit_signal_without_use:
|
2022-05-23 15:01:00 +00:00
|
|
|
@h='signal.h' \
|
|
|
|
re='\<($(_sig_function_re)) *\(|\<($(_sig_syms_re))\>' \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
# Don't include stdio--.h unless you use one of its functions.
|
|
|
|
sc_prohibit_stdio--_without_use:
|
2022-05-23 15:01:00 +00:00
|
|
|
@h='stdio--.h' re='\<((f(re)?|p)open|tmpfile) *\(' \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
2024-02-16 14:09:45 +00:00
|
|
|
_stddef_syms_re = \
|
|
|
|
NULL|max_align_t|nullptr_t|offsetof|ptrdiff_t|size_t|unreachable|wchar_t
|
2019-10-02 16:51:19 +00:00
|
|
|
# Prohibit the inclusion of stddef.h without an actual use.
|
|
|
|
sc_prohibit_stddef_without_use:
|
2022-05-23 15:01:00 +00:00
|
|
|
@h='stddef.h' \
|
|
|
|
re='\<($(_stddef_syms_re))\>' \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
_de1 = dirfd|(close|(fd)?open|read|rewind|seek|tell)dir(64)?(_r)?
|
|
|
|
_de2 = (versionsort|struct dirent|getdirentries|alphasort|scandir(at)?)(64)?
|
|
|
|
_de3 = MAXNAMLEN|DIR|ino_t|d_ino|d_fileno|d_namlen
|
|
|
|
_dirent_syms_re = $(_de1)|$(_de2)|$(_de3)
|
|
|
|
# Prohibit the inclusion of dirent.h without an actual use.
|
|
|
|
sc_prohibit_dirent_without_use:
|
2022-05-23 15:01:00 +00:00
|
|
|
@h='dirent.h' \
|
|
|
|
re='\<($(_dirent_syms_re))\>' \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
sc_trailing_blank:
|
2022-05-23 15:01:00 +00:00
|
|
|
@prohibit='[ ]$$' \
|
|
|
|
halt='found trailing blank(s)' \
|
|
|
|
exclude='^Binary file .* matches$$' \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
|
|
|
|
# A regexp matching function names like "error" that may be used
|
|
|
|
# to emit translatable messages.
|
|
|
|
_gl_translatable_diag_func_re ?= error
|
|
|
|
|
|
|
|
# Look for diagnostics that aren't marked for translation.
|
|
|
|
# This won't find any for which error's format string is on a separate line.
|
|
|
|
sc_unmarked_diagnostics:
|
|
|
|
@prohibit='\<$(_gl_translatable_diag_func_re) *\([^"]*"[^"]*[a-z]{3}' \
|
2022-05-23 15:01:00 +00:00
|
|
|
exclude='(_|ngettext ?)\(' \
|
|
|
|
halt='found unmarked diagnostic(s)' \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
|
|
|
|
sc_prohibit_defined_have_decl_tests:
|
2022-05-23 15:01:00 +00:00
|
|
|
@prohibit='(#[ ]*ifn?def|\<defined)\>[ (]+WITH_DECL_' \
|
|
|
|
halt='WITH_DECL macros are always defined' \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Prohibit checked in backup files.
|
|
|
|
sc_prohibit_backup_files:
|
2022-05-23 15:11:55 +00:00
|
|
|
@$(VC_LIST_EXCEPT) | $(GREP) '~$$' && \
|
2022-05-23 15:01:00 +00:00
|
|
|
{ echo 'found version controlled backup file' 1>&2; \
|
2019-10-02 16:51:19 +00:00
|
|
|
exit 1; } || :
|
|
|
|
|
2022-05-31 07:50:58 +00:00
|
|
|
# prohibit remote references to local file in RST files
|
|
|
|
sc_avoid_remote_reference_to_local_file:
|
|
|
|
@prohibit='<#' \
|
|
|
|
in_vc_files='\.rst$$' \
|
|
|
|
halt='use local reference within a file' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-10-02 16:51:19 +00:00
|
|
|
# This Perl code is slightly obfuscated. Not only is each "$" doubled
|
|
|
|
# because it's in a Makefile, but the $$c's are comments; we cannot
|
|
|
|
# use "#" due to the way the script ends up concatenated onto one line.
|
|
|
|
# It would be much more concise, and would produce better output (including
|
|
|
|
# counts) if written as:
|
|
|
|
# perl -ln -0777 -e '/\n(\n+)$/ and print "$ARGV: ".length $1' ...
|
|
|
|
# but that would be far less efficient, reading the entire contents
|
|
|
|
# of each file, rather than just the last two bytes of each.
|
|
|
|
# In addition, while the code below detects both blank lines and a missing
|
|
|
|
# newline at EOF, the above detects only the former.
|
|
|
|
#
|
|
|
|
# This is a perl script that is expected to be the single-quoted argument
|
|
|
|
# to a command-line "-le". The remaining arguments are file names.
|
|
|
|
# Print the name of each file that does not end in exactly one newline byte.
|
|
|
|
# I.e., warn if there are blank lines (2 or more newlines), or if the
|
|
|
|
# last byte is not a newline. However, currently we don't complain
|
|
|
|
# about any file that contains exactly one byte.
|
|
|
|
# Exit nonzero if at least one such file is found, otherwise, exit 0.
|
|
|
|
# Warn about, but otherwise ignore open failure. Ignore seek/read failure.
|
|
|
|
#
|
|
|
|
# Use this if you want to remove trailing empty lines from selected files:
|
|
|
|
# perl -pi -0777 -e 's/\n\n+$/\n/' files...
|
|
|
|
#
|
2022-05-23 15:01:00 +00:00
|
|
|
require_exactly_one_NL_at_EOF_ = \
|
|
|
|
foreach my $$f (@ARGV) \
|
|
|
|
{ \
|
|
|
|
open F, "<", $$f or (warn "failed to open $$f: $$!\n"), next; \
|
|
|
|
my $$p = sysseek (F, -2, 2); \
|
2019-10-02 16:51:19 +00:00
|
|
|
my $$c = "seek failure probably means file has < 2 bytes; ignore"; \
|
2022-05-23 15:01:00 +00:00
|
|
|
my $$last_two_bytes; \
|
|
|
|
defined $$p and $$p = sysread F, $$last_two_bytes, 2; \
|
|
|
|
close F; \
|
|
|
|
$$c = "ignore read failure"; \
|
|
|
|
$$p && ($$last_two_bytes eq "\n\n" \
|
|
|
|
|| substr ($$last_two_bytes,1) ne "\n") \
|
|
|
|
and (print $$f), $$fail=1; \
|
|
|
|
} \
|
2019-10-02 16:51:19 +00:00
|
|
|
END { exit defined $$fail }
|
|
|
|
sc_prohibit_empty_lines_at_EOF:
|
2022-05-23 15:01:00 +00:00
|
|
|
@$(VC_LIST_EXCEPT) \
|
|
|
|
| xargs perl -le '$(require_exactly_one_NL_at_EOF_)' \
|
|
|
|
|| { echo 'empty line(s) or no newline at EOF' 1>&2; \
|
|
|
|
exit 1; } \
|
2019-10-02 16:51:19 +00:00
|
|
|
|| :
|
|
|
|
|
|
|
|
|
|
|
|
# Perl block to convert a match to FILE_NAME:LINENO:TEST,
|
|
|
|
# that is shared by two definitions below.
|
2022-05-23 15:01:00 +00:00
|
|
|
perl_filename_lineno_text_ = \
|
|
|
|
-e ' {' \
|
|
|
|
-e ' $$n = ($$` =~ tr/\n/\n/ + 1);' \
|
|
|
|
-e ' ($$v = $$&) =~ s/\n/\\n/g;' \
|
|
|
|
-e ' print "$$ARGV:$$n:$$v\n";' \
|
2019-10-02 16:51:19 +00:00
|
|
|
-e ' }'
|
|
|
|
|
|
|
|
prohibit_doubled_words_ = \
|
2022-05-23 12:39:30 +00:00
|
|
|
the then in an on if is it but for or at and do to can
|
2019-10-02 16:51:19 +00:00
|
|
|
# expand the regex before running the check to avoid using expensive captures
|
|
|
|
prohibit_doubled_word_expanded_ = \
|
|
|
|
$(join $(prohibit_doubled_words_),$(addprefix \s+,$(prohibit_doubled_words_)))
|
|
|
|
prohibit_doubled_word_RE_ ?= \
|
|
|
|
/\b(?:$(subst $(_sp),|,$(prohibit_doubled_word_expanded_)))\b/gims
|
2022-05-23 15:01:00 +00:00
|
|
|
prohibit_doubled_word_ = \
|
|
|
|
-e 'while ($(prohibit_doubled_word_RE_))' \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(perl_filename_lineno_text_)
|
|
|
|
|
|
|
|
# Define this to a regular expression that matches
|
|
|
|
# any filename:dd:match lines you want to ignore.
|
|
|
|
# The default is to ignore no matches.
|
|
|
|
ignore_doubled_word_match_RE_ ?= ^$$
|
|
|
|
|
|
|
|
sc_prohibit_doubled_word:
|
2022-05-23 15:01:00 +00:00
|
|
|
@$(VC_LIST_EXCEPT) \
|
|
|
|
| xargs perl -n -0777 $(prohibit_doubled_word_) \
|
|
|
|
| $(GREP) -vE '$(ignore_doubled_word_match_RE_)' \
|
|
|
|
| $(GREP) . \
|
|
|
|
&& { echo 'doubled words' 1>&2; exit 1; } \
|
2019-10-02 16:51:19 +00:00
|
|
|
|| :
|
|
|
|
|
|
|
|
# Except for shell files and for loops, double semicolon is probably a mistake
|
|
|
|
sc_prohibit_double_semicolon:
|
2022-05-23 15:01:00 +00:00
|
|
|
@prohibit='; *;[ {} \]*(/[/*]|$$)' \
|
|
|
|
in_vc_files='\.[chly]$$' \
|
|
|
|
exclude='\bfor *\(.*\)' \
|
|
|
|
halt="Double semicolon detected" \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Avoid a test bashism.
|
|
|
|
sc_prohibit_test_double_equal:
|
2022-05-23 15:01:00 +00:00
|
|
|
@prohibit='(\<test| \[+) .+ == ' \
|
|
|
|
containing='#! */bin/[a-z]*sh' \
|
|
|
|
halt='use "test x = x", not "test x =''= x"' \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
|
|
|
|
# Warn about "c0nst struct Foo const foo[]",
|
|
|
|
# but not about "char const *const foo" or "#define const const".
|
|
|
|
sc_redundant_const:
|
2022-05-23 15:01:00 +00:00
|
|
|
@prohibit='\bconst\b[[:space:][:alnum:]]{2,}\bconst\b' \
|
|
|
|
halt='redundant "const" in declarations' \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
sc_const_long_option:
|
2022-05-23 15:01:00 +00:00
|
|
|
@prohibit='^ *static.*struct option ' \
|
|
|
|
exclude='const struct option|struct option const' \
|
|
|
|
halt='add "const" to the above declarations' \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
fix_po_file_diag = \
|
|
|
|
'you have changed the set of files with translatable diagnostics;\n\
|
|
|
|
apply the above patch\n'
|
|
|
|
|
|
|
|
# Generate a list of files in which to search for translatable strings.
|
2022-05-23 15:01:00 +00:00
|
|
|
perl_translatable_files_list_ = \
|
|
|
|
-e 'foreach $$file (@ARGV) {' \
|
|
|
|
-e ' \# Consider only file extensions with one or two letters' \
|
|
|
|
-e ' $$file =~ /\...?$$/ or next;' \
|
|
|
|
-e ' \# Ignore mk files' \
|
|
|
|
-e ' $$file =~ /\.mk$$/ and next;' \
|
|
|
|
-e ' \# Ignore a .c or .h file with a corresponding .l or .y file' \
|
|
|
|
-e ' $$file =~ /(.+)\.[ch]$$/ && (-e "$${1}.l" || -e "$${1}.y")' \
|
|
|
|
-e ' and next;' \
|
|
|
|
-e ' \# Skip unreadable files' \
|
|
|
|
-e ' -r $$file or next;' \
|
|
|
|
-e ' print "$$file ";' \
|
2019-10-02 16:51:19 +00:00
|
|
|
-e '}'
|
|
|
|
|
|
|
|
# Verify that all source files using _() (more specifically, files that
|
2022-05-16 14:57:08 +00:00
|
|
|
# match $(_gl_translatable_string_re)) are listed in po/POTFILES.
|
|
|
|
po_file ?= $(top_srcdir)/po/POTFILES
|
2019-10-23 19:33:31 +00:00
|
|
|
|
2022-05-16 14:57:08 +00:00
|
|
|
# List of additional files that we want to pick up in our POTFILES
|
2020-01-17 16:00:27 +00:00
|
|
|
# This is all generated files for RPC code.
|
2019-10-23 19:33:31 +00:00
|
|
|
generated_files = \
|
2020-06-25 21:29:43 +00:00
|
|
|
$(top_builddir)/src/*.[ch] \
|
|
|
|
$(top_builddir)/src/*/*.[ch]
|
2019-10-23 19:33:31 +00:00
|
|
|
|
2019-10-02 16:51:19 +00:00
|
|
|
_gl_translatable_string_re ?= \b(N?_|gettext *)\([^)"]*("|$$)
|
2019-10-23 13:35:05 +00:00
|
|
|
|
|
|
|
# sc_po_check can fail if generated files are not built first
|
2020-06-25 21:29:43 +00:00
|
|
|
sc_po_check:
|
2022-05-23 15:01:00 +00:00
|
|
|
@if test -f $(po_file); then \
|
2022-05-16 15:00:13 +00:00
|
|
|
$(GREP) -E -v '^(#|$$)' $(po_file) | sort > $@-1; \
|
2022-05-23 15:01:00 +00:00
|
|
|
{ $(VC_LIST_EXCEPT); echo $(generated_files); } \
|
|
|
|
| xargs perl $(perl_translatable_files_list_) \
|
|
|
|
| xargs $(GREP) -E -l '$(_gl_translatable_string_re)' \
|
2022-05-16 14:46:16 +00:00
|
|
|
| $(SED) 's|^$(_dot_escaped_builddir)/||' \
|
|
|
|
| $(SED) 's|^$(_dot_escaped_srcdir)/||' \
|
2022-05-23 15:01:00 +00:00
|
|
|
| sort -u > $@-2; \
|
|
|
|
diff -u -L $(po_file) -L $(po_file) $@-1 $@-2 \
|
|
|
|
|| { printf $(fix_po_file_diag) 1>&2; exit 1; }; \
|
|
|
|
rm -f $@-1 $@-2; \
|
2019-10-02 16:51:19 +00:00
|
|
|
fi
|
|
|
|
|
2020-09-01 11:27:44 +00:00
|
|
|
# #if WITH_... will evaluate to false for any non numeric string.
|
2019-10-02 16:51:19 +00:00
|
|
|
# That would be flagged by using -Wundef, however gnulib currently
|
|
|
|
# tests many undefined macros, and so we can't enable that option.
|
|
|
|
# So at least preclude common boolean strings as macro values.
|
|
|
|
sc_Wundef_boolean:
|
2022-05-23 15:01:00 +00:00
|
|
|
@prohibit='^#define.*(yes|no|true|false)$$' \
|
|
|
|
in_files='$(CONFIG_INCLUDE)' \
|
|
|
|
halt='Use 0 or 1 for macro values' \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Even if you use pathmax.h to guarantee that PATH_MAX is defined, it might
|
|
|
|
# not be constant, or might overflow a stack. In general, use PATH_MAX as
|
|
|
|
# a limit, not an array or alloca size.
|
|
|
|
sc_prohibit_path_max_allocation:
|
2022-05-23 15:01:00 +00:00
|
|
|
@prohibit='(\balloca *\([^)]*|\[[^]]*)\bPATH_MAX' \
|
|
|
|
halt='Avoid stack allocations of size PATH_MAX' \
|
2019-10-02 16:51:19 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2024-02-16 14:09:45 +00:00
|
|
|
sc_unportable_grep_q:
|
|
|
|
@prohibit='grep ''-q' halt="unportable 'grep ""-q', use >/dev/null instead" \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2016-06-15 16:01:24 +00:00
|
|
|
# Don't include duplicate header in the source (either *.c or *.h)
|
2020-08-03 09:46:23 +00:00
|
|
|
sc_prohibit-duplicate-header:
|
2019-08-30 12:22:54 +00:00
|
|
|
$(AM_V_GEN)$(VC_LIST_EXCEPT) | $(GREP) '\.[chx]$$' | $(RUNUTF8) xargs \
|
|
|
|
$(PYTHON) $(top_srcdir)/scripts/prohibit-duplicate-header.py
|
2016-06-15 16:01:24 +00:00
|
|
|
|
2020-08-03 09:46:23 +00:00
|
|
|
sc_spacing-check:
|
2021-08-19 11:32:41 +00:00
|
|
|
$(AM_V_GEN)$(VC_LIST_EXCEPT) | $(GREP) '\.c$$' | xargs \
|
2019-01-03 19:30:39 +00:00
|
|
|
$(PERL) $(top_srcdir)/build-aux/check-spacing.pl || \
|
2022-05-23 13:55:16 +00:00
|
|
|
{ echo 'incorrect formatting' 1>&2; exit 1; }
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2020-08-03 09:46:23 +00:00
|
|
|
sc_mock-noinline:
|
2022-03-03 12:14:18 +00:00
|
|
|
$(AM_V_GEN)$(VC_LIST_EXCEPT) | $(GREP) '\.[ch]$$' | $(RUNUTF8) \
|
2019-08-30 12:22:54 +00:00
|
|
|
$(PYTHON) $(top_srcdir)/scripts/mock-noinline.py
|
2017-04-07 14:07:49 +00:00
|
|
|
|
2020-08-03 09:46:23 +00:00
|
|
|
sc_header-ifdef:
|
2021-08-19 11:32:41 +00:00
|
|
|
$(AM_V_GEN)$(VC_LIST_EXCEPT) | $(GREP) '\.[h]$$' | $(RUNUTF8) xargs \
|
2019-08-30 12:22:54 +00:00
|
|
|
$(PYTHON) $(top_srcdir)/scripts/header-ifdef.py
|
2018-12-13 13:32:06 +00:00
|
|
|
|
2020-08-03 09:46:23 +00:00
|
|
|
sc_group-qemu-caps:
|
2019-08-30 12:22:54 +00:00
|
|
|
$(AM_V_GEN)$(RUNUTF8) $(PYTHON) $(top_srcdir)/scripts/group-qemu-caps.py \
|
|
|
|
--check --prefix $(top_srcdir)/
|
2018-04-12 06:16:12 +00:00
|
|
|
|
2021-07-13 09:52:20 +00:00
|
|
|
sc_prohibit_enum_impl_with_vir_prefix_in_virsh:
|
2022-05-23 15:01:00 +00:00
|
|
|
@prohibit='VIR_ENUM_(IMPL|DECL)\(vir[^s]' \
|
|
|
|
in_vc_files='tools/virsh.*\.[ch]$$' \
|
|
|
|
halt='avoid "vir" prefix for enums in virsh' \
|
2021-07-13 09:52:20 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2024-02-16 13:02:49 +00:00
|
|
|
sc_rst_since:
|
|
|
|
@prohibit=':since:`[^`]+$|:since:`[^`]+[.,;]`|:since:`[^`]+` [.,;]' \
|
|
|
|
halt='format :since: correctly' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2021-07-13 09:52:20 +00:00
|
|
|
|
2022-05-23 14:23:59 +00:00
|
|
|
## ---------- ##
|
|
|
|
## Exceptions ##
|
|
|
|
## ---------- ##
|
|
|
|
|
2022-05-27 07:00:59 +00:00
|
|
|
exclude_file_name_regexp--sc_avoid_strcase = ^tools/(vsh\.h|nss/libvirt_nss_(leases|macs)\.c)$$
|
2011-03-31 02:26:27 +00:00
|
|
|
|
2022-02-14 15:39:00 +00:00
|
|
|
exclude_file_name_regexp--sc_avoid_write = ^src/libvirt-stream\.c$$
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2022-05-23 13:34:58 +00:00
|
|
|
exclude_file_name_regexp--sc_gettext_init = \
|
2023-01-31 18:10:43 +00:00
|
|
|
^((tests|examples)/|tools/virt-login-shell\.c$$|scripts/rpcgen/tests/test_demo\.c$$)
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2013-05-14 23:41:15 +00:00
|
|
|
exclude_file_name_regexp--sc_copyright_usage = \
|
2022-05-23 14:12:20 +00:00
|
|
|
^COPYING(|\.LESSER)$$
|
2012-07-26 22:58:02 +00:00
|
|
|
|
2014-02-26 09:25:30 +00:00
|
|
|
exclude_file_name_regexp--sc_flags_usage = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^(build-aux/syntax-check\.mk|docs/|src/util/virnetdevtap\.c$$|tests/((vir(cgroup|pci|test|usb)|nss|qemuxml2argv|qemusecurity)mock|virfilewrapper)\.c$$)
|
2011-07-08 15:18:48 +00:00
|
|
|
|
2011-04-23 21:00:26 +00:00
|
|
|
exclude_file_name_regexp--sc_libvirt_unmarked_diagnostics = \
|
2012-08-20 13:06:21 +00:00
|
|
|
^(src/rpc/gendispatch\.pl$$|tests/)
|
2011-04-23 21:00:26 +00:00
|
|
|
|
2020-03-18 11:59:08 +00:00
|
|
|
exclude_file_name_regexp--sc_po_check = ^(docs/|src/rpc/gendispatch\.pl$$|tests/commandtest.c$$)
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2016-04-11 15:00:26 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_PATH_MAX = \
|
2021-05-06 15:08:34 +00:00
|
|
|
^(build-aux/syntax-check\.mk|tests/virfilemock.c)$$
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2016-04-11 15:00:26 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_access_xok = \
|
2019-08-30 12:22:54 +00:00
|
|
|
^(src/util/virutil\.c)$$
|
2011-03-18 20:41:13 +00:00
|
|
|
|
2011-03-16 21:25:56 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_asprintf = \
|
2020-02-11 00:10:47 +00:00
|
|
|
^(build-aux/syntax-check\.mk|examples/|tests/vircgroupmock\.c|tools/virt-login-shell\.c|tools/nss/libvirt_nss\.c$$)
|
2011-04-11 22:25:25 +00:00
|
|
|
|
2013-04-04 18:16:43 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_strdup = \
|
2020-02-11 00:10:47 +00:00
|
|
|
^(docs/|examples/|tests/virnetserverclientmock.c|tests/commandhelper.c|tools/nss/libvirt_nss_(leases|macs)\.c$$)
|
2013-04-04 18:16:43 +00:00
|
|
|
|
2011-03-16 21:25:56 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_close = \
|
tools: add virt-qemu-qmp-proxy for proxying QMP via libvirt QEMU guests
Libvirt provides QMP passthrough APIs for the QEMU driver and these are
exposed in virsh. It is not especially pleasant, however, using the raw
QMP JSON syntax. QEMU has a tool 'qmp-shell' which can speak QMP and
exposes a human friendly interactive shell. It is not possible to use
this with libvirt managed guest, however, since only one client can
attach to the QMP socket at any point in time. While it would be
possible to configure a second QMP socket for a VM, it may not be
an known requirement at the time the guest is provisioned.
The virt-qmp-proxy tool aims to solve this problem. It opens a UNIX
socket and listens for incoming client connections, speaking QMP on
the connected socket. It will forward any QMP commands received onto
the running libvirt QEMU guest, and forward any replies back to the
QMP client. It will also forward back events.
$ virsh start demo
$ virt-qmp-proxy demo demo.qmp &
$ qmp-shell demo.qmp
Welcome to the QMP low-level shell!
Connected to QEMU 6.2.0
(QEMU) query-kvm
{
"return": {
"enabled": true,
"present": true
}
}
Note this tool of course has the same risks as the raw libvirt
QMP passthrough. It is safe to run query commands to fetch information
but commands which change the QEMU state risk disrupting libvirt's
management of QEMU, potentially resulting in data loss/corruption in
the worst case. Any use of this tool will cause the guest to be marked
as tainted as an warning that it could be in an unexpected state.
Since this tool introduces a python dependency it is not desirable
to include it in any of the existing RPMs in libvirt. This tool is
also QEMU specific, so isn't appropriate to bundle with the generic
tools. Thus a new RPM is introduced 'libvirt-clients-qemu', to
contain additional QEMU specific tools, with extra external deps.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2022-05-27 09:34:47 +00:00
|
|
|
(\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/vir(file|event)\.c|src/libvirt-stream\.c|tests/(vir.+mock\.c|commandhelper\.c|qemusecuritymock\.c)|tools/nss/libvirt_nss_(leases|macs)\.c)|tools/virt-qemu-qmp-proxy$$)
|
2011-03-16 21:25:56 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = \
|
2023-01-31 18:10:43 +00:00
|
|
|
((^tests/(nodedevmdevctl|viracpi|virhostcpu|virpcitest|virstoragetest|qemunbdkit)data/|docs/js/.*\.js|docs/fonts/.*\.woff|\.diff|tests/virconfdata/no-newline\.conf$$)|\.bin)
|
2011-03-16 21:25:56 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_fork_wrappers = \
|
2020-03-27 15:18:53 +00:00
|
|
|
(^(src/(util/(vircommand|virdaemon)|lxc/lxc_controller)|tests/testutils)\.c$$)
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2021-03-09 14:20:57 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_gethostname = ^src/util/virutil\.c$$
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2011-09-20 18:11:32 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_internal_functions = \
|
2012-12-13 17:44:57 +00:00
|
|
|
^src/(util/(viralloc|virutil|virfile)\.[hc]|esx/esx_vi\.c)$$
|
2011-09-20 18:11:32 +00:00
|
|
|
|
2018-04-13 14:41:17 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_raw_virclassnew = \
|
|
|
|
^src/util/virobject\.[hc]$$
|
|
|
|
|
2011-04-23 21:00:26 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_newline_at_end_of_diagnostic = \
|
2010-12-10 12:27:33 +00:00
|
|
|
^src/rpc/gendispatch\.pl$$
|
2011-04-23 21:00:26 +00:00
|
|
|
|
2023-08-28 10:56:36 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_error_message_on_multiple_lines = \
|
|
|
|
^(build-aux/syntax-check\.mk|docs/coding-style.rst)
|
|
|
|
|
2011-03-16 21:25:56 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_nonreentrant = \
|
2022-03-10 15:30:15 +00:00
|
|
|
^((po|tests|examples)/|docs/.*(py|js|html\.in|.rst)|run.in$$|tools/wireshark/util/genxdrstub\.pl|tools/virt-login-shell\.c$$)
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2018-04-30 14:55:57 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_canonicalize_file_name = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^(build-aux/syntax-check\.mk|tests/virfilemock\.c)$$
|
2018-04-30 14:55:57 +00:00
|
|
|
|
2012-02-02 22:47:04 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_raw_allocation = \
|
2021-09-03 14:39:36 +00:00
|
|
|
^(docs/advanced-tests\.rst|src/util/viralloc\.[ch]|examples/.*|tests/(securityselinuxhelper|(vircgroup|nss)mock|commandhelper)\.c|tools/wireshark/src/packet-libvirt\.c|tools/nss/libvirt_nss(_leases|_macs)?\.c)$$
|
2012-02-02 22:47:04 +00:00
|
|
|
|
2012-05-16 15:52:44 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_readlink = \
|
2012-12-13 17:44:57 +00:00
|
|
|
^src/(util/virutil|lxc/lxc_container)\.c$$
|
2011-03-16 21:25:56 +00:00
|
|
|
|
tools: split virt-login-shell into two binaries
The virt-login-shell binary is a setuid program that takes
no arguments. When invoked it looks at the invoking uid,
resolves it to a username, and finds an LXC guest with the
same name. It then starts the guest and runs the shell in
side the namespaces of the container.
Given this set of tasks the virt-login-shell binary needs
to connect to libvirtd, make various other libvirt API calls.
This is a problem for setuid binaries as various libraries
that libvirt.so links to are not safe. For example, they have
constructor functions which execute an unknown amount of code
that can be influenced by env variables.
For this reason virt-login-shell doesn't use libvirt.so,
but instead links to a custom, cut down, set of source files
sufficient to be a local client only.
This introduces a problem for integrating glib2 into libvirt
though, as once integrated, there would be no way to build
virt-login-shell without an external dependancy on glib2 and
this is definitely not setuid safe.
To resolve this problem, we split the virt-login-shell binary
into two parts. The first part is setuid and does almost
nothing. It simply records the original uid+gid, and then
invokes the virt-login-shell-helper binary. Crucially when
it does this it completes scrubs all environment variables.
It is thus safe for virt-login-shell-helper to link to the
normal libvirt.so. Any things that constructor functions
do cannot be influenced by user control env vars or cli
args.
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2019-08-01 09:58:31 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_setuid = ^src/util/virutil\.c|tools/virt-login-shell\.c$$
|
2011-06-22 22:18:01 +00:00
|
|
|
|
2019-11-13 16:33:27 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_snprintf = \
|
2020-04-06 12:43:56 +00:00
|
|
|
^(build-aux/syntax-check\.mk|docs/coding-style\.rst|tools/virt-login-shell\.c)$$
|
2019-11-13 16:33:27 +00:00
|
|
|
|
2016-05-15 14:04:51 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_strtol = ^examples/.*$$
|
2012-04-19 00:06:59 +00:00
|
|
|
|
2012-12-13 18:13:21 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_xmlGetProp = ^src/util/virxml\.c$$
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2012-02-24 18:48:55 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_xmlURI = ^src/util/viruri\.c$$
|
|
|
|
|
2021-08-19 12:01:14 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_return_as_function = \.py$$
|
2012-03-23 07:34:09 +00:00
|
|
|
|
2013-05-31 17:52:51 +00:00
|
|
|
exclude_file_name_regexp--sc_require_config_h = \
|
2023-01-31 18:10:43 +00:00
|
|
|
^(examples/c/.*/.*\.c|tools/virsh-edit\.c|tests/virmockstathelpers\.c|scripts/rpcgen/tests/(test_)?demo\.c)$$
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2013-05-31 17:52:51 +00:00
|
|
|
exclude_file_name_regexp--sc_require_config_h_first = \
|
2023-01-31 18:10:43 +00:00
|
|
|
^(examples/|tools/virsh-edit\.c$$|tests/virmockstathelpers\.c$$|scripts/rpcgen/tests/test_demo\.c$$)
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2012-04-26 10:11:49 +00:00
|
|
|
exclude_file_name_regexp--sc_trailing_blank = \
|
2020-01-17 16:00:27 +00:00
|
|
|
/sysinfodata/.*\.data|/virhostcpudata/.*\.cpuinfo$$
|
2011-03-16 21:25:56 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_unmarked_diagnostics = \
|
2019-10-08 10:19:30 +00:00
|
|
|
^(scripts/apibuild.py|tests/virt-aa-helper-test|docs/js/.*\.js)$$
|
2012-03-29 09:52:04 +00:00
|
|
|
|
2019-10-02 16:51:19 +00:00
|
|
|
exclude_file_name_regexp--sc_size_of_brackets = build-aux/syntax-check\.mk
|
2011-07-06 16:20:04 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_correct_id_types = \
|
|
|
|
(^src/locking/lock_protocol.x$$)
|
Add some autoconf helper macros for checking for libraries
Most checks for libraries take the same format
* --with-libFOO=yes|no|check|/some/path argument
* check for a function NNN in libFOO.so
* check for a header file DDD/HHH.h
* Define a WITH_FOO config.h symbol
* Define a WITH_FOO make conditional
* Substitute FOO_CFLAGS and FOO_LIBS make variables
* Print CFLAGS & LIBS summary at the end
Doing all this correctly is rather difficult, typically
done by copy+paste of a previous usage. Further small
improvements people make are not applied to all previous
usages.
Improve this by creating some helper macros to apply
good practice. First, to perform the actual checks:
LIBVIRT_CHECK_LIB([SELINUX], [selinux],
[getfilecon], [selinux/selinux.h])
This checks for 'getfilecon' in -lselinux, and the
existence of 'selinux/selinux.h' header file. If successful
it sets SELINUX_CFLAGS and SELINUX_LIBS. The WITH_SELINUX
config.h macro and WITH_SELINUX make conditional are also
defined.
In some cases we need to check two variants of the same
library
LIBVIRT_CHECK_LIB_ALT([SASL], [sasl2],
[sasl_client_init], [sasl/sasl.h],
[SASL1], [sasl],
[sasl_client_init], [sasl/sasl.h])
This checks for sasl_client_init in libsasl2, and if that
is not found, checks sasl_client_init in libsasl. If the
first check succeeds WITH_SASL is set, while if the second
check succeeds *both* WITH_SASL and WITH_SASL1 are set.
If the library supports pkg-config, then another variant
is available
LIBVIRT_CHECK_PKG([AVAHI], [avahi-client], [0.6.0])
This checks for avahi-client >= 0.6.0 via pkg-config
and sets WITH_AVAHI if found.
Finally to print a summary of CFLAGS & LIBs found (if any):
LIBVIRT_RESULT_LIB([SELINUX])
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2012-09-19 17:46:30 +00:00
|
|
|
|
2013-04-17 10:19:19 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_include_public_headers_quote = \
|
2019-02-08 08:54:40 +00:00
|
|
|
^(src/internal\.h$$|tools/wireshark/src/packet-libvirt.c$$)
|
2013-04-17 10:19:19 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_include_public_headers_brackets = \
|
2015-11-26 14:02:49 +00:00
|
|
|
^(tools/|examples/|include/libvirt/(virterror|libvirt(-(admin|qemu|lxc))?)\.h$$)
|
2013-07-08 14:17:29 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_int_ijk = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^(src/remote_protocol-structs|src/remote/remote_protocol\.x|build-aux/syntax-check\.mk|include/libvirt/libvirt.+|src/admin_protocol-structs|src/admin/admin_protocol\.x)$$
|
2013-10-09 10:19:27 +00:00
|
|
|
|
2016-10-06 14:54:41 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_unsigned_pid = \
|
|
|
|
^(include/libvirt/.*\.h|src/(qemu/qemu_driver\.c|driver-hypervisor\.h|libvirt(-[a-z]*)?\.c|.*\.x|util/vir(polkit|systemd)\.c)|tests/virpolkittest\.c|tools/virsh-domain\.c)$$
|
|
|
|
|
2019-10-14 13:02:40 +00:00
|
|
|
exclude_file_name_regexp--sc_avoid_g_gnuc_unused_in_header = \
|
2015-04-27 11:25:51 +00:00
|
|
|
^(src/util/virlog\.h|src/network/bridge_driver\.h)$$
|
2014-03-13 12:00:16 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_mixed_case_abbreviations = \
|
|
|
|
^src/(vbox/vbox_CAPI.*.h|esx/esx_vi.(c|h)|esx/esx_storage_backend_iscsi.c)$$
|
2014-03-18 10:29:12 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_empty_first_line = \
|
2022-12-21 17:19:46 +00:00
|
|
|
^tests/vmwareverdata/fusion-5.0.3.txt|scripts/rpcgen/tests/demo\.c$$
|
2014-09-10 13:52:48 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_useless_translation = \
|
|
|
|
^tests/virpolkittest.c
|
2014-10-01 14:07:46 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_devname = \
|
2020-04-01 10:24:34 +00:00
|
|
|
^(tools/virsh.pod|build-aux/syntax-check\.mk|docs/.*|tests/qemucapabilitiesdata/.*)$$
|
2014-11-30 14:57:02 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_virXXXFree = \
|
2019-05-17 12:01:59 +00:00
|
|
|
^(docs/|tests/|examples/|tools/|build-aux/syntax-check\.mk|src/test/test_driver.c|src/libvirt_public.syms|include/libvirt/libvirt-(domain|network|nodedev|storage|stream|secret|nwfilter|interface|domain-snapshot).h|src/libvirt-(domain|qemu|network|nodedev|storage|stream|secret|nwfilter|interface|domain-snapshot).c|src/qemu/qemu_shim.c$$)
|
2015-02-02 10:26:49 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_sysconf_pagesize = \
|
2020-01-08 13:54:17 +00:00
|
|
|
^(build-aux/syntax-check\.mk|src/util/vir(hostmem|util)\.c)$$
|
2015-03-20 15:25:15 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_pthread_create = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^(build-aux/syntax-check\.mk|src/util/virthread\.c|tests/.*)$$
|
2015-10-20 16:15:12 +00:00
|
|
|
|
2016-06-21 14:53:42 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_readdir = \
|
2019-07-30 14:33:20 +00:00
|
|
|
^(tests/(.*mock|virfilewrapper)\.c|tools/nss/libvirt_nss\.c)$$
|
2017-02-20 13:54:12 +00:00
|
|
|
|
2019-04-02 12:33:06 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_dirent_d_type = \
|
|
|
|
^(src/util/vircgroup.c)$
|
2019-08-08 09:23:26 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_strcmp = \
|
2019-09-27 16:18:24 +00:00
|
|
|
^(tools/nss/libvirt_nss.*\.c|tools/virt-login-shell\.c)
|
2019-10-02 16:04:31 +00:00
|
|
|
|
2020-01-24 13:44:29 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_select = \
|
2022-04-28 10:37:59 +00:00
|
|
|
^build-aux/syntax-check\.mk|src/util/vireventglibwatch\.c|tests/meson\.build$$
|
2022-05-23 14:23:59 +00:00
|
|
|
|
2022-12-19 19:08:09 +00:00
|
|
|
exclude_file_name_regexp--sc_header-ifdef = \
|
|
|
|
^scripts/rpcgen/tests/demo\.[ch]$$
|
2022-05-23 14:23:59 +00:00
|
|
|
|
2023-02-01 16:19:16 +00:00
|
|
|
exclude_file_name_regexp--sc_black = \
|
|
|
|
^tools/|src/|tests/|ci/|run\.in|scripts/[^/]*\.py
|
|
|
|
|
2023-01-31 18:10:43 +00:00
|
|
|
exclude_file_name_regexp--sc_spacing-check = \
|
|
|
|
^scripts/rpcgen/tests/test_demo\.[ch]$$
|
|
|
|
|
2022-05-23 14:23:59 +00:00
|
|
|
## -------------- ##
|
|
|
|
## Implementation ##
|
|
|
|
## -------------- ##
|
|
|
|
|
|
|
|
# Helper variables.
|
|
|
|
_empty =
|
|
|
|
_sp = $(_empty) $(_empty)
|
|
|
|
|
|
|
|
VC_LIST = cd $(top_srcdir); git ls-tree -r 'HEAD:' | \
|
|
|
|
sed -n "s|^100[^ ]*.||p"
|
|
|
|
|
|
|
|
# This is to preprocess robustly the output of $(VC_LIST), so that even
|
|
|
|
# when $(top_srcdir) is a pathological name like "....", the leading sed command
|
|
|
|
# removes only the intended prefix.
|
|
|
|
_dot_escaped_srcdir = $(subst .,\.,$(top_srcdir))
|
|
|
|
_dot_escaped_builddir = $(subst .,\.,$(top_builddir))
|
|
|
|
|
|
|
|
# Post-process $(VC_LIST) output, prepending $(top_srcdir)/, but only
|
|
|
|
# when $(top_srcdir) is not ".".
|
|
|
|
ifeq ($(top_srcdir),.)
|
|
|
|
_prepend_srcdir_prefix =
|
|
|
|
else
|
|
|
|
_prepend_srcdir_prefix = | $(SED) 's|^|$(top_srcdir)/|'
|
|
|
|
endif
|
|
|
|
|
|
|
|
# In order to be able to consistently filter "."-relative names,
|
|
|
|
# (i.e., with no $(top_srcdir) prefix), this definition is careful to
|
|
|
|
# remove any $(top_srcdir) prefix, and to restore what it removes.
|
|
|
|
_sc_excl = \
|
|
|
|
$(or $(exclude_file_name_regexp--$@),^$$)
|
|
|
|
VC_LIST_EXCEPT = \
|
|
|
|
$(VC_LIST) | $(GREP) -Ev -e '($(VC_LIST_ALWAYS_EXCLUDE_REGEX)|$(_sc_excl))' \
|
|
|
|
$(_prepend_srcdir_prefix)
|
|
|
|
|
|
|
|
# Prevent programs like 'sort' from considering distinct strings to be equal.
|
|
|
|
# Doing it here saves us from having to set LC_ALL elsewhere in this file.
|
|
|
|
export LC_ALL = C
|
|
|
|
|
|
|
|
# _sc_search_regexp
|
|
|
|
#
|
|
|
|
# This macro searches for a given construct in the selected files and
|
|
|
|
# then takes some action.
|
|
|
|
#
|
|
|
|
# Parameters (shell variables):
|
|
|
|
#
|
|
|
|
# prohibit | require
|
|
|
|
#
|
|
|
|
# Regular expression (ERE) denoting either a forbidden construct
|
|
|
|
# or a required construct. Those arguments are exclusive.
|
|
|
|
#
|
|
|
|
# exclude
|
|
|
|
#
|
|
|
|
# Regular expression (ERE) denoting lines to ignore that matched
|
|
|
|
# a prohibit construct. For example, this can be used to exclude
|
|
|
|
# comments that mention why the nearby code uses an alternative
|
|
|
|
# construct instead of the simpler prohibited construct.
|
|
|
|
#
|
|
|
|
# in_vc_files | in_files
|
|
|
|
#
|
|
|
|
# grep-E-style regexp selecting the files to check. For in_vc_files,
|
|
|
|
# the regexp is used to select matching files from the list of all
|
|
|
|
# version-controlled files; for in_files, it's from the names printed
|
|
|
|
# by "find $(top_srcdir)". When neither is specified, use all files that
|
|
|
|
# are under version control.
|
|
|
|
#
|
|
|
|
# containing | non_containing
|
|
|
|
#
|
|
|
|
# Select the files (non) containing strings matching this regexp.
|
|
|
|
# If both arguments are specified then CONTAINING takes
|
|
|
|
# precedence.
|
|
|
|
#
|
|
|
|
# with_grep_options
|
|
|
|
#
|
|
|
|
# Extra options for grep.
|
|
|
|
#
|
|
|
|
# ignore_case
|
|
|
|
#
|
|
|
|
# Ignore case.
|
|
|
|
#
|
|
|
|
# halt
|
|
|
|
#
|
|
|
|
# Message to display before to halting execution.
|
|
|
|
#
|
|
|
|
# Finally, you may exempt files based on an ERE matching file names.
|
|
|
|
# For example, to exempt from the sc_space_tab check all files with the
|
|
|
|
# .diff suffix, set this Make variable:
|
|
|
|
#
|
|
|
|
# exclude_file_name_regexp--sc_space_tab = \.diff$
|
|
|
|
#
|
|
|
|
# Note that while this functionality is mostly inherited via VC_LIST_EXCEPT,
|
|
|
|
# when filtering by name via in_files, we explicitly filter out matching
|
|
|
|
# names here as well.
|
|
|
|
|
|
|
|
# Initialize each, so that envvar settings cannot interfere.
|
|
|
|
export require =
|
|
|
|
export prohibit =
|
|
|
|
export exclude =
|
|
|
|
export in_vc_files =
|
|
|
|
export in_files =
|
|
|
|
export containing =
|
|
|
|
export non_containing =
|
|
|
|
export halt =
|
|
|
|
export with_grep_options =
|
|
|
|
|
|
|
|
# By default, _sc_search_regexp does not ignore case.
|
|
|
|
export ignore_case =
|
|
|
|
_ignore_case = $$(test -n "$$ignore_case" && printf %s -i || :)
|
|
|
|
|
|
|
|
define _sc_say_and_exit
|
2022-05-23 15:01:00 +00:00
|
|
|
dummy=; : so we do not need a semicolon before each use; \
|
2022-05-23 14:23:59 +00:00
|
|
|
{ printf '%s\n' "$$msg" 1>&2; exit 1; };
|
|
|
|
endef
|
|
|
|
|
|
|
|
define _sc_search_regexp
|
2022-05-23 15:01:00 +00:00
|
|
|
dummy=; : so we do not need a semicolon before each use; \
|
|
|
|
\
|
|
|
|
: Check arguments; \
|
|
|
|
test -n "$$prohibit" && test -n "$$require" \
|
|
|
|
&& { msg='Cannot specify both prohibit and require' \
|
|
|
|
$(_sc_say_and_exit) } || :; \
|
|
|
|
test -z "$$prohibit" && test -z "$$require" \
|
|
|
|
&& { msg='Should specify either prohibit or require' \
|
|
|
|
$(_sc_say_and_exit) } || :; \
|
|
|
|
test -z "$$prohibit" && test -n "$$exclude" \
|
|
|
|
&& { msg='Use of exclude requires a prohibit pattern' \
|
|
|
|
$(_sc_say_and_exit) } || :; \
|
|
|
|
test -n "$$in_vc_files" && test -n "$$in_files" \
|
|
|
|
&& { msg='Cannot specify both in_vc_files and in_files' \
|
|
|
|
$(_sc_say_and_exit) } || :; \
|
|
|
|
test "x$$halt" != x \
|
|
|
|
|| { msg='halt not defined' $(_sc_say_and_exit) }; \
|
|
|
|
\
|
|
|
|
: Filter by file name; \
|
|
|
|
if test -n "$$in_files"; then \
|
|
|
|
files=$$(find $(top_srcdir) | $(GREP) -E "$$in_files" \
|
|
|
|
| $(GREP) -Ev '$(_sc_excl)'); \
|
|
|
|
else \
|
|
|
|
files=$$($(VC_LIST_EXCEPT)); \
|
|
|
|
if test -n "$$in_vc_files"; then \
|
|
|
|
files=$$(echo "$$files" | $(GREP) -E "$$in_vc_files"); \
|
|
|
|
fi; \
|
|
|
|
fi; \
|
|
|
|
\
|
|
|
|
: Filter by content; \
|
|
|
|
test -n "$$files" \
|
|
|
|
&& test -n "$$containing" \
|
|
|
|
&& { files=$$(echo "$$files" | xargs $(GREP) -l "$$containing"); } \
|
|
|
|
|| :; \
|
|
|
|
test -n "$$files" \
|
|
|
|
&& test -n "$$non_containing" \
|
2022-05-23 14:23:59 +00:00
|
|
|
&& { files=$$(echo "$$files" | xargs $(GREP) -vl "$$non_containing"); } \
|
2022-05-23 15:01:00 +00:00
|
|
|
|| :; \
|
|
|
|
\
|
|
|
|
: Check for the construct; \
|
|
|
|
if test -n "$$files"; then \
|
|
|
|
if test -n "$$prohibit"; then \
|
|
|
|
echo "$$files" \
|
|
|
|
| xargs $(GREP) $$with_grep_options $(_ignore_case) -nE \
|
|
|
|
"$$prohibit" /dev/null \
|
|
|
|
| $(GREP) -vE "$${exclude:-^$$}" \
|
|
|
|
&& { msg="$$halt" $(_sc_say_and_exit) } \
|
|
|
|
|| :; \
|
|
|
|
else \
|
|
|
|
echo "$$files" \
|
|
|
|
| xargs \
|
2022-05-23 14:23:59 +00:00
|
|
|
$(GREP) $$with_grep_options $(_ignore_case) -LE "$$require" \
|
2022-05-23 15:01:00 +00:00
|
|
|
| $(GREP) . \
|
|
|
|
&& { msg="$$halt" $(_sc_say_and_exit) } \
|
|
|
|
|| :; \
|
|
|
|
fi \
|
|
|
|
else :; \
|
2022-05-23 14:23:59 +00:00
|
|
|
fi || :;
|
|
|
|
endef
|