/**********************************************************************************************************************/
/** Socket Receive                                                                                                   **/
/** Carlos Vara Callau                                                                                               **/
/**                                                                                                                  **/
/** Fecha:      2005-11-13                                                                                           **/
/** Version:    1.0                                                                                                  **/
/**                                                                                                                  **/
/** INFO:       socket > STDOUT                                                                                      **/
/**                                                                                                                  **/
/** "THE BEER-WARE LICENSE" (Revision 42):                                                                           **/
/** bashflyng wrote this file. As long as you retain this notice you can do whatever you want with this stuff. If we **/
/** meet some day, and you think this stuff is worth it, you can buy me a beer in return.                            **/
/**********************************************************************************************************************/


#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>

#include <string.h>


#define UNIX_PATH_MAX    108            // man 7 unix


/** Muestra como invocar el programa y termina la ejecucion
\**********************************************************************************************************************/
void HowToUse( char *pname )
{
  printf("Uso incorrecto del programa.\n");
  printf("Invocar usando:\n");
  printf("    %s socket\n", pname);
  exit(1);
}


/** MAIN
\**********************************************************************************************************************/
int main( int argc, char **argv )
{
  int usock;
  struct sockaddr_un unix_addr;
  char c;
  
  
  if ( argc != 2 ) HowToUse( argv[0] );
  
  
  /* Prepara la estructura para conectar con el socket */
  if ( (usock = socket( PF_UNIX, SOCK_STREAM, 0 )) == -1 )
    perror("socket");
  
  
  unix_addr.sun_family = AF_UNIX;
  strncpy( unix_addr.sun_path, argv[1], UNIX_PATH_MAX ); /* jarl */
  
  
  /* conecta con el socket */
  if ( (connect( usock, (struct sockaddr *)&unix_addr, sizeof(unix_addr)) ) )
    perror("connect");
  
  
  /* recibe, de 1 en 1 */
  printf("Conectado con el socket %s\n", argv[1]);
  printf("Terminar la recepcion con CTRL+C.\n");
  
  while ( recv( usock, &c, sizeof(char), 0 ) == sizeof(char) )
  {
    if ( write(STDOUT_FILENO, &c, sizeof(char)) != sizeof(char) )
      perror("write");
  }
  
  
  exit(0);
}
