/* Make sure errno contains a meaningful value on error */ static int lock_file(struct lock_file *lk, const char *path, int flags) { size_t pathlen = strlen(path); if (!lock_file_list) { /* One-time initialization */ sigchain_push_common(remove_lock_files_on_signal); atexit(remove_lock_files_on_exit); } if (lk->active) die("BUG: cannot lock_file(\"%s\") using active struct lock_file", path); if (!lk->on_list) { /* Initialize *lk and add it to lock_file_list: */ lk->fd = -1; lk->fp = NULL; lk->active = 0; lk->owner = 0; strbuf_init(&lk->filename, pathlen + LOCK_SUFFIX_LEN); lk->next = lock_file_list; lock_file_list = lk; lk->on_list = 1; } else if (lk->filename.len) { /* This shouldn't happen, but better safe than sorry. */ die("BUG: lock_file(\"%s\") called with improperly-reset lock_file object", path); } if (flags & LOCK_NO_DEREF) { strbuf_add_absolute_path(&lk->filename, path); } else { struct strbuf resolved_path = STRBUF_INIT; strbuf_add(&resolved_path, path, pathlen); resolve_symlink(&resolved_path); strbuf_add_absolute_path(&lk->filename, resolved_path.buf); strbuf_release(&resolved_path); } strbuf_addstr(&lk->filename, LOCK_SUFFIX); lk->fd = open(lk->filename.buf, O_RDWR | O_CREAT | O_EXCL, 0666); if (lk->fd < 0) { strbuf_reset(&lk->filename); return -1; } lk->owner = getpid(); lk->active = 1; if (adjust_shared_perm(lk->filename.buf)) { int save_errno = errno; error("cannot fix permission bits on %s", lk->filename.buf); rollback_lock_file(lk); errno = save_errno; return -1; } return lk->fd; }
int impl_fuse_context::check_and_resolve(std::string *name) { if (!ops_.getattr) return -EINVAL; struct FUSE_STAT stat = {0}; CHECKED(ops_.getattr(name->c_str(), &stat)); if (S_ISLNK(stat.st_mode)) CHECKED(resolve_symlink(*name, name)); return 0; }
/* This returns a static buffer containing the real * configuration file known to be used last for this minor. * If you need the return value longer, stuff it away with strdup. */ char *lookup_resource(const char *name) { static char linkname[PATH_MAX]; struct stat stat_buf; linkname_from_resource_name(linkname, name); if (stat(linkname, &stat_buf) != 0) { if (errno != ENOENT) perror(linkname); return NULL; } return resolve_symlink(linkname); }
char *lookup_minor(int minor) { static char linkname[PATH_MAX]; struct stat stat_buf; linkname_from_minor(linkname, minor); if (stat(linkname, &stat_buf) != 0) { if (errno != ENOENT) perror(linkname); return NULL; } return resolve_symlink(linkname); }
/* Make sure errno contains a meaningful value on error */ static int lock_file(struct lock_file *lk, const char *path, int flags) { int fd; struct strbuf filename = STRBUF_INIT; strbuf_addstr(&filename, path); if (!(flags & LOCK_NO_DEREF)) resolve_symlink(&filename); strbuf_addstr(&filename, LOCK_SUFFIX); fd = create_tempfile(&lk->tempfile, filename.buf); strbuf_release(&filename); return fd; }
/** ******************************************************************************************************************* @brief attempt to reach controller when there are emergencies. ******************************************************************************************************************** */ static inline bool buddy_phone_home(void) { buddy_path("controller.sock"); resolve_symlink(); strncpy(buddy_sockaddr.sun_path, buddy_string_buf, sizeof(buddy_sockaddr.sun_path) - 1); buddy_sockaddr.sun_family = AF_UNIX; buddy_ctrlfd = socket(PF_UNIX, SOCK_STREAM, 0); if(connect(buddy_ctrlfd, (struct sockaddr *) &buddy_sockaddr, buddy_sockaddr_len) == 0) return true; return false; }
/* Make sure errno contains a meaningful value on error */ static int lock_file(struct lock_file *lk, const char *path, int flags) { /* * subtract 5 from size to make sure there's room for adding * ".lock" for the lock file name */ static const size_t max_path_len = sizeof(lk->filename) - 5; if (strlen(path) >= max_path_len) { errno = ENAMETOOLONG; return -1; } strcpy(lk->filename, path); if (!(flags & LOCK_NODEREF)) resolve_symlink(lk->filename, max_path_len); strcat(lk->filename, ".lock"); lk->fd = open(lk->filename, O_RDWR | O_CREAT | O_EXCL, 0666); if (0 <= lk->fd) { if (!lock_file_list) { sigchain_push_common(remove_lock_file_on_signal); atexit(remove_lock_file); } lk->owner = getpid(); if (!lk->on_list) { lk->next = lock_file_list; lock_file_list = lk; lk->on_list = 1; } if (adjust_shared_perm(lk->filename)) { int save_errno = errno; error("cannot fix permission bits on %s", lk->filename); errno = save_errno; return -1; } } else lk->filename[0] = 0; return lk->fd; }
int impl_fuse_context::open_directory(LPCWSTR file_name, PDOKAN_FILE_INFO dokan_file_info) { std::string fname = unixify(wchar_to_utf8_cstr(file_name)); if (ops_.opendir) return do_open_dir(file_name, dokan_file_info); // We don't have opendir(), so the most we can do is make sure // that the target is indeed a directory struct FUSE_STAT st = {0}; CHECKED(ops_.getattr(fname.c_str(), &st)); if (S_ISLNK(st.st_mode)) { std::string resolved; CHECKED(resolve_symlink(fname, &resolved)); CHECKED(ops_.getattr(resolved.c_str(), &st)); } // Not a directory if ((st.st_mode & S_IFDIR) != S_IFDIR) return -ENOTDIR; dokan_file_info->Context = (ULONG64)NULL; // Do not want to attach anything return 0; // Use readdir here? }
win_error impl_fuse_context::create_file(LPCWSTR file_name, DWORD access_mode, DWORD share_mode, DWORD creation_disposition, DWORD flags_and_attributes, PDOKAN_FILE_INFO dokan_file_info) { std::string fname = unixify(wchar_to_utf8_cstr(file_name)); dokan_file_info->Context = 0; if (!ops_.getattr) return -EINVAL; struct FUSE_STAT stbuf = {0}; // Check if the target file/directory exists if (ops_.getattr(fname.c_str(), &stbuf) < 0) { // Nope. if (dokan_file_info->IsDirectory) return -EINVAL; // We can't create directories using CreateFile return do_create_file(file_name, creation_disposition, share_mode, access_mode, dokan_file_info); } else { if (S_ISLNK(stbuf.st_mode)) { // Get link's target CHECKED(resolve_symlink(fname, &fname)); CHECKED(ops_.getattr(fname.c_str(), &stbuf)); } if ((stbuf.st_mode & S_IFDIR) == S_IFDIR) { // Existing directory // TODO: add access control dokan_file_info->IsDirectory = TRUE; return do_open_dir(file_name, dokan_file_info); } else { // Existing file // Check if we'll be able to truncate or delete the opened file // TODO: race condition here? if (creation_disposition == FILE_OVERWRITE) { if (!ops_.unlink) return -EINVAL; CHECKED(ops_.unlink(fname.c_str())); // Delete file // And create it! return do_create_file(file_name, creation_disposition, share_mode, access_mode, dokan_file_info); } else if (creation_disposition == FILE_SUPERSEDE || creation_disposition == FILE_OVERWRITE_IF) { if (!ops_.truncate) return -EINVAL; CHECKED(ops_.truncate(fname.c_str(), 0)); } else if (creation_disposition == FILE_CREATE) { SetLastError(ERROR_FILE_EXISTS); return win_error(STATUS_OBJECT_NAME_COLLISION, true); } if (creation_disposition == FILE_OVERWRITE_IF || creation_disposition == FILE_OPEN_IF) { SetLastError(ERROR_ALREADY_EXISTS); } return do_open_file(file_name, share_mode, access_mode, dokan_file_info); } } }
/* Main entry point. This is gcc driver driver! Interpret -arch flag from the list of input arguments. Invoke appropriate compiler driver. 'lipo' the results if more than one -arch is supplied. */ int main (int argc, const char **argv) { size_t i; int l, pid, argv_0_len, prog_len; char *errmsg_fmt, *errmsg_arg; char *override_option_str = NULL; char path_buffer[2*PATH_MAX+1]; int linklen; total_argc = argc; prog_len = 0; argv_0_len = strlen (argv[0]); /* Get the progname, required by pexecute () and program location. */ prog_len = get_prog_name_len (argv[0]); /* If argv[0] is all program name (no slashes), search the PATH environment variable to get the fully resolved path to the executable. */ if (prog_len == argv_0_len) { #ifdef DEBUG progname = argv[0] + argv_0_len - prog_len; fprintf (stderr,"%s: before PATH resolution, full progname = %s\n", argv[0]+argv_0_len-prog_len, argv[0]); #endif argv[0] = resolve_path_to_executable (argv[0]); prog_len = get_prog_name_len (argv[0]); argv_0_len = strlen(argv[0]); } /* If argv[0] is a symbolic link, use the directory of the pointed-to file to find compiler components. */ if ((linklen = readlink (argv[0], path_buffer, PATH_MAX)) != -1) { /* readlink succeeds if argv[0] is a symlink. path_buffer now contains the file referenced. */ path_buffer[linklen] = '\0'; #ifdef DEBUG progname = argv[0] + argv_0_len - prog_len; fprintf (stderr, "%s: before symlink, full prog = %s target = %s\n", progname, argv[0], path_buffer); #endif argv[0] = resolve_symlink(argv[0], path_buffer, argv_0_len, prog_len); argv_0_len = strlen(argv[0]); /* Get the progname, required by pexecute () and program location. */ prog_len = get_prog_name_len (argv[0]); #ifdef DEBUG progname = argv[0] + argv_0_len - prog_len; printf("%s: ARGV[0] after symlink = %s\n", progname, argv[0]); #endif } progname = argv[0] + argv_0_len - prog_len; /* Setup driver prefix. */ prefix_len = argv_0_len - prog_len; curr_dir = (char *) malloc (sizeof (char) * (prefix_len + 1)); strncpy (curr_dir, argv[0], prefix_len); curr_dir[prefix_len] = '\0'; driver_exec_prefix = (argv[0], "/usr/bin", curr_dir); #ifdef DEBUG fprintf (stderr,"%s: full progname = %s\n", progname, argv[0]); fprintf (stderr,"%s: progname = %s\n", progname, progname); fprintf (stderr,"%s: driver_exec_prefix = %s\n", progname, driver_exec_prefix); #endif /* Before we get too far, rewrite the command line with any requested overrides */ if ((override_option_str = getenv ("QA_OVERRIDE_GCC3_OPTIONS")) != NULL) rewrite_command_line(override_option_str, &argc, (char***)&argv); initialize (); /* Process arguments. Take appropriate actions when -arch, -c, -S, -E, -o is encountered. Find input file name. */ for (i = 1; i < argc; i++) { if (!strcmp (argv[i], "-arch")) { if (i + 1 >= argc) abort (); add_arch (argv[i+1]); i++; } else if (!strcmp (argv[i], "-c")) { new_argv[new_argc++] = argv[i]; compile_only_request = 1; } else if (!strcmp (argv[i], "-S")) { new_argv[new_argc++] = argv[i]; asm_output_request = 1; } else if (!strcmp (argv[i], "-E")) { new_argv[new_argc++] = argv[i]; preprocessed_output_request = 1; } else if (!strcmp (argv[i], "-MD") || !strcmp (argv[i], "-MMD")) { new_argv[new_argc++] = argv[i]; dash_capital_m_seen = 1; } else if (!strcmp (argv[i], "-m32")) { new_argv[new_argc++] = argv[i]; dash_m32_seen = 1; } else if (!strcmp (argv[i], "-m64")) { new_argv[new_argc++] = argv[i]; dash_m64_seen = 1; } else if (!strcmp (argv[i], "-dynamiclib")) { new_argv[new_argc++] = argv[i]; dash_dynamiclib_seen = 1; } else if (!strcmp (argv[i], "-v")) { new_argv[new_argc++] = argv[i]; verbose_flag = 1; } else if (!strcmp (argv[i], "-o")) { if (i + 1 >= argc) fatal ("argument to '-o' is missing"); output_filename = argv[i+1]; i++; } else if ((! strcmp (argv[i], "-pass-exit-codes")) || (! strcmp (argv[i], "-print-search-dirs")) || (! strcmp (argv[i], "-print-libgcc-file-name")) || (! strncmp (argv[i], "-print-file-name=", 17)) || (! strncmp (argv[i], "-print-prog-name=", 17)) || (! strcmp (argv[i], "-print-multi-lib")) || (! strcmp (argv[i], "-print-multi-directory")) || (! strcmp (argv[i], "-print-multi-os-directory")) || (! strcmp (argv[i], "-ftarget-help")) || (! strcmp (argv[i], "-fhelp")) || (! strcmp (argv[i], "+e")) || (! strncmp (argv[i], "-Wa,",4)) || (! strncmp (argv[i], "-Wp,",4)) || (! strncmp (argv[i], "-Wl,",4)) || (! strncmp (argv[i], "-l", 2)) || (! strncmp (argv[i], "-weak-l", 7)) || (! strncmp (argv[i], "-specs=", 7)) || (! strcmp (argv[i], "-ObjC")) || (! strcmp (argv[i], "-fobjC")) || (! strcmp (argv[i], "-ObjC++")) || (! strcmp (argv[i], "-time")) || (! strcmp (argv[i], "-###")) || (! strcmp (argv[i], "-fconstant-cfstrings")) || (! strcmp (argv[i], "-fno-constant-cfstrings")) || (! strcmp (argv[i], "-static-libgcc")) || (! strcmp (argv[i], "-shared-libgcc")) || (! strcmp (argv[i], "-pipe")) ) { new_argv[new_argc++] = argv[i]; } else if (! strcmp (argv[i], "-save-temps") || ! strcmp (argv[i], "--save-temps")) { new_argv[new_argc++] = argv[i]; save_temps_seen = 1; } else if ((! strcmp (argv[i], "-Xlinker")) || (! strcmp (argv[i], "-Xassembler")) || (! strcmp (argv[i], "-Xpreprocessor")) || (! strcmp (argv[i], "-l")) || (! strcmp (argv[i], "-weak_library")) || (! strcmp (argv[i], "-weak_framework")) || (! strcmp (argv[i], "-specs")) || (! strcmp (argv[i], "-framework")) ) { new_argv[new_argc++] = argv[i]; i++; new_argv[new_argc++] = argv[i]; } else if (! strncmp (argv[i], "-Xarch_", 7)) { arch_conditional[new_argc] = get_arch_name (argv[i] + 7); i++; new_argv[new_argc++] = argv[i]; } else if (argv[i][0] == '-' && argv[i][1] != 0) { const char *p = &argv[i][1]; int c = *p; /* First copy this flag itself. */ new_argv[new_argc++] = argv[i]; if (argv[i][1] == 'M') dash_capital_m_seen = 1; /* Now copy this flag's arguments, if any, appropriately. */ if ((SWITCH_TAKES_ARG (c) > (p[1] != 0)) || WORD_SWITCH_TAKES_ARG (p)) { int j = 0; int n_args = WORD_SWITCH_TAKES_ARG (p); if (n_args == 0) { /* Count only the option arguments in separate argv elements. */ n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0); } if (i + n_args >= argc) fatal ("argument to `-%s' is missing", p); while ( j < n_args) { i++; new_argv[new_argc++] = argv[i]; j++; } } } else { struct input_filename *ifn; new_argv[new_argc++] = argv[i]; ifn = (struct input_filename *) malloc (sizeof (struct input_filename)); ifn->name = argv[i]; ifn->index = i; ifn->next = NULL; num_infiles++; if (last_infile) last_infile->next = ifn; else in_files = ifn; last_infile = ifn; } } #if 0 if (num_infiles == 0) fatal ("no input files"); #endif if (num_arches == 0) add_arch(get_arch_name(NULL)); if (num_arches > 1) { if (preprocessed_output_request || save_temps_seen || asm_output_request || dash_capital_m_seen) fatal ("-E, -S, -save-temps and -M options are not allowed with multiple -arch flags"); } /* If -arch is not present OR Only one -arch <blah> is specified. Invoke appropriate compiler driver. FAT build is not required in this case. */ if (num_arches == 1) { int arch_specific_argc; const char **arch_specific_argv; /* Find compiler driver based on -arch <foo> and add approriate -m* argument. */ new_argv[0] = get_driver_name (get_arch_name (arches[0])); new_argc = new_argc + add_arch_options (0, new_argv, new_argc); #ifdef DEBUG printf ("%s: invoking single driver name = %s\n", progname, new_argv[0]); #endif /* Re insert output file name. */ if (output_filename) { new_argv[new_argc++] = "-o"; new_argv[new_argc++] = output_filename; } /* Add the NULL. */ new_argv[new_argc] = NULL; arch_specific_argv = (const char **) malloc ((new_argc + 1) * sizeof (const char *)); arch_specific_argc = filter_args_for_arch (new_argv, new_argc, arch_specific_argv, get_arch_name (arches[0])); #ifdef DEBUG debug_command_line (arch_specific_argv, arch_specific_argc); #endif pid = pexecute (arch_specific_argv[0], (char *const *)arch_specific_argv, progname, NULL, &errmsg_fmt, &errmsg_arg, PEXECUTE_SEARCH | PEXECUTE_ONE); if (pid == -1) pfatal_pexecute (errmsg_fmt, errmsg_arg); do_wait (pid, arch_specific_argv[0]); } else { /* Handle multiple -arch <blah>. */ /* If more than one input files are supplied but only one output filename is present then IMA will be used. */ if (num_infiles > 1 && !compile_only_request) ima_is_used = 1; /* Linker wants to know this in case of multiple -arch. */ if (!compile_only_request && !dash_dynamiclib_seen) new_argv[new_argc++] = "-Wl,-arch_multiple"; /* If only one input file is specified OR IMA is used then expected output is one FAT binary. */ if (num_infiles == 1 || ima_is_used) { const char *out_file; /* Create output file name based on input filename, if required. */ if (compile_only_request && !output_filename && num_infiles == 1) out_file = strip_path_and_suffix (in_files->name, ".o"); else out_file = (output_filename ? output_filename : final_output); /* Linker wants to know name of output file using one extra arg. */ if (!compile_only_request) { char *oname = (char *)(output_filename ? output_filename : final_output); char *n = malloc (sizeof (char) * (strlen (oname) + 5)); strcpy (n, "-Wl,"); strcat (n, oname); new_argv[new_argc++] = "-Wl,-final_output"; new_argv[new_argc++] = n; } /* Compile file(s) for each arch and lipo 'em together. */ do_compile (new_argv, new_argc); /* Make FAT binary by combining individual output files for each architecture, using 'lipo'. */ do_lipo (0, out_file); } else { /* Multiple input files are present and IMA is not used. Which means need to generate multiple FAT files. */ do_compile_separately (); do_lipo_separately (); } } final_cleanup (); free (curr_dir); return greatest_status; }