/usr/include/rostlab/euid_egid_resource.h is in librostlab3-dev 1.0.20-4.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | /*
Copyright (C) 2011 Laszlo Kajan, Technical University of Munich, Germany
This file is part of librostlab.
librostlab is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef ROSTLAB_EUID_EGID
#define ROSTLAB_EUID_EGID 1
#include <errno.h>
#include <sstream>
#include <stdexcept>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include "rostlab/rostlab_stdexcept.h"
namespace rostlab {
class euid_egid_resource
{
private:
uid_t _olduid;
gid_t _oldgid;
bool _changeduid;
bool _changedgid;
// this is a resource - disable copy contructor and copy assignment
euid_egid_resource( const euid_egid_resource& ){};
euid_egid_resource&
operator=(const euid_egid_resource&){return *this;};
public:
euid_egid_resource( uid_t __neweuid, gid_t __newegid ) : _changeduid(false), _changedgid(false)
{
_olduid = getuid();
_oldgid = getgid();
if( getegid() != __newegid )
{
if( setregid( getegid(), __newegid ) ){ std::ostringstream s; s << "failed to setregid " << getegid() << ":" << __newegid << " : " << strerror( errno ); throw runtime_error( s.str() ); }
_changedgid = true;
}
if( geteuid() != __neweuid )
{
if( setreuid( geteuid(), __neweuid ) ){ std::ostringstream s; s << "failed to setreuid " << geteuid() << ":" << __neweuid << " : " << strerror( errno ); throw runtime_error( s.str() ); }
_changeduid = true;
}
}
virtual ~euid_egid_resource()
{
if( _changeduid )
{
if( setreuid( geteuid(), getuid() ) ){ std::ostringstream s; s << "failed revert setreuid to " << geteuid() << ":" << getuid() << " : " << strerror( errno ); throw runtime_error( s.str() ); }
if( setreuid( _olduid, -1 ) ){ std::ostringstream s; s << "failed revert setreuid to " << _olduid << ":-1" << " : " << strerror( errno ); throw runtime_error( s.str() ); }
}
if( _changedgid )
{
if( setregid( getegid(), getgid() ) ){ std::ostringstream s; s << "failed revert setregid to " << getegid() << ":" << getgid() << " : " << strerror( errno ); throw runtime_error( s.str() ); }
if( setregid( _oldgid, -1 ) ){ std::ostringstream s; s << "failed revert setregid to " << _oldgid << ":-1" << " : " << strerror( errno ); throw runtime_error( s.str() ); }
}
}
};
};
#endif // ROSTLAB_EUID_EGID
// vim:et:ai:ts=2:
|