Bugzilla – Attachment 2332 Details for
Bug 2152
Simplify handling of sftp(1) command flags
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Use a struct to pass command flags
sftp-flags.diff (text/plain), 18.37 KB, created by
Iain Morgan
on 2013-09-13 06:54:23 AEST
(
hide
)
Description:
Use a struct to pass command flags
Filename:
MIME Type:
Creator:
Iain Morgan
Created:
2013-09-13 06:54:23 AEST
Size:
18.37 KB
patch
obsolete
>Index: sftp-client.c >=================================================================== >RCS file: /cvs/openssh/sftp-client.c,v >retrieving revision 1.115 >diff -u -r1.115 sftp-client.c >--- sftp-client.c 20 Aug 2013 16:42:13 -0000 1.115 >+++ sftp-client.c 12 Sep 2013 19:16:20 -0000 >@@ -991,7 +991,7 @@ > > int > do_download(struct sftp_conn *conn, char *remote_path, char *local_path, >- Attrib *a, int pflag, int resume) >+ Attrib *a, SftpFlags *flags) > { > Attrib junk; > Buffer msg; >@@ -1054,15 +1054,15 @@ > return(-1); > } > >- local_fd = open(local_path, O_WRONLY | O_CREAT | (resume ? 0 : O_TRUNC), >- mode | S_IWUSR); >+ local_fd = open(local_path, O_WRONLY | O_CREAT | >+ (flags->append ? 0 : O_TRUNC), mode | S_IWUSR); > if (local_fd == -1) { > error("Couldn't open local file \"%s\" for writing: %s", > local_path, strerror(errno)); > goto fail; > } > offset = highwater = 0; >- if (resume) { >+ if (flags->append) { > if (fstat(local_fd, &st) == -1) { > error("Unable to stat local file \"%s\": %s", > local_path, strerror(errno)); >@@ -1212,7 +1212,7 @@ > fatal("Transfer complete, but requests still in queue"); > /* Truncate at highest contiguous point to avoid holes on interrupt */ > if (read_error || write_error || interrupted) { >- if (reordered && resume) { >+ if (reordered && flags->append) { > error("Unable to resume download of \"%s\": " > "server reordered requests", local_path); > } >@@ -1235,13 +1235,13 @@ > status = -1; > /* Override umask and utimes if asked */ > #ifdef HAVE_FCHMOD >- if (pflag && fchmod(local_fd, mode) == -1) >+ if (flags->preserve && fchmod(local_fd, mode) == -1) > #else >- if (pflag && chmod(local_path, mode) == -1) >+ if (flags->preserve && chmod(local_path, mode) == -1) > #endif /* HAVE_FCHMOD */ > error("Couldn't set mode on \"%s\": %s", local_path, > strerror(errno)); >- if (pflag && (a->flags & SSH2_FILEXFER_ATTR_ACMODTIME)) { >+ if (flags->preserve && (a->flags & SSH2_FILEXFER_ATTR_ACMODTIME)) { > struct timeval tv[2]; > tv[0].tv_sec = a->atime; > tv[1].tv_sec = a->mtime; >@@ -1260,7 +1260,7 @@ > > static int > download_dir_internal(struct sftp_conn *conn, char *src, char *dst, >- Attrib *dirattrib, int pflag, int printflag, int depth, int resume) >+ Attrib *dirattrib, SftpFlags *flags, int printflag, int depth) > { > int i, ret = 0; > SFTP_DIRENT **dir_entries; >@@ -1312,12 +1312,12 @@ > strcmp(filename, "..") == 0) > continue; > if (download_dir_internal(conn, new_src, new_dst, >- &(dir_entries[i]->a), pflag, printflag, >- depth + 1, resume) == -1) >+ &(dir_entries[i]->a), flags, printflag, >+ depth + 1) == -1) > ret = -1; > } else if (S_ISREG(dir_entries[i]->a.perm) ) { > if (do_download(conn, new_src, new_dst, >- &(dir_entries[i]->a), pflag, resume) == -1) { >+ &(dir_entries[i]->a), flags) == -1) { > error("Download of file %s to %s failed", > new_src, new_dst); > ret = -1; >@@ -1329,7 +1329,7 @@ > free(new_src); > } > >- if (pflag) { >+ if (flags->preserve) { > if (dirattrib->flags & SSH2_FILEXFER_ATTR_ACMODTIME) { > struct timeval tv[2]; > tv[0].tv_sec = dirattrib->atime; >@@ -1350,7 +1350,7 @@ > > int > download_dir(struct sftp_conn *conn, char *src, char *dst, >- Attrib *dirattrib, int pflag, int printflag, int resume) >+ Attrib *dirattrib, SftpFlags *flags, int printflag) > { > char *src_canon; > int ret; >@@ -1361,14 +1361,14 @@ > } > > ret = download_dir_internal(conn, src_canon, dst, >- dirattrib, pflag, printflag, 0, resume); >+ dirattrib, flags, printflag, 0); > free(src_canon); > return ret; > } > > int > do_upload(struct sftp_conn *conn, char *local_path, char *remote_path, >- int pflag) >+ SftpFlags *flags) > { > int local_fd; > int status = SSH2_FX_OK; >@@ -1412,7 +1412,7 @@ > a.flags &= ~SSH2_FILEXFER_ATTR_SIZE; > a.flags &= ~SSH2_FILEXFER_ATTR_UIDGID; > a.perm &= 0777; >- if (!pflag) >+ if (!flags->preserve) > a.flags &= ~SSH2_FILEXFER_ATTR_ACMODTIME; > > buffer_init(&msg); >@@ -1541,7 +1541,7 @@ > } > > /* Override umask and utimes if asked */ >- if (pflag) >+ if (flags->preserve) > do_fsetstat(conn, handle, handle_len, &a); > > if (do_close(conn, handle, handle_len) != SSH2_FX_OK) >@@ -1553,7 +1553,7 @@ > > static int > upload_dir_internal(struct sftp_conn *conn, char *src, char *dst, >- int pflag, int printflag, int depth) >+ SftpFlags *flags, int printflag, int depth) > { > int ret = 0, status; > DIR *dirp; >@@ -1584,7 +1584,7 @@ > a.flags &= ~SSH2_FILEXFER_ATTR_SIZE; > a.flags &= ~SSH2_FILEXFER_ATTR_UIDGID; > a.perm &= 01777; >- if (!pflag) >+ if (!flags->preserve) > a.flags &= ~SSH2_FILEXFER_ATTR_ACMODTIME; > > status = do_mkdir(conn, dst, &a, 0); >@@ -1622,10 +1622,10 @@ > continue; > > if (upload_dir_internal(conn, new_src, new_dst, >- pflag, printflag, depth + 1) == -1) >+ flags, printflag, depth + 1) == -1) > ret = -1; > } else if (S_ISREG(sb.st_mode)) { >- if (do_upload(conn, new_src, new_dst, pflag) == -1) { >+ if (do_upload(conn, new_src, new_dst, flags) == -1) { > error("Uploading of file %s to %s failed!", > new_src, new_dst); > ret = -1; >@@ -1643,8 +1643,8 @@ > } > > int >-upload_dir(struct sftp_conn *conn, char *src, char *dst, int printflag, >- int pflag) >+upload_dir(struct sftp_conn *conn, char *src, char *dst, >+ SftpFlags *flags, int printflag) > { > char *dst_canon; > int ret; >@@ -1654,7 +1654,7 @@ > return -1; > } > >- ret = upload_dir_internal(conn, src, dst_canon, pflag, printflag, 0); >+ ret = upload_dir_internal(conn, src, dst_canon, flags, printflag, 0); > free(dst_canon); > return ret; > } >Index: sftp-client.h >=================================================================== >RCS file: /cvs/openssh/sftp-client.h,v >retrieving revision 1.22 >diff -u -r1.22 sftp-client.h >--- sftp-client.h 20 Aug 2013 16:41:15 -0000 1.22 >+++ sftp-client.h 12 Sep 2013 19:16:20 -0000 >@@ -29,6 +29,18 @@ > Attrib a; > }; > >+typedef struct { >+ int append; >+ int human_readable; >+ int ignore_errors; >+ int inodes; >+ int legacy_rename; >+ int ls_opts; >+ int preserve; >+ int recurse; >+ int symlink; >+} SftpFlags; >+ > /* > * Used for statvfs responses on the wire from the server, because the > * server's native format may be larger than the client's. >@@ -106,25 +118,25 @@ > * Download 'remote_path' to 'local_path'. Preserve permissions and times > * if 'pflag' is set > */ >-int do_download(struct sftp_conn *, char *, char *, Attrib *, int, int); >+int do_download(struct sftp_conn *, char *, char *, Attrib *, SftpFlags *); > > /* > * Recursively download 'remote_directory' to 'local_directory'. Preserve > * times if 'pflag' is set > */ >-int download_dir(struct sftp_conn *, char *, char *, Attrib *, int, int, int); >+int download_dir(struct sftp_conn *, char *, char *, Attrib *, SftpFlags *, int); > > /* > * Upload 'local_path' to 'remote_path'. Preserve permissions and times > * if 'pflag' is set > */ >-int do_upload(struct sftp_conn *, char *, char *, int); >+int do_upload(struct sftp_conn *, char *, char *, SftpFlags *); > > /* > * Recursively upload 'local_directory' to 'remote_directory'. Preserve > * times if 'pflag' is set > */ >-int upload_dir(struct sftp_conn *, char *, char *, int, int); >+int upload_dir(struct sftp_conn *, char *, char *, SftpFlags *, int); > > /* Concatenate paths, taking care of slashes. Caller must free result. */ > char *path_append(char *, char *); >Index: sftp.c >=================================================================== >RCS file: /cvs/openssh/sftp.c,v >retrieving revision 1.167 >diff -u -r1.167 sftp.c >--- sftp.c 20 Aug 2013 16:42:35 -0000 1.167 >+++ sftp.c 12 Sep 2013 19:16:21 -0000 >@@ -358,8 +358,7 @@ > } > > static int >-parse_getput_flags(const char *cmd, char **argv, int argc, >- int *aflag, int *pflag, int *rflag) >+parse_getput_flags(const char *cmd, char **argv, int argc, SftpFlags *flags) > { > extern int opterr, optind, optopt, optreset; > int ch; >@@ -367,19 +366,18 @@ > optind = optreset = 1; > opterr = 0; > >- *aflag = *rflag = *pflag = 0; > while ((ch = getopt(argc, argv, "aPpRr")) != -1) { > switch (ch) { > case 'a': >- *aflag = 1; >+ flags->append = 1; > break; > case 'p': > case 'P': >- *pflag = 1; >+ flags->preserve = 1; > break; > case 'r': > case 'R': >- *rflag = 1; >+ flags->recurse = 1; > break; > default: > error("%s: Invalid flag -%c", cmd, optopt); >@@ -391,7 +389,7 @@ > } > > static int >-parse_link_flags(const char *cmd, char **argv, int argc, int *sflag) >+parse_link_flags(const char *cmd, char **argv, int argc, SftpFlags *flags) > { > extern int opterr, optind, optopt, optreset; > int ch; >@@ -399,11 +397,10 @@ > optind = optreset = 1; > opterr = 0; > >- *sflag = 0; > while ((ch = getopt(argc, argv, "s")) != -1) { > switch (ch) { > case 's': >- *sflag = 1; >+ flags->symlink = 1; > break; > default: > error("%s: Invalid flag -%c", cmd, optopt); >@@ -415,7 +412,7 @@ > } > > static int >-parse_rename_flags(const char *cmd, char **argv, int argc, int *lflag) >+parse_rename_flags(const char *cmd, char **argv, int argc, SftpFlags *flags) > { > extern int opterr, optind, optopt, optreset; > int ch; >@@ -423,11 +420,10 @@ > optind = optreset = 1; > opterr = 0; > >- *lflag = 0; > while ((ch = getopt(argc, argv, "l")) != -1) { > switch (ch) { > case 'l': >- *lflag = 1; >+ flags->legacy_rename = 1; > break; > default: > error("%s: Invalid flag -%c", cmd, optopt); >@@ -439,7 +435,7 @@ > } > > static int >-parse_ls_flags(char **argv, int argc, int *lflag) >+parse_ls_flags(char **argv, int argc, SftpFlags *flags) > { > extern int opterr, optind, optopt, optreset; > int ch; >@@ -447,40 +443,40 @@ > optind = optreset = 1; > opterr = 0; > >- *lflag = LS_NAME_SORT; >+ flags->ls_opts = LS_NAME_SORT; > while ((ch = getopt(argc, argv, "1Safhlnrt")) != -1) { > switch (ch) { > case '1': >- *lflag &= ~VIEW_FLAGS; >- *lflag |= LS_SHORT_VIEW; >+ flags->ls_opts &= ~VIEW_FLAGS; >+ flags->ls_opts |= LS_SHORT_VIEW; > break; > case 'S': >- *lflag &= ~SORT_FLAGS; >- *lflag |= LS_SIZE_SORT; >+ flags->ls_opts &= ~SORT_FLAGS; >+ flags->ls_opts |= LS_SIZE_SORT; > break; > case 'a': >- *lflag |= LS_SHOW_ALL; >+ flags->ls_opts |= LS_SHOW_ALL; > break; > case 'f': >- *lflag &= ~SORT_FLAGS; >+ flags->ls_opts &= ~SORT_FLAGS; > break; > case 'h': >- *lflag |= LS_SI_UNITS; >+ flags->ls_opts |= LS_SI_UNITS; > break; > case 'l': >- *lflag &= ~LS_SHORT_VIEW; >- *lflag |= LS_LONG_VIEW; >+ flags->ls_opts &= ~LS_SHORT_VIEW; >+ flags->ls_opts |= LS_LONG_VIEW; > break; > case 'n': >- *lflag &= ~LS_SHORT_VIEW; >- *lflag |= LS_NUMERIC_VIEW|LS_LONG_VIEW; >+ flags->ls_opts &= ~LS_SHORT_VIEW; >+ flags->ls_opts |= LS_NUMERIC_VIEW|LS_LONG_VIEW; > break; > case 'r': >- *lflag |= LS_REVERSE_SORT; >+ flags->ls_opts |= LS_REVERSE_SORT; > break; > case 't': >- *lflag &= ~SORT_FLAGS; >- *lflag |= LS_TIME_SORT; >+ flags->ls_opts &= ~SORT_FLAGS; >+ flags->ls_opts |= LS_TIME_SORT; > break; > default: > error("ls: Invalid flag -%c", optopt); >@@ -492,7 +488,7 @@ > } > > static int >-parse_df_flags(const char *cmd, char **argv, int argc, int *hflag, int *iflag) >+parse_df_flags(const char *cmd, char **argv, int argc, SftpFlags *flags) > { > extern int opterr, optind, optopt, optreset; > int ch; >@@ -500,14 +496,13 @@ > optind = optreset = 1; > opterr = 0; > >- *hflag = *iflag = 0; > while ((ch = getopt(argc, argv, "hi")) != -1) { > switch (ch) { > case 'h': >- *hflag = 1; >+ flags->human_readable = 1; > break; > case 'i': >- *iflag = 1; >+ flags->inodes = 1; > break; > default: > error("%s: Invalid flag -%c", cmd, optopt); >@@ -574,7 +569,7 @@ > > static int > process_get(struct sftp_conn *conn, char *src, char *dst, char *pwd, >- int pflag, int rflag, int resume) >+ SftpFlags *flags) > { > char *abs_src = NULL; > char *abs_dst = NULL; >@@ -626,18 +621,17 @@ > } > free(tmp); > >- resume |= global_aflag; >- if (!quiet && resume) >+ if (!quiet && flags->append) > printf("Resuming %s to %s\n", g.gl_pathv[i], abs_dst); >- else if (!quiet && !resume) >+ else if (!quiet && !flags->append) > printf("Fetching %s to %s\n", g.gl_pathv[i], abs_dst); >- if (pathname_is_dir(g.gl_pathv[i]) && (rflag || global_rflag)) { >+ if (pathname_is_dir(g.gl_pathv[i]) && flags->recurse) { > if (download_dir(conn, g.gl_pathv[i], abs_dst, NULL, >- pflag || global_pflag, 1, resume) == -1) >+ flags, 1) == -1) > err = -1; > } else { > if (do_download(conn, g.gl_pathv[i], abs_dst, NULL, >- pflag || global_pflag, resume) == -1) >+ flags) == -1) > err = -1; > } > free(abs_dst); >@@ -652,7 +646,7 @@ > > static int > process_put(struct sftp_conn *conn, char *src, char *dst, char *pwd, >- int pflag, int rflag) >+ SftpFlags *flags) > { > char *tmp_dst = NULL; > char *abs_dst = NULL; >@@ -717,13 +711,13 @@ > > if (!quiet) > printf("Uploading %s to %s\n", g.gl_pathv[i], abs_dst); >- if (pathname_is_dir(g.gl_pathv[i]) && (rflag || global_rflag)) { >+ if (pathname_is_dir(g.gl_pathv[i]) && flags->recurse) { > if (upload_dir(conn, g.gl_pathv[i], abs_dst, >- pflag || global_pflag, 1) == -1) >+ flags, 1) == -1) > err = -1; > } else { > if (do_upload(conn, g.gl_pathv[i], abs_dst, >- pflag || global_pflag) == -1) >+ flags) == -1) > err = -1; > } > } >@@ -921,7 +915,7 @@ > } > > static int >-do_df(struct sftp_conn *conn, char *path, int hflag, int iflag) >+do_df(struct sftp_conn *conn, char *path, SftpFlags *flags) > { > struct sftp_statvfs st; > char s_used[FMT_SCALED_STRSIZE]; >@@ -932,7 +926,7 @@ > > if (do_statvfs(conn, path, &st, 1) == -1) > return -1; >- if (iflag) { >+ if (flags->inodes) { > ffree = st.f_files ? (100 * (st.f_files - st.f_ffree) / st.f_files) : 0; > printf(" Inodes Used Avail " > "(root) %%Capacity\n"); >@@ -941,7 +935,7 @@ > (unsigned long long)(st.f_files - st.f_ffree), > (unsigned long long)st.f_favail, > (unsigned long long)st.f_ffree, ffree); >- } else if (hflag) { >+ } else if (flags->human_readable) { > strlcpy(s_used, "error", sizeof(s_used)); > strlcpy(s_avail, "error", sizeof(s_avail)); > strlcpy(s_root, "error", sizeof(s_root)); >@@ -1176,8 +1170,7 @@ > } > > static int >-parse_args(const char **cpp, int *aflag, int *hflag, int *iflag, int *lflag, >- int *pflag, int *rflag, int *sflag, unsigned long *n_arg, >+parse_args(const char **cpp, SftpFlags *flags, unsigned long *n_arg, > char **path1, char **path2) > { > const char *cmd, *cp = *cpp; >@@ -1190,9 +1183,8 @@ > cp = cp + strspn(cp, WHITESPACE); > > /* Check for leading '-' (disable error processing) */ >- *iflag = 0; > if (*cp == '-') { >- *iflag = 1; >+ flags->ignore_errors = 1; > cp++; > cp = cp + strspn(cp, WHITESPACE); > } >@@ -1222,7 +1214,7 @@ > } > > /* Get arguments and parse flags */ >- *aflag = *lflag = *pflag = *rflag = *hflag = *n_arg = 0; >+ *n_arg = 0; > *path1 = *path2 = NULL; > optidx = 1; > switch (cmdnum) { >@@ -1230,7 +1222,7 @@ > case I_REGET: > case I_PUT: > if ((optidx = parse_getput_flags(cmd, argv, argc, >- aflag, pflag, rflag)) == -1) >+ flags)) == -1) > return -1; > /* Get first pathname (mandatory) */ > if (argc - optidx < 1) { >@@ -1245,18 +1237,18 @@ > /* Destination is not globbed */ > undo_glob_escape(*path2); > } >- if (*aflag && cmdnum == I_PUT) { >+ if (flags->append && cmdnum == I_PUT) { > /* XXX implement resume for uploads */ > error("Resume is not supported for uploads"); > return -1; > } > break; > case I_LINK: >- if ((optidx = parse_link_flags(cmd, argv, argc, sflag)) == -1) >+ if ((optidx = parse_link_flags(cmd, argv, argc, flags)) == -1) > return -1; > goto parse_two_paths; > case I_RENAME: >- if ((optidx = parse_rename_flags(cmd, argv, argc, lflag)) == -1) >+ if ((optidx = parse_rename_flags(cmd, argv, argc, flags)) == -1) > return -1; > goto parse_two_paths; > case I_SYMLINK: >@@ -1294,8 +1286,7 @@ > undo_glob_escape(*path1); > break; > case I_DF: >- if ((optidx = parse_df_flags(cmd, argv, argc, hflag, >- iflag)) == -1) >+ if ((optidx = parse_df_flags(cmd, argv, argc, flags)) == -1) > return -1; > /* Default to current directory if no path specified */ > if (argc - optidx < 1) >@@ -1306,7 +1297,7 @@ > } > break; > case I_LS: >- if ((optidx = parse_ls_flags(argv, argc, lflag)) == -1) >+ if ((optidx = parse_ls_flags(argv, argc, flags)) == -1) > return(-1); > /* Path is optional */ > if (argc - optidx > 0) >@@ -1371,8 +1362,7 @@ > int err_abort) > { > char *path1, *path2, *tmp; >- int aflag = 0, hflag = 0, iflag = 0, lflag = 0, pflag = 0; >- int rflag = 0, sflag = 0; >+ SftpFlags flags; > int cmdnum, i; > unsigned long n_arg = 0; > Attrib a, *aa; >@@ -1380,10 +1370,14 @@ > int err = 0; > glob_t g; > >+ bzero(&flags, sizeof(flags)); >+ if (global_aflag) flags.append = 1; >+ if (global_pflag) flags.preserve = 1; >+ if (global_rflag) flags.recurse = 1; >+ > path1 = path2 = NULL; >- cmdnum = parse_args(&cmd, &aflag, &hflag, &iflag, &lflag, &pflag, >- &rflag, &sflag, &n_arg, &path1, &path2); >- if (iflag != 0) >+ cmdnum = parse_args(&cmd, &flags, &n_arg, &path1, &path2); >+ if (flags.ignore_errors != 0) > err_abort = 0; > > memset(&g, 0, sizeof(g)); >@@ -1398,27 +1392,26 @@ > err = -1; > break; > case I_REGET: >- aflag = 1; >+ flags.append = 1; > /* FALLTHROUGH */ > case I_GET: >- err = process_get(conn, path1, path2, *pwd, pflag, >- rflag, aflag); >+ err = process_get(conn, path1, path2, *pwd, &flags); > break; > case I_PUT: >- err = process_put(conn, path1, path2, *pwd, pflag, rflag); >+ err = process_put(conn, path1, path2, *pwd, &flags); > break; > case I_RENAME: > path1 = make_absolute(path1, *pwd); > path2 = make_absolute(path2, *pwd); >- err = do_rename(conn, path1, path2, lflag); >+ err = do_rename(conn, path1, path2, flags.legacy_rename); > break; > case I_SYMLINK: >- sflag = 1; >+ flags.symlink = 1; > case I_LINK: >- if (!sflag) >+ if (!flags.symlink) > path1 = make_absolute(path1, *pwd); > path2 = make_absolute(path2, *pwd); >- err = (sflag ? do_symlink : do_hardlink)(conn, path1, path2); >+ err = (flags.symlink ? do_symlink : do_hardlink)(conn, path1, path2); > break; > case I_RM: > path1 = make_absolute(path1, *pwd); >@@ -1471,7 +1464,7 @@ > break; > case I_LS: > if (!path1) { >- do_ls_dir(conn, *pwd, *pwd, lflag); >+ do_ls_dir(conn, *pwd, *pwd, flags.ls_opts); > break; > } > >@@ -1481,14 +1474,14 @@ > tmp = *pwd; > > path1 = make_absolute(path1, *pwd); >- err = do_globbed_ls(conn, path1, tmp, lflag); >+ err = do_globbed_ls(conn, path1, tmp, flags.ls_opts); > break; > case I_DF: > /* Default to current directory if no path specified */ > if (path1 == NULL) > path1 = xstrdup(*pwd); > path1 = make_absolute(path1, *pwd); >- err = do_df(conn, path1, hflag, iflag); >+ err = do_df(conn, path1, &flags); > break; > case I_LCHDIR: > if (chdir(path1) == -1) {
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 2152
: 2332