home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Divers / samba-1.9.18p7.tar.gz / samba-1.9.18p7.tar / samba-1.9.18p7 / source / smbrun.c < prev    next >
C/C++ Source or Header  |  1998-01-26  |  2KB  |  98 lines

  1. /* 
  2.    Unix SMB/Netbios implementation.
  3.    Version 1.9.
  4.    external program running routine
  5.    Copyright (C) Andrew Tridgell 1992-1998
  6.    
  7.    This program is free software; you can redistribute it and/or modify
  8.    it under the terms of the GNU General Public License as published by
  9.    the Free Software Foundation; either version 2 of the License, or
  10.    (at your option) any later version.
  11.    
  12.    This program is distributed in the hope that it will be useful,
  13.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.    GNU General Public License for more details.
  16.    
  17.    You should have received a copy of the GNU General Public License
  18.    along with this program; if not, write to the Free Software
  19.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21.  
  22. #include "includes.h"
  23.  
  24.  
  25. /*******************************************************************
  26. close the low 3 fd's and open dev/null in their place
  27. ********************************************************************/
  28. static void close_fds(void)
  29. {
  30.   int fd;
  31.   int i;
  32.   close(0); close(1); close(2);
  33.   /* try and use up these file descriptors, so silly
  34.      library routines writing to stdout etc won't cause havoc */
  35.   for (i=0;i<3;i++) {
  36.     fd = open("/dev/null",O_RDWR,0);
  37.     if (fd < 0) fd = open("/dev/null",O_WRONLY,0);
  38.     if (fd != i) return;
  39.   }
  40. }
  41.  
  42.  
  43. /*
  44. This is a wrapper around the system() call to allow commands to run correctly 
  45. as non root from a program which is switching between root and non-root 
  46.  
  47. It takes 3 arguments as uid,gid,command and runs command after
  48. becoming a non-root user */
  49.  int main(int argc,char *argv[])
  50. {
  51.   int uid,gid;
  52.  
  53.   close_fds();
  54.  
  55.   if (argc != 4) exit(2);
  56.  
  57.   uid = atoi(argv[1]);
  58.   gid = atoi(argv[2]);
  59.  
  60.   /* first become root - we may need to do this in order to lose
  61.      our privilages! */
  62. #ifdef USE_SETRES
  63.   setresgid(0,0,0);
  64.   setresuid(0,0,0);
  65. #else      
  66.   setuid(0);
  67.   seteuid(0);
  68. #endif
  69.  
  70. #ifdef USE_SETFS
  71.   setfsuid(uid);
  72.   setfsgid(gid);
  73. #endif
  74.  
  75. #ifdef USE_SETRES
  76.   setresgid(gid,gid,gid);
  77.   setresuid(uid,uid,uid);      
  78. #else
  79.   setgid(gid);
  80.   setegid(gid);
  81.   setuid(uid);
  82.   seteuid(uid);
  83. #endif
  84.  
  85.  
  86.   /* paranoia :-) */
  87.   if (getuid() != uid)
  88.     return(3);
  89.  
  90.   if (geteuid() != getuid())
  91.     return(4);
  92.  
  93.   /* this is to make sure that the system() call doesn't run forever */
  94.   alarm(30);
  95.  
  96.   return(system(argv[3]));
  97. }
  98.