@@ -231,6 +231,31 @@ dnl Checks for headers and libraries
OPENIB_APP_OSMV_CHECK_HEADER
OPENIB_APP_OSMV_CHECK_LIB
+dnl Where to place opensm.pid
+piddir=/var/run
+dnl make sure the directory exists
+if test ! -d $piddir ; then
+ piddir=`eval echo ${sysconfdir}`
+ case $piddir in
+ NONE/*) piddir=`echo $piddir | sed "s~NONE~$ac_default_prefix~"` ;;
+ esac
+fi
+
+AC_ARG_WITH(pid-dir,
+ [ --with-pid-dir=<dir> define the dir of opensm.pid file (default is /var/run)],
+ [
+ if test -n "$withval" && test "x$withval" != "xno" && \
+ test "x${withval}" != "xyes"; then
+ piddir=$withval
+ if test ! -d $piddir ; then
+ AC_MSG_WARN([** no $piddir directory on this system **])
+ fi
+ fi
+ ]
+)
+AC_DEFINE_UNQUOTED(OPENSM_PID_DIR, "$piddir", [Specify location of opensm.pid])
+AC_SUBST(piddir)
+
AC_CONFIG_FILES([man/opensm.8 man/torus-2QoS.8 man/torus-2QoS.conf.5 scripts/opensm.init scripts/redhat-opensm.init scripts/sldd.sh])
dnl Create the following Makefiles
@@ -318,6 +318,24 @@ BEGIN_C_DECLS
#endif
/***********/
+/****d* OpenSM: Base/OSM_DEFAULT_PID_FILE
+* NAME
+* OSM_DEFAULT_PID_FILE
+*
+* DESCRIPTION
+* Specifies the default pid file name
+*
+* SYNOPSIS
+*/
+#if defined(HAVE_DEFAULT_PID_FILE)
+#define OSM_DEFAULT_PID_FILE HAVE_DEFAULT_PID_FILE
+#elif defined(OPENSM_PID_DIR)
+#define OSM_DEFAULT_PID_FILE OPENSM_PID_DIR "/opensm.pid"
+#else
+#define OSM_DEFAULT_PID_FILE "/var/run/opensm.pid"
+#endif
+/***********/
+
/****d* OpenSM: Base/OSM_DEFAULT_SWEEP_INTERVAL_SECS
* NAME
* OSM_DEFAULT_SWEEP_INTERVAL_SECS
@@ -208,6 +208,7 @@ typedef struct osm_subn_opt {
char *sa_db_file;
boolean_t sa_db_dump;
char *torus_conf_file;
+ char *pid_file;
boolean_t do_mesh_analysis;
boolean_t exit_on_fatal;
boolean_t honor_guid2lid_file;
@@ -55,6 +55,7 @@ opensm \- InfiniBand subnet manager and administration (SM/SA)
[\-\-consolidate_ipv6_snm_req]
[\-\-log_prefix <prefix text>]
[\-\-torus_config <path to file>]
+[\-\-pid_file <path to file>]
[\-v(erbose)] [\-V] [\-D <flags>] [\-d(ebug) <number>]
[\-h(elp)] [\-?]
@@ -407,6 +408,10 @@ This option defines the file name for the extra configuration
information needed for the torus-2QoS routing engine. The default
name is \fB\%@OPENSM_CONFIG_DIR@/@TORUS2QOS_CONF_FILE@\fP
.TP
+\fB\-\-pid_file\fR <path to pid file>
+Specifies the file that contains the process ID of the opensm daemon.
+The default is \fB/var/run/opensm.pid\fP
+.TP
\fB\-v\fR, \fB\-\-verbose\fR
This option increases the log verbosity level.
The -v option may be specified multiple times
@@ -347,6 +347,9 @@ static void show_usage(void)
printf("--consolidate_ipv6_snm_req\n"
" Use shared MLID for IPv6 Solicited Node Multicast groups\n"
" per MGID scope and P_Key.\n\n");
+ printf("--pid_file <path to file>\n"
+ " Specifies the file that contains the process ID of the\n"
+ " opensm daemon.The default is /var/run/opensm.pid\n");
printf("--log_prefix <prefix text>\n"
" Prefix to syslog messages from OpenSM.\n\n");
printf("--verbose, -v\n"
@@ -638,6 +641,7 @@ int main(int argc, char *argv[])
{"retries", 1, NULL, 8},
{"log_prefix", 1, NULL, 9},
{"torus_config", 1, NULL, 10},
+ {"pid_file", 1, NULL, 15},
{NULL, 0, NULL, 0} /* Required at the end of the array */
};
@@ -1047,6 +1051,9 @@ int main(int argc, char *argv[])
SET_STR_OPT(opt.torus_conf_file, optarg);
printf("Torus-2QoS config file = %s\n", opt.torus_conf_file);
break;
+ case 15:
+ SET_STR_OPT(opt.pid_file, optarg);
+ break;
case 'h':
case '?':
case ':':
@@ -1116,6 +1123,14 @@ int main(int argc, char *argv[])
setup_signals();
+ FILE *f = fopen(opt.pid_file, "w");
+ if (f == NULL)
+ printf("Couldn't create pid file \"%s\"\n", opt.pid_file);
+ else {
+ fprintf(f, "%ld\n", (long) getpid());
+ fclose(f);
+ }
+
osm_opensm_sweep(&osm);
if (run_once_flag == TRUE) {
@@ -1147,6 +1162,7 @@ int main(int argc, char *argv[])
}
Exit:
+ unlink(opt.pid_file);
osm_opensm_destroy(&osm);
complib_exit();
@@ -404,6 +404,7 @@ static const opt_rec_t opt_tbl[] = {
{ "no_clients_rereg", OPT_OFFSET(no_clients_rereg), opts_parse_boolean, NULL, 1 },
{ "prefix_routes_file", OPT_OFFSET(prefix_routes_file), opts_parse_charp, NULL, 0 },
{ "consolidate_ipv6_snm_req", OPT_OFFSET(consolidate_ipv6_snm_req), opts_parse_boolean, NULL, 1 },
+ { "pid_file", OPT_OFFSET(pid_file), opts_parse_charp, NULL, 0},
{ "lash_start_vl", OPT_OFFSET(lash_start_vl), opts_parse_uint8, NULL, 1 },
{ "sm_sl", OPT_OFFSET(sm_sl), opts_parse_uint8, NULL, 1 },
{ "log_prefix", OPT_OFFSET(log_prefix), opts_parse_charp, NULL, 1 },
@@ -791,6 +792,7 @@ void osm_subn_set_default_opt(IN osm_subn_opt_t * p_opt)
p_opt->no_clients_rereg = FALSE;
p_opt->prefix_routes_file = strdup(OSM_DEFAULT_PREFIX_ROUTES_FILE);
p_opt->consolidate_ipv6_snm_req = FALSE;
+ p_opt->pid_file = strdup(OSM_DEFAULT_PID_FILE);
p_opt->lash_start_vl = 0;
p_opt->sm_sl = OSM_DEFAULT_SL;
p_opt->log_prefix = NULL;
@@ -42,6 +42,9 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
+piddir=@piddir@
+
+PIDFILE=${piddir}/opensm.pid
# Source function library.
if [[ -s /etc/init.d/functions ]]; then
@@ -74,7 +77,7 @@ start () {
stop () {
echo -n "Shutting down opensm: "
- killproc opensm
+ killproc -p $PIDFILE opensm
if [[ $RETVAL -eq 0 ]]; then
rm -f /var/lock/subsys/opensm
success