/** * Check file access permissions * * This will be called for the access() system call. If the * 'default_permissions' mount option is given, this method is not * called. * * This method is not called under Linux kernel versions 2.4.x * * Introduced in version 2.5 */ int pipefs_access(const char *path, int mask) { int retstat = 0; char fpath[PATH_MAX]; log_msg(" \nbb_access(path=\"%s\", mask=0%o)\n", path, mask); pipefs_fullpath(fpath, path); struct pipefs_data* data = GET_DATA; char* translated_path = translate_file(fpath, data->source_suffix, data->target_suffix); if (translated_path && (mask & (W_OK | X_OK))) { free(translated_path); return -EACCES; } retstat = access(translated_path ? translated_path : fpath, mask); free(translated_path); if (retstat < 0) { retstat = pipefs_error("pipefs_access access"); } return retstat; }
/** Change the permission bits of a file */ int pipefs_chmod(const char *path, mode_t mode) { int retstat = 0; char fpath[PATH_MAX]; log_msg(" \nbb_chmod(fpath=\"%s\", mode=0%03o)\n", path, mode); pipefs_fullpath(fpath, path); CHECK_SOURCE_PATH(fpath); struct pipefs_data* data = GET_DATA; char* translated_path = translate_file(fpath, data->source_suffix, data->target_suffix); if (translated_path && (mode & 0333)) { free(translated_path); return -EPERM; } retstat = chmod(translated_path ? translated_path : fpath, mode); free(translated_path); if (retstat < 0) { retstat = pipefs_error("pipefs_chmod chmod"); } return retstat; }
/** Remove a file */ int pipefs_unlink(const char *path) { int retstat = 0; char fpath[PATH_MAX]; log_msg("pipefs_unlink(path=\"%s\")\n", path); pipefs_fullpath(fpath, path); CHECK_SOURCE_PATH(fpath); struct pipefs_data* data = GET_DATA; char* translated_path = translate_file(fpath, data->source_suffix, data->target_suffix); if (translated_path) { retstat = unlink(translated_path); free(translated_path); if (retstat < 0) { retstat = pipefs_error("pipefs_unlink unlink"); } return retstat; } retstat = unlink(fpath); if (retstat < 0) { retstat = pipefs_error("pipefs_unlink unlink"); } return retstat; }
/** Get file system statistics * * The 'f_frsize', 'f_favail', 'f_fsid' and 'f_flag' fields are ignored * * Replaced 'struct statfs' parameter with 'struct statvfs' in * version 2.5 */ int pipefs_statfs(const char *path, struct statvfs *statv) { int retstat = 0; char fpath[PATH_MAX]; log_msg(" \nbb_statfs(path=\"%s\", statv=0x%08x)\n", path, statv); pipefs_fullpath(fpath, path); CHECK_SOURCE_PATH(fpath); struct pipefs_data* data = GET_DATA; char* translated_path = translate_file(fpath, data->source_suffix, data->target_suffix); // get stats for underlying filesystem retstat = statvfs(translated_path ? translated_path : fpath, statv); free(translated_path); if (retstat < 0) { retstat = pipefs_error("pipefs_statfs statvfs"); } return retstat; }
/* note -- I'll want to change this as soon as 2.6 is in debian testing */ int pipefs_utime(const char *path, struct utimbuf *ubuf) { int retstat = 0; char fpath[PATH_MAX]; log_msg(" \nbb_utime(path=\"%s\", ubuf=0x%08x)\n", path, ubuf); CHECK_SOURCE_PATH(fpath); pipefs_fullpath(fpath, path); struct pipefs_data* data = GET_DATA; char* translated_path = translate_file(fpath, data->source_suffix, data->target_suffix); retstat = utime(translated_path ? translated_path : fpath, ubuf); free(translated_path); if (retstat < 0) { retstat = pipefs_error("pipefs_utime utime"); } return retstat; }
/** Change the owner and group of a file */ int pipefs_chown(const char *path, uid_t uid, gid_t gid) { int retstat = 0; char fpath[PATH_MAX]; log_msg(" \nbb_chown(path=\"%s\", uid=%d, gid=%d)\n", path, uid, gid); pipefs_fullpath(fpath, path); CHECK_SOURCE_PATH(fpath); struct pipefs_data* data = GET_DATA; char* translated_path = translate_file(fpath, data->source_suffix, data->target_suffix); retstat = chown(translated_path ? translated_path : fpath, uid, gid); free(translated_path); if (retstat < 0) { retstat = pipefs_error("pipefs_chown chown"); } return retstat; }
/* event callback */ gboolean help_interactive_display (const gchar * event_group_name, const gchar * event_name, gpointer init_data, gpointer data) { const dlg_colors_t help_colors = { HELP_NORMAL_COLOR, /* common text color */ 0, /* unused in help */ HELP_BOLD_COLOR, /* bold text color */ 0, /* unused in help */ HELP_TITLE_COLOR /* title color */ }; WButtonBar *help_bar; Widget *md; char *hlpfile = NULL; char *filedata; ev_help_t *event_data = (ev_help_t *) data; (void) event_group_name; (void) event_name; (void) init_data; if (event_data->filename != NULL) g_file_get_contents (event_data->filename, &filedata, NULL, NULL); else filedata = load_mc_home_file (mc_global.share_data_dir, MC_HELP, &hlpfile); if (filedata == NULL) message (D_ERROR, MSG_ERROR, _("Cannot open file %s\n%s"), event_data->filename ? event_data->filename : hlpfile, unix_error_string (errno)); g_free (hlpfile); if (filedata == NULL) return TRUE; translate_file (filedata); g_free (filedata); if (fdata == NULL) return TRUE; if ((event_data->node == NULL) || (*event_data->node == '\0')) event_data->node = "[main]"; main_node = search_string (fdata, event_data->node); if (main_node == NULL) { message (D_ERROR, MSG_ERROR, _("Cannot find node %s in help file"), event_data->node); /* Fallback to [main], return if it also cannot be found */ main_node = search_string (fdata, "[main]"); if (main_node == NULL) { interactive_display_finish (); return TRUE; } } help_lines = min (LINES - 4, max (2 * LINES / 3, 18)); whelp = dlg_create (TRUE, 0, 0, help_lines + 4, HELP_WINDOW_WIDTH + 4, help_colors, help_callback, NULL, "[Help]", _("Help"), DLG_TRYUP | DLG_CENTER | DLG_WANT_TAB); selected_item = search_string_node (main_node, STRING_LINK_START) - 1; currentpoint = main_node + 1; /* Skip the newline following the start of the node */ for (history_ptr = HISTORY_SIZE; history_ptr;) { history_ptr--; history[history_ptr].page = currentpoint; history[history_ptr].link = selected_item; } help_bar = buttonbar_new (TRUE); WIDGET (help_bar)->y -= WIDGET (whelp)->y; WIDGET (help_bar)->x -= WIDGET (whelp)->x; md = mousedispatch_new (1, 1, help_lines, HELP_WINDOW_WIDTH - 2); add_widget (whelp, md); add_widget (whelp, help_bar); buttonbar_set_label (help_bar, 1, Q_ ("ButtonBar|Help"), help_map, NULL); buttonbar_set_label (help_bar, 2, Q_ ("ButtonBar|Index"), help_map, NULL); buttonbar_set_label (help_bar, 3, Q_ ("ButtonBar|Prev"), help_map, NULL); buttonbar_set_label (help_bar, 4, "", help_map, NULL); buttonbar_set_label (help_bar, 5, "", help_map, NULL); buttonbar_set_label (help_bar, 6, "", help_map, NULL); buttonbar_set_label (help_bar, 7, "", help_map, NULL); buttonbar_set_label (help_bar, 8, "", help_map, NULL); buttonbar_set_label (help_bar, 9, "", help_map, NULL); buttonbar_set_label (help_bar, 10, Q_ ("ButtonBar|Quit"), help_map, NULL); dlg_run (whelp); interactive_display_finish (); dlg_destroy (whelp); return TRUE; }
int main(int argc, const char **argv) { int res = 0; int optCount = 0; dbgIn = stdin; conOut = stdout; (void)conIn; (void)dbgOut; memset(&cache, 0, sizeof(LIST)); memset(&sources, 0, sizeof(LIST)); stat_clear(&summ); memset(&revinfo, 0, sizeof(REVINFO)); clearLastLine(); optionInit(argc, argv); optCount = optionParse(argc, argv); if (optCount < 0) { return optCount; } argc -= optCount; if (opt_Revision && (strcmp(opt_Revision, "update") == 0)) { res = updateSvnlog(); return res; } if (check_directory(opt_force)) return 3; create_cache(opt_force, 0); if (opt_exit) return 0; read_cache(); l2l_dbg(4, "Cache read complete\n"); if (set_LogFile(&logFile)) return 2; l2l_dbg(4, "opt_logFile processed\n"); if (opt_Pipe) { l2l_dbg(3, "Command line: \"%s\"\n",opt_Pipe); if (!(dbgIn = POPEN(opt_Pipe, "r"))) { dbgIn = stdin; //restore l2l_dbg(0, "Could not popen '%s' (%s)\n", opt_Pipe, strerror(errno)); free(opt_Pipe); opt_Pipe = NULL; } } l2l_dbg(4, "opt_Pipe processed\n"); if (argc > 1) { // translate {<exefile> <offset>} int i = 1; const char *exefile = NULL; const char *offset = NULL; char Line[LINESIZE + 1]; while (i < argc) { Line[0] = '\0'; offset = argv[optCount + i++]; if (isOffset(offset)) { if (exefile) { l2l_dbg(2, "translating %s %s\n", exefile, offset); translate_file(exefile, my_atoi(offset), Line); printf("%s\n", Line); report(conOut); } else { l2l_dbg(0, "<exefile> expected\n"); res = 3; break; } } else { // Not an offset so must be an exefile: exefile = offset; } } } else { // translate logging from stdin translate_files(dbgIn, conOut); } if (logFile) fclose(logFile); if (opt_Pipe) PCLOSE(dbgIn); return res; }
static void translate_line(FILE *outFile, char *Line, char *path, char *LineOut) { size_t offset; int cnt, res; char *sep, *tail, *mark, *s; unsigned char ch; if (!*Line) return; res = 1; mark = ""; s = remove_mark(Line); if (opt_undo) { /* Strip all lines added by this tool: */ char buf[NAMESIZE]; if (sscanf(s, "| %s", buf) == 1) if (buf[0] == '0' || strcmp(buf, "----") == 0 || strcmp(buf, "L2L-") == 0 || strcmp(buf, "S---") == 0 || strcmp(buf, "R---") == 0 || atoi(buf)) res = 0; } sep = strchr(s, ':'); if (sep) { *sep = ' '; cnt = sscanf(s, "<%s %x%c", path, (unsigned int *)(&offset), &ch); if (opt_undo) { if (cnt == 3 && ch == ' ') { tail = strchr(s, '>'); tail = tail ? tail - 1 : tail; if (tail && tail[0] == ')' && tail[1] == '>') { res = 0; tail += 2; mark = opt_mark ? "* " : ""; if (opt_redo && !(res = translate_file(path, offset, LineOut))) { log(outFile, "%s<%s:%x (%s)>%s", mark, path, (unsigned int)offset, LineOut, tail); summ.redo++; } else { log(outFile, "%s<%s:%x>%s", mark, path, (unsigned int)offset, tail); summ.undo++; } } else { mark = opt_Mark ? "? " : ""; summ.skipped++; } summ.total++; } } if (!opt_undo || opt_redo) { if (cnt == 3 && ch == '>') { tail = strchr(s, '>') + 1; if (!(res = translate_file(path, offset, LineOut))) { mark = opt_mark ? "* " : ""; log(outFile, "%s<%s:%x (%s)>%s", mark, path, (unsigned int)offset, LineOut, tail); summ.translated++; } else { mark = opt_Mark ? "? " : ""; summ.skipped++; } summ.total++; } } } if (res) { if (sep) *sep = ':'; // restore because not translated log(outFile, "%s%s", mark, s); } memset(Line, '\0', LINESIZE); // flushed }