xref: /titanic_54/usr/src/cmd/ldmad/ldma_system.c (revision 49bfb42b00abac0958a1308f4233e366fd083366)
1*49bfb42bSAlexandre Chartre /*
2*49bfb42bSAlexandre Chartre  * CDDL HEADER START
3*49bfb42bSAlexandre Chartre  *
4*49bfb42bSAlexandre Chartre  * The contents of this file are subject to the terms of the
5*49bfb42bSAlexandre Chartre  * Common Development and Distribution License (the "License").
6*49bfb42bSAlexandre Chartre  * You may not use this file except in compliance with the License.
7*49bfb42bSAlexandre Chartre  *
8*49bfb42bSAlexandre Chartre  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*49bfb42bSAlexandre Chartre  * or http://www.opensolaris.org/os/licensing.
10*49bfb42bSAlexandre Chartre  * See the License for the specific language governing permissions
11*49bfb42bSAlexandre Chartre  * and limitations under the License.
12*49bfb42bSAlexandre Chartre  *
13*49bfb42bSAlexandre Chartre  * When distributing Covered Code, include this CDDL HEADER in each
14*49bfb42bSAlexandre Chartre  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*49bfb42bSAlexandre Chartre  * If applicable, add the following below this CDDL HEADER, with the
16*49bfb42bSAlexandre Chartre  * fields enclosed by brackets "[]" replaced with your own identifying
17*49bfb42bSAlexandre Chartre  * information: Portions Copyright [yyyy] [name of copyright owner]
18*49bfb42bSAlexandre Chartre  *
19*49bfb42bSAlexandre Chartre  * CDDL HEADER END
20*49bfb42bSAlexandre Chartre  */
21*49bfb42bSAlexandre Chartre 
22*49bfb42bSAlexandre Chartre /*
23*49bfb42bSAlexandre Chartre  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24*49bfb42bSAlexandre Chartre  * Use is subject to license terms.
25*49bfb42bSAlexandre Chartre  */
26*49bfb42bSAlexandre Chartre 
27*49bfb42bSAlexandre Chartre /*
28*49bfb42bSAlexandre Chartre  * Logical Domains System Agent
29*49bfb42bSAlexandre Chartre  */
30*49bfb42bSAlexandre Chartre 
31*49bfb42bSAlexandre Chartre #include <errno.h>
32*49bfb42bSAlexandre Chartre #include <libds.h>
33*49bfb42bSAlexandre Chartre #include <stdio.h>
34*49bfb42bSAlexandre Chartre #include <strings.h>
35*49bfb42bSAlexandre Chartre #include <sys/utsname.h>
36*49bfb42bSAlexandre Chartre 
37*49bfb42bSAlexandre Chartre #include "ldma.h"
38*49bfb42bSAlexandre Chartre 
39*49bfb42bSAlexandre Chartre #define	LDMA_MODULE	LDMA_NAME_SYSTEM
40*49bfb42bSAlexandre Chartre 
41*49bfb42bSAlexandre Chartre #define	LDMA_NVERSIONS	(sizeof (ldma_versions) / sizeof (ds_ver_t))
42*49bfb42bSAlexandre Chartre #define	LDMA_NHANDLERS	(sizeof (ldma_handlers) / sizeof (ldma_msg_handler_t))
43*49bfb42bSAlexandre Chartre 
44*49bfb42bSAlexandre Chartre static ldm_msg_func_t ldma_sys_get_sysinfo;
45*49bfb42bSAlexandre Chartre 
46*49bfb42bSAlexandre Chartre static ds_ver_t ldma_versions[] = { { 1, 0 } };
47*49bfb42bSAlexandre Chartre 
48*49bfb42bSAlexandre Chartre static ldma_msg_handler_t ldma_handlers[] = {
49*49bfb42bSAlexandre Chartre 	{ LDMA_MSGSYS_GET_SYSINFO, ldma_sys_get_sysinfo }
50*49bfb42bSAlexandre Chartre };
51*49bfb42bSAlexandre Chartre 
52*49bfb42bSAlexandre Chartre ldma_agent_info_t ldma_system_info = {
53*49bfb42bSAlexandre Chartre 	LDMA_NAME_SYSTEM,
54*49bfb42bSAlexandre Chartre 	ldma_versions, LDMA_NVERSIONS,
55*49bfb42bSAlexandre Chartre 	ldma_handlers, LDMA_NHANDLERS
56*49bfb42bSAlexandre Chartre };
57*49bfb42bSAlexandre Chartre 
58*49bfb42bSAlexandre Chartre /*ARGSUSED*/
59*49bfb42bSAlexandre Chartre static ldma_request_status_t
60*49bfb42bSAlexandre Chartre ldma_sys_get_sysinfo(ds_ver_t *ver, ldma_message_header_t *request,
61*49bfb42bSAlexandre Chartre     size_t request_dlen, ldma_message_header_t **replyp, size_t *reply_dlenp)
62*49bfb42bSAlexandre Chartre {
63*49bfb42bSAlexandre Chartre 	ldma_message_header_t *reply;
64*49bfb42bSAlexandre Chartre 	struct utsname name;
65*49bfb42bSAlexandre Chartre 	size_t syslen, nodlen, rellen, maclen, verlen;
66*49bfb42bSAlexandre Chartre 	size_t rlen;
67*49bfb42bSAlexandre Chartre 	char *data;
68*49bfb42bSAlexandre Chartre 	int status;
69*49bfb42bSAlexandre Chartre 
70*49bfb42bSAlexandre Chartre 	LDMA_DBG("GET_SYSINFO");
71*49bfb42bSAlexandre Chartre 
72*49bfb42bSAlexandre Chartre 	if (request->msg_info != 0 || request_dlen != 0) {
73*49bfb42bSAlexandre Chartre 		status = LDMA_REQ_INVALID;
74*49bfb42bSAlexandre Chartre 		goto done;
75*49bfb42bSAlexandre Chartre 	}
76*49bfb42bSAlexandre Chartre 
77*49bfb42bSAlexandre Chartre 	if (uname(&name) == -1) {
78*49bfb42bSAlexandre Chartre 		LDMA_DBG("GET_SYSINFO: uname failed with error %d", errno);
79*49bfb42bSAlexandre Chartre 		status = LDMA_REQ_FAILED;
80*49bfb42bSAlexandre Chartre 		goto done;
81*49bfb42bSAlexandre Chartre 	}
82*49bfb42bSAlexandre Chartre 
83*49bfb42bSAlexandre Chartre 	syslen = strlen(name.sysname) + 1;
84*49bfb42bSAlexandre Chartre 	nodlen = strlen(name.nodename) + 1;
85*49bfb42bSAlexandre Chartre 	rellen = strlen(name.release) + 1;
86*49bfb42bSAlexandre Chartre 	verlen = strlen(name.version) + 1;
87*49bfb42bSAlexandre Chartre 	maclen = strlen(name.machine) + 1;
88*49bfb42bSAlexandre Chartre 
89*49bfb42bSAlexandre Chartre 	rlen = syslen + nodlen + rellen + verlen + maclen;
90*49bfb42bSAlexandre Chartre 
91*49bfb42bSAlexandre Chartre 	reply = ldma_alloc_result_msg(request, rlen);
92*49bfb42bSAlexandre Chartre 
93*49bfb42bSAlexandre Chartre 	if (reply == NULL) {
94*49bfb42bSAlexandre Chartre 		status = LDMA_REQ_FAILED;
95*49bfb42bSAlexandre Chartre 		goto done;
96*49bfb42bSAlexandre Chartre 	}
97*49bfb42bSAlexandre Chartre 
98*49bfb42bSAlexandre Chartre 	reply->msg_info = rlen;
99*49bfb42bSAlexandre Chartre 
100*49bfb42bSAlexandre Chartre 	data = LDMA_HDR2DATA(reply);
101*49bfb42bSAlexandre Chartre 
102*49bfb42bSAlexandre Chartre 	(void) strcpy(data, name.sysname);
103*49bfb42bSAlexandre Chartre 	data += syslen;
104*49bfb42bSAlexandre Chartre 
105*49bfb42bSAlexandre Chartre 	(void) strcpy(data, name.nodename);
106*49bfb42bSAlexandre Chartre 	data += nodlen;
107*49bfb42bSAlexandre Chartre 
108*49bfb42bSAlexandre Chartre 	(void) strcpy(data, name.release);
109*49bfb42bSAlexandre Chartre 	data += rellen;
110*49bfb42bSAlexandre Chartre 
111*49bfb42bSAlexandre Chartre 	(void) strcpy(data, name.version);
112*49bfb42bSAlexandre Chartre 	data += verlen;
113*49bfb42bSAlexandre Chartre 
114*49bfb42bSAlexandre Chartre 	(void) strcpy(data, name.machine);
115*49bfb42bSAlexandre Chartre 
116*49bfb42bSAlexandre Chartre 	LDMA_DBG("GET_SYSINFO: return info=%u, {%s, %s, %s, %s, %s}", rlen,
117*49bfb42bSAlexandre Chartre 	    name.sysname, name.nodename, name.release, name.version,
118*49bfb42bSAlexandre Chartre 	    name.machine);
119*49bfb42bSAlexandre Chartre 
120*49bfb42bSAlexandre Chartre 	*replyp = reply;
121*49bfb42bSAlexandre Chartre 	*reply_dlenp = rlen;
122*49bfb42bSAlexandre Chartre 
123*49bfb42bSAlexandre Chartre 	return (LDMA_REQ_COMPLETED);
124*49bfb42bSAlexandre Chartre 
125*49bfb42bSAlexandre Chartre done:
126*49bfb42bSAlexandre Chartre 	LDMA_DBG("GET_SYSINFO: return error %d", status);
127*49bfb42bSAlexandre Chartre 	return (status);
128*49bfb42bSAlexandre Chartre }
129