summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Coopersmith <alan.coopersmith@oracle.com>2022-11-07 16:03:47 -0800
committerAlan Coopersmith <alan.coopersmith@oracle.com>2022-11-07 16:03:47 -0800
commit167ad7fa3a339da96798da49d05c3125045a87c2 (patch)
treecef81cd9a3fc39878ec8a4c874ffe71905877d0a
parent4b54c211e5e86d6ed62386ad9b7d676808b55766 (diff)
Use gettext() to localize messages if available
Originally fixed for Solaris in May 2000 by Steve Swales under Sun bug 4256527 "xhost messages not internationalized" Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
-rw-r--r--COPYING2
-rw-r--r--Makefile.am11
-rw-r--r--configure.ac21
-rw-r--r--xhost.c89
4 files changed, 90 insertions, 33 deletions
diff --git a/COPYING b/COPYING
index bca8d40..0f88422 100644
--- a/COPYING
+++ b/COPYING
@@ -1,4 +1,4 @@
-Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+Copyright (c) 2000, 2004, 2022, Oracle and/or its affiliates.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
diff --git a/Makefile.am b/Makefile.am
index 4c67a4f..07f36b2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -19,3 +19,14 @@ ChangeLog:
dist-hook: ChangeLog INSTALL
EXTRA_DIST = README.md
+
+if USE_GETTEXT
+AM_CPPFLAGS = -DLOCALEDIR='"$(LOCALEDIR)"'
+
+noinst_DATA = xhost.po
+
+xhost.po: $(xhost_SOURCES:%=$(srcdir)/%)
+ $(AM_V_GEN)xgettext -d xhost -n $(xhost_SOURCES:%=$(srcdir)/%)
+
+CLEANFILES = xhost.po
+endif
diff --git a/configure.ac b/configure.ac
index b9c8a9c..d69ebab 100644
--- a/configure.ac
+++ b/configure.ac
@@ -45,6 +45,27 @@ esac
# Checks for library functions.
AC_CHECK_FUNCS([inet_aton])
+# Internationalization & localization support
+AC_SEARCH_LIBS([gettext], [intl], [USE_GETTEXT="yes"], [USE_GETTEXT="no"])
+AC_MSG_CHECKING([where to install localized messages])
+AC_ARG_WITH([localedir], AS_HELP_STRING([--with-localedir=<path>],
+ [Path to install message files in (default: datadir/locale)]),
+ [LOCALEDIR=${withval}], [LOCALEDIR=${datadir}/locale])
+if test "x$LOCALEDIR" = "xno" -o "x$USE_GETTEXT" = "xno" ; then
+ AC_MSG_RESULT([nowhere])
+ USE_GETTEXT="no"
+else
+ AC_SUBST([LOCALEDIR])
+ AC_MSG_RESULT([$LOCALEDIR])
+fi
+
+if test "x$USE_GETTEXT" = "xyes" ; then
+ AC_DEFINE([USE_GETTEXT], 1,
+ [Define to 1 if you want to use the gettext() function.])
+fi
+AM_CONDITIONAL(USE_GETTEXT, test "x$USE_GETTEXT" = "xyes")
+
+
AC_CONFIG_FILES([
Makefile
man/Makefile])
diff --git a/xhost.c b/xhost.c
index 9b0a093..72d86be 100644
--- a/xhost.c
+++ b/xhost.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2004, 2022, Oracle and/or its affiliates.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -119,6 +119,13 @@ extern int getdomainname(char *name, size_t len);
#endif
#endif
+#ifdef USE_GETTEXT
+# include <locale.h> /* setlocale() */
+# include <libintl.h> /* gettext(), textdomain(), etc. */
+#else
+# define gettext(a) (a)
+#endif
+
static int change_host(Display *dpy, char *name, Bool add);
static const char *get_hostname(XHostAddress *ha);
static int local_xerror(Display *dpy, XErrorEvent *rep);
@@ -179,15 +186,29 @@ main(int argc, char *argv[])
Bool enabled = False;
Display *dpy;
+#ifdef USE_GETTEXT
+ const char *domaindir;
+
+ setlocale(LC_ALL, "");
+ textdomain("xhost");
+
+ /* mainly for debugging */
+ if ((domaindir = getenv("TEXTDOMAINDIR")) == NULL) {
+ domaindir = LOCALEDIR;
+ }
+ bindtextdomain("xhost", domaindir);
+#endif
+
ProgramName = argv[0];
if (argc == 2 && !strcmp(argv[1], "-help")) {
- fprintf(stderr, "usage: %s [[+-]hostname ...]\n", argv[0]);
+ fprintf(stderr, gettext("usage: %s [[+-]hostname ...]\n"), argv[0]);
exit(1);
}
if ((dpy = XOpenDisplay(NULL)) == NULL) {
- fprintf(stderr, "%s: unable to open display \"%s\"\n",
+ fprintf(stderr,
+ gettext("%s: unable to open display \"%s\"\n"),
ProgramName, XDisplayName (NULL));
exit(1);
}
@@ -199,9 +220,9 @@ main(int argc, char *argv[])
sethostent(1); /* don't close the data base each time */
list = XListHosts(dpy, &nhosts, &enabled);
if (enabled)
- printf ("access control enabled, only authorized clients can connect\n");
+ printf (gettext("access control enabled, only authorized clients can connect\n"));
else
- printf ("access control disabled, clients can connect from any host\n");
+ printf (gettext("access control disabled, clients can connect from any host\n"));
if (nhosts != 0) {
for (i = 0; i < nhosts; i++ ) {
@@ -230,16 +251,16 @@ main(int argc, char *argv[])
printf("SI:");
break;
default:
- printf("<unknown family type %d>:", list[i].family);
+ printf(gettext("<unknown family type %d>:"), list[i].family);
break;
}
printf ("%s", hostname);
} else {
- printf ("<unknown address in family %d>",
+ printf (gettext("<unknown address in family %d>"),
list[i].family);
}
if (nameserver_timedout) {
- printf("\t(no nameserver response within %d seconds)\n",
+ printf(gettext("\t(no nameserver response within %d seconds)\n"),
NAMESERVER_TIMEOUT);
nameserver_timedout = 0;
} else
@@ -256,26 +277,26 @@ main(int argc, char *argv[])
if (*arg == '-') {
if (!argv[i][1] && ((i+1) == argc)) {
- printf ("access control enabled, only authorized clients can connect\n");
+ printf (gettext("access control enabled, only authorized clients can connect\n"));
XEnableAccessControl(dpy);
} else {
arg = argv[i][1]? &argv[i][1] : argv[++i];
if (!change_host (dpy, arg, False)) {
- fprintf (stderr, "%s: bad hostname \"%s\"\n",
+ fprintf (stderr, gettext("%s: bad hostname \"%s\"\n"),
ProgramName, arg);
nfailed++;
}
}
} else {
if (*arg == '+' && !argv[i][1] && ((i+1) == argc)) {
- printf ("access control disabled, clients can connect from any host\n");
+ printf (gettext("access control disabled, clients can connect from any host\n"));
XDisableAccessControl(dpy);
} else {
if (*arg == '+') {
arg = argv[i][1]? &argv[i][1] : argv[++i];
}
if (!change_host (dpy, arg, True)) {
- fprintf (stderr, "%s: bad hostname \"%s\"\n",
+ fprintf (stderr, gettext("%s: bad hostname \"%s\"\n"),
ProgramName, arg);
nfailed++;
}
@@ -316,12 +337,13 @@ change_host(Display *dpy, char *name, Bool add)
#endif
#endif
char *cp;
- static const char *add_msg = "being added to access control list";
- static const char *remove_msg = "being removed from access control list";
+ const char *add_msg = gettext("being added to access control list");
+ const char *remove_msg = gettext("being removed from access control list");
namelen = strlen(name);
if ((lname = (char *)malloc(namelen+1)) == NULL) {
- fprintf (stderr, "%s: malloc bombed in change_host\n", ProgramName);
+ fprintf (stderr, gettext("%s: malloc bombed in change_host\n"),
+ ProgramName);
exit (1);
}
for (i = 0; i < namelen; i++) {
@@ -333,7 +355,7 @@ change_host(Display *dpy, char *name, Bool add)
family = FamilyInternet;
name += 5;
#else
- fprintf (stderr, "%s: not compiled for TCP/IP\n", ProgramName);
+ fprintf (stderr, gettext("%s: not compiled for TCP/IP\n"), ProgramName);
free(lname);
return 0;
#endif
@@ -343,7 +365,7 @@ change_host(Display *dpy, char *name, Bool add)
family = FamilyInternet6;
name += 6;
#else
- fprintf (stderr, "%s: not compiled for IPv6\n", ProgramName);
+ fprintf (stderr, gettext("%s: not compiled for IPv6\n"), ProgramName);
free(lname);
return 0;
#endif
@@ -355,14 +377,14 @@ change_host(Display *dpy, char *name, Bool add)
family = FamilyInternet6;
name += 7;
#else
- fprintf (stderr, "%s: not compiled for IPv6\n", ProgramName);
+ fprintf (stderr, gettext("%s: not compiled for IPv6\n"), ProgramName);
free(lname);
return 0;
#endif
}
#endif /* ACCEPT_INETV6 */
else if (!strncmp("dnet:", lname, 5)) {
- fprintf (stderr, "%s: not compiled for DECnet\n", ProgramName);
+ fprintf (stderr, gettext("%s: not compiled for DECnet\n"), ProgramName);
free(lname);
return 0;
}
@@ -371,7 +393,7 @@ change_host(Display *dpy, char *name, Bool add)
family = FamilyNetname;
name += 4;
#else
- fprintf (stderr, "%s: not compiled for Secure RPC\n", ProgramName);
+ fprintf (stderr, gettext("%s: not compiled for Secure RPC\n"), ProgramName);
free(lname);
return 0;
#endif
@@ -381,7 +403,7 @@ change_host(Display *dpy, char *name, Bool add)
family = FamilyKrb5Principal;
name +=4;
#else
- fprintf (stderr, "%s: not compiled for Kerberos 5\n", ProgramName);
+ fprintf (stderr, gettext("%s: not compiled for Kerberos 5\n"), ProgramName);
free(lname);
return 0;
#endif
@@ -404,7 +426,7 @@ change_host(Display *dpy, char *name, Bool add)
#endif
{
*cp = '\0';
- fprintf (stderr, "%s: unknown address family \"%s\"\n",
+ fprintf (stderr, gettext("%s: unknown address family \"%s\"\n"),
ProgramName, lname);
free(lname);
return 0;
@@ -418,8 +440,8 @@ change_host(Display *dpy, char *name, Bool add)
cp = strchr(name, ':');
if (cp == NULL || cp == name) {
- fprintf(stderr,
- "%s: type must be specified for server interpreted family \"%s\"\n",
+ fprintf(stderr, gettext(
+ "%s: type must be specified for server interpreted family \"%s\"\n"),
ProgramName, name);
return 0;
}
@@ -447,7 +469,7 @@ change_host(Display *dpy, char *name, Bool add)
retval = krb5_parse_name(name, &princ);
if (retval) {
krb5_init_ets(); /* init krb errs for error_message() */
- fprintf(stderr, "%s: cannot parse Kerberos name: %s\n",
+ fprintf(stderr, gettext("%s: cannot parse Kerberos name: %s\n"),
ProgramName, error_message(retval));
return 0;
}
@@ -474,7 +496,7 @@ change_host(Display *dpy, char *name, Bool add)
XAddHost(dpy, &ha);
else
XRemoveHost(dpy, &ha);
- printf( "non-network local connections %s\n", add ? add_msg : remove_msg);
+ printf( gettext("non-network local connections %s\n"), add ? add_msg : remove_msg);
return 1;
}
/*
@@ -493,12 +515,12 @@ change_host(Display *dpy, char *name, Bool add)
*cp = '\0';
pwd = getpwnam(name);
if (!pwd) {
- fprintf(stderr, "no such user \"%s\"\n", name);
+ fprintf(stderr, gettext("no such user \"%s\"\n"), name);
return 0;
}
getdomainname(domainname, sizeof(domainname));
if (!user2netname(username, pwd->pw_uid, domainname)) {
- fprintf(stderr, "failed to get netname for \"%s\"\n", name);
+ fprintf(stderr, gettext("failed to get netname for \"%s\"\n"), name);
return 0;
}
netname = username;
@@ -610,8 +632,11 @@ change_host(Display *dpy, char *name, Bool add)
familyMsg = "inet ";
}
- fprintf(stderr, "%s: unable to get %saddress for \"%s\"\n",
- ProgramName, familyMsg, name);
+ /* L10N_Comments - Parts composed to make full error string
+ 'unable to get' ['inet'|'inetv6'|''] 'address for' <address> */
+ fprintf (stderr, "%s: %s %s%s \"%s\"\n", ProgramName,
+ gettext("unable to get"), familyMsg, gettext("address for"),
+ name);
}
freeaddrinfo(addresses);
return 1;
@@ -852,13 +877,13 @@ local_xerror(Display *dpy, XErrorEvent *rep)
{
if ((rep->error_code == BadAccess) && (rep->request_code == X_ChangeHosts)) {
fprintf (stderr,
- "%s: must be on local machine to add or remove hosts.\n",
+ gettext("%s: must be on local machine to add or remove hosts.\n"),
ProgramName);
return 1;
} else if ((rep->error_code == BadAccess) &&
(rep->request_code == X_SetAccessControl)) {
fprintf (stderr,
- "%s: must be on local machine to enable or disable access control.\n",
+ gettext("%s: must be on local machine to enable or disable access control.\n"),
ProgramName);
return 1;
} else if ((rep->error_code == BadValue) &&