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