Makefile.am | 2
Makefile.in | 3 +
admserv/cgi-src40/restartsrv.c | 5 ++
admserv/cgi-src40/stopsrv.c | 5 ++
admserv/newinst/src/AdminServer.pm.in | 37 +++++++++------
config.h.in | 3 +
configure | 82 +++++++++++++++++++++++++---------
configure.ac | 28 +++++++++++
man/man8/restart-ds-admin.8 | 10 +++-
man/man8/start-ds-admin.8 | 10 +++-
man/man8/stop-ds-admin.8 | 10 +++-
11 files changed, 158 insertions(+), 37 deletions(-)
New commits:
commit 83551c42e6f1465f2c3b9c385373c71f9aa0a3d0
Author: Rich Megginson <rmeggins(a)redhat.com>
Date: Fri Jul 1 13:01:08 2011 -0600
Bug 718285 - AdminServer should use "service" command instead of
start/stop/restart scripts
https://bugzilla.redhat.com/show_bug.cgi?id=718285
Resolves: bug 718285
Bug Description: AdminServer should use "service" command instead of
start/stop/restart scripts
Reviewed by: nhosoi (Thanks!)
Branch: master
Fix Description: Added a new configure switch --enable-service - if this is
set, admin server will use the service command instead of the scripts. The
default value is "yes" if the build system has the service command. The
man pages for the scripts have been changed to discourage the user from
using them, in favor of the service command.
Platforms tested: RHEL6 x86_64
Flag Day: no
Doc impact: yes - need to document that the service command should be used
instead of the stop/start/restart scripts
diff --git a/Makefile.am b/Makefile.am
index 6618290..999adc9 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -549,6 +549,7 @@ fixupcmd = sed \
-e 's,@initconfigdir\@,$(initconfigdir),g' \
-e 's,@updatedir\@,$(updatedir),g' \
-e 's,@with_selinux\@,@with_selinux@,g' \
+ -e 's,@enable_service\@,@enable_service@,g' \
-e 's,@dsgwcgibindir\@,$(dsgwcgibindir),g' \
-e 's,@dsgwconfigdir\@,$(dsgwconfigdir),g' \
-e 's,@dsgwcookiedir\@,$(dsgwcookiedir),g'
@@ -608,6 +609,7 @@ fixupcmd = sed \
-e 's,@initconfigdir\@,$(initconfigdir),g' \
-e 's,@updatedir\@,$(updatedir),g' \
-e 's,@with_selinux\@,@with_selinux@,g' \
+ -e 's,@enable_service\@,@enable_service@,g' \
-e 's,@dsgwcgibindir\@,$(dsgwcgibindir),g' \
-e 's,@dsgwconfigdir\@,$(dsgwconfigdir),g' \
-e 's,@dsgwcookiedir\@,$(dsgwcookiedir),g'
diff --git a/Makefile.in b/Makefile.in
index 8e79f25..3585ba0 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -415,6 +415,7 @@ dsgwcgibindir = $(libdir)@dsgwcgibindir@
dsgwcookiedir = $(localstatedir)@dsgwcookiedir@
dslibdir = @dslibdir@
dvidir = @dvidir@
+enable_service = @enable_service@
exec_prefix = @exec_prefix@
extra_cppflags = @extra_cppflags@
host = @host@
@@ -913,6 +914,7 @@ property_DATA = admserv/newinst/src/setup-ds-admin.res \
@BUNDLE_FALSE@ -e 's,@initconfigdir\@,$(initconfigdir),g' \
@BUNDLE_FALSE@ -e 's,@updatedir\@,$(updatedir),g' \
@BUNDLE_FALSE@ -e 's,@with_selinux\@,@with_selinux@,g' \
+@BUNDLE_FALSE@ -e 's,@enable_service\@,@enable_service@,g' \
@BUNDLE_FALSE@ -e 's,@dsgwcgibindir\@,$(dsgwcgibindir),g' \
@BUNDLE_FALSE@ -e 's,@dsgwconfigdir\@,$(dsgwconfigdir),g' \
@BUNDLE_FALSE@ -e 's,@dsgwcookiedir\@,$(dsgwcookiedir),g'
@@ -981,6 +983,7 @@ property_DATA = admserv/newinst/src/setup-ds-admin.res \
@BUNDLE_TRUE@ -e 's,@initconfigdir\@,$(initconfigdir),g' \
@BUNDLE_TRUE@ -e 's,@updatedir\@,$(updatedir),g' \
@BUNDLE_TRUE@ -e 's,@with_selinux\@,@with_selinux@,g' \
+@BUNDLE_TRUE@ -e 's,@enable_service\@,@enable_service@,g' \
@BUNDLE_TRUE@ -e 's,@dsgwcgibindir\@,$(dsgwcgibindir),g' \
@BUNDLE_TRUE@ -e 's,@dsgwconfigdir\@,$(dsgwconfigdir),g' \
@BUNDLE_TRUE@ -e 's,@dsgwcookiedir\@,$(dsgwcookiedir),g'
diff --git a/admserv/cgi-src40/restartsrv.c b/admserv/cgi-src40/restartsrv.c
index 9759c07..f4501cc 100644
--- a/admserv/cgi-src40/restartsrv.c
+++ b/admserv/cgi-src40/restartsrv.c
@@ -183,9 +183,14 @@ int main(int argc, char *argv[])
NULL, NULL);
break;
case 0:
+#if defined(ENABLE_SERVICE)
+ PR_snprintf(line, sizeof(line), "service " PACKAGE_NAME "
restart");
+ restart(line);
+#else
if (util_find_file_in_paths(line, sizeof(line), "restart-ds-admin",
CMDBINDIR, "../..", "")) {
restart(line);
}
+#endif
exit(0);
break;
default:
diff --git a/admserv/cgi-src40/stopsrv.c b/admserv/cgi-src40/stopsrv.c
index 05461f8..780a6d0 100644
--- a/admserv/cgi-src40/stopsrv.c
+++ b/admserv/cgi-src40/stopsrv.c
@@ -143,9 +143,14 @@ int main(int argc, char *argv[])
#else
sleep(5);
#endif
+#if defined(ENABLE_SERVICE)
+ PR_snprintf(line, sizeof(line), "service " PACKAGE_NAME "
stop");
+ system(line);
+#else
if (util_find_file_in_paths(line, sizeof(line), "stop-ds-admin",
CMDBINDIR, "../..", "")) {
system(line);
}
+#endif
exit(0);
break;
default:
diff --git a/admserv/newinst/src/AdminServer.pm.in
b/admserv/newinst/src/AdminServer.pm.in
index 72d8529..9cff480 100644
--- a/admserv/newinst/src/AdminServer.pm.in
+++ b/admserv/newinst/src/AdminServer.pm.in
@@ -447,10 +447,18 @@ sub startAdminServer {
if ($isrunning) {
$setup->msg('restarting_adminserver');
- $rc = system("$selinux_cmd @cmdbindir@/restart-ds-admin > $filename
2>&1");
+ if ("@enable_service@") {
+ $rc = system("service @package_name@ restart > $filename
2>&1");
+ } else {
+ $rc = system("$selinux_cmd @cmdbindir@/restart-ds-admin > $filename
2>&1");
+ }
} else {
$setup->msg('starting_adminserver');
- $rc = system("$selinux_cmd @cmdbindir@/start-ds-admin > $filename
2>&1");
+ if ("@enable_service@") {
+ $rc = system("service @package_name@ start > $filename
2>&1");
+ } else {
+ $rc = system("$selinux_cmd @cmdbindir@/start-ds-admin > $filename
2>&1");
+ }
}
open(STARTLOG, "$filename");
@@ -573,21 +581,22 @@ sub reconfigAdminServer {
sub stopAdminServer {
my $prog = "@sbindir@/stop-ds-admin";
- if (-x $prog) {
- $? = 0;
- # run the stop command
- my $output = `$prog 2>&1`;
- my $status = $?;
- debug(3, "stopping admin server returns status $status: output
$output\n");
- if ($status) {
- # Ignore the stop failure
- debug(1,"Warning: Could not stop admin server: status $status: output
$output\n");
- return 1;
- }
- } else {
+ if ("@enable_service@") {
+ $prog = "service @package_name@ stop";
+ } elsif (! -x $prog) {
debug(1, "stopping admin server: no such program $prog: cannot stop
server\n");
return 0;
}
+ $? = 0;
+ # run the stop command
+ my $output = `$prog 2>&1`;
+ my $status = $?;
+ debug(3, "stopping admin server returns status $status: output
$output\n");
+ if ($status) {
+ # Ignore the stop failure
+ debug(1,"Warning: Could not stop admin server: status $status: output
$output\n");
+ return 1;
+ }
debug(1, "Successfully stopped admin server\n");
return 1;
diff --git a/config.h.in b/config.h.in
index 9d3196f..a5e78f8 100644
--- a/config.h.in
+++ b/config.h.in
@@ -24,6 +24,9 @@
/* cpu type sparc */
#undef CPU_sparc
+/* Use the service command instead of the stop|start|restart scripts */
+#undef ENABLE_SERVICE
+
/* Define to 1 if you have the <arpa/inet.h> header file. */
#undef HAVE_ARPA_INET_H
diff --git a/configure b/configure
index f15ce44..27ea93d 100755
--- a/configure
+++ b/configure
@@ -857,6 +857,7 @@ nss_inc
nspr_libdir
nspr_lib
nspr_inc
+enable_service
dslibdir
instconfigdir
SELINUX_FALSE
@@ -1050,6 +1051,7 @@ with_modnss_bin
with_selinux
with_instconfigdir
with_dslibdir
+enable_service
'
ac_precious_vars='build_alias
host_alias
@@ -1710,6 +1712,8 @@ Optional Features:
--enable-threading Admin Server works best if Apache has threading
support. Use --disable-threading to force the use of
an Apache without threading support.
+ --enable-service Use the service command instead of the
+ stop|start|restart scripts
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
@@ -5298,13 +5302,13 @@ if test "${lt_cv_nm_interface+set}" = set; then
else
lt_cv_nm_interface="BSD nm"
echo "int some_variable = 0;" > conftest.$ac_ext
- (eval echo "\"\$as_me:5301: $ac_compile\"" >&5)
+ (eval echo "\"\$as_me:5305: $ac_compile\"" >&5)
(eval "$ac_compile" 2>conftest.err)
cat conftest.err >&5
- (eval echo "\"\$as_me:5304: $NM
\\\"conftest.$ac_objext\\\"\"" >&5)
+ (eval echo "\"\$as_me:5308: $NM
\\\"conftest.$ac_objext\\\"\"" >&5)
(eval "$NM \"conftest.$ac_objext\"" 2>conftest.err >
conftest.out)
cat conftest.err >&5
- (eval echo "\"\$as_me:5307: output\"" >&5)
+ (eval echo "\"\$as_me:5311: output\"" >&5)
cat conftest.out >&5
if $GREP 'External.*some_variable' conftest.out > /dev/null; then
lt_cv_nm_interface="MS dumpbin"
@@ -6510,7 +6514,7 @@ ia64-*-hpux*)
;;
*-*-irix6*)
# Find out which ABI we are using.
- echo '#line 6513 "configure"' > conftest.$ac_ext
+ echo '#line 6517 "configure"' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
@@ -9075,11 +9079,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:9078: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:9082: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
- echo "$as_me:9082: \$? = $ac_status" >&5
+ echo "$as_me:9086: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
@@ -9414,11 +9418,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:9417: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:9421: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
- echo "$as_me:9421: \$? = $ac_status" >&5
+ echo "$as_me:9425: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
@@ -9519,11 +9523,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:9522: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:9526: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
- echo "$as_me:9526: \$? = $ac_status" >&5
+ echo "$as_me:9530: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@@ -9574,11 +9578,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:9577: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:9581: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
- echo "$as_me:9581: \$? = $ac_status" >&5
+ echo "$as_me:9585: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@@ -12377,7 +12381,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 12380 "configure"
+#line 12384 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -12473,7 +12477,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 12476 "configure"
+#line 12480 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -14493,11 +14497,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:14496: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:14500: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
- echo "$as_me:14500: \$? = $ac_status" >&5
+ echo "$as_me:14504: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
@@ -14592,11 +14596,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:14595: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:14599: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
- echo "$as_me:14599: \$? = $ac_status" >&5
+ echo "$as_me:14603: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@@ -14644,11 +14648,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:14647: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:14651: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
- echo "$as_me:14651: \$? = $ac_status" >&5
+ echo "$as_me:14655: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@@ -22869,6 +22873,8 @@ else
fi
+{ $as_echo "$as_me:$LINENO: result: $instconfigdir" >&5
+$as_echo "$instconfigdir" >&6; }
# check for --with-dslibdir
{ $as_echo "$as_me:$LINENO: checking for --with-dslibdir" >&5
@@ -22891,6 +22897,42 @@ else
fi
+{ $as_echo "$as_me:$LINENO: result: $dslibdir" >&5
+$as_echo "$dslibdir" >&6; }
+
+# check for --enable-service
+# set default value based on availability of the service command
+if test -z "$enable_service" ; then
+ if test -f $sbindir/service ; then
+ enable_service=yes
+ elif test -f /sbin/service ; then
+ enable_service=yes
+ fi
+fi
+{ $as_echo "$as_me:$LINENO: checking for --enable-service" >&5
+$as_echo_n "checking for --enable-service... " >&6; }
+# Check whether --enable-service was given.
+if test "${enable_service+set}" = set; then
+ enableval=$enable_service; if test x"$enableval" = xyes ; then
+ enable_service=yes
+else
+ enable_service=
+fi
+else
+ enable_service=
+
+fi
+
+
+if test -n "$enable_service" ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define ENABLE_SERVICE 1
+_ACEOF
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $enable_service" >&5
+$as_echo "$enable_service" >&6; }
# installation paths - by default, configure will just
# use /usr as the prefix for everything, which means
diff --git a/configure.ac b/configure.ac
index 9fd1b3f..1a438e3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -279,6 +279,7 @@ AC_ARG_WITH(instconfigdir,
instconfigdir='$(sysconfdir)/$(PACKAGE_BASE_NAME)'
])
AC_SUBST(instconfigdir)
+AC_MSG_RESULT([$instconfigdir])
# check for --with-dslibdir
AC_MSG_CHECKING(for --with-dslibdir)
@@ -296,6 +297,33 @@ AC_ARG_WITH(dslibdir,
dslibdir='$(libdir)/$(PACKAGE_BASE_NAME)'
])
AC_SUBST(dslibdir)
+AC_MSG_RESULT([$dslibdir])
+
+# check for --enable-service
+# set default value based on availability of the service command
+if test -z "$enable_service" ; then
+ if test -f $sbindir/service ; then
+ enable_service=yes
+ elif test -f /sbin/service ; then
+ enable_service=yes
+ fi
+fi
+AC_MSG_CHECKING(for --enable-service)
+AC_ARG_ENABLE(service,
+ AS_HELP_STRING([--enable-service],
+ [Use the service command instead of the stop|start|restart
scripts]),
+[if test x"$enableval" = xyes ; then
+ enable_service=yes
+else
+ enable_service=
+fi],
+[enable_service=]
+)
+AC_SUBST(enable_service)
+if test -n "$enable_service" ; then
+ AC_DEFINE([ENABLE_SERVICE], [1], [Use the service command instead of the
stop|start|restart scripts])
+fi
+AC_MSG_RESULT([$enable_service])
# installation paths - by default, configure will just
# use /usr as the prefix for everything, which means
diff --git a/man/man8/restart-ds-admin.8 b/man/man8/restart-ds-admin.8
index f6d3e56..c210103 100644
--- a/man/man8/restart-ds-admin.8
+++ b/man/man8/restart-ds-admin.8
@@ -2,7 +2,7 @@
.\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1)
-.TH RESTART-DS-ADMIN 8 "Jun 8, 2010"
+.TH RESTART-DS-ADMIN 8 "Jul 1, 2011"
.\" Please adjust this date whenever revising the manpage.
.\"
.\" Some roff macros, for reference:
@@ -21,6 +21,14 @@ restart-ds-admin \- restart script for Admin Server
.B restart-ds-admin
.SH DESCRIPTION
restart-ds-admin restarts the Admin Server instance
+.sp 2
+NOTE: On systems that provide the \fIservice\fP command
+or \fIsystemctl\fP or other
+similar command, that command should be used instead of this script.
+This script is only for those installations that do not support such
+mechanisms. e.g.
+.sp 2
+ service dirsrv-admin restart
.PP
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
diff --git a/man/man8/start-ds-admin.8 b/man/man8/start-ds-admin.8
index 420a5a0..70efd67 100644
--- a/man/man8/start-ds-admin.8
+++ b/man/man8/start-ds-admin.8
@@ -2,7 +2,7 @@
.\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1)
-.TH START-DS-ADMIN 8 "Jun 8, 2010"
+.TH START-DS-ADMIN 8 "Jul 1, 2011"
.\" Please adjust this date whenever revising the manpage.
.\"
.\" Some roff macros, for reference:
@@ -21,6 +21,14 @@ start-ds-admin \- start script for Admin Server
.B start-ds-admin
.SH DESCRIPTION
start-ds-admin starts the Admin Server instance
+.sp 2
+NOTE: On systems that provide the \fIservice\fP command
+or \fIsystemctl\fP or other
+similar command, that command should be used instead of this script.
+This script is only for those installations that do not support such
+mechanisms. e.g.
+.sp 2
+ service dirsrv-admin start
.PP
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
diff --git a/man/man8/stop-ds-admin.8 b/man/man8/stop-ds-admin.8
index 178bcf9..ccf9447 100644
--- a/man/man8/stop-ds-admin.8
+++ b/man/man8/stop-ds-admin.8
@@ -2,7 +2,7 @@
.\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1)
-.TH STOP-DS-ADMIN 8 "Jun 8, 2010"
+.TH STOP-DS-ADMIN 8 "Jul 1 2011"
.\" Please adjust this date whenever revising the manpage.
.\"
.\" Some roff macros, for reference:
@@ -21,6 +21,14 @@ stop-ds-admin \- stop script for Admin Server
.B stop-ds-admin
.SH DESCRIPTION
stop-ds-admin stops the Admin Server instance
+.sp 2
+NOTE: On systems that provide the \fIservice\fP command
+or \fIsystemctl\fP or other
+similar command, that command should be used instead of this script.
+This script is only for those installations that do not support such
+mechanisms. e.g.
+.sp 2
+ service dirsrv-admin stop
.PP
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,