Ignore:
Timestamp:
May 13, 2009, 3:54:04 PM (13 years ago)
Author:
charles
Message:

(trunk) #920: add "move data" to libT so all clients can use it

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/utils.c

    r8368 r8389  
    15671567    return buf;
    15681568}
     1569
     1570/***
     1571****
     1572***/
     1573
     1574int
     1575tr_moveFile( const char * oldpath, const char * newpath )
     1576{
     1577    int in;
     1578    int out;
     1579    char * buf;
     1580    struct stat st;
     1581    size_t bytesLeft;
     1582    size_t buflen;
     1583
     1584    /* make sure the old file exists */
     1585    if( stat( oldpath, &st ) ) {
     1586        const int err = errno;
     1587        errno = err;
     1588        return -1;
     1589    }
     1590    if( !S_ISREG( st.st_mode ) ) {
     1591        errno = ENOENT;
     1592        return -1;
     1593    }
     1594    bytesLeft = st.st_size;
     1595
     1596    /* make sure the target directory exists */
     1597    {
     1598        char * newdir = tr_dirname( newpath );
     1599        int i = tr_mkdirp( newdir, 0777 );
     1600        tr_free( newdir );
     1601        if( i )
     1602            return i;
     1603    }
     1604
     1605    /* they  might be on the same filesystem... */
     1606    if( !rename( oldpath, newpath ) )
     1607        return 0;
     1608
     1609    /* copy the file */
     1610    in = tr_open_file_for_scanning( oldpath );
     1611    tr_preallocate_file( newpath, bytesLeft );
     1612    out = tr_open_file_for_writing( newpath );
     1613    buflen = stat( newpath, &st ) ? 4096 : st.st_blksize;
     1614    buf = tr_new( char, buflen );
     1615    while( bytesLeft > 0 )
     1616    {
     1617        ssize_t bytesWritten;
     1618        const size_t bytesThisPass = MIN( bytesLeft, buflen );
     1619        const int numRead = read( in, buf, bytesThisPass );
     1620        if( numRead < 0 )
     1621            break;
     1622        bytesWritten = write( out, buf, numRead );
     1623        if( bytesWritten < 0 )
     1624            break;
     1625        bytesLeft -= bytesWritten;
     1626    }
     1627
     1628    /* cleanup */
     1629    tr_free( buf );
     1630    tr_close_file( out );
     1631    tr_close_file( in );
     1632    if( bytesLeft != 0 )
     1633        return -1;
     1634
     1635    unlink( oldpath );
     1636    return 0;
     1637}
Note: See TracChangeset for help on using the changeset viewer.