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