void chmod_cmd (void) { char buffer [BUF_TINY]; char *fname; int i; struct stat sf_stat; Dlg_head *ch_dlg; do { /* do while any files remaining */ ch_dlg = init_chmod (); if (current_panel->marked) fname = next_file (); /* next marked file */ else fname = selection (current_panel)->fname; /* single file */ if (mc_stat (fname, &sf_stat) != 0) { /* get status of file */ destroy_dlg (ch_dlg); break; } c_stat = sf_stat.st_mode; mode_change = 0; /* clear changes flag */ /* set check buttons */ for (i = 0; i < PERMISSIONS; i++) { check_perm[i].check->state = (c_stat & check_perm[i].mode) ? 1 : 0; check_perm[i].selected = 0; } /* Set the labels */ c_fname = name_trunc (fname, 21); add_widget (ch_dlg, label_new (FY+2, FX+2, c_fname)); c_fown = name_trunc (get_owner (sf_stat.st_uid), 21); add_widget (ch_dlg, label_new (FY+6, FX+2, c_fown)); c_fgrp = name_trunc (get_group (sf_stat.st_gid), 21); add_widget (ch_dlg, label_new (FY+8, FX+2, c_fgrp)); g_snprintf (buffer, sizeof (buffer), "%o", c_stat); statl = label_new (FY+4, FX+2, buffer); add_widget (ch_dlg, statl); run_dlg (ch_dlg); /* retrieve an action */ /* do action */ switch (ch_dlg->ret_value) { case B_ENTER: if (mode_change) if (mc_chmod (fname, c_stat) == -1) message (1, MSG_ERROR, _(" Cannot chmod \"%s\" \n %s "), fname, unix_error_string (errno)); need_update = 1; break; case B_CANCEL: end_chmod = 1; break; case B_ALL: case B_MARKED: and_mask = or_mask = 0; and_mask = ~and_mask; for (i = 0; i < PERMISSIONS; i++) { if (check_perm[i].selected || ch_dlg->ret_value == B_ALL) { if (check_perm[i].check->state & C_BOOL) or_mask |= check_perm[i].mode; else and_mask &= ~check_perm[i].mode; } } apply_mask (&sf_stat); break; case B_SETMRK: and_mask = or_mask = 0; and_mask = ~and_mask; for (i = 0; i < PERMISSIONS; i++) { if (check_perm[i].selected) or_mask |= check_perm[i].mode; } apply_mask (&sf_stat); break; case B_CLRMRK: and_mask = or_mask = 0; and_mask = ~and_mask; for (i = 0; i < PERMISSIONS; i++) { if (check_perm[i].selected) and_mask &= ~check_perm[i].mode; } apply_mask (&sf_stat); break; } if (current_panel->marked && ch_dlg->ret_value!=B_CANCEL) { do_file_mark (current_panel, c_file, 0); need_update = 1; } destroy_dlg (ch_dlg); } while (current_panel->marked && !end_chmod); chmod_done (); }
void chmod_cmd (void) { chmod_i18n (); do { /* do while any files remaining */ vfs_path_t *vpath; Dlg_head *ch_dlg; struct stat sf_stat; char *fname; int result; unsigned int i; do_refresh (); mode_change = FALSE; need_update = FALSE; end_chmod = FALSE; c_file = 0; if (current_panel->marked != 0) fname = next_file (); /* next marked file */ else fname = selection (current_panel)->fname; /* single file */ vpath = vfs_path_from_str (fname); if (mc_stat (vpath, &sf_stat) != 0) { vfs_path_free (vpath); break; } c_stat = sf_stat.st_mode; ch_dlg = init_chmod (fname, &sf_stat); /* do action */ result = run_dlg (ch_dlg); switch (result) { case B_ENTER: if (mode_change && mc_chmod (vpath, c_stat) == -1) message (D_ERROR, MSG_ERROR, _("Cannot chmod \"%s\"\n%s"), fname, unix_error_string (errno)); need_update = TRUE; break; case B_CANCEL: end_chmod = TRUE; break; case B_ALL: case B_MARKED: and_mask = or_mask = 0; and_mask = ~and_mask; for (i = 0; i < check_perm_num; i++) if (check_perm[i].selected || result == B_ALL) { if (check_perm[i].check->state & C_BOOL) or_mask |= check_perm[i].mode; else and_mask &= ~check_perm[i].mode; } apply_mask (&sf_stat); break; case B_SETMRK: and_mask = or_mask = 0; and_mask = ~and_mask; for (i = 0; i < check_perm_num; i++) if (check_perm[i].selected) or_mask |= check_perm[i].mode; apply_mask (&sf_stat); break; case B_CLRMRK: and_mask = or_mask = 0; and_mask = ~and_mask; for (i = 0; i < check_perm_num; i++) if (check_perm[i].selected) and_mask &= ~check_perm[i].mode; apply_mask (&sf_stat); break; } if (current_panel->marked != 0 && result != B_CANCEL) { do_file_mark (current_panel, c_file, 0); need_update = TRUE; } vfs_path_free (vpath); destroy_dlg (ch_dlg); } while (current_panel->marked != 0 && !end_chmod); chmod_done (); }