DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400 Tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400 Tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ S T

⟦5912e4154⟧ TextFile

    Length: 15796 (0x3db4)
    Types: TextFile
    Names: »SERVER_C«

Derivation

└─⟦afbc8121e⟧ Bits:30000532 8mm tape, Rational 1000, MC68020_OS2000 7_2_2
    └─ ⟦77aa8350c⟧ »DATA« 
        └─⟦f794ecd1d⟧ 
            └─⟦this⟧ 

TextFile

/*========================================================================*/
/*  SERVER.C                                                              */
/*                                                                        */
/*                                                                        */
/*  Purpose: Server for File transfer with a remote host.                 */
/*                                                                        */ 
/*                                                                        */
/*  nopen()    a TCP/IP connection                                        */
/*  nsocket()  get socket_id 1                                            */
/*  nsocket()  get socket_id 2                                            */
/*  loop                                                                  */
/*      naccept()  a TCP/IP connection                                    */ 
/*      nread()    transfer type and the port_id for connection           */
/*                 transfer types are:                                    */
/*                    e - host to server executable file                  */
/*                    f - host to server other file                       */
/*                    g - server to host file                             */
/*      connect()                                                         */
/*      nread()   the local filename for transfer                         */
/*      open or create the file                                           */
/*      nwrite()   Success if OK; Error_code if not                */
/*      if receiving then                                                 */
/*          nread()    receive from host ...                              */
/*          write()    and write to file until count = 0                  */
/*      else                                                              */
/*          read()     read from the file, until count = 0                */ 
/*          nwrite()   and write to host                                  */
/*      end if;                                                           */ 
/*      close the file.                                                   */
/*      nclose()   the TCP/IP connection                                  */
/*  end loop;                                                             */
/*  nsoclose(s_id1)                                                       */
/*  nsoclose(s_id2)                                                       */
/*------------------------------------------------------------------------*/

#include <stdio.h>
#include <modes.h>
#include <errno.h>
#include "/H0/TCP/INCL/msocket.h"

#define LOCAL_PORT     0x010D      /* local socket - wait for commands     */
                                   /*   from host; since OS-9 treats the   */
                                   /*   sockets < (4,0) as privileged, the */
                                   /*   server must use privileged ports.  */
#define REM_HOST_ADR   0x59400359  /* Barney host address */
                                   /* not used since server is passive */

typedef char REQUEST;

#define RQ_PUT_EXE 'E'
#define RQ_PUT_FIL 'F'
#define RQ_GET_FIL 'G'

typedef char FILE_STATUS;

#define ST_SUCCESS 'S'
#define ST_NAM_ERR 'N'
#define ST_USE_ERR 'U'
#define ST_DEV_ERR 'D'
#define ST_OTH_ERR 'O'

extern int tcp_errno;
extern int errno;
extern int priv_port;

struct sockaddr asa_l;  /* used by nsocket() - defines local port */
struct sockaddr asa_r;  /* used by naccept   - returns remote port + addr */
struct sockaddr asa_w;  /* used by nconnect  - */

int debug = 0 ;

int rem_host_address;
int remote_port ;

REQUEST request;

int   count_r,count_w;
int   status;
int   s_id1,s_id2; 
char  r_buff[1024];
char  stat_buff[2];

int   i;
int   local_port;

int id = 0 ;                /* id returned from nopen, used by all nxxx calls*/

int fpath  = 0 ;            /* path for file */ 
short e_attr  = 0x3f;       /* all permissions */
short rw_attr = 0x1b;       /* read/write permissions */
FILE *fdes;
/*---------------------------------------------------------------------------*/
/*\f

*/
/*===========================================================================*/

int makeconnection ()
{
  /*----------------------------------connect-------------------------------*/
  asa_w.sin_family        = AF_INET;
  asa_w.sin_port          = remote_port ;
  asa_w.sin_addr          = rem_host_address ;
  for(i=0 ; i<8 ; i++)  asa_w.sin_data[i] = 0;   /* not required ? */

  if(debug>1) printf
   ("SERVER:  Connect at Remote_Port =x%x   Remote_Host_addr = x%x \n",
                                       asa_w.sin_port, asa_w.sin_addr);

  status = nconnect(id,s_id2,&asa_w);

  if (status == -1)
  {
      printf
         ("SERVER:  *** ERROR at nconnect() call. ErrCode = x%x\n",tcp_errno);
      return -1;
  }

  if (debug>1) printf
("SERVER:  Returned from nconnect(). Status= %d  Rem adr= x%x  Rem port= x%x\n",
                                       status, asa_w.sin_addr, asa_w.sin_port);
  return 0;
}  /*end makeconnection */
/*\f

*/

int getfilename()
{
  if(debug>1) printf ("SERVER:  Get file name from Remote.\n");
  
  count_r = nread(id,s_id1,r_buff,1024);

  if (count_r == -1)
  {
    printf
    ("SERVER:  *** ERROR at nread() call. Status = x%x ErrCode = x%x\n",
                                                           count_r,tcp_errno) ;
    return -1;
  }

  r_buff[count_r] = 0 ; /* add terminator */
    
  printf("SERVER:  Transfering file = %s \n",r_buff);

  return 0;
}  /*end getfilename */
/*\f

*/

int xferfromhost ()
{
  int total_r = 0;

  if(debug>1)
     printf("SERVER:  Enter mode: 'read from TCP and write to file.\n");
  
  while(1)

  { /* .begin while read TCP - write file.................................*/

    count_r = nread(id,s_id2,r_buff,1024);

    if (debug>1) printf("SERVER:  Number of bytes read = %d \n",count_r);

    if (count_r == -1)
    {
        printf
        ("SERVER:  *** ERROR at nread() call. Status = x%x Errcode = %x%\n",
                                                    count_r,tcp_errno);
        return -1;
    }

    if (count_r == 0)
      {
         printf("SERVER:  Number bytes transferred = %d \n",total_r);
         break;
      }

    count_w = fwrite(r_buff,1,count_r,fdes);

    if (count_w == 0)
        {
            printf ("SERVER:  *** ERROR at fwrite() call.\n");
            return -1;
        }
      
    total_r  = total_r  + count_r;

    if (debug>1) printf("SERVER:  Number of bytes written = %d \n",count_w);

  }  /* .end while read from TCP - write to file...........................*/

  return 0;

}  /*end xferfromhost */

/*\f

*/

int xfertohost()
{
  int total_w = 0;

  if(debug>1)
     printf("SERVER:  Enter mode: 'read from file and transmit to TCP.\n");
  
  while(1)

  { /* .begin while read file - nwrite .....................................*/

    count_r = fread(r_buff,1,128,fdes);

    /*----nwrite ----*/

    count_w = count_r ;

    {
      status = nwrite(id,s_id2,r_buff,count_w);         /* echo back */

      if (status == -1)
      {
       printf("SERVER:  *** ERROR at nwrite() call. ErrCode = x%x\n",tcp_errno);
         return -1;
      }

      if (debug>1) printf("SERVER:  Number of written bytes = x%x \n",status);
    }

    if (count_r == 0)
      {
         printf("SERVER:  Number of bytes transferred = %d \n",total_w);
         break;
      }

    total_w  = total_w  + count_w;

  }  /* .end while read from file - nwrite .................................*/

   return 0;

}  /*end xfertohost */

/*\f

*/

main(argc,argv)
int argc;
char *argv[];
{
  char  *ap;
  char  c;
  debug = 0;

  if(argc>0)      /* turn on debug if argument = 'd' */ 
  {
    ap = argv[1];
    if (*ap == 'd') debug = 2 ;
    if (*ap == 'D') debug = 2 ;
  }

  printf("SERVER:  Starting TCP/IP server\n");

  /*-------------get local port----------------------------------------------*/
  
  local_port = LOCAL_PORT;

again:

  /*-------------open-------------------------------------------------------*/

  if(debug>1) printf("\nSERVER:  Calling nopen().\n");

  id = nopen();           /* id = global variable to be used by nxxxx calls */

  if(id < 0)   { printf("SERVER:  *** ERROR at nopen. Status = x%x\n",id);
                 goto error ;
               }

  if(debug>1) printf("SERVER:  Returned from nopen(). id = x%x\n",id);

  /*-------------socket for accept------------------------------------------*/

  if(debug>1)
         printf("SERVER:  Calling nsocket() to get a socket for accept.\n");

  asa_l.sin_family = AF_INET;
  asa_l.sin_port   = local_port;
  asa_l.sin_addr   = 0;

  s_id1 = nsocket(id,SOCK_STREAM,(struct sockproto*)0, &asa_l,SO_ACCEPTCONN);

  priv_port = 1;    /* enable privileged port */

  if (s_id1 == -1)
  {
    printf
    ("SERVER:  *** ERROR at nsocket() call: Status = x%x. ErrCode = x%x \n",
                                                            s_id1,tcp_errno);
    goto error_cleanup ;
  }
  
  if(debug>1) printf
    ("SERVER:  Returned from nsocket(). Socket id = x%x \n",s_id1);

  /*-------------socket for connect ----------------------------------------*/

  if(debug>1)
         printf("SERVER:  Calling nsocket() to get a socket for connect.\n");

  s_id2 = nsocket(id,SOCK_STREAM,(struct sockproto*)0,(struct sockaddr*)0,0);

  if (s_id2 == -1)
  {
      printf
           ("SERVER:  *** ERROR at nsocket() call: ErrCode = x%x\n",
                                                               tcp_errno);
      goto error_cleanup;
  }
  if (debug>1)
  printf("SERVER:  Returned from nsocket(). Socket id = x%x\n",s_id2);

  /*-------------accept----------------------------------------------------*/

  if(debug>1) printf
    ("SERVER:  Calling naccept(). Waiting for connection at port = x%x\n",
                                                             asa_l.sin_port);
  status = naccept(id,s_id1,&asa_r);

  if (status == -1)
  {
    printf
    ("SERVER:  *** ERROR at naccept() call. Status = %d  ErrCode = x%x\n",
                                                            status,tcp_errno) ;
    goto error_cleanup;
  }

  if(debug>1)printf
  ("SERVER:  Ret from naccept(). Stat=x%x  Rem_adr=x%x  Rem_port=x%x\n",
                                      status, asa_r.sin_addr, asa_r.sin_port);

  rem_host_address = asa_r.sin_addr ; /* to be used by nconnect() */

  /*------------------------------------------------------------------------*/

  /*-------------nread to get port to make connect at ---------------------*/

  if(debug>1) printf ("SERVER:  Get port number from Remote.\n");
  
    count_r = nread(id,s_id1,r_buff,1024);

    if (count_r == -1)
    {
      printf
      ("SERVER:  *** ERROR at nread() call. Status = x%x ErrCode = x%x\n",
                                                           count_r,tcp_errno) ;
      goto error_cleanup;
    }

    if (debug>1)
    printf("SERVER:  Count=x%x. Remote_port_Data = %x %x \n",count_r,
                                      r_buff[0] & 0xff, r_buff[1] & 0xff );
  
    if (debug>1)
    printf("SERVER:  Request= '%c'.\n",r_buff[2] );

    remote_port = ((r_buff[0] & 0xff) << 8) + (r_buff[1] & 0xff) ;  

    request = r_buff[2];

    switch (request)
    {
    case RQ_PUT_EXE:
        printf("\nSERVER:  Receiving executable file from host.\n");
        break;
    case RQ_PUT_FIL:
        printf("\nSERVER:  Receiving file from host.\n");
        break;
    case RQ_GET_FIL:
        printf("\nSERVER:  Sending file to host.\n");
        break;

    default:
        printf("\nSERVER:  Unknown command:  '%c'\n", request );
        goto error_cleanup;
    }
  
  /*----------------- establish the transfer connection----------------*/

  status = makeconnection();

  if (status < 0) goto error_cleanup;

  /*------------------------ get filename -----------------------------*/

  status = getfilename();
  
  if (status < 0) goto error_cleanup;

  /*------------ create the file -----------------------------*/

    switch (request)
    {
    case RQ_PUT_EXE:
        fdes = fopen(r_buff,"wx");
        break;
    case RQ_PUT_FIL:
        fdes = fopen(r_buff,"w");
        break;
    case RQ_GET_FIL:
        fdes = fopen(r_buff,"r");
        break;

    default:
        printf("\nSERVER:  Unknown command:  '%c'\n", request );
        goto error_cleanup;
    }

  stat_buff[0] = '?';
  stat_buff[1] = ST_SUCCESS;

  if (fdes == NULL)
  {
    printf("SERVER:  *** ERROR can't open file %s\n",r_buff);
    printf("         *** errno = %d\n", errno);
  
    switch (errno)
    {
    case E_BPNAM:    /* Bad path name */
    case E_BNAM:     /* Bad name */
    case E_PNNF:     /* Path name not found */
       stat_buff[1] = ST_NAM_ERR;
       break;
      
    case E_PERMIT:   /* Need permissions */
    case E_FNA:      /* File not accessible */
    case E_SHARE:    /* Nonshareable file is busy */
       stat_buff[1] = ST_USE_ERR;
       break;

    case E_WP:       /* Write protected */
    case E_UNIT:     /* Illegal unit (drive) */
    case E_READ:     /* Read error */
    case E_WRITE:    /* Write error */
    case E_NOTRDY:   /* Device not ready */
    case E_DEVBSY:   /* Device is busy */
    case E_FULL:     /* Media is full */
       stat_buff[1] = ST_DEV_ERR; 
       break;

    default:
       stat_buff[1] = ST_OTH_ERR;
       break;
    }
  }

  status = nwrite(id,s_id2,stat_buff,2);     /* write error status */
  
  if (status == -1)
  {
    printf("SERVER:  *** ERROR at nwrite() call. ErrCode = x%x\n",tcp_errno);
    goto error_cleanup;
  }

  if (fdes == NULL) goto error_cleanup;

  fpath = fileno(fdes);

    switch (request)
    {
    case RQ_PUT_EXE:
        /*----- transfer file to host --------*/
        status = _ss_attr(fpath,e_attr);  /* set file attributes */ 

        if (status == -1)
            printf("SERVER:  *** ERROR unable to set file attributes\n");
 
        status = xferfromhost ();
        break;

    case RQ_PUT_FIL:
        /*----- transfer file from host ------*/
        status = _ss_attr(fpath,rw_attr);  /* set file attributes */ 

        if (status == -1)
            printf("SERVER:  *** ERROR unable to set file attributes\n");
 
        status = xferfromhost ();
        break;

    case RQ_GET_FIL:
        /*----- transfer file to host --------*/ 
        status = xfertohost ();
        break;

    default:
        printf("\nSERVER:  Unknown command:  '%c'\n", request );
        goto error_cleanup;
    }


 /*--------- done with transfer --------------------------------------------*/

error_cleanup:
 
 /*--------- close, nsoclose(), nclose -------------------------------------*/

  fclose(fdes);

  if(debug>1) 
    printf("SERVER:  Calling nsoclose().\n");

  status = nsoclose(id,s_id1);   
  if (status == -1)
  {
    printf("SERVER:  *** ERROR at nsoclose(). Status = x%x. ErrCod = x%x\n",
                                                            status,tcp_errno) ;
  }
  if(debug>1) 
    printf("SERVER:  Calling nsoclose().\n");

  status = nsoclose(id,s_id2);   
  if (status == -1)
  {
    printf("SERVER:  *** ERROR at nsoclose(). Status = x%x. ErrCod = x%x\n",
                                                            status,tcp_errno) ;
  }

  status = nclose(id,0);   

  if (status == -1)
  {
    printf("SERVER:  *** ERROR at nclose(). Status = x%x. ErrCod = x%x\n",
                                                            status,tcp_errno) ;
    goto error ;
  }

  if(debug>1) printf("SERVER:  Returned from nclose(). Status = x%x\n",status);
  /*------------------------------------------------------------------------*/

goto again;

error:  

  printf("SERVER:  *** TCP/IP server terminated due to error.\n");

} /*end main*/