1999-01-07 04:14:50 +03:00
|
|
|
/* File operation contexts for the Midnight Commander
|
|
|
|
*
|
|
|
|
* Copyright (C) 1998 The Free Software Foundation
|
|
|
|
*
|
|
|
|
* Authors: Federico Mena <federico@nuclecu.unam.mx>
|
|
|
|
* Miguel de Icaza <miguel@nuclecu.unam.mx>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef FILEOPCTX_H
|
|
|
|
#define FILEOPCTX_H
|
|
|
|
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <sys/types.h>
|
Glibing..... (2)
Wed Jan 27 03:17:44 1999 Timur Bakeyev <mc@bat.ru>
* Converted memory managment to Glib. Now we use g_new()/g_malloc()/
g_strdup()/g_free() routings. Also, copy_strings() replaced by
g_strconcat(), strcasecmp() -> g_strcasecmp(),and sprintf() by
g_snprintf().
* Some sequences of malloc()/sprintf() changed to g_strdup_printf().
* mad.[ch]: Modified, to work with new GLib's memory managment. Fixed
a missing #undef for tempnam, which caused dead loop. Add several new
functions to emulate GLib memory managment.
*main.c, mad.[ch]: Add a new switch "-M", which allows to redirect MAD
messages to the file.
* util.[ch], utilunix.c: Modified, deleted our variants of strcasecmp()
and strdup() - we have g_ equivalences. Remove get_full_name() - it is
similar to concat_dir_and_file(). Some other tricks with g_* functions.
* global.h: Modified, extended. Now it is main memory mangment include -
i.e. all inclusions of <stdlib.h>, <malloc.h>, <glib.h>, "fs.h", "mem.h",
"util.h" and "mad.h" done there. This elimanates problem with proper or-
der of #include's.
* All around the source - changed order of #include's, most of them gone
to global.h (see above), minor changes, like "0" -> NULL in string func-
tions.
1999-01-27 04:08:30 +03:00
|
|
|
#include "eregex.h"
|
1999-01-07 04:14:50 +03:00
|
|
|
|
2004-01-24 00:59:38 +03:00
|
|
|
typedef enum {
|
|
|
|
OP_COPY,
|
|
|
|
OP_MOVE,
|
|
|
|
OP_DELETE
|
|
|
|
} FileOperation;
|
1999-01-07 04:14:50 +03:00
|
|
|
|
2004-08-29 20:42:40 +04:00
|
|
|
typedef int (*mc_stat_fn) (const char *filename, struct stat *buf);
|
2001-10-01 08:20:23 +04:00
|
|
|
|
1999-01-07 04:14:50 +03:00
|
|
|
/* This structure describes a context for file operations. It is used to update
|
|
|
|
* the progress windows and pass around options.
|
|
|
|
*/
|
2003-10-24 22:28:32 +04:00
|
|
|
typedef struct FileOpContext {
|
2004-01-24 00:59:38 +03:00
|
|
|
/* Operation type (copy, move, delete) */
|
|
|
|
FileOperation operation;
|
|
|
|
|
1999-01-07 04:14:50 +03:00
|
|
|
/* The estimated time of arrival in seconds */
|
|
|
|
double eta_secs;
|
|
|
|
|
|
|
|
/* Transferred bytes per second */
|
|
|
|
long bps;
|
|
|
|
|
|
|
|
/* Transferred seconds */
|
|
|
|
long bps_time;
|
|
|
|
|
|
|
|
/* Whether the panel total has been computed */
|
|
|
|
int progress_totals_computed;
|
|
|
|
|
|
|
|
/* Counters for progress indicators */
|
2001-09-21 09:04:38 +04:00
|
|
|
off_t progress_count;
|
1999-01-07 04:14:50 +03:00
|
|
|
double progress_bytes;
|
|
|
|
|
1999-01-14 04:10:32 +03:00
|
|
|
/* The value of the "preserve Attributes" checkbox in the copy file dialog.
|
|
|
|
* We can't use the value of "ctx->preserve" because it can change in order
|
|
|
|
* to preserve file attributs when moving files across filesystem boundaries
|
|
|
|
* (we want to keep the value of the checkbox between copy operations).
|
|
|
|
*/
|
|
|
|
int op_preserve;
|
|
|
|
|
1999-01-07 04:14:50 +03:00
|
|
|
/* Result from the recursive query */
|
|
|
|
int recursive_result;
|
|
|
|
|
|
|
|
/* Whether to do a reget */
|
|
|
|
int do_reget;
|
|
|
|
|
|
|
|
/* Controls appending to files */
|
|
|
|
int do_append;
|
|
|
|
|
|
|
|
/* Whether to stat or lstat */
|
|
|
|
int follow_links;
|
|
|
|
|
|
|
|
/* Pointer to the stat function we will use */
|
2001-10-01 08:20:23 +04:00
|
|
|
mc_stat_fn stat_func;
|
1999-01-07 04:14:50 +03:00
|
|
|
|
|
|
|
/* Whether to recompute symlinks */
|
|
|
|
int stable_symlinks;
|
|
|
|
|
|
|
|
/* Preserve the original files' owner, group, permissions, and
|
|
|
|
* timestamps (owner, group only as root).
|
|
|
|
*/
|
|
|
|
int preserve;
|
|
|
|
|
|
|
|
/* If running as root, preserve the original uid/gid (we don't want to
|
2002-10-23 12:26:16 +04:00
|
|
|
* try chown for non root) preserve_uidgid = preserve && uid == 0
|
1999-01-07 04:14:50 +03:00
|
|
|
*/
|
|
|
|
int preserve_uidgid;
|
|
|
|
|
|
|
|
/* The bits to preserve in created files' modes on file copy */
|
|
|
|
int umask_kill;
|
|
|
|
|
|
|
|
/* The mask of files to actually operate on */
|
|
|
|
char *dest_mask;
|
|
|
|
|
|
|
|
/* Regex for the file mask */
|
|
|
|
struct re_pattern_buffer rx;
|
|
|
|
struct re_registers regs;
|
|
|
|
|
|
|
|
/* Whether to dive into subdirectories for recursive operations */
|
|
|
|
int dive_into_subdirs;
|
|
|
|
|
|
|
|
/* When moving directories cross filesystem boundaries delete the
|
2003-06-02 23:26:55 +04:00
|
|
|
* successfully copied files when all files below the directory and its
|
1999-01-07 04:14:50 +03:00
|
|
|
* subdirectories were processed.
|
|
|
|
*
|
|
|
|
* If erase_at_end is zero files will be deleted immediately after their
|
2003-06-02 22:13:42 +04:00
|
|
|
* successful copy (Note: this behavior is not tested and at the moment
|
1999-01-07 04:14:50 +03:00
|
|
|
* it can't be changed at runtime).
|
|
|
|
*/
|
|
|
|
int erase_at_end;
|
|
|
|
|
|
|
|
/* PID of the child for background operations */
|
|
|
|
pid_t pid;
|
|
|
|
|
|
|
|
/* User interface data goes here */
|
|
|
|
|
|
|
|
void *ui;
|
|
|
|
} FileOpContext;
|
|
|
|
|
|
|
|
|
2004-01-24 00:59:38 +03:00
|
|
|
FileOpContext *file_op_context_new (FileOperation op);
|
1999-01-07 04:14:50 +03:00
|
|
|
void file_op_context_destroy (FileOpContext *ctx);
|
|
|
|
|
|
|
|
|
2004-08-30 02:51:02 +04:00
|
|
|
extern const char *op_names [3];
|
1999-01-07 04:14:50 +03:00
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
FILE_CONT,
|
|
|
|
FILE_RETRY,
|
|
|
|
FILE_SKIP,
|
|
|
|
FILE_ABORT
|
|
|
|
} FileProgressStatus;
|
|
|
|
|
1999-02-26 03:27:23 +03:00
|
|
|
typedef enum {
|
|
|
|
RECURSIVE_YES,
|
|
|
|
RECURSIVE_NO,
|
|
|
|
RECURSIVE_ALWAYS,
|
|
|
|
RECURSIVE_NEVER,
|
|
|
|
RECURSIVE_ABORT
|
|
|
|
} FileCopyMode;
|
|
|
|
|
1999-01-14 04:10:32 +03:00
|
|
|
/* First argument passed to real functions */
|
|
|
|
enum OperationMode {
|
|
|
|
Foreground,
|
|
|
|
Background
|
|
|
|
};
|
|
|
|
|
1999-01-07 04:14:50 +03:00
|
|
|
/* The following functions are implemented separately by each port */
|
|
|
|
|
2004-01-24 00:59:38 +03:00
|
|
|
void file_op_context_create_ui (FileOpContext *ctx, int with_eta);
|
1999-01-07 04:14:50 +03:00
|
|
|
void file_op_context_destroy_ui (FileOpContext *ctx);
|
|
|
|
|
2001-09-21 09:04:38 +04:00
|
|
|
FileProgressStatus file_progress_show (FileOpContext *ctx, off_t done, off_t total);
|
|
|
|
FileProgressStatus file_progress_show_count (FileOpContext *ctx, off_t done, off_t total);
|
1999-01-07 04:14:50 +03:00
|
|
|
FileProgressStatus file_progress_show_bytes (FileOpContext *ctx, double done, double total);
|
2004-08-29 20:42:40 +04:00
|
|
|
FileProgressStatus file_progress_show_source (FileOpContext *ctx, const char *path);
|
|
|
|
FileProgressStatus file_progress_show_target (FileOpContext *ctx, const char *path);
|
|
|
|
FileProgressStatus file_progress_show_deleting (FileOpContext *ctx, const char *path);
|
1999-01-07 04:14:50 +03:00
|
|
|
|
2004-08-29 20:42:40 +04:00
|
|
|
void file_progress_set_stalled_label (FileOpContext *ctx, const char *stalled_msg);
|
1999-01-07 04:14:50 +03:00
|
|
|
|
|
|
|
FileProgressStatus file_progress_real_query_replace (FileOpContext *ctx,
|
|
|
|
enum OperationMode mode,
|
2004-08-29 20:42:40 +04:00
|
|
|
const char *destname,
|
1999-01-07 04:14:50 +03:00
|
|
|
struct stat *_s_stat,
|
|
|
|
struct stat *_d_stat);
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|