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 + -
显示快捷键?