xref: /titanic_44/usr/src/cmd/srptsvc/srptsvc.c (revision db8b037b5616a366b7dfdc01ef9552f02f9adfdd)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #include <stdio.h>
27 #include <libintl.h>
28 #include <sys/types.h>
29 #include <sys/stat.h>
30 #include <fcntl.h>
31 #include <locale.h>
32 #include <errno.h>
33 #include <unistd.h>
34 #include <strings.h>
35 #include <libscf.h>	/* for SMF error exit codes */
36 
37 #include <srpt_ioctl.h>
38 
39 
40 /* Globals */
41 char	cmdName[] = "svc-srpt";
42 
43 int
44 main(int argc, char *argv[])
45 {
46 	int		ret;
47 	boolean_t	do_enable = B_FALSE;
48 	int		srpt_ioctl;
49 	int		fd = -1;
50 	int		saverr;
51 	char		*txt;
52 	struct stat	statbuf;
53 
54 	(void) setlocale(LC_ALL, "");
55 
56 	if (argc < 2 || argc > 2) {
57 		goto usage;
58 	}
59 
60 	if (strcasecmp(argv[1], "start") == 0) {
61 		do_enable = B_TRUE;
62 		srpt_ioctl = SRPT_IOC_ENABLE_SVC;
63 	} else if (strcasecmp(argv[1], "stop") == 0)  {
64 		srpt_ioctl = SRPT_IOC_DISABLE_SVC;
65 	} else {
66 		goto usage;
67 	}
68 
69 	fd = open(SRPT_NODE, O_RDONLY);
70 	if (fd < 0) {
71 		saverr = errno;
72 
73 		(void) fprintf(stderr, "%s: %s (%s): %s\n", cmdName,
74 		    gettext("Could not open SRP Target pseudodevice"),
75 		    SRPT_NODE, strerror(saverr));
76 
77 		if (saverr == ENOENT) {
78 			/* avoid having the service go into maintenance */
79 			if ((stat("/devices/ib", &statbuf)) != 0) {
80 				(void) fprintf(stderr, "%s: %s\n", cmdName,
81 				    gettext(
82 				    "No InfiniBand devices on this system."));
83 			}
84 			ret = 0;
85 
86 		} else {
87 			ret = SMF_EXIT_ERR_FATAL; /* avoid retries */
88 		}
89 
90 		(void) fprintf(stderr, "%s: %s\n", cmdName,
91 		    gettext("SRPT Driver may not be loaded."));
92 
93 		return (ret);
94 	}
95 
96 	ret = ioctl(fd, srpt_ioctl, NULL);
97 	if (ret != 0) {
98 		if (do_enable) {
99 			txt = gettext("Could not enable SRP Target");
100 		} else {
101 			txt = gettext("Could not disable SRP Target");
102 		}
103 
104 		(void) fprintf(stderr, "%s: %d", txt, ret);
105 		ret = SMF_EXIT_ERR_FATAL;
106 	}
107 
108 	(void) close(fd);
109 
110 	return (ret);
111 
112 usage:
113 	(void) fprintf(stderr, gettext("Usage: %s start|stop"), cmdName);
114 	(void) fprintf(stderr, "\n");
115 
116 	return (1);
117 }
118