summaryrefslogtreecommitdiff
path: root/net/openistgt
diff options
context:
space:
mode:
authorJosh Paetzel <jpaetzel@FreeBSD.org>2012-05-16 23:54:04 +0000
committerJosh Paetzel <jpaetzel@FreeBSD.org>2012-05-16 23:54:04 +0000
commita883fd79821a87d94b4bf7c123ff4c9eacf4032c (patch)
treea2a9999dcb9c28d060520449579dee60e6650db8 /net/openistgt
parentUpdate to the 20120512 snapshot of GCC 4.7.1. (diff)
Welcome openistgt to the ports tree. An istgt fork
with an available svn dev repo as well as patches incorporated which have not been adopted upstream.
Notes
Notes: svn path=/head/; revision=296805
Diffstat (limited to 'net/openistgt')
-rw-r--r--net/openistgt/Makefile12
-rw-r--r--net/openistgt/distinfo4
-rw-r--r--net/openistgt/files/patch-istgt-rc38
-rw-r--r--net/openistgt/files/patch-istgt-reload438
-rw-r--r--net/openistgt/files/pkg-message.in2
5 files changed, 9 insertions, 485 deletions
diff --git a/net/openistgt/Makefile b/net/openistgt/Makefile
index 5a3aa1d38187..84743c91e64b 100644
--- a/net/openistgt/Makefile
+++ b/net/openistgt/Makefile
@@ -5,17 +5,17 @@
# $FreeBSD$
#
-PORTNAME= istgt
-PORTVERSION= 20111008
-PORTREVISION= 2
+PORTNAME= openistgt
+PORTVERSION= 20120516
CATEGORIES= net
-MASTER_SITES= http://www.peach.ne.jp/archives/istgt/
+MASTER_SITES= SF/${PORTNAME}
-MAINTAINER= aoyama@peach.ne.jp
+MAINTAINER= jpaetzel@FreeBSD.org
COMMENT= An iSCSI target for FreeBSD
SUB_FILES= pkg-message
PKGMESSAGE= ${WRKDIR}/pkg-message
+CONFLICTS= istgt-2*
GNU_CONFIGURE= yes
@@ -24,7 +24,7 @@ MANCOMPRESSED= yes
PLIST_FILES= bin/istgt \
bin/istgtcontrol \
- etc/rc.d/istgt \
+ etc/rc.d/openistgt \
%%ETCDIR%%/auth.conf.sample \
%%ETCDIR%%/istgt.conf.sample \
%%ETCDIR%%/istgt.large.conf.sample \
diff --git a/net/openistgt/distinfo b/net/openistgt/distinfo
index 4c4e69dc543f..12c6a51d15bf 100644
--- a/net/openistgt/distinfo
+++ b/net/openistgt/distinfo
@@ -1,2 +1,2 @@
-SHA256 (istgt-20111008.tar.gz) = 41ddc49dbd0cda81c3f7557e76d27b851e042a32acb448dac1b743c759b0b37e
-SIZE (istgt-20111008.tar.gz) = 235227
+SHA256 (openistgt-20120516.tar.gz) = 4d8752ca761f047cd1f1800d760a3b1afd157ad116d4d9677206401d68a7bfd4
+SIZE (openistgt-20120516.tar.gz) = 237295
diff --git a/net/openistgt/files/patch-istgt-rc b/net/openistgt/files/patch-istgt-rc
deleted file mode 100644
index 4065054989a3..000000000000
--- a/net/openistgt/files/patch-istgt-rc
+++ /dev/null
@@ -1,38 +0,0 @@
---- etc/istgt.sh.in.orig 2011-08-31 11:53:08.000000000 -0700
-+++ etc/istgt.sh.in 2012-05-05 20:27:54.000000000 -0700
-@@ -8,19 +8,28 @@
- . /etc/rc.subr
-
- name="istgt"
--rcvar=`set_rcvar`
--extra_commands="reload"
-+rcvar=istgt_enable
-
- load_rc_config $name
-
--: ${istgt_enable="NO"}
-+: ${istgt_enable:="NO"}
- : ${istgt_config="%%CONFIGDIR%%/istgt.conf"}
--: ${istgt_pidfile="/var/run/istgt.pid"}
--: ${istgt_flags=""}
-+
-+pidfile=${istgt_pidfile:-"/var/run/istgt.pid"}
-+
-+reload_cmd="istgt_reload"
-+extra_commands="reload"
-+
-+#
-+# Refresh configuration
-+#
-+istgt_reload()
-+{
-+ %%BINDIR%%/istgtcontrol refresh
-+}
-
- required_files="${istgt_config}"
--pidfile="${istgt_pidfile}"
- command="%%BINDIR%%/istgt"
--command_args="-c ${istgt_config} ${istgt_flags}"
-+command_args="-c ${istgt_config}"
-
- run_rc_command "$1"
diff --git a/net/openistgt/files/patch-istgt-reload b/net/openistgt/files/patch-istgt-reload
deleted file mode 100644
index 6cba294b4422..000000000000
--- a/net/openistgt/files/patch-istgt-reload
+++ /dev/null
@@ -1,438 +0,0 @@
-diff --git src/istgt.c src/istgt.c
-index e62de97..8fd509e 100644
---- src/istgt.c
-+++ src/istgt.c
-@@ -71,6 +71,7 @@
- #define PORTNUMLEN 32
-
- ISTGT g_istgt;
-+const char *g_config_file;
-
- #if 0
- void
-@@ -1598,6 +1599,7 @@ main(int argc, char **argv)
-
- /* read config files */
- config = istgt_allocate_config();
-+ g_config_file = config_file;
- rc = istgt_read_config(config, config_file);
- if (rc < 0) {
- fprintf(stderr, "config error\n");
-@@ -1662,7 +1664,7 @@ main(int argc, char **argv)
- istgt_free_config(config);
- exit(EXIT_FAILURE);
- }
-- rc = istgt_lu_init(istgt);
-+ rc = istgt_lu_init(istgt, 0);
- if (rc < 0) {
- ISTGT_ERRLOG("istgt_lu_init() failed\n");
- goto initialize_error;
-@@ -1772,7 +1774,7 @@ main(int argc, char **argv)
- #endif
-
- /* create LUN threads for command queuing */
-- rc = istgt_lu_create_threads(istgt);
-+ rc = istgt_lu_create_threads(istgt, 0);
- if (rc < 0) {
- ISTGT_ERRLOG("lu_create_threads() failed\n");
- goto initialize_error;
-@@ -1809,7 +1811,7 @@ main(int argc, char **argv)
- istgt_close_portal(istgt);
- istgt_close_uctl_portal(istgt);
- istgt_iscsi_shutdown(istgt);
-- istgt_lu_shutdown(istgt);
-+ istgt_lu_shutdown(istgt, 0);
- istgt_destory_initiator_group_array(istgt);
- istgt_destroy_portal_array(istgt);
- istgt_destroy_uctl_portal(istgt);
-@@ -1837,7 +1839,7 @@ main(int argc, char **argv)
- istgt_close_portal(istgt);
- istgt_close_uctl_portal(istgt);
- istgt_iscsi_shutdown(istgt);
-- istgt_lu_shutdown(istgt);
-+ istgt_lu_shutdown(istgt, 0);
- istgt_destory_initiator_group_array(istgt);
- istgt_destroy_portal_array(istgt);
- istgt_destroy_uctl_portal(istgt);
-diff --git src/istgt_lu.c src/istgt_lu.c
-index 783f809..c0c4f31 100644
---- src/istgt_lu.c
-+++ src/istgt_lu.c
-@@ -1202,7 +1202,7 @@ istgt_lu_set_local_settings(ISTGT_Ptr istgt, CF_SECTION *sp, ISTGT_LU_Ptr lu)
- }
-
- static int
--istgt_lu_add_unit(ISTGT_Ptr istgt, CF_SECTION *sp)
-+istgt_lu_add_unit(ISTGT_Ptr istgt, CF_SECTION *sp, int ignore_dup)
- {
- char buf[MAX_TMPBUF], buf2[MAX_TMPBUF];
- ISTGT_LU_Ptr lu;
-@@ -1222,21 +1222,40 @@ istgt_lu_add_unit(ISTGT_Ptr istgt, CF_SECTION *sp)
- int i, j, k;
- int rc;
-
-- ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "add unit %d\n", sp->num);
-+ ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "add unit %d (ignore dup = %d)\n", sp->num, ignore_dup);
-
- if (sp->num >= MAX_LOGICAL_UNIT) {
- ISTGT_ERRLOG("LU%d: over maximum unit number\n", sp->num);
- return -1;
- }
-- if (istgt->logical_unit[sp->num] != NULL) {
-+ if (istgt->logical_unit[sp->num] != NULL && !ignore_dup) {
- ISTGT_ERRLOG("LU%d: duplicate unit\n", sp->num);
- return -1;
- }
-+ /* existing LUNs */
-+ if (istgt->logical_unit[sp->num] != NULL && ignore_dup) {
-+ istgt->logical_unit[sp->num]->to_add = 0;
-+ istgt->logical_unit[sp->num]->to_remove = 0;
-+ ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "skip existing unit %d\n", sp->num);
-+ return 0;
-+ }
-+
-+ /* new LUNs */
-+ if (istgt->logical_unit[sp->num] == NULL && ignore_dup) {
-+ ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "add NEW unit %d\n", sp->num);
-+ }
-
- lu = xmalloc(sizeof *lu);
- memset(lu, 0, sizeof *lu);
- lu->num = sp->num;
- lu->istgt = istgt;
-+
-+ /* tag new LUNs */
-+ if (ignore_dup) {
-+ lu->to_add = 1;
-+ lu->to_remove = 0;
-+ }
-+
- istgt_lu_set_state(lu, ISTGT_STATE_INVALID);
- nbs64 = istgt_lu_get_nbserial(istgt->nodebase);
- #if 0
-@@ -1944,12 +1963,15 @@ istgt_lu_del_unit(ISTGT_Ptr istgt, ISTGT_LU_Ptr lu)
- static void *luworker(void *arg);
-
- int
--istgt_lu_init(ISTGT_Ptr istgt)
-+istgt_lu_init(ISTGT_Ptr istgt, int ignore_dup)
- {
- ISTGT_LU_Ptr lu;
- CF_SECTION *sp;
- int rc;
- int i;
-+ int lun_map[MAX_LOGICAL_UNIT];
-+
-+ memset(lun_map, 0, sizeof(int) * MAX_LOGICAL_UNIT);
-
- ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "istgt_lu_init\n");
- sp = istgt_find_cf_section(istgt->config, "Global");
-@@ -1969,11 +1991,12 @@ istgt_lu_init(ISTGT_Ptr istgt)
- ISTGT_ERRLOG("tag %d is invalid\n", sp->num);
- return -1;
- }
-- rc = istgt_lu_add_unit(istgt, sp);
-+ rc = istgt_lu_add_unit(istgt, sp, ignore_dup);
- if (rc < 0) {
- ISTGT_ERRLOG("lu_add_unit() failed\n");
- return -1;
- }
-+ lun_map[sp->num] = 1; /* in new LUN list */
- }
- sp = sp->next;
- }
-@@ -1982,6 +2005,22 @@ istgt_lu_init(ISTGT_Ptr istgt)
- lu = istgt->logical_unit[i];
- if (lu == NULL)
- continue;
-+ /* tag to be removed LUNs */
-+ if (lun_map[i] == 0) {
-+ istgt->logical_unit[i]->to_add = 0;
-+ istgt->logical_unit[i]->to_remove = 1;
-+ continue;
-+ }
-+ /* only process newly added LUNs here beyond in loop */
-+ if (ignore_dup &&
-+ (istgt->logical_unit[i]->to_add == 1 &&
-+ istgt->logical_unit[i]->to_remove == 0)) {
-+ ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "adding unit %d\n", i);
-+ } else if (ignore_dup &&
-+ !(istgt->logical_unit[i]->to_add == 1 &&
-+ istgt->logical_unit[i]->to_remove == 0)) {
-+ continue;
-+ }
-
- rc = pthread_mutex_init(&lu->mutex, NULL);
- if (rc != 0) {
-@@ -2069,7 +2108,7 @@ istgt_lu_set_all_state(ISTGT_Ptr istgt, ISTGT_STATE state)
- }
-
- int
--istgt_lu_create_threads(ISTGT_Ptr istgt)
-+istgt_lu_create_threads(ISTGT_Ptr istgt, int new_only)
- {
- #ifdef HAVE_PTHREAD_SET_NAME_NP
- char buf[MAX_TMPBUF];
-@@ -2084,6 +2123,10 @@ istgt_lu_create_threads(ISTGT_Ptr istgt)
- lu = istgt->logical_unit[i];
- if (lu == NULL)
- continue;
-+ if (new_only && !lu->to_add) {
-+ ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "skip existing LUN %d\n", i);
-+ continue;
-+ }
-
- if (lu->queue_depth != 0) {
- /* create LU thread */
-@@ -2114,18 +2157,22 @@ istgt_lu_create_threads(ISTGT_Ptr istgt)
- }
-
- int
--istgt_lu_shutdown(ISTGT_Ptr istgt)
-+istgt_lu_shutdown(ISTGT_Ptr istgt, int removed_only)
- {
- ISTGT_LU_Ptr lu;
- int rc;
- int i;
-
-- ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "istgt_lu_shutdown\n");
-+ ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "istgt_lu_shutdown (removed_only = %d\n", removed_only);
-
- for (i = 0; i < MAX_LOGICAL_UNIT; i++) {
- lu = istgt->logical_unit[i];
- if (lu == NULL)
- continue;
-+ if (removed_only && !lu->to_remove) {
-+ ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "skip existing LUNs %d\n", i);
-+ continue;
-+ }
- istgt_lu_set_state(lu, ISTGT_STATE_SHUTDOWN);
-
- switch (lu->type) {
-diff --git src/istgt_lu.h src/istgt_lu.h
-index 72c5a6c..9484266 100644
---- src/istgt_lu.h
-+++ src/istgt_lu.h
-@@ -236,6 +236,9 @@ typedef struct istgt_lu_t {
- ISTGT_LU_TSIH tsih[MAX_LU_TSIH];
- int maxmap;
- ISTGT_LU_MAP map[MAX_LU_MAP];
-+
-+ int to_add;
-+ int to_remove;
- } ISTGT_LU;
- typedef ISTGT_LU *ISTGT_LU_Ptr;
-
-diff --git src/istgt_lu_ctl.c src/istgt_lu_ctl.c
-index 70c93e1..47e2fd3 100644
---- src/istgt_lu_ctl.c
-+++ src/istgt_lu_ctl.c
-@@ -965,6 +965,113 @@ istgt_uctl_cmd_change(UCTL_Ptr uctl)
- return UCTL_CMD_OK;
- }
-
-+extern const char *g_config_file;
-+extern ISTGT g_istgt;
-+
-+static int
-+istgt_uctl_cmd_refresh(UCTL_Ptr uctl)
-+{
-+ char *arg;
-+ int rc, i, j;
-+ CONFIG *config;
-+ ISTGT_Ptr istgt;
-+
-+ arg = uctl->arg;
-+ istgt = &g_istgt;
-+
-+ /* reload config, might add/remove LUNs */
-+ /* step 1: re-read config files */
-+ config = istgt_allocate_config();
-+ rc = istgt_read_config(config, g_config_file);
-+ if (rc < 0) {
-+ fprintf(stderr, "refresh config error\n");
-+ return UCTL_CMD_ERR;
-+ }
-+ if (config->section == NULL) {
-+ fprintf(stderr, "empty config\n");
-+ istgt_free_config(config);
-+ return UCTL_CMD_ERR;
-+ }
-+ istgt_free_config(istgt->config);
-+ istgt->config = config;
-+
-+ /* step 2: add new units, init new LUNs, tag to-add/remove LUNs */
-+ rc = istgt_lu_init(istgt, 1);
-+ if (rc < 0) {
-+ ISTGT_ERRLOG("istgt_lu_init() failed\n");
-+ istgt_free_config(config);
-+ return UCTL_CMD_ERR;
-+ }
-+
-+ for (i = 0; i < MAX_LOGICAL_UNIT; i++) {
-+ ISTGT_LU_Ptr lu = istgt->logical_unit[i];
-+ if (lu == NULL)
-+ continue;
-+ if (lu->to_add)
-+ ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "newly added LUN %s\n", lu->name);
-+ if (lu->to_remove)
-+ ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "newly removed LUN %s\n", lu->name);
-+ }
-+
-+ /* creat new threads for new LUNs, do work in luworker() */
-+ /* create LUN threads for command queuing */
-+ rc = istgt_lu_create_threads(istgt, 1);
-+ if (rc < 0) {
-+ ISTGT_ERRLOG("lu_create_threads() failed\n");
-+ istgt_free_config(config);
-+ return UCTL_CMD_ERR;
-+ }
-+ /* start taking IOs */
-+ for (i = 0; i < MAX_LOGICAL_UNIT; i++) {
-+ ISTGT_LU_Ptr lu = istgt->logical_unit[i];
-+ if (lu == NULL)
-+ continue;
-+ if (lu->to_add) {
-+ istgt_lu_set_state(lu, ISTGT_STATE_RUNNING);
-+ ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "set newly added LUN as running %s\n", lu->name);
-+ }
-+ }
-+
-+ /* step 3: shutdown removed LUNs */
-+ /* clear outstanding IOs */
-+ for (i = 0; i < MAX_LOGICAL_UNIT; i++) {
-+ ISTGT_LU_Ptr lu = istgt->logical_unit[i];
-+ if (lu == NULL)
-+ continue;
-+ if (lu->to_remove) {
-+ for (j = 0; j<lu->maxlun; j++)
-+ istgt_lu_clear_all_task(lu, j);
-+ ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "clear newly removed LUN queue %s\n", lu
-+->name);
-+ }
-+ }
-+
-+ /* sync and close LUNs */
-+ istgt_lu_shutdown(istgt, 1);
-+
-+ /* clear tag of to_add/to_remove, get ready for next refresh */
-+ for (i = 0; i < MAX_LOGICAL_UNIT; i++) {
-+ ISTGT_LU_Ptr lu = istgt->logical_unit[i];
-+ if (lu == NULL)
-+ continue;
-+ if (lu->to_add)
-+ lu->to_add = 0;
-+ if (lu->to_remove)
-+ lu->to_remove = 0;
-+ }
-+
-+ /* logging event */
-+ ISTGT_NOTICELOG("Configuration refresh requested from %s\n",
-+ uctl->caddr);
-+
-+ /* refresh succeeded */
-+ istgt_uctl_snprintf(uctl, "OK %s\n", uctl->cmd);
-+ rc = istgt_uctl_writeline(uctl);
-+ if (rc != UCTL_CMD_OK)
-+ return rc;
-+ return UCTL_CMD_OK;
-+}
-+
- static int
- istgt_uctl_cmd_reset(UCTL_Ptr uctl)
- {
-@@ -1183,6 +1290,7 @@ static ISTGT_UCTL_CMD_TABLE istgt_uctl_cmd_table[] =
- { "UNLOAD", istgt_uctl_cmd_unload },
- { "LOAD", istgt_uctl_cmd_load },
- { "CHANGE", istgt_uctl_cmd_change },
-+ { "REFRESH", istgt_uctl_cmd_refresh },
- { "RESET", istgt_uctl_cmd_reset },
- { "INFO", istgt_uctl_cmd_info },
- { NULL, NULL },
-diff --git src/istgt_lu_disk.c src/istgt_lu_disk.c
-index 84eff07..40c9402 100644
---- src/istgt_lu_disk.c
-+++ src/istgt_lu_disk.c
-@@ -794,6 +794,7 @@ istgt_lu_disk_shutdown(ISTGT_Ptr istgt, ISTGT_LU_Ptr lu)
- xfree(spec);
- lu->lun[i].spec = NULL;
- }
-+ lu->maxlun = 0;
-
- return 0;
- }
-diff --git src/istgt_proto.h src/istgt_proto.h
-index 8318f64..9bc842a 100644
---- src/istgt_proto.h
-+++ src/istgt_proto.h
-@@ -85,10 +85,10 @@ int istgt_lu_parse_media_flags(const char *flags);
- uint64_t istgt_lu_parse_media_size(const char *file, const char *size, int *flags);
- PORTAL *istgt_lu_find_portalgroup(ISTGT_Ptr istgt, int tag);
- INITIATOR_GROUP *istgt_lu_find_initiatorgroup(ISTGT_Ptr istgt, int tag);
--int istgt_lu_init(ISTGT_Ptr istgt);
-+int istgt_lu_init(ISTGT_Ptr istgt, int ignore_dup);
- int istgt_lu_set_all_state(ISTGT_Ptr istgt, ISTGT_STATE state);
--int istgt_lu_create_threads(ISTGT_Ptr istgt);
--int istgt_lu_shutdown(ISTGT_Ptr istgt);
-+int istgt_lu_create_threads(ISTGT_Ptr istgt, int new_only);
-+int istgt_lu_shutdown(ISTGT_Ptr istgt, int removed_only);
- int istgt_lu_islun2lun(uint64_t islun);
- uint64_t istgt_lu_lun2islun(int lun, int maxlun);
- int istgt_lu_reset(ISTGT_LU_Ptr lu, uint64_t lun);
-diff --git src/istgtcontrol.c src/istgtcontrol.c
-index 46d6e98..489691d 100644
---- src/istgtcontrol.c
-+++ src/istgtcontrol.c
-@@ -494,6 +494,36 @@ exec_change(UCTL_Ptr uctl)
- }
-
- static int
-+exec_refresh(UCTL_Ptr uctl)
-+{
-+ const char *delim = ARGS_DELIM;
-+ char *arg;
-+ char *result;
-+ int rc;
-+
-+ /* send command */
-+ uctl_snprintf(uctl, "REFRESH \n");
-+ rc = uctl_writeline(uctl);
-+ if (rc != UCTL_CMD_OK)
-+ return rc;
-+
-+ /* receive result */
-+ rc = uctl_readline(uctl);
-+ if (rc != UCTL_CMD_OK)
-+ return rc;
-+ arg = trim_string(uctl->recvbuf);
-+ result = strsepq(&arg, delim);
-+ strupr(result);
-+ if (strcmp(result, "OK") != 0) {
-+ if (is_err_req_auth(uctl, arg))
-+ return UCTL_CMD_REQAUTH;
-+ fprintf(stderr, "ERROR %s\n", arg);
-+ return UCTL_CMD_ERR;
-+ }
-+ return UCTL_CMD_OK;
-+}
-+
-+static int
- exec_reset(UCTL_Ptr uctl)
- {
- const char *delim = ARGS_DELIM;
-@@ -591,6 +621,7 @@ static EXEC_TABLE exec_table[] =
- { "UNLOAD", exec_unload, 0, 1 },
- { "LOAD", exec_load, 0, 1 },
- { "CHANGE", exec_change, 1, 1 },
-+ { "REFRESH", exec_refresh, 0, 0 },
- { "RESET", exec_reset, 0, 1 },
- { "INFO", exec_info, 0, 0 },
- { NULL, NULL, 0, 0 },
-@@ -1054,6 +1085,7 @@ usage(void)
- printf(" load load media to specified unit\n");
- printf(" unload unload media from specified unit\n");
- printf(" change change media with <file> at specified unit\n");
-+ printf(" refresh refresh to reload target and lun configuration\n");
- printf(" reset reset specified lun of target\n");
- printf(" info show connections of target\n");
- } \ No newline at end of file
diff --git a/net/openistgt/files/pkg-message.in b/net/openistgt/files/pkg-message.in
index 8466449434f3..8a57a97f54e9 100644
--- a/net/openistgt/files/pkg-message.in
+++ b/net/openistgt/files/pkg-message.in
@@ -1,6 +1,6 @@
*************************************************************************
-To run istgt at startup, add istgt_enable="YES" to /etc/rc.conf.
+To run openistgt at startup, add openistgt_enable="YES" to /etc/rc.conf.
Create configuration files manually.
Sample configuration files can be found in %%PREFIX%%/etc/istgt.
QUICKSTART in %%DOCSDIR%% shows you how to configure.