Yes, the patch worked for me. I am now about to use wildcard expansion
with scp2. Thank you for the quick response, I appreciate it a lot.

-Shane


Sami Lehtinen wrote:
> 
> Try this patch. If it works for you, inform me, as then I will post it
> to the list. (I tested it myself allready, but I want to be sure.)
> 
> --snip snip--
> 
>   ------------------------------------------------------------------------
> diff -u --recursive /home/sjl/ssh-2.0.12.orig/apps/ssh/scp2.c 
>ssh-2.0.12/apps/ssh/scp2.c
> --- /home/sjl/ssh-2.0.12.orig/apps/ssh/scp2.c   Mon Jan 25 16:14:45 1999
> +++ ssh-2.0.12/apps/ssh/scp2.c  Fri Feb  5 05:27:08 1999
> @@ -848,6 +848,7 @@
>    temp_filename = &orig_filename[strlen(basepath)];
> 
>    hlp = strchr(temp_filename, '/');
> +
>    if (hlp)
>      {
>        *hlp = '\0';
> @@ -1033,6 +1034,7 @@
>    ScpFileLocation *new_loc_list_start = NULL, *new_loc_list_tail = NULL;
>    ScpFileLocation temp_loc = NULL;
>    SshFileHandle handle;
> +  Boolean found_expansion = FALSE;
> 
>    SSH_PRECOND(loc_list_start && loc_list_tail);
>    SSH_PRECOND((*loc_list_start)->next == NULL);
> @@ -1085,7 +1087,7 @@
>          {
>            char *full_filename;
>            int is_dir = 0;
> -
> +
>            /* Discard if "." or ".." */
>            if ((session->tmp_attributes->permissions & S_IFMT)
>                == S_IFDIR)
> @@ -1099,6 +1101,7 @@
>                if (!strcmp(tempdir, ".") || !strcmp(tempdir, ".."))
>                  continue;
> 
> +              found_expansion = TRUE;
>                is_dir = 1;
>              }
> 
> @@ -1125,6 +1128,7 @@
>                    list_tail = list_tail->next;
>                  }
> 
> +              found_expansion = TRUE;
>              }
> 
>            /* XXX what if permissions doesn't contain everything we need?
> @@ -1141,13 +1145,13 @@
>                if (session->preserve_flag)
>                  (*new_loc_list_start)->dir_attrs =
>                    ssh_file_attributes_dup(session->tmp_attributes);
> -
> 
>                if (!scp_recurse_directories(new_loc_list_start,
>                                             new_loc_list_tail,
>                                             session,
>                                             src_client))
>                  {
> +                  found_expansion = TRUE;
>                    /* Append. (If list's first item, initialize.) */
>                    if (list_start == NULL)
>                      {
> @@ -1163,7 +1167,6 @@
>                else
>                  {
>                    scp_file_location_free(*new_loc_list_start);
> -                  ssh_xfree(full_filename);
>                  }
>              }
>          }
> @@ -1173,6 +1176,8 @@
>    ssh_xfree(new_loc_list_start);
>    ssh_xfree(new_loc_list_tail);
> 
> +  if (!found_expansion)
> +    return TRUE;
> 
>    (*loc_list_start)->next = list_start;
>    *loc_list_tail = list_tail;
> @@ -1459,6 +1464,8 @@
>    /* Here we do wildcard-expansion*/
>    if (session->src_list && session->src_list->contains_wildcards)
>      {
> +      char *basepath = NULL;
> +
>        /* host has to be remote, not local, otherwise the shell
>           would've parsed the wildcards for us.*/
>        if (!session->src_list->host)
> @@ -1473,21 +1480,28 @@
> 
> 
>        to_be_deleted = session->src_list;
> -
> -      if (session->src_remote_client != NULL)
> +      if (!scp_set_src_is_remote_location_ok(session,
> +                                             session->src_list->host,
> +                                             session->src_list->port,
> +                                             session->src_list->user))
>          {
> -          ssh_file_client_destroy(session->src_remote_client);
> -          session->src_remote_client = NULL;
> +
> +          if (session->src_remote_client != NULL)
> +            {
> +              ssh_file_client_destroy(session->src_remote_client);
> +              session->src_remote_client = NULL;
> +            }
> +          session->src_remote_client =
> +            scp_open_remote_connection(session,
> +                                       session->src_list->host,
> +                                       session->src_list->user,
> +                                       session->src_list->port);
> +          scp_set_src_remote_location(session,
> +                                      session->src_list->host,
> +                                      session->src_list->port,
> +                                      session->src_list->user);
>          }
> -      session->src_remote_client =
> -        scp_open_remote_connection(session,
> -                                   session->src_list->host,
> -                                   session->src_list->user,
> -                                   session->src_list->port);
> -      scp_set_src_remote_location(session,
> -                                  session->src_list->host,
> -                                  session->src_list->port,
> -                                  session->src_list->user);
> +
>        if (session->src_remote_client == NULL)
>          ssh_fatal("Cannot reach the source location.");
>        scp_abort_if_remote_dead(session, session->src_remote_client);
> @@ -1495,10 +1509,15 @@
> 
>        *list_start =
>          scp_file_location_dup(session->src_list);
> +
> +      if (session->src_list->file[0] == '/')
> +        basepath = ssh_xstrdup("/");
> +      else
> +        basepath = ssh_xstrdup("");
> 
>        /* Expand. (NOTE: this is a recursive function) */
>        if (!scp_expand_wildcards(list_start, list_tail,
> -                                (char *)"", session->src_list->file,
> +                                basepath, session->src_list->file,
>                                  session))
>          {
>            tmp = session->src_list->next;
> @@ -1540,21 +1559,28 @@
>          {
> 
>            /* Open connection */
> -          if (session->src_remote_client != NULL)
> +          if (!scp_set_src_is_remote_location_ok(session,
> +                                                 session->src_list->host,
> +                                                 session->src_list->port,
> +                                                 session->src_list->user))
>              {
> -              ssh_file_client_destroy(session->src_remote_client);
> -              session->src_remote_client = NULL;
> -            }
> +              if (session->src_remote_client != NULL)
> +                {
> +                  ssh_file_client_destroy(session->src_remote_client);
> +                  session->src_remote_client = NULL;
> +                }
> 
> -          session->src_remote_client =
> -            scp_open_remote_connection(session,
> -                                       session->src_list->host,
> -                                       session->src_list->user,
> -                                       session->src_list->port);
> -          scp_set_src_remote_location(session,
> -                                      session->src_list->host,
> -                                      session->src_list->port,
> -                                      session->src_list->user);
> +              session->src_remote_client =
> +                scp_open_remote_connection(session,
> +                                           session->src_list->host,
> +                                           session->src_list->user,
> +                                           session->src_list->port);
> +              scp_set_src_remote_location(session,
> +                                          session->src_list->host,
> +                                          session->src_list->port,
> +                                          session->src_list->user);
> +            }
> +
>            if (session->src_remote_client == NULL)
>              ssh_fatal("Cannot reach the source location.");
>            scp_abort_if_remote_dead(session, session->src_remote_client);
> @@ -1670,9 +1696,16 @@
>                      current_src_location->
>                      file[strlen(session->
>                                  current_src_location->dir_mask)]);
> -
> -      if (*temp_filename == '/')
> +
> +      /* Remove excess '/' characters */
> +      for (;*temp_filename == '/';)
>          temp_filename++;
> +
> +      if (session->dst_location->file[strlen(session->dst_location->file) - 1]
> +          == '/')
> +        session->dst_location->file[strlen(session->dst_location->file) - 1] =
> +          '\0';
> +
> 
>        session->current_dst_file =
>          str_concat_3(session->dst_location->file,
> @@ -1685,6 +1718,11 @@
>    else if (session->dst_is_dir)
>      {
>        char *hlp = strrchr(session->current_src_location->file, '/');
> +      /* Remove excess '/' characters */
> +      if (session->dst_location->file[strlen(session->dst_location->file) - 1]
> +          == '/')
> +        session->dst_location->file[strlen(session->dst_location->file) - 1] =
> +          '\0';
> 
>        if (hlp == NULL)
>          {
> @@ -2793,14 +2831,6 @@
>            /* create needed directories */
>            if (session->current_src_location->is_dir == 1)
>              {
> -              /*              char *new_dir;*/
> -              /* If source file is directory, we make the dir and
> -                 continue. */
> -              /* xxx */
> -              /* session->tmp_attributes->flags = 0;
> -                 new_dir = str_concat_3(session->dst_location->file, "/",
> -                 session->current_dst_file);
> -              */
>                if (session->preserve_flag)
>                  {
>                    SSH_DEBUG(3, ("Preserve flag is on, but we don't have " \
> 
>   ------------------------------------------------------------------------
> --snap snap--
> 

-- 
Shane Ramey
Systems Administrator
BroadLink Communications, Inc.

Reply via email to