privs.h
上传用户:pycemail
上传日期:2007-01-04
资源大小:329k
文件大小:4k
源码类别:

Ftp客户端

开发平台:

Unix_Linux

  1. /*
  2.  * ProFTPD - FTP server daemon
  3.  * Copyright (c) 1997, 1998 Public Flood Software
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
  18.  */
  19. /* $Id: privs.h,v 1.2 1999/10/01 03:49:07 macgyver Exp $
  20.  */
  21. #ifndef __PRIVS_H
  22. #define __PRIVS_H
  23. /* Macros for manipulating saved, real and effective uid for easy 
  24.  * switching from/to root.
  25.  *
  26.  * Note: In version 1.1.5, all of this changed.  We USED to play games
  27.  * with the saved-uid/gid _and_ setreuid()/setregid(), however this
  28.  * appears to be slightly non-portable (i.e. w/ BSDs).  However, since
  29.  * POSIX.1 saved-uids are pretty much useless without setre* (in the
  30.  * case of root), so we now use basic uid swapping if we have seteuid(),
  31.  * and setreuid() swapping if not.
  32.  */
  33. /* Porters, please put the most reasonable and secure method of
  34.  * doing this in here:
  35.  */
  36. #ifdef __hpux
  37. #define setreuid(x,y) setresuid(x,y,0)
  38. #endif
  39. #if !defined(HAVE_SETEUID)
  40.  
  41. /* Use setreuid() to perform uid swapping.
  42.  */
  43. #define PRIVS_SETUP(u,g) { if(getuid()) { 
  44.   session.ouid = session.uid = (int)getuid(); 
  45.   session.gid = (int)getgid(); 
  46.                                   setgid(session.gid); 
  47.                                   setreuid(session.uid,session.uid); 
  48. } else {  
  49.                                   session.ouid = (int)getuid(); 
  50.                                   session.uid = (u); session.gid = (g); 
  51.                                   setgid(session.gid); 
  52.   setreuid(0,session.uid); 
  53. } }
  54. #define PRIVS_ROOT { log_debug(DEBUG4,"ROOT %s %d", 
  55.   __FILE__, __LINE__); 
  56.   if(!session.disable_id_switching) 
  57.     { setreuid(session.uid,0); 
  58. } }
  59. #define PRIVS_RELINQUISH { log_debug(DEBUG4,"NONROOT %s %d", 
  60.   __FILE__, __LINE__); 
  61.   if(!session.disable_id_switching) 
  62.     { setreuid(session.uid,session.uid); 
  63. } }
  64. #define PRIVS_REVOKE { setreuid(0,0); 
  65.   setgid(session.gid); 
  66.                                   setuid(session.uid); }
  67. #else /* HAVE_SETEUID */
  68. /* Set the saved uid/gid using setuid/seteuid().  setreuid() is
  69.  * no longer used as it is considered obsolete on many systems.
  70.  * gids are also no longer swapped, as they are unnecessary.
  71.  * If run as root, proftpd now normally runs as:
  72.  *   real user            : root
  73.  *   effective user       : <user>
  74.  *   saved user           : root
  75.  *   real/eff/saved group : <group>
  76.  */
  77. #define PRIVS_SETUP(u,g) { if(getuid()) { 
  78.                                   session.ouid = session.uid = (int)getuid(); 
  79.                                   session.gid = (int)getgid(); 
  80.                                   setgid(session.gid); 
  81.                                   setuid(session.uid); 
  82.   seteuid(session.uid); 
  83.                                 } else { 
  84.   session.ouid = (int)getuid(); 
  85.                                   session.uid = (u); session.gid = (g); 
  86.                                   setuid(0); 
  87.                                   setgid((g)); seteuid((u)); 
  88.                                 } }
  89. /* Switch back to root */
  90. #define PRIVS_ROOT if(!session.disable_id_switching) 
  91. { seteuid(0); }
  92. /* Relinquish privs granted by PRIVS_ROOT */
  93. #define PRIVS_RELINQUISH if(!session.disable_id_switching) 
  94. { seteuid(session.uid); }
  95. /* Revoke all privs */
  96. #define PRIVS_REVOKE { seteuid(0); 
  97.   setgid(session.gid); 
  98.   setuid(session.uid); }
  99. #endif /* HAVE_SETEUID */
  100. #endif /* __PRIVS_H */