14e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park/** @addtogroup MCD_MCDIMPL_DAEMON_KERNEL 24e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * @{ 34e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * @file 44e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 54e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * Kernel Module Interface. 64e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 74e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * <!-- Copyright Giesecke & Devrient GmbH 2009 - 2012 --> 89081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim * 94e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * Redistribution and use in source and binary forms, with or without 104e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * modification, are permitted provided that the following conditions 114e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * are met: 124e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 1. Redistributions of source code must retain the above copyright 134e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * notice, this list of conditions and the following disclaimer. 144e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 2. Redistributions in binary form must reproduce the above copyright 154e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * notice, this list of conditions and the following disclaimer in the 164e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * documentation and/or other materials provided with the distribution. 174e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 3. The name of the author may not be used to endorse or promote 184e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * products derived from this software without specific prior 194e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * written permission. 204e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 214e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 224e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 234e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 244e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 254e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 264e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 274e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 284e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 294e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 304e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 314e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 324e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park */ 334e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <cstdlib> 344e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 354e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <fcntl.h> 364e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <sys/mman.h> 374e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <errno.h> 384e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 394e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "CKMod.h" 404e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 414e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "log.h" 424e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 437b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim#define INVALID_FILE_DESCRIPTOR ((int)(-1)) 444e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 454e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 469081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun KimCKMod::CKMod(void) 479081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{ 487b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim fdKMod = INVALID_FILE_DESCRIPTOR; 494e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 504e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 514e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 524e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 539081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun KimCKMod::~CKMod(void) 549081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{ 557b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim close(); 564e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 574e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 584e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 594e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 609081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimbool CKMod::isOpen(void) 619081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{ 627b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return (INVALID_FILE_DESCRIPTOR == fdKMod) ? false : true; 634e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 644e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 654e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 664e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 677b143edf281bed18c8ebd0733465f3af5af327ebJungtae KimmcResult_t CKMod::open(const char *deviceName) 689081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{ 697b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (isOpen()) { 707b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_W("already open"); 717b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_ERR_DEVICE_ALREADY_OPEN; 727b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 737b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 747b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_I(" Opening kernel module at %s.", deviceName); 757b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 767b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim // open return -1 on error, "errno" is set with details 777b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim int openRet = ::open(deviceName, O_RDWR); 787b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (openRet == -1) { 797b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_ERRNO("open"); 807b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MAKE_MC_DRV_KMOD_WITH_ERRNO(errno); 817b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 827b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 837b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim fdKMod = openRet; 847b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_OK; 854e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 864e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 874e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 884e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 894e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkvoid CKMod::close( 904e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park void 917b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim) 927b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim{ 937b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (isOpen()) { 947b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (::close(fdKMod) != 0) { 957b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_ERRNO("close"); 967b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } else { 977b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim fdKMod = INVALID_FILE_DESCRIPTOR; 987b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 997b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } else { 1007b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_W(" Kernel module device not open"); 1017b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 1024e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 1034e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1044e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park/** @} */ 105