Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

copyfile.c

Go to the documentation of this file.
00001 
00002 /*
00003  *   THIS FILE IS UNDER RCS - DO NOT MODIFY UNLESS YOU HAVE
00004  *   CHECKED IT OUT USING THE COMMAND CHECKOUT.
00005  *
00006  *    $Id: copyfile_8c-source.html 2161 2006-05-19 16:55:03Z paulf $
00007  *
00008  *    Revision history:
00009  *     $Log$
00009  *     Revision 1.1  2006/05/19 16:55:01  paulf
00009  *     first inclusion
00009  *
00010  *     Revision 1.1  2000/02/14 18:53:30  lucky
00011  *     Initial revision
00012  *
00013  *
00014  */
00015 
00016    /***********************************************************************
00017     *                               copyfile.c                            *
00018     *                           Windows NT version                        *
00019     *                                                                     *
00020     *  Copies a file from local machine to a remote machine using rcp.    *
00021     *                                                                     *
00022     *  For this function to work, make sure that the following files are  *
00023     *  set up properly on the remote machine:                             *
00024     *    /etc/hosts         must contain address and localhostname        *
00025     *    /etc/hosts.equiv   must contain local_hostname                   *
00026     *    .rhosts            in <userid>'s home directory must contain a   *
00027     *                       line: local_hostname local_username           *
00028     *                       describing who is running this program.       *
00029     *                                                                     *
00030     *  Also make sure that entries for the remote host are in the         *
00031     *  local machine's \winnt\system32\drivers\etc\hosts file.            *
00032     *                                                                     *
00033     *  Returns 0 if all is ok                                             *
00034     *          1 if error creating the child process                      *
00035     *          2 if error waiting for the child process to complete       *
00036     *          3 if the child process ended abnormally                    *
00037     ***********************************************************************/
00038 
00039 #include <stdio.h>
00040 #include <string.h>
00041 #include <windows.h>
00042 #include <earthworm.h>
00043 
00044 
00045 int copyfile( char *fname,         /* Name of file to copy                 */
00046               char *tname,         /* Temporary remote file name           */
00047               char *host,          /* Remote machine to copy file to       */
00048               char *dir,           /* Directory on remote machine          */
00049               char *userid,        /* Use this user name on remote machine */
00050               char *passwd,        /* Userid's password on remote machine  */
00051               char *errtxt )       /* String to return error message in    */
00052 
00053 
00054 {
00055    char        rcpPath[175];       /* Copy the file to this path           */
00056    char        tmpName[100];       /* Temporary file name                  */
00057    char        finalName[100];     /* Final name for the copied file       */
00058    char        commandLine[100];   /* Command that invokes the child proc  */
00059    DWORD       display;
00060    BOOL        success;
00061    DWORD       priorityClass;
00062    DWORD       rc;
00063    DWORD       exitCode;
00064 
00065    STARTUPINFO         startUpInfo;
00066    PROCESS_INFORMATION procInfo;
00067 
00068 /* Build temporary and final path names on the target system
00069    *********************************************************/
00070    if ( dir[strlen(dir)-1] == '/' )
00071    {
00072       sprintf( rcpPath,  "%s.%s:%s%s",  host, userid, dir, tname );
00073       sprintf( tmpName,  "%s%s",        dir, tname );
00074       sprintf( finalName, "%s%s",       dir, fname );
00075    }
00076    else
00077    {
00078       sprintf( rcpPath,  "%s.%s:%s/%s", host, userid, dir, tname );
00079       sprintf( tmpName,  "%s/%s",       dir, tname );
00080       sprintf( finalName, "%s/%s",      dir, fname );
00081    }
00082 
00083 /* Retrieve the STARTUPINFOR structure for the current process.
00084    Use this structure for the child processes.
00085    ***********************************************************/
00086    GetStartupInfo( &startUpInfo );
00087 
00088 /* Copy the file using rcp
00089    ***********************/
00090    display = 0;                                /* Do not create a new console window */
00091 
00092    priorityClass = GetPriorityClass( GetCurrentProcess() );
00093 
00094    sprintf( commandLine, "rcp %s %s", fname, rcpPath );
00095 
00096    success = CreateProcess( 0,
00097                             commandLine,             /* Command line to invoke child */
00098                             0, 0,                          /* No security attributes */
00099                             FALSE,                           /* No inherited handles */
00100                             display |                 /* Child does not get a window */
00101                             priorityClass,             /* Same as priority of parent */
00102                             0,                     /* Not passing environmental vars */
00103                             0,                         /* Current dir same as parent */
00104                             &startUpInfo,            /* Attributes of process window */
00105                             &procInfo );              /* Attributes of child process */
00106    if ( !success )
00107    {
00108       sprintf( errtxt, "Error starting the rcp command: %d", GetLastError() );
00109       return 1;
00110    }
00111 
00112 /* Wait 2 minutes for the remote copy to complete.
00113    Check the process exit code for abnormal termination.
00114    ****************************************************/
00115    rc = WaitForSingleObject( procInfo.hProcess, 120000 );
00116 
00117    if ( rc == WAIT_FAILED )
00118    {
00119       sprintf( errtxt, "rcp WaitForSingleObject() failed with error: %d", GetLastError() );
00120       return 2;
00121    }
00122    if ( rc == WAIT_TIMEOUT )
00123    {
00124       sprintf( errtxt, "Error. Remote copy not completed within 2 minutes." );
00125       return 2;
00126    }
00127    success = GetExitCodeProcess( procInfo.hProcess, &exitCode );
00128    if ( !success )
00129    {
00130       sprintf( errtxt, "Error getting the rcp exit code: %d", GetLastError() );
00131       return 3;
00132    }
00133    if ( exitCode != 0 )
00134    {
00135       strcpy( errtxt, "Remote copy failed." );
00136       return 3;
00137    }
00138 
00139 /* Close the process and thread handles for rcp
00140    ********************************************/
00141    success = CloseHandle( procInfo.hProcess );
00142    if ( !success )
00143    {
00144       sprintf( errtxt, "Error closing the rcp process handle: %d", GetLastError() );
00145       return 3;
00146    }
00147    success = CloseHandle( procInfo.hThread );
00148    if ( !success )
00149    {
00150       sprintf( errtxt, "Error closing the rcp thread handle: %d", GetLastError() );
00151       return 3;
00152    }
00153 
00154 /* Rename the remote file using rsh
00155    ********************************/
00156    sprintf( commandLine, "rsh %s -l %s /usr/bin/mv %s %s",
00157                           host, userid, tmpName, finalName );
00158 
00159    success = CreateProcess( 0,
00160                             commandLine,             /* Command line to invoke child */
00161                             0, 0,                          /* No security attributes */
00162                             FALSE,                           /* No inherited handles */
00163                             display |                 /* Child does not get a window */
00164                             priorityClass,             /* Same as priority of parent */
00165                             0,                     /* Not passing environmental vars */
00166                             0,                         /* Current dir same as parent */
00167                             &startUpInfo,            /* Attributes of process window */
00168                             &procInfo );              /* Attributes of child process */
00169    if ( !success )
00170    {
00171       sprintf( errtxt, "Error starting the rsh command: %d", GetLastError() );
00172       return 1;
00173    }
00174 
00175 /* Wait 2 minutes for the remote move command to complete.
00176    Check the process exit code for abnormal termination.
00177    ******************************************************/
00178    rc = WaitForSingleObject( procInfo.hProcess, 120000 );
00179 
00180    if ( rc == WAIT_FAILED )
00181    {
00182       sprintf( errtxt, "rsh WaitForSingleObject() failed with error: %d", GetLastError() );
00183       return 2;
00184    }
00185    if ( rc == WAIT_TIMEOUT )
00186    {
00187       sprintf( errtxt, "Error. Remote mv command not completed within 2 minutes." );
00188       return 2;
00189    }
00190    success = GetExitCodeProcess( procInfo.hProcess, &exitCode );
00191    if ( !success )
00192    {
00193       sprintf( errtxt, "Error getting the rsh exit code: %d", GetLastError() );
00194       return 3;
00195    }
00196    if ( exitCode != 0 )
00197    {
00198       strcpy( errtxt, "Remote mv command failed." );
00199       return 3;
00200    }
00201 
00202 /* Close the process and thread handles for rsh
00203    ********************************************/
00204    success = CloseHandle( procInfo.hProcess );
00205    if ( !success )
00206    {
00207       sprintf( errtxt, "Error closing the rsh process handle: %d", GetLastError() );
00208       return 3;
00209    }
00210    success = CloseHandle( procInfo.hThread );
00211    if ( !success )
00212    {
00213       sprintf( errtxt, "Error closing the rsh thread handle: %d", GetLastError() );
00214       return 3;
00215    }
00216 
00217 /* Everything went smoothly
00218    ************************/
00219    return 0;
00220 }

Generated on Tue May 6 09:16:00 2003 for Earthworm Libs by doxygen1.3-rc3