diff --git a/libsysio/include/creds.h b/libsysio/include/creds.h index 90305e1d305f294cb1cc56122d07f7427b97044a..672dfcfedc06edf9b3978fe670670a6c8e164340 100644 --- a/libsysio/include/creds.h +++ b/libsysio/include/creds.h @@ -46,6 +46,11 @@ #ifndef _CREDS_H_ #define _CREDS_H_ +/* + * Superuser's UID. + */ +#define _SYSIO_ROOT_UID 0 + /* * Data structure for user credentials */ @@ -56,4 +61,12 @@ struct creds { int creds_ngids; }; + +#ifdef _SYSIO_ROOT_UID +/* + * Is caller the superuser? + */ +#define _sysio_is_root(_crp) \ + ((_crp)->creds_uid == _SYSIO_ROOT_UID) +#endif #endif diff --git a/libsysio/src/access.c b/libsysio/src/access.c index 80e8fcd9ed005ea528c5cad7a339ad55ea212153..784de8e31f84b44058daae794ba823651ff4e182 100644 --- a/libsysio/src/access.c +++ b/libsysio/src/access.c @@ -99,6 +99,16 @@ _sysio_check_permission(struct pnode *pno, struct creds *crp, int amode) err = -EACCES; /* assume error */ stat = &ino->i_stbuf; do { +#ifdef _SYSIO_ROOT_UID + /* + * Root? + */ + if (_sysio_is_root(crp)) { + err = 0; + break; + } +#endif + /* * Owner? */