Annotation of embedaddon/strongswan/src/libimcv/imv/imv_os_info.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2014 Andreas Steffen
! 3: * HSR Hochschule fuer Technik Rapperswil
! 4: *
! 5: * This program is free software; you can redistribute it and/or modify it
! 6: * under the terms of the GNU General Public License as published by the
! 7: * Free Software Foundation; either version 2 of the License, or (at your
! 8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 9: *
! 10: * This program is distributed in the hope that it will be useful, but
! 11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 13: * for more details.
! 14: */
! 15:
! 16: #include "imv_os_info.h"
! 17:
! 18: typedef struct private_imv_os_info_t private_imv_os_info_t;
! 19:
! 20: /**
! 21: * Private data of an imv_os_info_t object.
! 22: *
! 23: */
! 24: struct private_imv_os_info_t {
! 25:
! 26: /**
! 27: * Public imv_os_info_t interface.
! 28: */
! 29: imv_os_info_t public;
! 30:
! 31: /**
! 32: * OS type
! 33: */
! 34: os_type_t type;
! 35:
! 36: /**
! 37: * OS name
! 38: */
! 39: chunk_t name;
! 40:
! 41: /**
! 42: * OS version
! 43: */
! 44: chunk_t version;
! 45:
! 46: /**
! 47: * This flag allows the OS version to be empty
! 48: */
! 49: bool version_is_set;
! 50:
! 51: /**
! 52: * OS Product Information (OS Name | OS Version)
! 53: */
! 54: char *info;
! 55:
! 56: };
! 57:
! 58: METHOD(imv_os_info_t, get_type, os_type_t,
! 59: private_imv_os_info_t *this)
! 60: {
! 61: return this->type;
! 62: }
! 63:
! 64: METHOD(imv_os_info_t, set_name, void,
! 65: private_imv_os_info_t *this, chunk_t name)
! 66: {
! 67: /* Has the OS name already been set? */
! 68: if (this->name.len)
! 69: {
! 70: if (chunk_equals(name, this->name))
! 71: {
! 72: return;
! 73: }
! 74: free(this->name.ptr);
! 75:
! 76: /* Also clear the OS info string */
! 77: free(this->info);
! 78: this->info = NULL;
! 79: }
! 80: this->name = chunk_clone(name);
! 81: this->type = os_type_from_name(name);
! 82: }
! 83:
! 84: METHOD(imv_os_info_t, get_name, chunk_t,
! 85: private_imv_os_info_t *this)
! 86: {
! 87: return this->name;
! 88: }
! 89:
! 90: METHOD(imv_os_info_t, set_version, void,
! 91: private_imv_os_info_t *this, chunk_t version)
! 92: {
! 93: /* Has the OS version already been set? */
! 94: if (this->version_is_set)
! 95: {
! 96: if (chunk_equals(version, this->version))
! 97: {
! 98: return;
! 99: }
! 100: free(this->version.ptr);
! 101:
! 102: /* Also clear the OS info string */
! 103: free(this->info);
! 104: this->info = NULL;
! 105: }
! 106: this->version = chunk_clone(version);
! 107: this->version_is_set = TRUE;
! 108: }
! 109:
! 110: METHOD(imv_os_info_t, get_version, chunk_t,
! 111: private_imv_os_info_t *this)
! 112: {
! 113: return this->version;
! 114: }
! 115:
! 116: METHOD(imv_os_info_t, get_info, char*,
! 117: private_imv_os_info_t *this)
! 118: {
! 119: int len;
! 120:
! 121: if (!this->info)
! 122: {
! 123: /* Have both OS name and OS version been set? */
! 124: if (this->name.len == 0 || !this->version_is_set)
! 125: {
! 126: return NULL;
! 127: }
! 128:
! 129: /* OS info is a concatenation of OS name and OS version */
! 130: len = this->name.len + 1 + this->version.len + 1;
! 131: this->info = malloc(len);
! 132: snprintf(this->info, len, "%.*s %.*s",
! 133: (int)this->name.len, this->name.ptr,
! 134: (int)this->version.len, this->version.ptr);
! 135: }
! 136: return this->info;
! 137: }
! 138:
! 139: METHOD(imv_os_info_t, destroy, void,
! 140: private_imv_os_info_t *this)
! 141: {
! 142: free(this->name.ptr);
! 143: free(this->version.ptr);
! 144: free(this->info);
! 145: free(this);
! 146: }
! 147:
! 148: /**
! 149: * See header
! 150: */
! 151: imv_os_info_t *imv_os_info_create(void)
! 152: {
! 153: private_imv_os_info_t *this;
! 154:
! 155: INIT(this,
! 156: .public = {
! 157: .get_type = _get_type,
! 158: .set_name = _set_name,
! 159: .get_name = _get_name,
! 160: .set_version = _set_version,
! 161: .get_version = _get_version,
! 162: .get_info = _get_info,
! 163: .destroy = _destroy,
! 164: },
! 165: );
! 166:
! 167: return &this->public;
! 168: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>