Lines Matching +full:sig +full:- +full:dir +full:- +full:cmd
3 * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
69 #include "sftp-common.h"
70 #include "sftp-client.h"
71 #include "sftp-usergroup.h"
80 static volatile pid_t sshpid = -1;
114 int (*)(const char *, int), glob_t *); /* proto for sftp-glob.c */
122 #define LS_LONG_VIEW 0x0001 /* Full view ala ls -l */
123 #define LS_SHORT_VIEW 0x0002 /* Single row view ala ls -1 */
167 struct CMD { struct
179 static const struct CMD cmds[] = { argument
189 { "dir", I_LS, REMOTE, NOARGS },
217 { NULL, -1, -1, -1 }
240 while (waitpid(sshpid, NULL, WUNTRACED) == -1 && errno == EINTR) in suspchild()
253 (void)write(STDERR_FILENO, msg, sizeof(msg) - 1); in cmd_interrupt()
265 sigchld_handler(int sig) in sigchld_handler() argument
272 while ((pid = waitpid(sshpid, NULL, WNOHANG)) == -1 && errno == EINTR) in sigchld_handler()
276 (void)write(STDERR_FILENO, msg, sizeof(msg) - 1); in sigchld_handler()
277 sshpid = -1; in sigchld_handler()
289 "chgrp [-h] grp path Change group of file 'path' to 'grp'\n" in help()
290 "chmod [-h] mode path Change permissions of file 'path' to 'mode'\n" in help()
291 "chown [-h] own path Change owner of file 'path' to 'own'\n" in help()
294 "df [-hi] [path] Display statistics for current directory or\n" in help()
297 "get [-afpR] remote [local] Download file\n" in help()
300 "lls [ls-options [path]] Display local directory listing\n" in help()
302 "ln [-s] oldpath newpath Link remote file (-s for symlink)\n" in help()
304 "ls [-1afhlnrSt] [path] Display remote directory listing\n" in help()
308 "put [-afpR] local [remote] Upload file\n" in help()
311 "reget [-fpR] remote [local] Resume download file\n" in help()
313 "reput [-fpR] local [remote] Resume upload file\n" in help()
336 if ((pid = fork()) == -1) in local_do_shell()
340 /* XXX: child has pipe fds to ssh subproc open - issue? */ in local_do_shell()
342 debug3("Executing %s -c \"%s\"", shell, args); in local_do_shell()
343 execl(shell, shell, "-c", args, (char *)NULL); in local_do_shell()
352 while (waitpid(pid, &status, 0) == -1) in local_do_shell()
370 /* XXX: quoting - rip quoting code from ftp? */ in local_do_ls()
388 if (strip[len - 1] != '/' && path[len] == '/') in path_strip()
397 parse_getput_flags(const char *cmd, char **argv, int argc, in parse_getput_flags() argument
407 while ((ch = getopt(argc, argv, "afPpRr")) != -1) { in parse_getput_flags()
424 error("%s: Invalid flag -%c", cmd, optopt); in parse_getput_flags()
425 return -1; in parse_getput_flags()
433 parse_link_flags(const char *cmd, char **argv, int argc, int *sflag) in parse_link_flags() argument
442 while ((ch = getopt(argc, argv, "s")) != -1) { in parse_link_flags()
448 error("%s: Invalid flag -%c", cmd, optopt); in parse_link_flags()
449 return -1; in parse_link_flags()
457 parse_rename_flags(const char *cmd, char **argv, int argc, int *lflag) in parse_rename_flags() argument
466 while ((ch = getopt(argc, argv, "l")) != -1) { in parse_rename_flags()
472 error("%s: Invalid flag -%c", cmd, optopt); in parse_rename_flags()
473 return -1; in parse_rename_flags()
490 while ((ch = getopt(argc, argv, "1Safhlnrt")) != -1) { in parse_ls_flags()
525 error("ls: Invalid flag -%c", optopt); in parse_ls_flags()
526 return -1; in parse_ls_flags()
534 parse_df_flags(const char *cmd, char **argv, int argc, int *hflag, int *iflag) in parse_df_flags() argument
543 while ((ch = getopt(argc, argv, "hi")) != -1) { in parse_df_flags()
552 error("%s: Invalid flag -%c", cmd, optopt); in parse_df_flags()
553 return -1; in parse_df_flags()
561 parse_ch_flags(const char *cmd, char **argv, int argc, int *hflag) in parse_ch_flags() argument
570 while ((ch = getopt(argc, argv, "h")) != -1) { in parse_ch_flags()
576 error("%s: Invalid flag -%c", cmd, optopt); in parse_ch_flags()
577 return -1; in parse_ch_flags()
585 parse_no_flags(const char *cmd, char **argv, int argc) in parse_no_flags() argument
593 while ((ch = getopt(argc, argv, "")) != -1) { in parse_no_flags()
596 error("%s: Invalid flag -%c", cmd, optopt); in parse_no_flags()
597 return -1; in parse_no_flags()
643 if (stat(path, &sb) == -1) in local_is_dir()
666 err = -1; in process_get()
677 err = -1; in process_get()
686 err = -1; in process_get()
715 fflag || global_fflag, 0, 0) == -1) in process_get()
716 err = -1; in process_get()
720 fflag || global_fflag, 0) == -1) in process_get()
721 err = -1; in process_get()
754 err = -1; in process_put()
766 err = -1; in process_put()
771 if (stat(g.gl_pathv[i], &sb) == -1) { in process_put()
772 err = -1; in process_put()
781 err = -1; in process_put()
812 fflag || global_fflag, 0, 0) == -1) in process_put()
813 err = -1; in process_put()
817 fflag || global_fflag, 0) == -1) in process_put()
818 err = -1; in process_put()
834 int rmul = sort_flag & LS_REVERSE_SORT ? -1 : 1; in sdirent_comp()
836 #define NCMP(a,b) (a == b ? 0 : (a < b ? 1 : -1)) in sdirent_comp()
838 return (rmul * strcmp(a->filename, b->filename)); in sdirent_comp()
840 return (rmul * NCMP(a->a.mtime, b->a.mtime)); in sdirent_comp()
842 return (rmul * NCMP(a->a.size, b->a.size)); in sdirent_comp()
866 if (d[n]->filename[0] != '.' || (lflag & LS_SHOW_ALL)) in do_ls_dir()
867 m = MAXIMUM(m, strlen(d[n]->filename)); in do_ls_dir()
875 if (ioctl(fileno(stdin), TIOCGWINSZ, &ws) != -1) in do_ls_dir()
895 if (d[n]->filename[0] == '.' && !(lflag & LS_SHOW_ALL)) in do_ls_dir()
898 tmp = sftp_path_append(path, d[n]->filename); in do_ls_dir()
909 attrib_to_stat(&d[n]->a, &sb); in do_ls_dir()
917 mprintf("%s\n", d[n]->longname); in do_ls_dir()
919 mprintf("%-*s", colspace, fname); in do_ls_dir()
942 const char *ap = sort_glob->gl_pathv[a]; in sglob_comp()
943 const char *bp = sort_glob->gl_pathv[b]; in sglob_comp()
944 const struct stat *as = sort_glob->gl_statv[a]; in sglob_comp()
945 const struct stat *bs = sort_glob->gl_statv[b]; in sglob_comp()
946 int rmul = sort_flag & LS_REVERSE_SORT ? -1 : 1; in sglob_comp()
948 #define NCMP(a,b) (a == b ? 0 : (a < b ? 1 : -1)) in sglob_comp()
953 if (timespeccmp(&as->st_mtim, &bs->st_mtim, ==)) in sglob_comp()
955 return timespeccmp(&as->st_mtim, &bs->st_mtim, <) ? in sglob_comp()
956 rmul : -rmul; in sglob_comp()
958 return (rmul * NCMP(as->st_mtime, bs->st_mtime)); in sglob_comp()
963 return (rmul * NCMP(as->st_size, bs->st_size)); in sglob_comp()
993 return -1; in do_globbed_ls()
1004 S_ISDIR(g.gl_statv[0]->st_mode)) { in do_globbed_ls()
1010 if (ioctl(fileno(stdin), TIOCGWINSZ, &ws) != -1) in do_globbed_ls()
1053 ruser_name(g.gl_statv[i]->st_uid), in do_globbed_ls()
1054 rgroup_name(g.gl_statv[i]->st_gid)); in do_globbed_ls()
1058 mprintf("%-*s", colspace, fname); in do_globbed_ls()
1087 if (sftp_statvfs(conn, path, &st, 1) == -1) in do_df()
1088 return -1; in do_df()
1093 (unsigned long long)(100 * (st.f_files - st.f_ffree) / in do_df()
1100 (unsigned long long)(100 * (st.f_blocks - st.f_bfree) / in do_df()
1108 (unsigned long long)(st.f_files - st.f_ffree), in do_df()
1116 fmt_scaled((st.f_blocks - st.f_bfree) * st.f_frsize, s_used); in do_df()
1129 (st.f_blocks - st.f_bfree) / 1024), in do_df()
1178 * Split a string into an argument vector using sh(1)-style quoting,
1184 * Returns NULL on error or a NULL-terminated array of arguments.
1206 if (strlen(arg) > sizeof(argvs) - 1) { in makeargv()
1255 * double-escaped glob sequence - in makeargv()
1259 if (j >= sizeof(argvs) - 5) in makeargv()
1280 * escaped glob sequence - in makeargv()
1329 if (j >= sizeof(argvs) - 3) in makeargv()
1348 const char *cmd, *cp = *cpp; in parse_args() local
1358 * Check for leading '-' (disable error processing) and '@' (suppress in parse_args()
1364 if (*cp == '-') { in parse_args()
1380 return -1; in parse_args()
1388 cmd = cmds[i].c; in parse_args()
1394 } else if (cmdnum == -1) { in parse_args()
1396 return -1; in parse_args()
1409 if ((optidx = parse_getput_flags(cmd, argv, argc, in parse_args()
1410 aflag, fflag, pflag, rflag)) == -1) in parse_args()
1411 return -1; in parse_args()
1413 if (argc - optidx < 1) { in parse_args()
1415 "%s command.", cmd); in parse_args()
1416 return -1; in parse_args()
1420 if (argc - optidx > 1) { in parse_args()
1427 if ((optidx = parse_link_flags(cmd, argv, argc, sflag)) == -1) in parse_args()
1428 return -1; in parse_args()
1431 if ((optidx = parse_no_flags(cmd, argv, argc)) == -1) in parse_args()
1432 return -1; in parse_args()
1435 if ((optidx = parse_rename_flags(cmd, argv, argc, lflag)) == -1) in parse_args()
1436 return -1; in parse_args()
1439 if ((optidx = parse_no_flags(cmd, argv, argc)) == -1) in parse_args()
1440 return -1; in parse_args()
1442 if (argc - optidx < 2) { in parse_args()
1444 "command.", cmd); in parse_args()
1445 return -1; in parse_args()
1461 if ((optidx = parse_no_flags(cmd, argv, argc)) == -1) in parse_args()
1462 return -1; in parse_args()
1464 if (argc - optidx < 1) { in parse_args()
1468 cmd); in parse_args()
1469 return -1; in parse_args()
1477 if ((optidx = parse_df_flags(cmd, argv, argc, hflag, in parse_args()
1478 iflag)) == -1) in parse_args()
1479 return -1; in parse_args()
1481 if (argc - optidx < 1) in parse_args()
1489 if ((optidx = parse_ls_flags(argv, argc, lflag)) == -1) in parse_args()
1490 return(-1); in parse_args()
1492 if (argc - optidx > 0) in parse_args()
1497 cp = cp + strlen(cmd) + strspn(cp, WHITESPACE); in parse_args()
1507 if ((optidx = parse_ch_flags(cmd, argv, argc, hflag)) == -1) in parse_args()
1508 return -1; in parse_args()
1510 if (argc - optidx < 1) in parse_args()
1519 "to the %s command.", cmd); in parse_args()
1520 return -1; in parse_args()
1526 if (argc - optidx < 2) { in parse_args()
1528 cmd); in parse_args()
1529 return -1; in parse_args()
1539 if ((optidx = parse_no_flags(cmd, argv, argc)) == -1) in parse_args()
1540 return -1; in parse_args()
1551 parse_dispatch_command(struct sftp_conn *conn, const char *cmd, char **pwd, in parse_dispatch_command() argument
1554 const char *ocmd = cmd; in parse_dispatch_command()
1567 cmdnum = parse_args(&cmd, &ignore_errors, &disable_echo, &aflag, &fflag, in parse_dispatch_command()
1583 case -1: in parse_dispatch_command()
1585 err = -1; in parse_dispatch_command()
1678 /* Strip pwd off beginning of non-absolute paths */ in parse_dispatch_command()
1699 if (chdir(path1) == -1) { in parse_dispatch_command()
1706 if (mkdir(path1, 0777) == -1) { in parse_dispatch_command()
1713 local_do_ls(cmd); in parse_dispatch_command()
1716 local_do_shell(cmd); in parse_dispatch_command()
1746 err = -1; in parse_dispatch_command()
1755 err = -1; in parse_dispatch_command()
1784 err = -1; in parse_dispatch_command()
1816 return (-1); in parse_dispatch_command()
1842 if (ioctl(fileno(stdin), TIOCGWINSZ, &ws) != -1) in complete_display()
1845 m = m > len ? m - len : 0; in complete_display()
1856 mprintf("%-*s", colspace, tmp); in complete_display()
1904 complete_cmd_parse(EditLine *el, char *cmd, int lastarg, char quote, in complete_cmd_parse() argument
1914 if (cmd == NULL) { in complete_cmd_parse()
1927 /* Prepare subset of commands that start with "cmd" */ in complete_cmd_parse()
1928 cmdlen = strlen(cmd); in complete_cmd_parse()
1930 if (!strncasecmp(cmd, cmds[y].c, cmdlen)) in complete_cmd_parse()
1941 tmp = complete_ambiguous(cmd, list, count); in complete_cmd_parse()
1951 cmdlen = strlen(cmd); in complete_cmd_parse()
1952 /* If cmd may be extended then do so */ in complete_cmd_parse()
1954 if (el_insertstr(el, tmp + cmdlen) == -1) in complete_cmd_parse()
1962 if (lastarg || *(lf->cursor) != ' ') in complete_cmd_parse()
1965 if (y > 0 && el_insertstr(el, argterm) == -1) in complete_cmd_parse()
1980 complete_is_remote(char *cmd, int cmdarg) { in complete_is_remote() argument
1983 if (cmd == NULL) in complete_is_remote()
1984 return -1; in complete_is_remote()
1987 if (!strncasecmp(cmd, cmds[i].c, strlen(cmds[i].c))) { in complete_is_remote()
1996 return -1; in complete_is_remote()
2072 if (tmplen > (filelen - cesc)) { in complete_match()
2073 tmp2 = tmp + filelen - cesc; in complete_match()
2077 if ((clen = mblen(tmp2 + i, len - i)) < 0 || in complete_match()
2078 (size_t)clen > sizeof(ins) - 2) in complete_match()
2093 if (el_insertstr(el, ins) == -1) in complete_match()
2100 if (el_insertstr(el, ins + 1) == -1) in complete_match()
2112 if (*(lf->cursor - 1) != '/' && in complete_match()
2113 (lastarg || *(lf->cursor) != ' ')) in complete_match()
2116 if (i > 0 && el_insertstr(el, ins) == -1) in complete_match()
2126 /* tab-completion hook function, called via libedit */
2141 cursor = lf->cursor - lf->buffer; in complete()
2143 memcpy(line, lf->buffer, cursor); in complete()
2149 len = lf->lastchar - lf->buffer; in complete()
2151 memcpy(line, lf->buffer, len); in complete()
2166 } else if (carg == 1 && cursor > 0 && line[cursor - 1] != ' ') { in complete()
2177 if (carg > 1 && line[cursor-1] != ' ') in complete()
2178 filematch = argv[carg - 1]; in complete()
2182 if (argv[i][0] != '-') in complete()
2190 if (line[cursor - 1] == ' ') in complete()
2196 complete_match(el, complete_ctx->conn, in complete()
2197 *complete_ctx->remote_pathp, filematch, in complete()
2211 char *dir = NULL, *startdir = NULL; in interactive_loop() local
2212 char cmd[2048]; in interactive_loop() local
2236 el_set(el, EL_ADDFN, "ftp-complete", in interactive_loop()
2241 el_set(el, EL_BIND, "^I", "ftp-complete", NULL); in interactive_loop()
2242 /* enable ctrl-left-arrow and ctrl-right-arrow */ in interactive_loop()
2243 el_set(el, EL_BIND, "\\e[1;5C", "em-next-word", NULL); in interactive_loop()
2244 el_set(el, EL_BIND, "\\e\\e[C", "em-next-word", NULL); in interactive_loop()
2245 el_set(el, EL_BIND, "\\e[1;5D", "ed-prev-word", NULL); in interactive_loop()
2246 el_set(el, EL_BIND, "\\e\\e[D", "ed-prev-word", NULL); in interactive_loop()
2248 el_set(el, EL_BIND, "^w", "ed-delete-prev-word", NULL); in interactive_loop()
2257 dir = xstrdup(file1); in interactive_loop()
2258 dir = sftp_make_absolute(dir, remote_path); in interactive_loop()
2260 if (sftp_remote_is_dir(conn, dir) && file2 == NULL) { in interactive_loop()
2262 mprintf("Changing to: %s\n", dir); in interactive_loop()
2263 snprintf(cmd, sizeof cmd, "cd \"%s\"", dir); in interactive_loop()
2264 if (parse_dispatch_command(conn, cmd, in interactive_loop()
2266 free(dir); in interactive_loop()
2270 return (-1); in interactive_loop()
2274 snprintf(cmd, sizeof cmd, "get%s %s%s%s", in interactive_loop()
2275 global_aflag ? " -a" : "", dir, in interactive_loop()
2278 err = parse_dispatch_command(conn, cmd, in interactive_loop()
2280 free(dir); in interactive_loop()
2286 free(dir); in interactive_loop()
2300 if (sigaction(SIGINT, &sa, NULL) == -1) { in interactive_loop()
2310 if (fgets(cmd, sizeof(cmd), infile) == NULL) { in interactive_loop()
2330 if (strlcpy(cmd, line, sizeof(cmd)) >= sizeof(cmd)) { in interactive_loop()
2337 cmd[strcspn(cmd, "\n")] = '\0'; in interactive_loop()
2343 err = parse_dispatch_command(conn, cmd, &remote_path, in interactive_loop()
2359 return (err >= 0 ? 0 : -1); in interactive_loop()
2369 if ((pipe(pin) == -1) || (pipe(pout) == -1)) in connect_to_server()
2378 if (socketpair(AF_UNIX, SOCK_STREAM, 0, inout) == -1) in connect_to_server()
2384 if ((sshpid = fork()) == -1) in connect_to_server()
2387 if ((dup2(c_in, STDIN_FILENO) == -1) || in connect_to_server()
2388 (dup2(c_out, STDOUT_FILENO) == -1)) { in connect_to_server()
2428 "usage: %s [-46AaCfNpqrv] [-B buffer_size] [-b batchfile] [-c cipher]\n" in usage()
2429 " [-D sftp_server_command] [-F ssh_config] [-i identity_file]\n" in usage()
2430 " [-J destination] [-l limit] [-o ssh_option] [-P port]\n" in usage()
2431 " [-R num_requests] [-S program] [-s subsystem | sftp_server]\n" in usage()
2432 " [-X sftp_option] destination\n", in usage()
2440 int r, in, out, ch, err, tmp, port = -1, noisy = 0; in main()
2463 addargs(&args, "-oForwardX11 no"); in main()
2464 addargs(&args, "-oPermitLocalCommand no"); in main()
2465 addargs(&args, "-oClearAllForwardings yes"); in main()
2471 "1246AafhNpqrvCc:D:i:l:o:s:S:b:B:F:J:P:R:X:")) != -1) { in main()
2478 addargs(&args, "-%c", ch); in main()
2486 addargs(&args, "-%c", ch); in main()
2493 addargs(&args, "-%c", ch); in main()
2502 addargs(&args, "-v"); in main()
2525 /* Allow "-" as stdin */ in main()
2526 if (strcmp(optarg, "-") != 0 && in main()
2531 addargs(&args, "-obatchmode yes"); in main()
2569 /* Please keep in sync with ssh.c -X */ in main()
2573 r = -1; in main()
2576 if (r == -1) { in main()
2590 fatal("Invalid -X option"); in main()
2600 addargs(&args, "-oForwardAgent no"); in main()
2616 case -1: in main()
2620 if (tmp != -1) in main()
2644 if (port != -1) in main()
2645 addargs(&args, "-oPort %d", port); in main()
2647 addargs(&args, "-l"); in main()
2651 /* no subsystem if the server-spec contains a '/' */ in main()
2653 addargs(&args, "-s"); in main()
2655 addargs(&args, "--"); in main()
2663 fatal_r(r, "Parse -D arguments"); in main()
2665 fatal("No sftp server specified via -D"); in main()
2694 while (waitpid(sshpid, NULL, 0) == -1 && sshpid > 1) in main()