summaryrefslogtreecommitdiff
path: root/usr/src/lib/libiscsitgt/common/gen.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libiscsitgt/common/gen.c')
-rw-r--r--usr/src/lib/libiscsitgt/common/gen.c266
1 files changed, 0 insertions, 266 deletions
diff --git a/usr/src/lib/libiscsitgt/common/gen.c b/usr/src/lib/libiscsitgt/common/gen.c
deleted file mode 100644
index 12bc7bad64..0000000000
--- a/usr/src/lib/libiscsitgt/common/gen.c
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-/*
- * Support routines for library
- */
-#include <errno.h>
-#include <strings.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <libscf.h>
-#include <door.h>
-#include <libxml/xmlreader.h>
-#include <sys/mman.h>
-
-#include "iscsitgt_impl.h"
-
-#define WAIT_FOR_SERVICE 15
-#define WAIT_FOR_DOOR 15
-static char *service = "system/iscsitgt:default";
-
-static Boolean_t check_and_online(int);
-
-tgt_node_t *
-tgt_door_call(char *str, int smf_flags)
-{
- tgt_node_t *n = NULL;
- door_arg_t d;
- int s;
- int allocated;
- xmlTextReaderPtr r;
- char *door_buf = NULL;
-
- /*
- * Setup the door pointers for the initial try.
- */
- allocated = MAX(DOOR_MIN_SPACE, strlen(str) + 1);
- if ((door_buf = malloc(allocated)) == NULL)
- return (NULL);
- (void) strncpy(door_buf, str, allocated);
- bzero(&d, sizeof (d));
- d.data_ptr = door_buf;
- d.data_size = allocated;
- d.rbuf = door_buf;
- d.rsize = allocated;
-
- /*
- * It's entirely possible that we'll be sending this request more
- * than once. In the case of a list operation it's unknown how much
- * data will be required, so the request will be sent and the daemon
- * will return information on how large of a buffer is needed.
- * It possible that the second request, with a larger buffer, also
- * fails with not enough space since between the first and second
- * calls a third party could have created another target increasing
- * the space required. This is not an error, just need to handle it.
- */
- do {
- /*
- * Open the door and if that doesn't work or the first door call
- * fails, try to bring the service online. Then repeat one
- * more time. If the second attempt at the door_call fails
- * then bail out.
- */
- if (((s = open(ISCSI_TARGET_MGMT_DOOR, 0)) == -1) ||
- (door_call(s, &d) == -1)) {
- if (s != -1) {
- (void) close(s);
- s = -1;
- }
- if (check_and_online(smf_flags) == False) {
- goto error;
- } else if ((s = open(ISCSI_TARGET_MGMT_DOOR, 0)) ==
- -1) {
- goto error;
- } else if (door_call(s, &d) == -1) {
- goto error;
- }
- }
-
- if (d.rbuf == NULL)
- goto error;
-
- if ((r = (xmlTextReaderPtr)xmlReaderForMemory(d.rbuf,
- strlen(d.rbuf), NULL, NULL, 0)) == NULL)
- goto error;
-
- while (xmlTextReaderRead(r) == 1)
- if (tgt_node_process(r, &n) == False)
- break;
- xmlFreeTextReader(r);
-
- /*
- * Check to see if our request failed to provide enough
- * buffer room. This can occur if:
- * (1) The request caused an error and the message
- * is larger than the request.
- * (2) We're requesting a configuration list which is
- * fairly large and need to reissue the request with
- * a larger buffer, which the daemon is kind enough
- * to tell us the size needed.
- */
- if (tgt_find_value_int(n, XML_ELEMENT_MORESPACE,
- &allocated) == True) {
-
- tgt_node_free(n);
- n = NULL;
-
- /*
- * It's possible that we've already done a request
- * with a larger buffer, but before we could reissue
- * the request the results got bigger. Targets being
- * added to the configuration would be the common
- * cause of this condition.
- */
- if (door_buf != NULL)
- free(door_buf);
-
- if ((door_buf = malloc(allocated)) == NULL)
- goto error;
-
- (void) strncpy(door_buf, str, allocated);
- d.data_ptr = door_buf;
- d.data_size = allocated;
- d.rbuf = door_buf;
- d.rsize = allocated;
- }
-
- (void) close(s);
- s = -1;
- } while (n == NULL);
-
-error:
- if (door_buf)
- free(door_buf);
- (void) close(s);
- return (n);
-}
-
-static Boolean_t
-is_online(void)
-{
- char *s;
- Boolean_t rval = False;
-
- if (getenv("iscsitgt_no_daemon") != NULL) {
- rval = True;
- } else {
- if ((s = smf_get_state(service)) != NULL) {
- if (strcmp(s, SCF_STATE_STRING_ONLINE) == 0)
- rval = True;
- free(s);
- }
- }
-
- return (rval);
-}
-
-static Boolean_t
-is_auto_enabled(void)
-{
- scf_simple_prop_t *prop;
- uint8_t *ret;
- Boolean_t rval = True;
-
- if ((prop = scf_simple_prop_get(NULL, service, "application",
- "auto_enable")) == NULL)
- return (True);
-
- if ((ret = scf_simple_prop_next_boolean(prop)) != NULL)
- rval = (*ret != 0);
-
- scf_simple_prop_free(prop);
-
- return (rval);
-}
-
-static Boolean_t
-check_and_online(int smf_flags)
-{
- int i;
- int fd;
- door_arg_t d;
-
- if (!is_online()) {
- if (!is_auto_enabled())
- return (False);
-
- if (smf_enable_instance(service, smf_flags) != 0)
- return (False);
-
- for (i = 0; i < WAIT_FOR_SERVICE; i++) {
- if (is_online() == True)
- break;
- (void) sleep(1);
- }
-
- if (i == WAIT_FOR_SERVICE)
- return (False);
- }
-
- for (i = 0; i < WAIT_FOR_DOOR; i++) {
- if ((fd = open(ISCSI_TARGET_MGMT_DOOR, 0)) >= 0) {
- /*
- * There's at least a file with the same name as our
- * door. Let's see if someone is currently answering
- * by sending an empty XML request.
- */
- d.data_ptr = "<config></config>";
- d.data_size = strlen(d.data_ptr) + 1;
- d.desc_ptr = NULL;
- d.desc_num = 0;
- d.rbuf = NULL;
- d.rsize = 0;
-
- if (door_call(fd, &d) == 0) {
- /*
- * The daemon is now ready to handle requests.
- */
- (void) close(fd);
- return (True);
- } else
- (void) close(fd);
-
- }
- if (!is_online())
- break;
- (void) sleep(1);
- }
- return (False);
-}
-
-/*
- * Not using Boolean_t here, since that is a
- * private type to the library
- */
-int
-iscsitgt_svc_online()
-{
- return ((is_online() == True) ? 0 : 1);
-}