864
893
return GLOBUS_FAILURE;
898
globus_l_gass_copy_glob_parse_mlst_line(
900
globus_gass_copy_glob_stat_t * stat_info)
902
static char * myname = "globus_l_gass_copy_glob_parse_ftp_list";
903
globus_result_t result;
912
char * unique_id = NULL;
913
char * mode_s = NULL;
914
char * symlink_target = NULL;
915
char * modify_s = NULL;
916
char * size_s = NULL;
917
globus_gass_copy_glob_entry_t type;
921
space = strchr(startline, ' ');
922
if(space == GLOBUS_NULL)
924
result = globus_error_put(
925
globus_error_construct_string(
926
GLOBUS_GASS_COPY_MODULE,
928
"[%s]: Bad MLSD response",
931
goto error_invalid_mlsd;
934
filename = space + 1;
935
startfact = startline;
937
while(startfact != space)
939
endfact = strchr(startfact, ';');
947
older MLST-draft spec says ending fact can be missing
948
the final semicolon... not a problem to support this,
949
no need to die. (ncftpd does this)
951
result = globus_error_put(
952
globus_error_construct_string(
953
GLOBUS_GASS_COPY_MODULE,
955
"[%s]: Bad MLSD response",
958
goto error_invalid_mlsd;
964
factval = strchr(startfact, '=');
967
result = globus_error_put(
968
globus_error_construct_string(
969
GLOBUS_GASS_COPY_MODULE,
971
"[%s]: Bad MLSD response",
974
goto error_invalid_mlsd;
978
for(i = 0; startfact[i] != '\0'; i++)
980
startfact[i] = tolower(startfact[i]);
983
if(strcmp(startfact, "type") == 0)
985
if(strcasecmp(factval, "dir") == 0)
987
type = GLOBUS_GASS_COPY_GLOB_ENTRY_DIR;
989
else if(strcasecmp(factval, "file") == 0)
991
type = GLOBUS_GASS_COPY_GLOB_ENTRY_FILE;
995
type = GLOBUS_GASS_COPY_GLOB_ENTRY_OTHER;
998
if(strcmp(startfact, "unique") == 0)
1000
unique_id = factval;
1002
if(strcmp(startfact, "unix.mode") == 0)
1006
if(strcmp(startfact, "modify") == 0)
1010
if(strcmp(startfact, "size") == 0)
1014
if(strcmp(startfact, "unix.slink") == 0)
1016
symlink_target = factval;
1019
startfact = endfact + 1;
1023
stat_info->type = type;
1024
stat_info->unique_id = globus_libc_strdup(unique_id);
1025
stat_info->symlink_target = globus_libc_strdup(symlink_target);
1026
stat_info->mode = -1;
1027
stat_info->size = -1;
1028
stat_info->mdtm = -1;
1032
stat_info->mode = strtoul(mode_s, NULL, 0);
1040
rc = sscanf(size_s, "%"GLOBUS_OFF_T_FORMAT, &size);
1043
stat_info->size = size;
1051
if(globus_l_gass_copy_mdtm_to_timet(modify_s, &mdtm) ==
1054
stat_info->mdtm = mdtm;
1058
return GLOBUS_SUCCESS;
1477
globus_l_gass_copy_stat_ftp(
1478
globus_gass_copy_handle_t * handle,
1480
globus_gass_copy_attr_t * attr,
1481
globus_gass_copy_glob_stat_t * stat_info)
1483
globus_result_t result;
1484
globus_l_gass_copy_glob_info_t info;
1485
globus_byte_t * mlst_buf;
1486
globus_size_t mlst_len;
1488
info.callbacks_left = 1;
1489
info.err = GLOBUS_NULL;
1490
globus_cond_init(&info.cond, GLOBUS_NULL);
1491
globus_mutex_init(&info.mutex, GLOBUS_NULL);
1493
result = globus_ftp_client_mlst(
1494
&handle->ftp_handle,
1499
globus_l_gass_copy_ftp_client_op_done_callback,
1501
if(result != GLOBUS_SUCCESS)
1506
globus_mutex_lock(&info.mutex);
1507
while(info.callbacks_left > 0)
1509
globus_cond_wait(&info.cond, &info.mutex);
1511
globus_mutex_unlock(&info.mutex);
1515
result = globus_error_put(info.err);
1516
info.err = GLOBUS_NULL;
1519
if(result != GLOBUS_SUCCESS)
1524
result = globus_l_gass_copy_glob_parse_mlst_line(
1525
(char *) mlst_buf, stat_info);
1527
if(result != GLOBUS_SUCCESS)
1532
globus_free(mlst_buf);
1533
globus_cond_destroy(&info.cond);
1534
globus_mutex_destroy(&info.mutex);
1536
return GLOBUS_SUCCESS;
1539
globus_free(mlst_buf);
1542
globus_cond_destroy(&info.cond);
1543
globus_mutex_destroy(&info.mutex);
1550
globus_l_gass_copy_stat_file(
1552
globus_gass_copy_glob_stat_t * stat_info)
1554
static char * myname = "globus_l_gass_copy_stat_file";
1556
globus_result_t result;
1557
struct stat stat_buf;
1558
globus_url_t parsed_url;
1559
char unique_id[256];
1560
globus_gass_copy_glob_entry_t type;
1561
char symlink_target[MAXPATHLEN*2];
1563
rc = globus_url_parse(url, &parsed_url);
1567
result = globus_error_put(
1568
globus_error_construct_string(
1569
GLOBUS_GASS_COPY_MODULE,
1571
"[%s]: error parsing url: "
1572
"globus_url_parse returned %d",
1578
if(parsed_url.url_path == GLOBUS_NULL)
1580
result = globus_error_put(
1581
globus_error_construct_string(
1582
GLOBUS_GASS_COPY_MODULE,
1584
"[%s]: error parsing url: "
1587
goto error_null_path;
1590
if(lstat(parsed_url.url_path, &stat_buf) != 0)
1592
result = globus_error_put(
1593
globus_error_construct_string(
1594
GLOBUS_GASS_COPY_MODULE,
1596
"[%s]: invalid entry in dir: %s",
1598
parsed_url.url_path));
1602
*symlink_target = '\0';
1603
if(S_ISLNK(stat_buf.st_mode))
1605
if(stat(parsed_url.url_path, &stat_buf) != 0)
1607
result = globus_error_put(
1608
globus_error_construct_string(
1609
GLOBUS_GASS_COPY_MODULE,
1611
"[%s]: invalid symlink entry in dir: %s",
1613
parsed_url.url_path));
1616
if(realpath(parsed_url.url_path, symlink_target) == NULL)
1618
result = globus_error_put(
1619
globus_error_construct_string(
1620
GLOBUS_GASS_COPY_MODULE,
1622
"[%s]: unable to find path of symlink in dir: %s",
1624
parsed_url.url_path));
1629
if(S_ISDIR(stat_buf.st_mode))
1631
type = GLOBUS_GASS_COPY_GLOB_ENTRY_DIR;
1635
type = GLOBUS_GASS_COPY_GLOB_ENTRY_FILE;
1642
(unsigned long) stat_buf.st_dev,
1643
(unsigned long) stat_buf.st_ino);
1645
stat_info->type = type;
1646
stat_info->unique_id = globus_libc_strdup(unique_id);
1647
stat_info->symlink_target = *symlink_target ?
1648
globus_libc_strdup(symlink_target) : NULL;
1649
stat_info->mode = stat_buf.st_mode & 07777;
1650
stat_info->mdtm = (int) stat_buf.st_mtime;
1651
stat_info->size = stat_buf.st_size;
1653
globus_url_destroy(&parsed_url);
1654
return GLOBUS_SUCCESS;
1658
globus_url_destroy(&parsed_url);
1667
globus_gass_copy_stat(
1668
globus_gass_copy_handle_t * handle,
1670
globus_gass_copy_attr_t * attr,
1671
globus_gass_copy_glob_stat_t * stat_info)
1673
static char * myname = "globus_gass_copy_stat";
1675
globus_result_t result;
1676
globus_gass_copy_url_mode_t url_mode;
1678
result = globus_gass_copy_get_url_mode(url, &url_mode);
1679
if(result != GLOBUS_SUCCESS)
1684
if(url_mode == GLOBUS_GASS_COPY_URL_MODE_FTP)
1686
result = globus_l_gass_copy_stat_ftp(handle, url, attr, stat_info);
1688
if(result != GLOBUS_SUCCESS)
1693
else if(url_mode == GLOBUS_GASS_COPY_URL_MODE_IO)
1695
result = globus_l_gass_copy_stat_file(url, stat_info);
1696
if(result != GLOBUS_SUCCESS)
1703
result = globus_error_put(
1704
globus_error_construct_string(
1705
GLOBUS_GASS_COPY_MODULE,
1707
"[%s]: unsupported URL scheme: %s",
1713
return GLOBUS_SUCCESS;
1278
1722
globus_result_t
1279
1723
globus_gass_copy_mkdir(
1280
1724
globus_gass_copy_handle_t * handle,
1912
globus_l_gass_copy_cksm_ftp(
1913
globus_gass_copy_handle_t * handle,
1915
globus_gass_copy_attr_t * attr,
1917
globus_off_t offset,
1918
globus_off_t length,
1919
const char * algorithm)
1921
globus_result_t result;
1922
globus_l_gass_copy_glob_info_t info;
1924
info.callbacks_left = 1;
1925
info.err = GLOBUS_NULL;
1927
globus_mutex_init(&info.mutex, GLOBUS_NULL);
1928
globus_cond_init(&info.cond, GLOBUS_NULL);
1931
result = globus_ftp_client_cksm(
1932
&handle->ftp_handle,
1939
globus_l_gass_copy_ftp_client_op_done_callback,
1941
if(result != GLOBUS_SUCCESS)
1946
globus_mutex_lock(&info.mutex);
1947
while(info.callbacks_left > 0)
1949
globus_cond_wait(&info.cond, &info.mutex);
1951
globus_mutex_unlock(&info.mutex);
1956
result = globus_error_put(info.err);
1957
info.err = GLOBUS_NULL;
1960
globus_cond_destroy(&info.cond);
1961
globus_mutex_destroy(&info.mutex);
1962
return GLOBUS_SUCCESS;
1964
globus_cond_destroy(&info.cond);
1965
globus_mutex_destroy(&info.mutex);
1970
#define GASS_COPY_CKSM_BUFSIZE 1024*1024
1974
globus_l_gass_copy_cksm_file(
1977
globus_off_t offset,
1978
globus_off_t length,
1979
const char * algorithm)
1981
char * myname = "globus_l_gass_copy_cksm_file";
1983
globus_url_t parsed_url;
1984
globus_result_t result;
1989
unsigned char md[MD5_DIGEST_LENGTH];
1990
char md5sum[MD5_DIGEST_LENGTH * 2 + 1];
1991
char buf[GASS_COPY_CKSM_BUFSIZE];
1997
globus_off_t read_left;
1999
rc = globus_url_parse_loose(url, &parsed_url);
2002
result = globus_error_put(
2003
globus_error_construct_string(
2004
GLOBUS_GASS_COPY_MODULE,
2006
"[%s]: error parsing url: "
2007
"globus_url_parse returned %d",
2013
if(parsed_url.url_path == GLOBUS_NULL)
2015
result = globus_error_put(
2016
globus_error_construct_string(
2017
GLOBUS_GASS_COPY_MODULE,
2019
"[%s]: error parsing url: "
2028
count = (read_left > GASS_COPY_CKSM_BUFSIZE) ?
2029
GASS_COPY_CKSM_BUFSIZE : read_left;
2033
count = GASS_COPY_CKSM_BUFSIZE;
2036
fd = open(parsed_url.url_path, O_RDONLY);
2042
if (lseek(fd, offset, SEEK_SET) == -1)
2049
while((n = read(fd, buf, count)) > 0)
2054
count = (read_left > GASS_COPY_CKSM_BUFSIZE) ? GASS_COPY_CKSM_BUFSIZE : read_left;
2057
MD5_Update(&mdctx, buf, n);
2060
MD5_Final(md, &mdctx);
2065
for(i = 0; i < MD5_DIGEST_LENGTH; i++)
2067
sprintf(md5ptr, "%02x", md[i]);
2073
strncpy(cksm, md5sum, sizeof(md5sum));
2075
globus_url_destroy(&parsed_url);
2077
return GLOBUS_SUCCESS;
2082
globus_url_destroy(&parsed_url);
2089
/* Determine the type of the url and call checksum functions above accordingly
2093
globus_gass_copy_cksm(
2094
globus_gass_copy_handle_t * handle,
2096
globus_gass_copy_attr_t * attr,
2097
globus_off_t offset,
2098
globus_off_t length,
2099
const char * algorithm,
2102
static char * myname = "globus_gass_copy_cksm";
2104
globus_result_t result;
2105
globus_gass_copy_url_mode_t url_mode;
2107
result = globus_gass_copy_get_url_mode(url, &url_mode);
2109
if(result != GLOBUS_SUCCESS)
2114
if(url_mode == GLOBUS_GASS_COPY_URL_MODE_FTP)
2116
result = globus_l_gass_copy_cksm_ftp(
2125
if(result != GLOBUS_SUCCESS)
2127
goto error_ftp_cksm;
2130
else if(url_mode == GLOBUS_GASS_COPY_URL_MODE_IO)
2132
result = globus_l_gass_copy_cksm_file(
2138
if(result != GLOBUS_SUCCESS)
2140
goto error_file_cksm;
2145
result = globus_error_put(
2146
globus_error_construct_string(
2147
GLOBUS_GASS_COPY_MODULE,
2149
"[%s]: unsupported URL scheme: %s",
2155
return GLOBUS_SUCCESS;