| Summary: | [PATCH] ifconfig: supported media looks bad & wastes space | ||||||
|---|---|---|---|---|---|---|---|
| Product: | Base System | Reporter: | brooks <brooks> | ||||
| Component: | bin | Assignee: | freebsd-bugs (Nobody) <bugs> | ||||
| Status: | Closed FIXED | ||||||
| Severity: | Affects Only Me | ||||||
| Priority: | Normal | ||||||
| Version: | 5.0-CURRENT | ||||||
| Hardware: | Any | ||||||
| OS: | Any | ||||||
| Attachments: |
|
||||||
|
Description
brooks
2001-05-28 07:20:01 UTC
Oops, I just realized that I didn't complete the formatting upgrade in
that patch. The following extra snipit finishes it:
--- ifmedia.c.orig Sun May 27 23:23:16 2001
+++ ifmedia.c Sun May 27 23:22:32 2001
@@ -502,7 +502,7 @@
{
struct ifmedia_description *desc;
struct ifmedia_type_to_subtype *ttos;
- int seen_option = 0, i;
+ int i;
/* Find the top-level interface type. */
for (desc = ifm_type_descriptions, ttos = ifmedia_types_to_subtypes;
@@ -535,7 +535,7 @@
return;
got_subtype:
- printf("%s", desc->ifmt_string);
+ printf("media %s", desc->ifmt_string);
/* Find options. */
for (i = 0; ttos->options[i].desc != NULL; i++) {
@@ -544,14 +544,10 @@
for (desc = ttos->options[i].desc;
desc->ifmt_string != NULL; desc++) {
if (ifmw & desc->ifmt_word) {
- if (seen_option == 0)
- printf(" <");
- printf("%s%s", seen_option++ ? "," : "",
- desc->ifmt_string);
+ printf(" mediaopt %s", desc->ifmt_string);
}
}
}
- printf("%s", seen_option ? ">" : "");
}
/**********************************************************************
--
Any statement of the form "X is the one, true Y" is FALSE.
PGP fingerprint 655D 519C 26A7 82E7 2529 9BF0 5D8E 8BE9 F238 1AD4
I tried to apply your patch, but it seems to screw up the formatting,
even with your 2nd patch, can you try to produce a fixed patch ?
I think Ideally I would like it to look something like this for ifconfig -m:
fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 212.242.86.142 netmask 0xffffffe0 broadcast 212.242.86.159
ether 00:e0:81:01:9d:2c
media: autoselect(100baseTX) mediaopt (full-duplex) status: active
# The () values on the media: line being actual values shown only
# if different from configured values.
supported media:
autoselect {full-duplex,half-duplex}
# don't show flag0... which can be set on all interfaces.
100baseTX {full-duplex,half-duplex}
100baseTX {full-duplex,half-duplex}
10baseT/UTP {full-duplex,half-duplex}
10baseT/UTP {full-duplex,half-duplex}
100baseTX {full-duplex,half-duplex}
--
Poul-Henning Kamp | UNIX since Zilog Zeus 3.20
phk@FreeBSD.ORG | TCP/IP since RFC 956
FreeBSD committer | BSD since 4.3-tahoe
Never attribute to malice what can adequately be explained by incompetence.
State Changed From-To: open->feedback Patch suffers from formatting problems. Waiting for improved patch from originator. On Mon, May 28, 2001 at 10:37:38PM +0200, Poul-Henning Kamp wrote:
>
> I tried to apply your patch, but it seems to screw up the formatting,
> even with your 2nd patch, can you try to produce a fixed patch ?
I've attached an updated patch below. The flaw in the previous one was
using the same code to print both supported and current media types.
The new output looks like this:
tx0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
inet 216.39.168.226 netmask 0xfffffff0 broadcast 216.39.168.239
ether 00:e0:29:27:50:95
# The () part is only displayed if the settings differ (that should have
# been the case before.) Following the example of the OpenBSD box I've
# been using as an example, I added the disply of the top level media
# type.
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
# Net and OpenBSD display the supported options this way rather then in
# the older "mediatype <option1,option2> style. I think it's more
# useful since it gives the administrator something to copy and paste.
supported media:
media autoselect
media 100baseTX mediaopt full-duplex
media 100baseTX
media 10baseT/UTP mediaopt full-duplex
media 10baseT/UTP
-- Brooks
--
Any statement of the form "X is the one, true Y" is FALSE.
PGP fingerprint 655D 519C 26A7 82E7 2529 9BF0 5D8E 8BE9 F238 1AD4
Index: ifconfig.8
===================================================================
RCS file: /home/ncvs/src/sbin/ifconfig/ifconfig.8,v
retrieving revision 1.38
diff -u -r1.38 ifconfig.8
--- ifconfig.8 2001/05/26 09:26:01 1.38
+++ ifconfig.8 2001/05/29 00:28:09
@@ -41,6 +41,7 @@
.Sh SYNOPSIS
.Nm
.Op Fl L
+.Op Fl m
.Ar interface
.Op Ar address_family
.Oo
@@ -52,6 +53,7 @@
.Fl a
.Op Fl L
.Op Fl d
+.Op Fl m
.Op Fl u
.Op Ar address_family
.Nm
@@ -62,6 +64,7 @@
.Nm
.Op Fl L
.Op Fl d
+.Op Fl m
.Op Fl u
.Sh DESCRIPTION
.Nm Ifconfig
@@ -530,6 +533,10 @@
If the driver does supports the media selection system, the supported
media list will be included in the output.
.Pp
+If the
+.Fl m
+flag is passed before an interface name, ifconfig will display all
+of the supported media for the specified interface.
If
.Fl L
flag is supplied, address lifetime is displayed for IPv6 addresses,
Index: ifconfig.c
===================================================================
RCS file: /home/ncvs/src/sbin/ifconfig/ifconfig.c,v
retrieving revision 1.61
diff -u -r1.61 ifconfig.c
--- ifconfig.c 2001/05/26 09:26:01 1.61
+++ ifconfig.c 2001/05/29 00:28:09
@@ -134,6 +134,8 @@
struct afswtch;
+int supmedia = 0;
+
#ifdef INET6
char addr_buf[MAXHOSTNAMELEN *2 + 1]; /*for getnameinfo()*/
#endif
@@ -351,16 +353,16 @@
fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n",
"usage: ifconfig interface address_family [address [dest_address]]",
" [parameters]",
- " ifconfig -a [-d] [-u] [address_family]",
+ " ifconfig -a [-d] [-m] [-u] [address_family]",
" ifconfig -l [-d] [-u] [address_family]",
- " ifconfig [-d] [-u]");
+ " ifconfig [-d] [-m] [-u]");
#else
fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n",
"usage: ifconfig [-L] interface address_family [address [dest_address]]",
" [parameters]",
- " ifconfig -a [-L] [-d] [-u] [address_family]",
+ " ifconfig -a [-L] [-d] [-m] [-u] [address_family]",
" ifconfig -l [-d] [-u] [address_family]",
- " ifconfig [-L] [-d] [-u]");
+ " ifconfig [-L] [-d] [-m] [-u]");
#endif
exit(1);
}
@@ -410,7 +412,7 @@
uponly++;
break;
case 'm': /* show media choices in status */
- /* ignored for compatibility */
+ supmedia = 1;
break;
default:
usage();
@@ -421,7 +423,7 @@
argv += optind;
/* -l cannot be used with -a or -m */
- if (namesonly && all)
+ if (namesonly && (all || supmedia))
usage();
/* nonsense.. */
Index: ifconfig.h
===================================================================
RCS file: /home/ncvs/src/sbin/ifconfig/ifconfig.h,v
retrieving revision 1.6
diff -u -r1.6 ifconfig.h
--- ifconfig.h 2001/05/26 09:26:01 1.6
+++ ifconfig.h 2001/05/29 00:28:09
@@ -38,6 +38,7 @@
extern char name[32]; /* name of interface */
extern int allmedia;
+extern int supmedia;
struct afswtch;
extern void setmedia(const char *, int, int, const struct afswtch *rafp);
Index: ifmedia.c
===================================================================
RCS file: /home/ncvs/src/sbin/ifconfig/ifmedia.c,v
retrieving revision 1.7
diff -u -r1.7 ifmedia.c
--- ifmedia.c 2001/05/26 09:26:01 1.7
+++ ifmedia.c 2001/05/29 01:15:21
@@ -93,8 +93,14 @@
static int get_media_subtype __P((int, const char *));
static int get_media_options __P((int, const char *));
static int lookup_media_word __P((struct ifmedia_description *, const char *));
-static void print_media_word __P((int));
+static void print_media_word __P((int, int));
+static void print_media_word_ifconfig __P((int));
+static struct ifmedia_description *get_toptype_desc __P((int));
+static struct ifmedia_type_to_subtype *get_toptype_ttos __P((int));
+static struct ifmedia_description *get_subtype_desc __P((int,
+ struct ifmedia_type_to_subtype *ttos));
+
void
media_status(s, info)
int s;
@@ -127,16 +133,18 @@
err(1, "SIOCGIFMEDIA");
printf("\tmedia: ");
- print_media_word(ifmr.ifm_current);
+ print_media_word(ifmr.ifm_current, 1);
if (ifmr.ifm_active != ifmr.ifm_current) {
putchar(' ');
putchar('(');
- print_media_word(ifmr.ifm_active);
+ print_media_word(ifmr.ifm_active, 0);
putchar(')');
}
+ putchar('\n');
+
if (ifmr.ifm_status & IFM_AVALID) {
- printf(" status: ");
+ printf("\tstatus: ");
switch (IFM_TYPE(ifmr.ifm_active)) {
case IFM_ETHER:
if (ifmr.ifm_status & IFM_ACTIVE)
@@ -164,13 +172,13 @@
putchar('\n');
- if (ifmr.ifm_count > 0) {
- printf("\tsupported media:");
+ if (ifmr.ifm_count > 0 && supmedia) {
+ printf("\tsupported media:\n");
for (i = 0; i < ifmr.ifm_count; i++) {
- putchar(' ');
- print_media_word(media_list[i]);
+ printf("\t\t");
+ print_media_word_ifconfig(media_list[i]);
+ putchar('\n');
}
- putchar('\n');
}
free(media_list);
@@ -496,22 +504,69 @@
return (-1);
}
-static void
-print_media_word(ifmw)
+static struct ifmedia_description *get_toptype_desc(ifmw)
int ifmw;
{
struct ifmedia_description *desc;
+
+ for (desc = ifm_type_descriptions; desc->ifmt_string != NULL; desc++)
+ if (IFM_TYPE(ifmw) == desc->ifmt_word)
+ break;
+
+ return desc;
+}
+
+static struct ifmedia_type_to_subtype *get_toptype_ttos(ifmw)
+ int ifmw;
+{
+ struct ifmedia_description *desc;
struct ifmedia_type_to_subtype *ttos;
- int seen_option = 0, i;
- /* Find the top-level interface type. */
for (desc = ifm_type_descriptions, ttos = ifmedia_types_to_subtypes;
desc->ifmt_string != NULL; desc++, ttos++)
if (IFM_TYPE(ifmw) == desc->ifmt_word)
break;
+
+ return ttos;
+}
+
+static struct ifmedia_description *get_subtype_desc(ifmw, ttos)
+ int ifmw;
+ struct ifmedia_type_to_subtype *ttos;
+{
+ int i;
+ struct ifmedia_description *desc;
+
+ for (i = 0; ttos->subtypes[i].desc != NULL; i++) {
+ if (ttos->subtypes[i].alias)
+ continue;
+ for (desc = ttos->subtypes[i].desc;
+ desc->ifmt_string != NULL; desc++) {
+ if (IFM_SUBTYPE(ifmw) == desc->ifmt_word)
+ return desc;
+ }
+ }
+
+ return NULL;
+}
+
+static void
+print_media_word(ifmw, print_toptype)
+ int ifmw;
+ int print_toptype;
+{
+ struct ifmedia_description *desc;
+ struct ifmedia_type_to_subtype *ttos;
+ int seen_option = 0, i;
+
+ /* Find the top-level interface type. */
+ desc = get_toptype_desc(ifmw);
+ ttos = get_toptype_ttos(ifmw);
if (desc->ifmt_string == NULL) {
printf("<unknown type>");
return;
+ } else if (print_toptype) {
+ printf("%s", desc->ifmt_string);
}
/*
@@ -520,21 +575,18 @@
*/
/* Find subtype. */
- for (i = 0; ttos->subtypes[i].desc != NULL; i++) {
- if (ttos->subtypes[i].alias)
- continue;
- for (desc = ttos->subtypes[i].desc;
- desc->ifmt_string != NULL; desc++) {
- if (IFM_SUBTYPE(ifmw) == desc->ifmt_word)
- goto got_subtype;
- }
- }
+ desc = get_subtype_desc(ifmw, ttos);
+ if (desc != NULL)
+ goto got_subtype;
/* Falling to here means unknown subtype. */
printf("<unknown subtype>");
return;
got_subtype:
+ if (print_toptype)
+ putchar(' ');
+
printf("%s", desc->ifmt_string);
/* Find options. */
@@ -552,6 +604,52 @@
}
}
printf("%s", seen_option ? ">" : "");
+}
+
+static void
+print_media_word_ifconfig(ifmw)
+ int ifmw;
+{
+ struct ifmedia_description *desc;
+ struct ifmedia_type_to_subtype *ttos;
+ int i;
+
+ /* Find the top-level interface type. */
+ desc = get_toptype_desc(ifmw);
+ ttos = get_toptype_ttos(ifmw);
+ if (desc->ifmt_string == NULL) {
+ printf("<unknown type>");
+ return;
+ }
+
+ /*
+ * Don't print the top-level type; it's not like we can
+ * change it, or anything.
+ */
+
+ /* Find subtype. */
+ desc = get_subtype_desc(ifmw, ttos);
+ if (desc != NULL)
+ goto got_subtype;
+
+ /* Falling to here means unknown subtype. */
+ printf("<unknown subtype>");
+ return;
+
+ got_subtype:
+ printf("media %s", desc->ifmt_string);
+
+ /* Find options. */
+ for (i = 0; ttos->options[i].desc != NULL; i++) {
+ if (ttos->options[i].alias)
+ continue;
+ for (desc = ttos->options[i].desc;
+ desc->ifmt_string != NULL; desc++) {
+ if (ifmw & desc->ifmt_word) {
+ printf(" mediaopt %s", desc->ifmt_string);
+ }
+ }
+ }
}
/**********************************************************************
Hmm, it looks like gnats doesn't like signed mail. Here's an unsigned
message with the patch.
Index: ifconfig.8
===================================================================
RCS file: /home/ncvs/src/sbin/ifconfig/ifconfig.8,v
retrieving revision 1.38
diff -u -r1.38 ifconfig.8
--- ifconfig.8 2001/05/26 09:26:01 1.38
+++ ifconfig.8 2001/05/29 00:28:09
@@ -41,6 +41,7 @@
.Sh SYNOPSIS
.Nm
.Op Fl L
+.Op Fl m
.Ar interface
.Op Ar address_family
.Oo
@@ -52,6 +53,7 @@
.Fl a
.Op Fl L
.Op Fl d
+.Op Fl m
.Op Fl u
.Op Ar address_family
.Nm
@@ -62,6 +64,7 @@
.Nm
.Op Fl L
.Op Fl d
+.Op Fl m
.Op Fl u
.Sh DESCRIPTION
.Nm Ifconfig
@@ -530,6 +533,10 @@
If the driver does supports the media selection system, the supported
media list will be included in the output.
.Pp
+If the
+.Fl m
+flag is passed before an interface name, ifconfig will display all
+of the supported media for the specified interface.
If
.Fl L
flag is supplied, address lifetime is displayed for IPv6 addresses,
Index: ifconfig.c
===================================================================
RCS file: /home/ncvs/src/sbin/ifconfig/ifconfig.c,v
retrieving revision 1.61
diff -u -r1.61 ifconfig.c
--- ifconfig.c 2001/05/26 09:26:01 1.61
+++ ifconfig.c 2001/05/29 00:28:09
@@ -134,6 +134,8 @@
struct afswtch;
+int supmedia = 0;
+
#ifdef INET6
char addr_buf[MAXHOSTNAMELEN *2 + 1]; /*for getnameinfo()*/
#endif
@@ -351,16 +353,16 @@
fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n",
"usage: ifconfig interface address_family [address [dest_address]]",
" [parameters]",
- " ifconfig -a [-d] [-u] [address_family]",
+ " ifconfig -a [-d] [-m] [-u] [address_family]",
" ifconfig -l [-d] [-u] [address_family]",
- " ifconfig [-d] [-u]");
+ " ifconfig [-d] [-m] [-u]");
#else
fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n",
"usage: ifconfig [-L] interface address_family [address [dest_address]]",
" [parameters]",
- " ifconfig -a [-L] [-d] [-u] [address_family]",
+ " ifconfig -a [-L] [-d] [-m] [-u] [address_family]",
" ifconfig -l [-d] [-u] [address_family]",
- " ifconfig [-L] [-d] [-u]");
+ " ifconfig [-L] [-d] [-m] [-u]");
#endif
exit(1);
}
@@ -410,7 +412,7 @@
uponly++;
break;
case 'm': /* show media choices in status */
- /* ignored for compatibility */
+ supmedia = 1;
break;
default:
usage();
@@ -421,7 +423,7 @@
argv += optind;
/* -l cannot be used with -a or -m */
- if (namesonly && all)
+ if (namesonly && (all || supmedia))
usage();
/* nonsense.. */
Index: ifconfig.h
===================================================================
RCS file: /home/ncvs/src/sbin/ifconfig/ifconfig.h,v
retrieving revision 1.6
diff -u -r1.6 ifconfig.h
--- ifconfig.h 2001/05/26 09:26:01 1.6
+++ ifconfig.h 2001/05/29 00:28:09
@@ -38,6 +38,7 @@
extern char name[32]; /* name of interface */
extern int allmedia;
+extern int supmedia;
struct afswtch;
extern void setmedia(const char *, int, int, const struct afswtch *rafp);
Index: ifmedia.c
===================================================================
RCS file: /home/ncvs/src/sbin/ifconfig/ifmedia.c,v
retrieving revision 1.7
diff -u -r1.7 ifmedia.c
--- ifmedia.c 2001/05/26 09:26:01 1.7
+++ ifmedia.c 2001/05/29 01:15:21
@@ -93,8 +93,14 @@
static int get_media_subtype __P((int, const char *));
static int get_media_options __P((int, const char *));
static int lookup_media_word __P((struct ifmedia_description *, const char *));
-static void print_media_word __P((int));
+static void print_media_word __P((int, int));
+static void print_media_word_ifconfig __P((int));
+static struct ifmedia_description *get_toptype_desc __P((int));
+static struct ifmedia_type_to_subtype *get_toptype_ttos __P((int));
+static struct ifmedia_description *get_subtype_desc __P((int,
+ struct ifmedia_type_to_subtype *ttos));
+
void
media_status(s, info)
int s;
@@ -127,16 +133,18 @@
err(1, "SIOCGIFMEDIA");
printf("\tmedia: ");
- print_media_word(ifmr.ifm_current);
+ print_media_word(ifmr.ifm_current, 1);
if (ifmr.ifm_active != ifmr.ifm_current) {
putchar(' ');
putchar('(');
- print_media_word(ifmr.ifm_active);
+ print_media_word(ifmr.ifm_active, 0);
putchar(')');
}
+ putchar('\n');
+
if (ifmr.ifm_status & IFM_AVALID) {
- printf(" status: ");
+ printf("\tstatus: ");
switch (IFM_TYPE(ifmr.ifm_active)) {
case IFM_ETHER:
if (ifmr.ifm_status & IFM_ACTIVE)
@@ -164,13 +172,13 @@
putchar('\n');
- if (ifmr.ifm_count > 0) {
- printf("\tsupported media:");
+ if (ifmr.ifm_count > 0 && supmedia) {
+ printf("\tsupported media:\n");
for (i = 0; i < ifmr.ifm_count; i++) {
- putchar(' ');
- print_media_word(media_list[i]);
+ printf("\t\t");
+ print_media_word_ifconfig(media_list[i]);
+ putchar('\n');
}
- putchar('\n');
}
free(media_list);
@@ -496,22 +504,69 @@
return (-1);
}
-static void
-print_media_word(ifmw)
+static struct ifmedia_description *get_toptype_desc(ifmw)
int ifmw;
{
struct ifmedia_description *desc;
+
+ for (desc = ifm_type_descriptions; desc->ifmt_string != NULL; desc++)
+ if (IFM_TYPE(ifmw) == desc->ifmt_word)
+ break;
+
+ return desc;
+}
+
+static struct ifmedia_type_to_subtype *get_toptype_ttos(ifmw)
+ int ifmw;
+{
+ struct ifmedia_description *desc;
struct ifmedia_type_to_subtype *ttos;
- int seen_option = 0, i;
- /* Find the top-level interface type. */
for (desc = ifm_type_descriptions, ttos = ifmedia_types_to_subtypes;
desc->ifmt_string != NULL; desc++, ttos++)
if (IFM_TYPE(ifmw) == desc->ifmt_word)
break;
+
+ return ttos;
+}
+
+static struct ifmedia_description *get_subtype_desc(ifmw, ttos)
+ int ifmw;
+ struct ifmedia_type_to_subtype *ttos;
+{
+ int i;
+ struct ifmedia_description *desc;
+
+ for (i = 0; ttos->subtypes[i].desc != NULL; i++) {
+ if (ttos->subtypes[i].alias)
+ continue;
+ for (desc = ttos->subtypes[i].desc;
+ desc->ifmt_string != NULL; desc++) {
+ if (IFM_SUBTYPE(ifmw) == desc->ifmt_word)
+ return desc;
+ }
+ }
+
+ return NULL;
+}
+
+static void
+print_media_word(ifmw, print_toptype)
+ int ifmw;
+ int print_toptype;
+{
+ struct ifmedia_description *desc;
+ struct ifmedia_type_to_subtype *ttos;
+ int seen_option = 0, i;
+
+ /* Find the top-level interface type. */
+ desc = get_toptype_desc(ifmw);
+ ttos = get_toptype_ttos(ifmw);
if (desc->ifmt_string == NULL) {
printf("<unknown type>");
return;
+ } else if (print_toptype) {
+ printf("%s", desc->ifmt_string);
}
/*
@@ -520,21 +575,18 @@
*/
/* Find subtype. */
- for (i = 0; ttos->subtypes[i].desc != NULL; i++) {
- if (ttos->subtypes[i].alias)
- continue;
- for (desc = ttos->subtypes[i].desc;
- desc->ifmt_string != NULL; desc++) {
- if (IFM_SUBTYPE(ifmw) == desc->ifmt_word)
- goto got_subtype;
- }
- }
+ desc = get_subtype_desc(ifmw, ttos);
+ if (desc != NULL)
+ goto got_subtype;
/* Falling to here means unknown subtype. */
printf("<unknown subtype>");
return;
got_subtype:
+ if (print_toptype)
+ putchar(' ');
+
printf("%s", desc->ifmt_string);
/* Find options. */
@@ -552,6 +604,52 @@
}
}
printf("%s", seen_option ? ">" : "");
+}
+
+static void
+print_media_word_ifconfig(ifmw)
+ int ifmw;
+{
+ struct ifmedia_description *desc;
+ struct ifmedia_type_to_subtype *ttos;
+ int i;
+
+ /* Find the top-level interface type. */
+ desc = get_toptype_desc(ifmw);
+ ttos = get_toptype_ttos(ifmw);
+ if (desc->ifmt_string == NULL) {
+ printf("<unknown type>");
+ return;
+ }
+
+ /*
+ * Don't print the top-level type; it's not like we can
+ * change it, or anything.
+ */
+
+ /* Find subtype. */
+ desc = get_subtype_desc(ifmw, ttos);
+ if (desc != NULL)
+ goto got_subtype;
+
+ /* Falling to here means unknown subtype. */
+ printf("<unknown subtype>");
+ return;
+
+ got_subtype:
+ printf("media %s", desc->ifmt_string);
+
+ /* Find options. */
+ for (i = 0; ttos->options[i].desc != NULL; i++) {
+ if (ttos->options[i].alias)
+ continue;
+ for (desc = ttos->options[i].desc;
+ desc->ifmt_string != NULL; desc++) {
+ if (ifmw & desc->ifmt_word) {
+ printf(" mediaopt %s", desc->ifmt_string);
+ }
+ }
+ }
}
/**********************************************************************
--
Any statement of the form "X is the one, true Y" is FALSE.
PGP fingerprint 655D 519C 26A7 82E7 2529 9BF0 5D8E 8BE9 F238 1AD4
State Changed From-To: feedback->closed Committed, thanks! |