Merge branch 'master' into next
This commit is contained in:
@@ -145,11 +145,14 @@ our $Sparse = qr{
|
||||
__kprobes|
|
||||
__ref
|
||||
}x;
|
||||
|
||||
# Notes to $Attribute:
|
||||
# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
|
||||
our $Attribute = qr{
|
||||
const|
|
||||
__read_mostly|
|
||||
__kprobes|
|
||||
__(?:mem|cpu|dev|)(?:initdata|init)|
|
||||
__(?:mem|cpu|dev|)(?:initdata|initconst|init\b)|
|
||||
____cacheline_aligned|
|
||||
____cacheline_aligned_in_smp|
|
||||
____cacheline_internodealigned_in_smp|
|
||||
@@ -189,6 +192,14 @@ our $typeTypedefs = qr{(?x:
|
||||
atomic_t
|
||||
)};
|
||||
|
||||
our $logFunctions = qr{(?x:
|
||||
printk|
|
||||
pr_(debug|dbg|vdbg|devel|info|warning|err|notice|alert|crit|emerg|cont)|
|
||||
dev_(printk|dbg|vdbg|info|warn|err|notice|alert|crit|emerg|WARN)|
|
||||
WARN|
|
||||
panic
|
||||
)};
|
||||
|
||||
our @typeList = (
|
||||
qr{void},
|
||||
qr{(?:unsigned\s+)?char},
|
||||
@@ -1377,12 +1388,17 @@ sub process {
|
||||
#80 column limit
|
||||
if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
|
||||
$rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
|
||||
$line !~ /^\+\s*printk\s*\(\s*(?:KERN_\S+\s*)?"[X\t]*"\s*(?:,|\)\s*;)\s*$/ &&
|
||||
$line !~ /^\+\s*$logFunctions\s*\(\s*(?:KERN_\S+\s*)?"[X\t]*"\s*(?:,|\)\s*;)\s*$/ &&
|
||||
$length > 80)
|
||||
{
|
||||
WARN("line over 80 characters\n" . $herecurr);
|
||||
}
|
||||
|
||||
# check for spaces before a quoted newline
|
||||
if ($rawline =~ /^.*\".*\s\\n/) {
|
||||
WARN("unnecessary whitespace before a quoted newline\n" . $herecurr);
|
||||
}
|
||||
|
||||
# check for adding lines without a newline.
|
||||
if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
|
||||
WARN("adding a line without newline at end of file\n" . $herecurr);
|
||||
@@ -1411,6 +1427,12 @@ sub process {
|
||||
ERROR("code indent should use tabs where possible\n" . $herevet);
|
||||
}
|
||||
|
||||
# check for space before tabs.
|
||||
if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
|
||||
my $herevet = "$here\n" . cat_vet($rawline) . "\n";
|
||||
WARN("please, no space before tabs\n" . $herevet);
|
||||
}
|
||||
|
||||
# check we are in a valid C source file if not then ignore this hunk
|
||||
next if ($realfile !~ /\.(h|c)$/);
|
||||
|
||||
@@ -2182,8 +2204,10 @@ sub process {
|
||||
# Find out how long the conditional actually is.
|
||||
my @newlines = ($c =~ /\n/gs);
|
||||
my $cond_lines = 1 + $#newlines;
|
||||
my $stat_real = '';
|
||||
|
||||
my $stat_real = raw_line($linenr, $cond_lines);
|
||||
$stat_real = raw_line($linenr, $cond_lines)
|
||||
. "\n" if ($cond_lines);
|
||||
if (defined($stat_real) && $cond_lines > 1) {
|
||||
$stat_real = "[...]\n$stat_real";
|
||||
}
|
||||
@@ -2348,6 +2372,8 @@ sub process {
|
||||
DECLARE_PER_CPU|
|
||||
DEFINE_PER_CPU|
|
||||
__typeof__\(|
|
||||
union|
|
||||
struct|
|
||||
\.$Ident\s*=\s*|
|
||||
^\"|\"$
|
||||
}x;
|
||||
@@ -2572,6 +2598,11 @@ sub process {
|
||||
WARN("plain inline is preferred over $1\n" . $herecurr);
|
||||
}
|
||||
|
||||
# check for sizeof(&)
|
||||
if ($line =~ /\bsizeof\s*\(\s*\&/) {
|
||||
WARN("sizeof(& should be avoided\n" . $herecurr);
|
||||
}
|
||||
|
||||
# check for new externs in .c files.
|
||||
if ($realfile =~ /\.c$/ && defined $stat &&
|
||||
$stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
|
||||
@@ -2634,9 +2665,46 @@ sub process {
|
||||
if ($line =~ /^.\s*__initcall\s*\(/) {
|
||||
WARN("please use device_initcall() instead of __initcall()\n" . $herecurr);
|
||||
}
|
||||
# check for struct file_operations, ensure they are const.
|
||||
# check for various ops structs, ensure they are const.
|
||||
my $struct_ops = qr{acpi_dock_ops|
|
||||
address_space_operations|
|
||||
backlight_ops|
|
||||
block_device_operations|
|
||||
dentry_operations|
|
||||
dev_pm_ops|
|
||||
dma_map_ops|
|
||||
extent_io_ops|
|
||||
file_lock_operations|
|
||||
file_operations|
|
||||
hv_ops|
|
||||
ide_dma_ops|
|
||||
intel_dvo_dev_ops|
|
||||
item_operations|
|
||||
iwl_ops|
|
||||
kgdb_arch|
|
||||
kgdb_io|
|
||||
kset_uevent_ops|
|
||||
lock_manager_operations|
|
||||
microcode_ops|
|
||||
mtrr_ops|
|
||||
neigh_ops|
|
||||
nlmsvc_binding|
|
||||
pci_raw_ops|
|
||||
pipe_buf_operations|
|
||||
platform_hibernation_ops|
|
||||
platform_suspend_ops|
|
||||
proto_ops|
|
||||
rpc_pipe_ops|
|
||||
seq_operations|
|
||||
snd_ac97_build_ops|
|
||||
soc_pcmcia_socket_ops|
|
||||
stacktrace_ops|
|
||||
sysfs_ops|
|
||||
tty_operations|
|
||||
usb_mon_operations|
|
||||
wd_ops}x;
|
||||
if ($line !~ /\bconst\b/ &&
|
||||
$line =~ /\bstruct\s+(file_operations|seq_operations)\b/) {
|
||||
$line =~ /\bstruct\s+($struct_ops)\b/) {
|
||||
WARN("struct $1 should normally be const\n" .
|
||||
$herecurr);
|
||||
}
|
||||
|
@@ -41,6 +41,8 @@ my $web = 0;
|
||||
my $subsystem = 0;
|
||||
my $status = 0;
|
||||
my $keywords = 1;
|
||||
my $sections = 0;
|
||||
my $file_emails = 0;
|
||||
my $from_filename = 0;
|
||||
my $pattern_depth = 0;
|
||||
my $version = 0;
|
||||
@@ -120,9 +122,11 @@ if (!GetOptions(
|
||||
'web!' => \$web,
|
||||
'pattern-depth=i' => \$pattern_depth,
|
||||
'k|keywords!' => \$keywords,
|
||||
'sections!' => \$sections,
|
||||
'fe|file-emails!' => \$file_emails,
|
||||
'f|file' => \$from_filename,
|
||||
'v|version' => \$version,
|
||||
'h|help' => \$help,
|
||||
'h|help|usage' => \$help,
|
||||
)) {
|
||||
die "$P: invalid argument - use --help if necessary\n";
|
||||
}
|
||||
@@ -137,9 +141,9 @@ if ($version != 0) {
|
||||
exit 0;
|
||||
}
|
||||
|
||||
if ($#ARGV < 0) {
|
||||
usage();
|
||||
die "$P: argument missing: patchfile or -f file please\n";
|
||||
if (-t STDIN && !@ARGV) {
|
||||
# We're talking to a terminal, but have no command line arguments.
|
||||
die "$P: missing patchfile or -f file - use --help if necessary\n";
|
||||
}
|
||||
|
||||
if ($output_separator ne ", ") {
|
||||
@@ -150,16 +154,24 @@ if ($output_rolestats) {
|
||||
$output_roles = 1;
|
||||
}
|
||||
|
||||
my $selections = $email + $scm + $status + $subsystem + $web;
|
||||
if ($selections == 0) {
|
||||
usage();
|
||||
die "$P: Missing required option: email, scm, status, subsystem or web\n";
|
||||
if ($sections) {
|
||||
$email = 0;
|
||||
$email_list = 0;
|
||||
$scm = 0;
|
||||
$status = 0;
|
||||
$subsystem = 0;
|
||||
$web = 0;
|
||||
$keywords = 0;
|
||||
} else {
|
||||
my $selections = $email + $scm + $status + $subsystem + $web;
|
||||
if ($selections == 0) {
|
||||
die "$P: Missing required option: email, scm, status, subsystem or web\n";
|
||||
}
|
||||
}
|
||||
|
||||
if ($email &&
|
||||
($email_maintainer + $email_list + $email_subscriber_list +
|
||||
$email_git + $email_git_penguin_chiefs + $email_git_blame) == 0) {
|
||||
usage();
|
||||
die "$P: Please select at least 1 email option\n";
|
||||
}
|
||||
|
||||
@@ -173,8 +185,9 @@ if (!top_of_kernel_tree($lk_path)) {
|
||||
my @typevalue = ();
|
||||
my %keyword_hash;
|
||||
|
||||
open(MAINT, "<${lk_path}MAINTAINERS") || die "$P: Can't open MAINTAINERS\n";
|
||||
while (<MAINT>) {
|
||||
open (my $maint, '<', "${lk_path}MAINTAINERS")
|
||||
or die "$P: Can't open MAINTAINERS: $!\n";
|
||||
while (<$maint>) {
|
||||
my $line = $_;
|
||||
|
||||
if ($line =~ m/^(\C):\s*(.*)/) {
|
||||
@@ -199,13 +212,14 @@ while (<MAINT>) {
|
||||
push(@typevalue, $line);
|
||||
}
|
||||
}
|
||||
close(MAINT);
|
||||
close($maint);
|
||||
|
||||
my %mailmap;
|
||||
|
||||
if ($email_remove_duplicates) {
|
||||
open(MAILMAP, "<${lk_path}.mailmap") || warn "$P: Can't open .mailmap\n";
|
||||
while (<MAILMAP>) {
|
||||
open(my $mailmap, '<', "${lk_path}.mailmap")
|
||||
or warn "$P: Can't open .mailmap: $!\n";
|
||||
while (<$mailmap>) {
|
||||
my $line = $_;
|
||||
|
||||
next if ($line =~ m/^\s*#/);
|
||||
@@ -224,7 +238,7 @@ if ($email_remove_duplicates) {
|
||||
$mailmap{$name} = \@arr;
|
||||
}
|
||||
}
|
||||
close(MAILMAP);
|
||||
close($mailmap);
|
||||
}
|
||||
|
||||
## use the filenames on the command line or find the filenames in the patchfiles
|
||||
@@ -232,31 +246,47 @@ if ($email_remove_duplicates) {
|
||||
my @files = ();
|
||||
my @range = ();
|
||||
my @keyword_tvi = ();
|
||||
my @file_emails = ();
|
||||
|
||||
if (!@ARGV) {
|
||||
push(@ARGV, "&STDIN");
|
||||
}
|
||||
|
||||
foreach my $file (@ARGV) {
|
||||
##if $file is a directory and it lacks a trailing slash, add one
|
||||
if ((-d $file)) {
|
||||
$file =~ s@([^/])$@$1/@;
|
||||
} elsif (!(-f $file)) {
|
||||
die "$P: file '${file}' not found\n";
|
||||
if ($file ne "&STDIN") {
|
||||
##if $file is a directory and it lacks a trailing slash, add one
|
||||
if ((-d $file)) {
|
||||
$file =~ s@([^/])$@$1/@;
|
||||
} elsif (!(-f $file)) {
|
||||
die "$P: file '${file}' not found\n";
|
||||
}
|
||||
}
|
||||
if ($from_filename) {
|
||||
push(@files, $file);
|
||||
if (-f $file && $keywords) {
|
||||
open(FILE, "<$file") or die "$P: Can't open ${file}\n";
|
||||
my $text = do { local($/) ; <FILE> };
|
||||
foreach my $line (keys %keyword_hash) {
|
||||
if ($text =~ m/$keyword_hash{$line}/x) {
|
||||
push(@keyword_tvi, $line);
|
||||
if (-f $file && ($keywords || $file_emails)) {
|
||||
open(my $f, '<', $file)
|
||||
or die "$P: Can't open $file: $!\n";
|
||||
my $text = do { local($/) ; <$f> };
|
||||
close($f);
|
||||
if ($keywords) {
|
||||
foreach my $line (keys %keyword_hash) {
|
||||
if ($text =~ m/$keyword_hash{$line}/x) {
|
||||
push(@keyword_tvi, $line);
|
||||
}
|
||||
}
|
||||
}
|
||||
close(FILE);
|
||||
if ($file_emails) {
|
||||
my @poss_addr = $text =~ m$[A-Za-zÀ-ÿ\"\' \,\.\+-]*\s*[\,]*\s*[\(\<\{]{0,1}[A-Za-z0-9_\.\+-]+\@[A-Za-z0-9\.-]+\.[A-Za-z0-9]+[\)\>\}]{0,1}$g;
|
||||
push(@file_emails, clean_file_emails(@poss_addr));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
my $file_cnt = @files;
|
||||
my $lastfile;
|
||||
open(PATCH, "<$file") or die "$P: Can't open ${file}\n";
|
||||
while (<PATCH>) {
|
||||
|
||||
open(my $patch, "< $file")
|
||||
or die "$P: Can't open $file: $!\n";
|
||||
while (<$patch>) {
|
||||
my $patch_line = $_;
|
||||
if (m/^\+\+\+\s+(\S+)/) {
|
||||
my $filename = $1;
|
||||
@@ -276,7 +306,8 @@ foreach my $file (@ARGV) {
|
||||
}
|
||||
}
|
||||
}
|
||||
close(PATCH);
|
||||
close($patch);
|
||||
|
||||
if ($file_cnt == @files) {
|
||||
warn "$P: file '${file}' doesn't appear to be a patch. "
|
||||
. "Add -f to options?\n";
|
||||
@@ -285,6 +316,8 @@ foreach my $file (@ARGV) {
|
||||
}
|
||||
}
|
||||
|
||||
@file_emails = uniq(@file_emails);
|
||||
|
||||
my @email_to = ();
|
||||
my @list_to = ();
|
||||
my @scm = ();
|
||||
@@ -314,6 +347,7 @@ foreach my $file (@files) {
|
||||
if ($type eq 'X') {
|
||||
if (file_match_pattern($file, $value)) {
|
||||
$exclude = 1;
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -340,12 +374,28 @@ foreach my $file (@files) {
|
||||
}
|
||||
}
|
||||
|
||||
$tvi += ($end - $start);
|
||||
|
||||
$tvi = $end + 1;
|
||||
}
|
||||
|
||||
foreach my $line (sort {$hash{$b} <=> $hash{$a}} keys %hash) {
|
||||
add_categories($line);
|
||||
if ($sections) {
|
||||
my $i;
|
||||
my $start = find_starting_index($line);
|
||||
my $end = find_ending_index($line);
|
||||
for ($i = $start; $i < $end; $i++) {
|
||||
my $line = $typevalue[$i];
|
||||
if ($line =~ /^[FX]:/) { ##Restore file patterns
|
||||
$line =~ s/([^\\])\.([^\*])/$1\?$2/g;
|
||||
$line =~ s/([^\\])\.$/$1\?/g; ##Convert . back to ?
|
||||
$line =~ s/\\\./\./g; ##Convert \. to .
|
||||
$line =~ s/\.\*/\*/g; ##Convert .* to *
|
||||
}
|
||||
$line =~ s/^([A-Z]):/$1:\t/g;
|
||||
print("$line\n");
|
||||
}
|
||||
print("\n");
|
||||
}
|
||||
}
|
||||
|
||||
if ($email && $email_git) {
|
||||
@@ -377,6 +427,14 @@ if ($email) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach my $email (@file_emails) {
|
||||
my ($name, $address) = parse_email($email);
|
||||
|
||||
my $tmp_email = format_email($name, $address, $email_usename);
|
||||
push_email_address($tmp_email, '');
|
||||
add_role($tmp_email, 'in file');
|
||||
}
|
||||
}
|
||||
|
||||
if ($email || $email_list) {
|
||||
@@ -453,6 +511,7 @@ MAINTAINER field selection options:
|
||||
--remove-duplicates => minimize duplicate email names/addresses
|
||||
--roles => show roles (status:subsystem, git-signer, list, etc...)
|
||||
--rolestats => show roles and statistics (commits/total_commits, %)
|
||||
--file-emails => add email addresses found in -f file (default: 0 (off))
|
||||
--scm => print SCM tree(s) if any
|
||||
--status => print status if any
|
||||
--subsystem => print subsystem name if any
|
||||
@@ -466,6 +525,7 @@ Output type options:
|
||||
Other options:
|
||||
--pattern-depth => Number of pattern directory traversals (default: 0 (all))
|
||||
--keywords => scan patch for keywords (default: 1 (on))
|
||||
--sections => print the entire subsystem sections with pattern matches
|
||||
--version => show version
|
||||
--help => show this help information
|
||||
|
||||
@@ -545,7 +605,7 @@ sub parse_email {
|
||||
$name =~ s/^\"|\"$//g;
|
||||
$address =~ s/^\s+|\s+$//g;
|
||||
|
||||
if ($name =~ /[^a-z0-9 \.\-]/i) { ##has "must quote" chars
|
||||
if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
|
||||
$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
|
||||
$name = "\"$name\"";
|
||||
}
|
||||
@@ -562,7 +622,7 @@ sub format_email {
|
||||
$name =~ s/^\"|\"$//g;
|
||||
$address =~ s/^\s+|\s+$//g;
|
||||
|
||||
if ($name =~ /[^a-z0-9 \.\-]/i) { ##has "must quote" chars
|
||||
if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
|
||||
$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
|
||||
$name = "\"$name\"";
|
||||
}
|
||||
@@ -811,7 +871,9 @@ sub add_role {
|
||||
foreach my $entry (@email_to) {
|
||||
if ($email_remove_duplicates) {
|
||||
my ($entry_name, $entry_address) = parse_email($entry->[0]);
|
||||
if ($name eq $entry_name || $address eq $entry_address) {
|
||||
if (($name eq $entry_name || $address eq $entry_address)
|
||||
&& ($role eq "" || !($entry->[1] =~ m/$role/))
|
||||
) {
|
||||
if ($entry->[1] eq "") {
|
||||
$entry->[1] = "$role";
|
||||
} else {
|
||||
@@ -819,7 +881,9 @@ sub add_role {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ($email eq $entry->[0]) {
|
||||
if ($email eq $entry->[0]
|
||||
&& ($role eq "" || !($entry->[1] =~ m/$role/))
|
||||
) {
|
||||
if ($entry->[1] eq "") {
|
||||
$entry->[1] = "$role";
|
||||
} else {
|
||||
@@ -1099,6 +1163,51 @@ sub sort_and_uniq {
|
||||
return @parms;
|
||||
}
|
||||
|
||||
sub clean_file_emails {
|
||||
my (@file_emails) = @_;
|
||||
my @fmt_emails = ();
|
||||
|
||||
foreach my $email (@file_emails) {
|
||||
$email =~ s/[\(\<\{]{0,1}([A-Za-z0-9_\.\+-]+\@[A-Za-z0-9\.-]+)[\)\>\}]{0,1}/\<$1\>/g;
|
||||
my ($name, $address) = parse_email($email);
|
||||
if ($name eq '"[,\.]"') {
|
||||
$name = "";
|
||||
}
|
||||
|
||||
my @nw = split(/[^A-Za-zÀ-ÿ\'\,\.\+-]/, $name);
|
||||
if (@nw > 2) {
|
||||
my $first = $nw[@nw - 3];
|
||||
my $middle = $nw[@nw - 2];
|
||||
my $last = $nw[@nw - 1];
|
||||
|
||||
if (((length($first) == 1 && $first =~ m/[A-Za-z]/) ||
|
||||
(length($first) == 2 && substr($first, -1) eq ".")) ||
|
||||
(length($middle) == 1 ||
|
||||
(length($middle) == 2 && substr($middle, -1) eq "."))) {
|
||||
$name = "$first $middle $last";
|
||||
} else {
|
||||
$name = "$middle $last";
|
||||
}
|
||||
}
|
||||
|
||||
if (substr($name, -1) =~ /[,\.]/) {
|
||||
$name = substr($name, 0, length($name) - 1);
|
||||
} elsif (substr($name, -2) =~ /[,\.]"/) {
|
||||
$name = substr($name, 0, length($name) - 2) . '"';
|
||||
}
|
||||
|
||||
if (substr($name, 0, 1) =~ /[,\.]/) {
|
||||
$name = substr($name, 1, length($name) - 1);
|
||||
} elsif (substr($name, 0, 2) =~ /"[,\.]/) {
|
||||
$name = '"' . substr($name, 2, length($name) - 2);
|
||||
}
|
||||
|
||||
my $fmt_email = format_email($name, $address, $email_usename);
|
||||
push(@fmt_emails, $fmt_email);
|
||||
}
|
||||
return @fmt_emails;
|
||||
}
|
||||
|
||||
sub merge_email {
|
||||
my @lines;
|
||||
my %saw;
|
||||
@@ -1183,7 +1292,7 @@ sub rfc822_strip_comments {
|
||||
|
||||
# valid: returns true if the parameter is an RFC822 valid address
|
||||
#
|
||||
sub rfc822_valid ($) {
|
||||
sub rfc822_valid {
|
||||
my $s = rfc822_strip_comments(shift);
|
||||
|
||||
if (!$rfc822re) {
|
||||
@@ -1203,7 +1312,7 @@ sub rfc822_valid ($) {
|
||||
# from success with no addresses found, because an empty string is
|
||||
# a valid list.
|
||||
|
||||
sub rfc822_validlist ($) {
|
||||
sub rfc822_validlist {
|
||||
my $s = rfc822_strip_comments(shift);
|
||||
|
||||
if (!$rfc822re) {
|
||||
|
@@ -19,7 +19,7 @@ usage() {
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Parse command-line arguements
|
||||
# Parse command-line arguments
|
||||
while [ $# -gt 0 ]; do
|
||||
case $1 in
|
||||
--source)
|
||||
|
@@ -1424,6 +1424,8 @@ sub dump_struct($$) {
|
||||
$nested =~ s/\/\*.*?\*\///gos;
|
||||
# strip kmemcheck_bitfield_{begin,end}.*;
|
||||
$members =~ s/kmemcheck_bitfield_.*?;//gos;
|
||||
# strip attributes
|
||||
$members =~ s/__aligned\s*\(\d+\)//gos;
|
||||
|
||||
create_parameterlist($members, ';', $file);
|
||||
check_sections($file, $declaration_name, "struct", $sectcheck, $struct_actual, $nested);
|
||||
@@ -1728,6 +1730,7 @@ sub dump_function($$) {
|
||||
$prototype =~ s/^noinline +//;
|
||||
$prototype =~ s/__devinit +//;
|
||||
$prototype =~ s/__init +//;
|
||||
$prototype =~ s/__init_or_module +//;
|
||||
$prototype =~ s/^#\s*define\s+//; #ak added
|
||||
$prototype =~ s/__attribute__\s*\(\([a-z,]*\)\)//;
|
||||
|
||||
@@ -2103,7 +2106,7 @@ sub process_file($) {
|
||||
$section = $newsection;
|
||||
} elsif (/$doc_end/) {
|
||||
|
||||
if ($contents ne "") {
|
||||
if (($contents ne "") && ($contents ne "\n")) {
|
||||
dump_section($file, $section, xml_escape($contents));
|
||||
$section = $section_default;
|
||||
$contents = "";
|
||||
|
Reference in New Issue
Block a user