cmd.c

来自「ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机」· C语言 代码 · 共 1,573 行 · 第 1/3 页

C
1,573
字号
	    return;
	}
	if (src){
	    if (*src) {
	        save_cwds_stat ();
	        if (-1 == mc_symlink (dest, src))
		    message (1, MSG_ERROR, _(" symlink: %s "),
			     unix_error_string (errno));
	    }
	    free (src);
	}
    }
    free (dest);
    update_panels (UP_OPTIMIZE, UP_KEEPSEL);
    repaint_screen ();
}

void link_cmd (void)
{
    do_link (0, selection (cpanel)->fname);
}

void symlink_cmd (void)
{
    do_link (1, selection (cpanel)->fname);
}

void edit_symlink_cmd (void)
{
    if (S_ISLNK (selection (cpanel)->buf.st_mode)) {
	char buffer [MC_MAXPATHLEN], *p = selection (cpanel)->fname;
	int i;
	char *dest, *q = copy_strings (_(" Symlink "), name_trunc (p, 32), _(" points to:"), NULL);

	i = readlink (p, buffer, MC_MAXPATHLEN);
	if (i > 0) {
	    buffer [i] = 0;
	    dest = input_expand_dialog (_(" Edit symlink "), q, buffer);
	    if (dest) {
		if (*dest && strcmp (buffer, dest)) {
		    save_cwds_stat ();
		    mc_unlink (p);
		    if (-1 == mc_symlink (dest, p))
		        message (1, MSG_ERROR, _(" edit symlink: %s "),
				 unix_error_string (errno));
		    update_panels (UP_OPTIMIZE, UP_KEEPSEL);
		    repaint_screen ();
		}
		free (dest);
	    }
	}
	free (q);
    }
}

void other_symlink_cmd (void)
{
    char *dest, *q, *p, *r, *s, *t;

    if (get_other_type () != view_listing)
        return;

    if (!strcmp (selection (opanel)->fname, ".."))
        return;
    p = concat_dir_and_file (cpanel->cwd, selection (cpanel)->fname);
    r = concat_dir_and_file (opanel->cwd, selection (cpanel)->fname);

    q = copy_strings (_(" Link symbolically "), name_trunc (p, 32), _(" to:"), NULL);
    dest = input_expand_dialog (_(" Relative symlink "), q, r);
    if (dest) {
	if (*dest) {
	    t = strrchr (dest, PATH_SEP);
	    if (t) {
		t[1] = 0;
		s = diff_two_paths (dest, p);
		t[1] = PATH_SEP;
		if (s) {
		    save_cwds_stat ();
		    if (-1 == mc_symlink (dest, s))
		        message (1, MSG_ERROR, _(" relative symlink: %s "),
				 unix_error_string (errno));
		    update_panels (UP_OPTIMIZE, UP_KEEPSEL);
		    repaint_screen ();
		    free (s);
		}
	    }
	}
	free (dest);
    }
    free (q);
    free (p);
    free (r);
}
#endif

void help_cmd (void)
{
   char *hlpfile = concat_dir_and_file (mc_home, "mc.hlp");
   interactive_display (hlpfile, "[main]");
   free (hlpfile);
}

void view_panel_cmd (void)
{
    view_cmd (cpanel);
}

void edit_panel_cmd (void)
{
    edit_cmd (cpanel);
}

void mkdir_panel_cmd (void)
{
    mkdir_cmd (cpanel);
}

/* Returns a random hint */
char *get_random_hint (void)
{
    char *data, *result, *eol;
    char *hintfile;
    int  len;
    int start;

    /* Do not change hints more often than one minute */

#ifdef SCO_FLAVOR
    static time_t last;
    time_t now;

    time (&now);
    if ((now - last) < 60)
	return strdup ("");
    last = now;
#else
    static int last_sec;
    static struct timeval tv;

    gettimeofday (&tv, NULL);
    if (!(tv.tv_sec> last_sec+60))
	return strdup ("");
    last_sec = tv.tv_sec;
#endif

    hintfile = concat_dir_and_file (mc_home, MC_HINT);
    data = load_file (hintfile);
    free (hintfile);
    if (!data)
	return 0;

#ifdef SCO_FLAVOR
    srand ((short) now);
#else
    srand (tv.tv_sec);
#endif
    /* get a random entry */
    len = strlen (data);
    start = rand () % len;

    for (;start; start--){
	if (data [start] == '\n'){
	    start++;
	    break;
	}
    }
    eol = strchr (&data [start], '\n');
    if (eol)
	*eol = 0;
    result = strdup (&data [start]);
    free (data);
    return result;
}

#ifndef USE_VFS
#ifdef USE_NETCODE
#undef USE_NETCODE
#endif
#endif

#ifdef USE_NETCODE

static char *machine_str = N_(" Enter machine name (F1 for details): ");

static void nice_cd (char *text, char *xtext, char *help, char *prefix, int to_home)
{
    char *machine;
    char *cd_path;

    if (!SELECTED_IS_PANEL)
	return;

    machine = input_dialog_help (text,
				 xtext,
				 help, "");
    if (!machine)
	return;

    if (strncmp (prefix, machine, strlen (prefix)) == 0)
	cd_path = copy_strings (machine, to_home ? "/~/" : NULL, NULL);
    else
	cd_path = copy_strings (prefix, machine, to_home ? "/~/" : NULL, NULL);

    if (do_panel_cd (MENU_PANEL, cd_path, 0))
	directory_history_add (MENU_PANEL, (MENU_PANEL)->cwd);
    else
	message (1, MSG_ERROR, N_(" Could not chdir to %s "), cd_path);
    free (cd_path);
    free (machine);
}

void netlink_cmd (void)
{
    nice_cd (_(" Link to a remote machine "), _(machine_str),
	     "[Network File System]", "mc:", 1);
}

void ftplink_cmd (void)
{
    nice_cd (_(" FTP to machine "), _(machine_str),
	     "[FTP File System]", "ftp://", 1);
}

#ifdef HAVE_SETSOCKOPT
void source_routing (void)
{
    char *source;
    struct hostent *hp;

    source = input_dialog (_(" Socket source routing setup "),
			   _(" Enter host name to use as a source routing hop: ")n,
			   "");
    if (!source)
	return;

    hp = gethostbyname (source);
    if (!hp){
	message (1, _(" Host name "), _(" Error while looking up IP address "));
	return;
    }
    source_route = *((int *)hp->h_addr);
}
#endif /* HAVE_SETSOCKOPT */
#endif /* USE_NETCODE */

#ifdef USE_EXT2FSLIB
void undelete_cmd (void)
{
    nice_cd (_(" Undelete files on an ext2 file system "),
	     _(" Enter the file system name where you want to run the\n "
	       " undelete file system on: (F1 for details)"),
	     "[Undelete File System]", "undel:", 0);
}
#endif

void quick_cd_cmd (void)
{
    char *p = cd_dialog ();

    if (p && *p) {
        char *q = copy_strings ("cd ", p, NULL);

        do_cd_command (q);
        free (q);
    }
    if (p)
        free (p);
}

#ifdef SCO_FLAVOR
#undef DUSUM_USEB
#undef DUSUM_FACTOR
#endif /* SCO_FLAVOR */

#ifdef HAVE_DUSUM
void dirsizes_cmd (void)
{
    WPanel *panel = cpanel;
    int i, j = 0;
    char *cmd, *p, *q, *r;
    FILE *f;
#ifdef DUSUM_USEB
#   define dirsizes_command "du -s -b "
#else
#   define dirsizes_command "du -s "
#endif
#ifndef DUSUM_FACTOR
#    define DUSUM_FACTOR 512
#endif

    if (!vfs_current_is_local ())
        return;
    for (i = 0; i < panel->count; i++)
        if (S_ISDIR (panel->dir.list [i].buf.st_mode))
            j += strlen (panel->dir.list [i].fname) + 1;
    if (!j)
        return;
    cmd = xmalloc (strlen (dirsizes_command) + j + 1, "dirsizes_cmd");
    strcpy (cmd, dirsizes_command);
    p = strchr (cmd, 0);
    for (i = 0; i < panel->count; i++)
        if (S_ISDIR (panel->dir.list [i].buf.st_mode) &&
            strcmp (panel->dir.list [i].fname, "..")) {
            strcpy (p, panel->dir.list [i].fname);
            p = strchr (p, 0);
            *(p++) = ' ';
        }
    *(--p) = 0;
    open_error_pipe ();
    f = popen (cmd, "r");
    free (cmd);
    if (f != NULL) {
        /* Assume that du will display the directories in the order
         * I've passed to it :(
         */
        i = 0;
        p = xmalloc (1024, "dirsizes_cmd");
        while (fgets (p, 1024, f)) {
            j = atoi (p) * DUSUM_FACTOR;
            for (q = p; *q && *q != ' ' && *q != '\t'; q++);
            while (*q == ' ' || *q == '\t')
                q++;
            r = strchr (q, '\n');
            if (r == NULL)
                r = strchr (q, 0);
    	    for (; i < panel->count; i++)
                if (S_ISDIR (panel->dir.list [i].buf.st_mode))
                    if (!strncmp (q, panel->dir.list [i].fname,
                        r - q)) {
                        if (panel->dir.list [i].f.marked)
                            panel->total += j -
			    ((panel->has_dir_sizes) ? panel->dir.list [i].buf.st_size : 0);
                        panel->dir.list [i].buf.st_size = j;
                        break;
                    }
            if (i == panel->count)
                break;
        }
	free (p);
        if (pclose (f) < 0)
#ifndef SCO_FLAVOR
	    message (0, _("Show directory sizes"), _("Pipe close failed"));
	else
#else /* SCO_FLAVOR */
 	/*
 	**	SCO reports about error while all seems to be ok. Just ignore it...
 	**	(alex@bcs.zaporizhzhe.ua)
 	*/
 	;
#endif /* SCO_FLAVOR */
	    panel->has_dir_sizes = 1;
	close_error_pipe (0, 0);
	paint_panel (panel);
    } else
        close_error_pipe (1, _("Cannot invoke du command."));
}
#endif

void
save_setup_cmd (void)
{
    char *str;

    save_setup ();
    sync_profiles ();
    str = copy_strings ( _(" Setup saved to ~/"), PROFILE_NAME, NULL);

#ifdef HAVE_GNOME
    set_hintbar (str);
#else
    message (0, _(" Setup "), str);
#endif
    free (str);
}

void
configure_panel_listing (WPanel *p, int view_type, int use_msformat, char *user, char *status)
{
    int err;

    p->user_mini_status = use_msformat;
    p->list_type = view_type;

    if (view_type == list_user || use_msformat){
	free (p->user_format);
	p->user_format = user;

	free (p->user_status_format [view_type]);
	p->user_status_format [view_type] = status;

	err = set_panel_formats (p);

	if (err){
	    if (err & 0x01){
	    	free (p->user_format);
		p->user_format  = strdup (DEFAULT_USER_FORMAT);
	    }

	    if (err & 0x02){
		free (p->user_status_format [view_type]);
		p->user_status_format [view_type]  = strdup (DEFAULT_USER_FORMAT);
	    }
	}
    }
    else {
        free (user);
        free (status);
    }

    set_panel_formats (p);
    paint_panel (p);

    do_refresh ();
}

#ifndef HAVE_GNOME
void
info_cmd_no_menu (void)
{
    set_display_type (cpanel == left_panel ? 1 : 0, view_info);
}

void
quick_cmd_no_menu (void)
{
    set_display_type (cpanel == left_panel ? 1 : 0, view_quick);
}

void
switch_to_listing (int panel_index)
{
    if (get_display_type (panel_index) != view_listing)
	set_display_type (panel_index, view_listing);
}

void
listing_cmd (void)
{
    int   view_type, use_msformat;
    char  *user, *status;
    WPanel *p;
    int   display_type;

    display_type = get_display_type (MENU_PANEL_IDX);
    if (display_type == view_listing)
	p = MENU_PANEL_IDX == 0 ? left_panel : right_panel;
    else
	p = 0;

    view_type = display_box (p, &user, &status, &use_msformat, MENU_PANEL_IDX);

    if (view_type == -1)
	return;

    switch_to_listing (MENU_PANEL_IDX);

    p = MENU_PANEL_IDX == 0 ? left_panel : right_panel;

    configure_panel_listing (p, view_type, use_msformat, user, status);
}

void
tree_cmd (void)
{
    set_display_type (MENU_PANEL_IDX, view_tree);
}

void
info_cmd (void)
{
    set_display_type (MENU_PANEL_IDX, view_info);
}

void
quick_view_cmd (void)
{
    set_display_type (MENU_PANEL_IDX, view_quick);
}
#endif

/* Handle the tree internal listing modes switching */
static int
set_basic_panel_listing_to (int panel_index, int listing_mode)
{
    WPanel *p = (WPanel *) get_panel_widget (panel_index);

#ifndef HAVE_GNOME
    switch_to_listing (panel_index);
#endif
    p->list_type = listing_mode;
    if (set_panel_formats (p))
	return 0;

    paint_panel (p);
    do_refresh ();
    return 1;
}

void
toggle_listing_cmd (void)
{
    int current = get_current_index ();
    WPanel *p = (WPanel *) get_panel_widget (current);
    int list_mode = p->list_type;
    int m;

    switch (list_mode){
    case list_full:
    case list_brief:
	m = list_long;
	break;
    case list_long:
	m = list_user;
	break;
    default:
	m = list_full;
    }
    if (set_basic_panel_listing_to (current, m))
	return;
    set_basic_panel_listing_to (current, list_full);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?