int
dsi_restart_transfer(globus_gfs_transfer_info_t * TransferInfo)
{
	globus_off_t offset;
	globus_off_t length;

	if (globus_range_list_size(TransferInfo->range_list) != 1)
		return 1;

	globus_range_list_at(TransferInfo->range_list, 0, &offset, &length);
	return (offset != 0 || length != -1);
}
static void
globus_l_gsc_send_restart(
    globus_gridftp_server_control_op_t  op,
    globus_range_list_t                 range_list)
{
    int                                 ctr;
    char *                              tmp_msg;
    char *                              msg;
    int                                 size;
    globus_off_t                        offset;
    globus_off_t                        length;
    globus_range_list_t                 new_range_list;

    globus_range_list_merge(
        &new_range_list, op->perf_range_list, range_list);
    globus_range_list_destroy(op->perf_range_list);
    op->perf_range_list = new_range_list;

    size = globus_range_list_size(range_list);
    if(size < 1)
    {
        /* sending 0-0 is useless, and it causes a problem with our client
            when markers are sent before the retr begins
        msg = globus_common_create_string("111 Range Marker 0-0\r\n"); */
    }
    else
    {    
        msg = globus_common_create_string("111 Range Marker");
        for(ctr = 0; ctr < size; ctr++)
        {
            globus_range_list_at(range_list, ctr, &offset, &length);
    
            tmp_msg = globus_common_create_string("%s%c%"
                GLOBUS_OFF_T_FORMAT"-%"GLOBUS_OFF_T_FORMAT,
                 msg, ctr ? ',' : ' ', offset, offset + length);
            globus_free(msg);
            msg = tmp_msg;
        }
        tmp_msg = globus_common_create_string("%s%s", msg, "\r\n");
        globus_free(msg);
        msg = tmp_msg;
        
        globus_i_gsc_intermediate_reply(op, msg);
        globus_free(msg);
    }    
}
/************************************************************************
 *  event handlers
 *  --------------
 ***********************************************************************/
void
globus_i_gsc_reverse_restart(
    globus_range_list_t                 in_range,
    globus_range_list_t                 out_range)
{
    globus_off_t                        offset;
    globus_off_t                        length;

    globus_range_list_insert(out_range, 0, GLOBUS_RANGE_LIST_MAX);

    if(in_range != NULL)
    {
        while(globus_range_list_size(in_range))
        {
            globus_range_list_remove_at(in_range, 0, &offset, &length);
            
            globus_range_list_remove(out_range, offset, length);
        }
    }
}