libcamera: sysfs: Add helper to lookup sysfs path of a character device

Add a helper function to lookup the sysfs path of a character device.
Store the function in a new libcamera::sysfs namespace as there is not
class to host it.

Suggested-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Niklas Söderlund
2020-08-04 15:39:16 +02:00
parent 79a834f24c
commit 6ad3258cd3
4 changed files with 76 additions and 0 deletions

View File

@@ -25,6 +25,7 @@ libcamera_internal_headers = files([
'process.h',
'pub_key.h',
'semaphore.h',
'sysfs.h',
'thread.h',
'utils.h',
'v4l2_controls.h',

View File

@@ -0,0 +1,22 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
* Copyright (C) 2020, Google Inc.
*
* sysfs.h - Miscellaneous utility functions to access sysfs
*/
#ifndef __LIBCAMERA_INTERNAL_SYSFS_H__
#define __LIBCAMERA_INTERNAL_SYSFS_H__
#include <string>
namespace libcamera {
namespace sysfs {
std::string charDevPath(const std::string &deviceNode);
} /* namespace sysfs */
} /* namespace libcamera */
#endif /* __LIBCAMERA_INTERNAL_SYSFS_H__ */

View File

@@ -41,6 +41,7 @@ libcamera_sources = files([
'semaphore.cpp',
'signal.cpp',
'stream.cpp',
'sysfs.cpp',
'thread.cpp',
'timer.cpp',
'utils.cpp',

52
src/libcamera/sysfs.cpp Normal file
View File

@@ -0,0 +1,52 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
* Copyright (C) 2020, Google Inc.
*
* sysfs.cpp - Miscellaneous utility functions to access sysfs
*/
#include "libcamera/internal/sysfs.h"
#include <sstream>
#include <sys/stat.h>
#include <sys/sysmacros.h>
#include "libcamera/internal/log.h"
/**
* \file sysfs.h
* \brief Miscellaneous utility functions to access sysfs
*/
namespace libcamera {
LOG_DEFINE_CATEGORY(SysFs);
namespace sysfs {
/**
* \brief Retrieve the sysfs path for a character device
* \param[in] deviceNode Path to character device node
* \return The sysfs path on success or an empty string on failure
*/
std::string charDevPath(const std::string &deviceNode)
{
struct stat st;
int ret = stat(deviceNode.c_str(), &st);
if (ret < 0) {
ret = -errno;
LOG(SysFs, Error)
<< "Unable to stat '" << deviceNode << "': "
<< strerror(-ret);
return {};
}
std::ostringstream dev("/sys/dev/char/", std::ios_base::ate);
dev << major(st.st_rdev) << ":" << minor(st.st_rdev);
return dev.str();
}
} /* namespace sysfs */
} /* namespace libcamera */