home *** CD-ROM | disk | FTP | other *** search
/ Amiga Developer CD v1.2 / amidev_cd_12.iso / devcon / milan_1991 / devcon91.2 / network / socket / examples / ncopy.c < prev    next >
C/C++ Source or Header  |  1992-09-01  |  3KB  |  116 lines

  1. /*
  2. **  ncopy.c
  3. **
  4. **  Written by Dale Larson, Software Engineer, Commodore-Amiga, Inc.
  5. **  Copyright 1991, Commodore-Amiga, Inc.
  6. **  Permission to use granted provided this notice remains intact.
  7. **
  8. **  An example ncopy client.  This file contains only the main loop.
  9. **  (See also transfer.c).  The ncopy client can copy files from the
  10. **  current machine to the current machine or from any connected Amiga
  11. **  running an ncopy server to any other Amiga running an ncopy server.
  12. **
  13. **  This ncopy server is somewhat deficient in that it:
  14. **    Doesn't do wildcards or multiple or directory copies.
  15. **    Does not handle the case "copy x ram:", must be "copy x ram:x"
  16. **
  17. **  The copy loop could be made more efficient, but it transparently
  18. **  handles the different cases presented by files being on local and
  19. **  remote machines.  Thanks to Mike Sinz for this idea.
  20. */
  21.  
  22.  
  23. #include "ncopy.h"
  24. #include "client.h"
  25.  
  26. struct Library *SockBase;
  27. #define MAXSOCKS 10
  28.  
  29.  
  30. char vers[] = "\0$VER: ncopy 1.0 (25.02.91)";
  31.  
  32.  
  33. /*
  34. **  main()
  35. **
  36. **  Process arguments.
  37. **
  38. **  If they're ok, my_open() a source and destination my_file.  A my_file
  39. **  is either a socket or an AmigaDOS file, depending on whether the file
  40. **  is local or not (see ncopy.h and transfer.c/parse()).
  41. **
  42. **  If the my_open()s went ok, copy the file by my_read()ing a buffer and
  43. **  my_write()ing the buffer until there's nothing left to my_read() or there
  44. **  is an error.
  45. **
  46. **  Clean up.
  47. */
  48. main(int argc, char **argv)
  49. {
  50. LONG opts[OPT_COUNT];        /*  For ReadArgs()  */
  51. struct RDArgs *argsptr;        /*  for ReadArgs() return  */
  52. char *from, *to,         /*  file names from ReadArgs()  */
  53.      buffer[LENGTH];        /*  buffer for the copy operation  */
  54. my_file *source, *destination;    /*  socket/files for reading and writing  */
  55. int n;                /*  number of bytes read  */
  56.  
  57.     /*
  58.     ** Process arguments using new (2.0) dos calls.
  59.     */
  60.     argsptr = (struct RDArgs *)ReadArgs((UBYTE *)TEMPLATE, opts, NULL);
  61.     if(argsptr == NULL)
  62.     {
  63.         PrintFault(IoErr(), "Command line not accepted");
  64.         return RETURN_ERROR;
  65.     }
  66.     from = (char *)opts[OPT_FROM];
  67.     to   = (char *)opts[OPT_TO];
  68.  
  69.     /*
  70.     **  Don't need to check length of filenames under current operating
  71.     **  system because command limited to 255 characters and our LENGTH
  72.     **  should be bigger than that.
  73.     */
  74.  
  75.     /*  Open Shared Socket library:
  76.     */
  77.         if(SockBase = OpenLibrary("inet:libs/socket.library", 0L))
  78.         {
  79.                 setup_sockets( MAXSOCKS, &errno );
  80.     }else
  81.     {
  82.         puts("Can't open socket.library.");
  83.         return RETURN_ERROR;
  84.     }
  85.  
  86.     /*
  87.     **  Open my_files (file/sockets).  If there is an error, my_open()
  88.     **  will print an error message, so we don't worry about it.
  89.     */
  90.     if( !(source = my_open(from, MODE_OLDFILE)) )
  91.         return RETURN_ERROR;
  92.     if( !(destination = my_open(to, MODE_NEWFILE)) )
  93.         return RETURN_ERROR;
  94.  
  95.     /*
  96.     **  Copy the file.
  97.     */
  98.     while( (n = my_read(source, buffer, LENGTH)) > 0)
  99.         if (!my_write(destination, buffer, n))
  100.             /*
  101.             **  Error.  Error message should be printed by
  102.             **  my_read/write(), so we need only stop and clean up.
  103.             **  We're too lazy to set the return code properly.
  104.             */
  105.             break;
  106.     /*
  107.     **  Clean up.
  108.     */
  109.     my_close(source);
  110.     my_close(destination);
  111.     cleanup_sockets();
  112.     CloseLibrary(SockBase);
  113.     FreeArgs(argsptr);
  114.     return RETURN_OK;
  115. }
  116.