diff -X diffx.list -brwc gt502orig/source-trees/gass/copy/source/globus_url_copy.c gt502in/source-trees/gass/copy/source/globus_url_copy.c *** gt502orig/source-trees/gass/copy/source/globus_url_copy.c 2010-07-13 15:11:50.000000000 -0400 --- gt502in/source-trees/gass/copy/source/globus_url_copy.c 2010-08-09 23:28:35.000000000 -0400 *************** *** 51,56 **** --- 51,59 ---- #define GUC_URL_ENC_CHAR "#;:=+ ," + /* dgg patch: set dest file time to source file time : always? flagged? */ + #define DEST_SETTIME 1 + /****************************************************************************** Type definitions ******************************************************************************/ *************** *** 69,74 **** --- 72,80 ---- char * dst_url; globus_off_t offset; globus_off_t length; + #if DEST_SETTIME + int src_mtime; + #endif } globus_l_guc_src_dst_pair_t; typedef struct globus_l_guc_handle_s *************** *** 180,185 **** --- 186,194 ---- globus_off_t length; globus_bool_t needs_mkdir; globus_fifo_t matched_url_list; + #if DEST_SETTIME + int src_mtime; + #endif } globus_l_guc_transfer_t; typedef struct *************** *** 1502,1507 **** --- 1511,1519 ---- dst_url = url_pair->dst_url; transfer_info->offset = url_pair->offset; transfer_info->length = url_pair->length; + #if DEST_SETTIME + transfer_info->src_mtime= url_pair->src_mtime; + #endif globus_free(url_pair); *************** *** 1518,1523 **** --- 1530,1538 ---- transfer_info->dst_url = url_pair->dst_url; transfer_info->offset = url_pair->offset; transfer_info->length = url_pair->length; + #if DEST_SETTIME + transfer_info->src_mtime= url_pair->src_mtime; + #endif globus_free(url_pair); *************** *** 1611,1616 **** --- 1626,1634 ---- url_pair->dst_url = globus_libc_strdup(transfer_info->dst_url); url_pair->offset = transfer_info->offset; url_pair->length = transfer_info->length; + #if DEST_SETTIME + url_pair->src_mtime= transfer_info->src_mtime; + #endif globus_l_guc_enqueue_pair( &transfer_info->guc_info->user_url_list, *************** *** 1879,1884 **** --- 1897,1951 ---- } /* main() */ + /* dgg patch: set dest file time to source file time : always? flagged? */ + #if DEST_SETTIME + static + globus_result_t + globus_l_set_dest_timestamp( + globus_l_guc_transfer_t* transfer_info ) + { + #include + + char * dst_url; + globus_gass_copy_url_mode_t url_mode; + + dst_url= transfer_info->dst_url; + globus_gass_copy_get_url_mode(dst_url, &url_mode); + + if(url_mode == GLOBUS_GASS_COPY_URL_MODE_IO) { + /* globus_l_guc_url_info_t * src_urlinfo; */ + globus_url_t parsed_url; + int src_mtime; + + int rc = globus_url_parse(dst_url, &parsed_url); + + /* dest_hash wrong; need src_hash but dont have it ... */ + /* src_urlinfo = (globus_l_guc_url_info_t *) + globus_hashtable_lookup(&transfer_info->guc_info->dest_hash, transfer_info->src_url); */ + + /* src_urlinfo = (globus_l_guc_url_info_t *) + globus_fifo_peek(&transfer_info->matched_url_list); + */ + src_mtime= transfer_info->src_mtime; + + if(rc == 0 && src_mtime != -1 && src_mtime != 0) { + struct timeval times[2]; + times[0].tv_usec = times[1].tv_usec = 0; + times[0].tv_sec = time( ×[0].tv_sec); /* now ; actime */ + times[1].tv_sec = (time_t) src_mtime; + if (utimes(parsed_url.url_path, times) == -1) + ; /* error("Can't set times on \"%s\": %s", parsed_url.url_path, strerror(errno)); */ + + /* int fmode = src_urlinfo->mode; chmod(local_path,fmod); //.. not now */ + } + globus_url_destroy(&parsed_url); + + } + + return GLOBUS_SUCCESS; + } + #endif + /****************************************************************************** Function: globus_l_url_copy_monitor_callback() *************** *** 1910,1915 **** --- 1977,1985 ---- url_pair->dst_url = globus_libc_strdup(transfer_info->dst_url); url_pair->offset = transfer_info->offset; url_pair->length = transfer_info->length; + #if DEST_SETTIME + url_pair->src_mtime= transfer_info->src_mtime; + #endif globus_l_guc_enqueue_pair( &transfer_info->guc_info->user_url_list, *************** *** 1920,1925 **** --- 1990,2001 ---- g_monitor.err = globus_object_copy(error); } + #if DEST_SETTIME + /* dgg patch: set dest file time to source file time : always? flagged? */ + if(error == NULL) + globus_l_set_dest_timestamp(transfer_info); + #endif + transfer_info->guc_info->conc_outstanding--; transfer_info->handle->current_transfer = NULL; if(transfer_info->src_url) *************** *** 2318,2323 **** --- 2394,2402 ---- ent->dst_url = globus_libc_strdup(dst_url); ent->offset = offset; ent->length = length; + #if DEST_SETTIME + ent->src_mtime= -1; + #endif globus_fifo_enqueue(user_url_list, ent); } *************** *** 2674,2679 **** --- 2753,2761 ---- url_pair->dst_url = globus_libc_strdup(transfer_info->dst_url); url_pair->offset = transfer_info->offset; url_pair->length = transfer_info->length; + #if DEST_SETTIME + url_pair->src_mtime= transfer_info->src_mtime; + #endif globus_l_guc_enqueue_pair( &transfer_info->guc_info->user_url_list, *************** *** 2723,2728 **** --- 2805,2813 ---- url_pair->dst_url = globus_libc_strdup(transfer_info->dst_url); url_pair->offset = transfer_info->offset; url_pair->length = transfer_info->length; + #if DEST_SETTIME + url_pair->src_mtime= transfer_info->src_mtime; + #endif globus_l_guc_enqueue_pair( &guc_info->dump_url_list, *************** *** 4075,4080 **** --- 4160,4168 ---- ent->dst_url = guc_l_convert_file_url(argv[2]); ent->offset = guc_info->partial_offset; ent->length = guc_info->partial_length; + #if DEST_SETTIME + ent->src_mtime= -1; + #endif globus_fifo_enqueue(&guc_info->user_url_list, ent); } *************** *** 4508,4513 **** --- 4596,4604 ---- expanded_url_pair->dst_url = globus_libc_strdup(dst_url); expanded_url_pair->offset = user_url_pair->offset; expanded_url_pair->length = user_url_pair->length; + #if DEST_SETTIME + expanded_url_pair->src_mtime= user_url_pair->src_mtime; + #endif globus_fifo_enqueue( &guc_info->expanded_url_list, *************** *** 4548,4553 **** --- 4639,4647 ---- transfer_info.guc_info = guc_info; handle->current_transfer = &transfer_info; transfer_info.guc_info->conc_outstanding++; + #if DEST_SETTIME + transfer_info.src_mtime= user_url_pair->src_mtime; + #endif result = globus_l_guc_expand_single_url(&transfer_info); *************** *** 4566,4571 **** --- 4660,4668 ---- url_pair->dst_url = globus_libc_strdup(transfer_info.dst_url); url_pair->offset = transfer_info.offset; url_pair->length = transfer_info.length; + #if DEST_SETTIME + url_pair->src_mtime= transfer_info.src_mtime; + #endif globus_fifo_enqueue( &transfer_info.guc_info->user_url_list, *************** *** 4899,4904 **** --- 4996,5004 ---- expanded_url_pair->dst_url = matched_dest_url; expanded_url_pair->offset = transfer_info->offset; expanded_url_pair->length = transfer_info->length; + #if DEST_SETTIME + expanded_url_pair->src_mtime= matched_src_urlinfo->mdtm; /*transfer_info->src_mtime;*/ + #endif globus_l_guc_enqueue_pair( &guc_info->expanded_url_list, diff -X diffx.list -brwc gt502orig/source-trees/gridftp/server/src/globus_gridftp_server.c gt502in/source-trees/gridftp/server/src/globus_gridftp_server.c *** gt502orig/source-trees/gridftp/server/src/globus_gridftp_server.c 2010-07-09 13:21:53.000000000 -0400 --- gt502in/source-trees/gridftp/server/src/globus_gridftp_server.c 2010-08-15 17:28:03.000000000 -0400 *************** *** 600,605 **** --- 600,653 ---- globus_l_gfs_tcp_driver, GLOBUS_XIO_TCP_GET_REMOTE_NUMERIC_CONTACT, &remote_contact); + + /* dgg patch: convert contact string to host IP + allow_from 129.79. + >> this is from solaris10 .. sol10 adds this ::ffff: crap + contact is "[::ffff:129.79...." + log: Connection disallowed by configuration from: [::ffff:129.79.225.199]:57464 + log2: Connection disallowed by configuration from: ::ffff:129.79.225.199 + .. what is this ::ffff: stuff in IP host? ::ffff: may be a solaris getnameinfo() result? + >> this is from linux (no source code changes): + Connection disallowed by configuration from: 129.79.225.199:57941 + + log3: Connection disallowed by configuration from: 129.79.225.199 + >> now ok for sol10... + + sol10 problem is in globus_libc.c:globus_libc_getnameinfo() + maybe need new sol10 flag for getnameinfo(...,flags) + + >> ::ffff: is an IPv6 format, from sol getnameinfo(), + maybe flags AI_V4MAPPED or AI_ADDRCONFIG + prior call to getaddrinfo() seems to return IPv6 addr + flag globus_libc_getaddrinfo(hints.AI_ADDRCONFIG) ?? + + http://old.nabble.com/Upgrade-from-2.3.1-to-2.6.6-fail-td4296744.html + Re: Upgrade from 2.3.1 to 2.6.6 fail + + On Tue, May 09, 2006 at 05:30:24PM +0800, Foo Donald wrote: + > 2006/05/09 16:18:40 [5332] rsync denied on module autoupdate from unknown (::ffff:merlin's IP address) + + I'm guessing that your getnameinfo() function is returning an IPv4 + address in IPv6 format. The way rsync currently works, the address's + "family" must match the value in the config file, so you should add the + IPv6 version of an IP address to your "hosts allow" line to allow it to + be in either IPv4 or IPv6 format. For instance, if the IP address is + 1.2.3.4, the line would like like this: + + hosts allow = 1.2.3.4 ::ffff:1.2.3.4 + + */ + + if(result == GLOBUS_SUCCESS) { + /* dgg: hack but seems valid for solving this IPv6 prefix mess */ + char * hostip = remote_contact; + if(strncmp("[::ffff:",hostip,8) == 0) hostip += 8; + hostip = strdup(hostip); + globus_free(remote_contact); + remote_contact= hostip; + } + if(result != GLOBUS_SUCCESS) { globus_gfs_log_message( diff -X diffx.list -brwc gt502orig/source-trees/gridftp/server/src/globus_i_gfs_control.c gt502in/source-trees/gridftp/server/src/globus_i_gfs_control.c *** gt502orig/source-trees/gridftp/server/src/globus_i_gfs_control.c 2009-06-16 23:34:11.000000000 -0400 --- gt502in/source-trees/gridftp/server/src/globus_i_gfs_control.c 2010-08-04 00:00:34.000000000 -0400 *************** *** 286,291 **** --- 286,292 ---- int cwd_len; int sc; char * slash = "/"; + int is_anon_user= 0; /* dgg */ GlobusGFSName(globus_l_gfs_get_full_path); GlobusGFSDebugEnter(); *************** *** 295,300 **** --- 296,312 ---- result = GlobusGFSErrorGeneric("invalid pathname"); goto done; } + + #if 1 + /* dgg mods for anon user path always relative to instance->home_dir */ + if( globus_i_gfs_config_bool("allow_anonymous") + && globus_i_gfs_config_is_anonymous(instance->username) ) + { + is_anon_user= 1; + globus_gfs_log_message( GLOBUS_GFS_LOG_DUMP, "anonymous in_path=%s\n", in_path); + } + #endif + if(*in_path == '/') { strncpy(path, in_path, sizeof(path)); *************** *** 378,383 **** --- 390,426 ---- } path[MAXPATHLEN - 1] = '\0'; + #if 1 + /* dgg: do this AFTER all other path rewrites */ + if(is_anon_user) { + char * anondir; char * relpath; + anondir = globus_libc_strdup(instance->home_dir); /* should be anon dir? */ + relpath = globus_libc_strdup(path); + if( strncmp(relpath,anondir,strlen(anondir)) != 0 ) { + if(*relpath == '/') slash=""; else slash="/"; + snprintf( path, sizeof(path), "%s%s%s", anondir, slash, relpath); + } + globus_free(relpath); + + /* this removes /../ ; but needs check that path is inside anondir */ + relpath = globus_i_gsc_concat_path(instance->server_handle, path); + snprintf( path, sizeof(path), relpath); + globus_free(relpath); + if( strncmp(path,anondir,strlen(anondir)) != 0 ) { /* fail */ + globus_gfs_log_message(GLOBUS_GFS_LOG_WARN, + "%s: [CLIENT ERROR]: blocked bad anonymous path %s\n", + instance->remote_contact, path); + snprintf( path, sizeof(path), anondir); + /* this fail leaves client/server hanging .. instead return anondir */ + /* globus_free(anondir); + result = GlobusGFSErrorGeneric("invalid pathname"); + goto done; */ + } + globus_free(anondir); + globus_gfs_log_message( GLOBUS_GFS_LOG_DUMP, "anonymous out_path=%s\n", path); + } + #endif + *out_path = globus_libc_strdup(path); GlobusGFSDebugExit(); diff -X diffx.list -brwc gt502orig/source-trees/gridftp/server/src/globus_i_gfs_data.c gt502in/source-trees/gridftp/server/src/globus_i_gfs_data.c *** gt502orig/source-trees/gridftp/server/src/globus_i_gfs_data.c 2009-12-17 02:17:37.000000000 -0500 --- gt502in/source-trees/gridftp/server/src/globus_i_gfs_data.c 2010-08-03 23:58:25.000000000 -0400 *************** *** 5253,5264 **** if(globus_i_gfs_config_string("log_transfer")) { globus_i_gfs_log_transfer( op->node_count, op->data_handle->info.nstreams, &op->start_timeval, &end_timeval, ! op->remote_ip ? op->remote_ip : "0.0.0.0", op->data_handle->info.blocksize, op->data_handle->info.tcp_bufsize, info->pathname, --- 5253,5274 ---- if(globus_i_gfs_config_string("log_transfer")) { + /* dgg: udt does not set remote_ip? or does it set to 0.0.0.0 + substitute client_ip from contact hostname, see globus_xio_contact_parse()? + */ + char * remote_ip = NULL; + if(op->remote_ip && strcmp(op->remote_ip,"0.0.0.0")!=0 ) { + remote_ip= op->remote_ip; + } else if(op->session_handle->client_ip) { + remote_ip = op->session_handle->client_ip; + } else { remote_ip = "0.0.0.0"; } /* dgg */ + globus_i_gfs_log_transfer( op->node_count, op->data_handle->info.nstreams, &op->start_timeval, &end_timeval, ! remote_ip, /*dgg: op->remote_ip ? op->remote_ip : "0.0.0.0", */ op->data_handle->info.blocksize, op->data_handle->info.tcp_bufsize, info->pathname, diff -X diffx.list -brwc gt502orig/source-trees/xio/external_libs/udt/udt4/configure.ac gt502in/source-trees/xio/external_libs/udt/udt4/configure.ac *** gt502orig/source-trees/xio/external_libs/udt/udt4/configure.ac 2007-11-05 18:54:14.000000000 -0500 --- gt502in/source-trees/xio/external_libs/udt/udt4/configure.ac 2010-08-08 14:20:50.000000000 -0400 *************** *** 45,50 **** --- 45,55 ---- OS=LINUX;; aix | solaris ) OS=UNIX;; + # dgg patches + *solaris* ) + OS=UNIX;; + *darwin* ) + OS=OSX;; darwin | bsd | freebsd ) OS=BSD;; * ) *************** *** 67,73 **** CPPFLAGS="-I ../src -D$OS -D$ARCH $CPPFLAGS" AC_SUBST([LIBVER],[`echo AC_PACKAGE_VERSION | sed 's/\\./:/'`]) ! AC_SUBST([LIBUDT],[src/libudt.la]) AC_CONFIG_FILES([Makefile examples/Makefile src/Makefile]) AC_OUTPUT --- 72,78 ---- CPPFLAGS="-I ../src -D$OS -D$ARCH $CPPFLAGS" AC_SUBST([LIBVER],[`echo AC_PACKAGE_VERSION | sed 's/\\./:/'`]) ! AC_SUBST([LIBUDT],[src/libudt_gcc32dbg.la]) AC_CONFIG_FILES([Makefile examples/Makefile src/Makefile]) AC_OUTPUT diff -X diffx.list -brwc gt502orig/source-trees/xio/external_libs/udt/udt4/src/channel.cpp gt502in/source-trees/xio/external_libs/udt/udt4/src/channel.cpp *** gt502orig/source-trees/xio/external_libs/udt/udt4/src/channel.cpp 2010-07-13 09:09:14.000000000 -0400 --- gt502in/source-trees/xio/external_libs/udt/udt4/src/channel.cpp 2010-08-08 12:24:51.000000000 -0400 *************** *** 46,51 **** --- 46,52 ---- #include #include #include + #include #else #include #include *************** *** 138,144 **** void CChannel::setUDPSockOpt() { ! #if defined(BSD) || defined(OSX) // BSD system will fail setsockopt if the requested buffer size exceeds system maximum value int maxsize = 64000; if (0 != setsockopt(m_iSocket, SOL_SOCKET, SO_RCVBUF, (char*)&m_iRcvBufSize, sizeof(int))) --- 139,150 ---- void CChannel::setUDPSockOpt() { ! // dgg: when UNIX added here to BSD, sol10 server hangs; ! // when not added, dies with error ! // globus_xio: Connection setup failure: unable to create/configure UDP socket: No buffer space available. ! // but have system (tcp) buffer set above this limit .. check udp buffers? ! ! #if defined(BSD) || defined(OSX) || defined(UNIX) // BSD system will fail setsockopt if the requested buffer size exceeds system maximum value int maxsize = 64000; if (0 != setsockopt(m_iSocket, SOL_SOCKET, SO_RCVBUF, (char*)&m_iRcvBufSize, sizeof(int))) *************** *** 146,156 **** --- 152,190 ---- if (0 != setsockopt(m_iSocket, SOL_SOCKET, SO_SNDBUF, (char*)&m_iSndBufSize, sizeof(int))) setsockopt(m_iSocket, SOL_SOCKET, SO_SNDBUF, (char*)&maxsize, sizeof(int)); #else + #if 0 + { + /* dgg: got this result ; move sol10/UNIX to above choice; better would be interogate for proper max + channel::setUDPSockOpt err, SO_RCVBUF: 12288000 + channel::setUDPSockOpt err, SO_RCVBUF: 12288000 + .. see also + api.cpp: m.m_pChannel->setRcvBufSize(s->m_pUDT->m_iUDPRcvBufSize); + core.cpp: m_iUDPRcvBufSize = m_iRcvBufSize * m_iMSS; + // Default UDT configurations + m_iMSS = 1500; + m_iSndBufSize = 8192; + m_iRcvBufSize = 8192; //Rcv buffer MUST NOT be bigger than Flight Flag size + m_iUDPSndBufSize = 65536; + m_iUDPRcvBufSize = m_iRcvBufSize * m_iMSS; + == 12288000 as seen, 12 Mb .. too big? + */ + int err=0; + if ( m_iRcvBufSize > 65536) m_iRcvBufSize = 65536; /* dgg test patch */ + if(0 != setsockopt(m_iSocket, SOL_SOCKET, SO_RCVBUF, (char*)&m_iRcvBufSize, sizeof(int))) + { err=1; FILE *f= fopen("/tmp/udt.debug","a"); + fprintf(f,"channel::setUDPSockOpt err, SO_RCVBUF: %d\n", m_iRcvBufSize); fclose(f); } + if(0 != setsockopt(m_iSocket, SOL_SOCKET, SO_SNDBUF, (char*)&m_iSndBufSize, sizeof(int))) + { err=1; FILE *f= fopen("/tmp/udt.debug","a"); + fprintf(f,"channel::setUDPSockOpt err, SO_SNDBUF: %d\n", m_iSndBufSize); fclose(f); } + if(err != 0) throw CUDTException(1, 3, NET_ERROR); + } + #else // for other systems, if requested is greated than maximum, the maximum value will be automactally used if ((0 != setsockopt(m_iSocket, SOL_SOCKET, SO_RCVBUF, (char*)&m_iRcvBufSize, sizeof(int))) || (0 != setsockopt(m_iSocket, SOL_SOCKET, SO_SNDBUF, (char*)&m_iSndBufSize, sizeof(int)))) throw CUDTException(1, 3, NET_ERROR); #endif + #endif timeval tv; tv.tv_sec = 0; *************** *** 164,170 **** #ifdef UNIX // Set non-blocking I/O ! // UNIX does not support SO_RCVTIMEO int opts = fcntl(m_iSocket, F_GETFL); if (-1 == fcntl(m_iSocket, F_SETFL, opts | O_NONBLOCK)) throw CUDTException(1, 3, NET_ERROR); --- 198,205 ---- #ifdef UNIX // Set non-blocking I/O ! // UNIX does not support SO_RCVTIMEO // dgg: sol10 for UDP this is true ! // SO_RCVTIMEO: unable to create/configure UDP socket: Option not supported by protocol. int opts = fcntl(m_iSocket, F_GETFL); if (-1 == fcntl(m_iSocket, F_SETFL, opts | O_NONBLOCK)) throw CUDTException(1, 3, NET_ERROR); *************** *** 249,256 **** --- 284,304 ---- #ifndef WIN32 msghdr mh; + #if defined(Not_OSX) /* dgg is this right? typedef is char*/ + /* dgg: this may be what fails on sol10, osx: sendmsg/recvmsg + try alt forms? no cant, need iovec in msghdr + ssize_t send(int s, const void *msg, size_t len, int flags); + ssize_t sendto(int s, const void *msg, size_t len, int flags, + const struct sockaddr *to, int tolen); + */ + mh.msg_name = (char*)addr->sa_data; + mh.msg_namelen = addr->sa_len; + /* mh.msg_name = (char*)addr; + mh.msg_namelen = (AF_INET == m_iIPversion) ? sizeof(sockaddr_in) : sizeof(sockaddr_in6); */ + #else mh.msg_name = (sockaddr*)addr; mh.msg_namelen = (AF_INET == m_iIPversion) ? sizeof(sockaddr_in) : sizeof(sockaddr_in6); + #endif mh.msg_iov = (iovec*)packet.m_PacketVector; mh.msg_iovlen = 2; mh.msg_control = NULL; *************** *** 258,263 **** --- 306,313 ---- mh.msg_flags = 0; int res = sendmsg(m_iSocket, &mh, 0); + //if(res < 0) std::cout << "CChannel::sendto errno=" << errno << '\n'; // dgg debug + #else DWORD size = CPacket::m_iPktHdrSize + packet.getLength(); int addrsize = (AF_INET == m_iIPversion) ? sizeof(sockaddr_in) : sizeof(sockaddr_in6); *************** *** 279,284 **** --- 329,335 ---- for (int l = 0, n = packet.getLength() / 4; l < n; ++ l) *((uint32_t *)packet.m_pcData + l) = ntohl(*((uint32_t *)packet.m_pcData + l)); + return res; } *************** *** 286,293 **** --- 337,351 ---- { #ifndef WIN32 msghdr mh; + #if defined(Not_OSX) /* dgg is this right? typedef is char*/ + mh.msg_name = (char*)addr->sa_data; + mh.msg_namelen = addr->sa_len; + /* mh.msg_name = (char*)addr; + mh.msg_namelen = (AF_INET == m_iIPversion) ? sizeof(sockaddr_in) : sizeof(sockaddr_in6); */ + #else mh.msg_name = addr; mh.msg_namelen = (AF_INET == m_iIPversion) ? sizeof(sockaddr_in) : sizeof(sockaddr_in6); + #endif mh.msg_iov = packet.m_PacketVector; mh.msg_iovlen = 2; mh.msg_control = NULL; *************** *** 305,310 **** --- 363,370 ---- #endif int res = recvmsg(m_iSocket, &mh, 0); + //if(res < 0) std::cout << "CChannel::recvfrom errno=" << errno << '\n'; // dgg debug + #else DWORD size = CPacket::m_iPktHdrSize + packet.getLength(); DWORD flag = 0;