/* Never fails. */ static int cmdline_get_module_path_via_argv(const char *argv, int overwrite) { char buffer[PATH_MAX]; int ret; if (overwrite) { /* Arbitrary order. */ cmdline_free(g_module_basename); cmdline_free(g_module_dirname); cmdline_free(g_module_basename); g_module_basename = NULL; g_module_dirname = NULL; } if (!g_module_dirname) { ret = snprintf(buffer, sizeof(buffer), "%s", argv); if (ret >= 0 && (size_t)ret < sizeof(buffer)) { g_module_dirname = cmdline_strdup(dirname(buffer)); } } if (!g_module_basename) { ret = snprintf(buffer, sizeof(buffer), "%s", argv); if (ret >= 0 && (size_t)ret < sizeof(buffer)) { g_module_basename = cmdline_strdup(basename(buffer)); } } return 0; }
/* Only dirname is retrieved. */ static int cmdline_get_module_path_via_fd(const char *argv) { char buffer[PATH_MAX]; char path[128]; char *ptr; int ret; int fd; if (g_module_dirname) { return 0; } ptr = cmdline_strdup(argv); fd = open(dirname(ptr), O_RDONLY | O_NOCTTY); cmdline_free(ptr); if (fd < 0) { return -1; } ret = snprintf(path, sizeof(path), "/proc/%d/fd/%d", getpid(), fd); if (ret < 0 || (size_t)ret >= sizeof(path)) { return -1; } ret = readlink(path, buffer, sizeof(buffer)); close(fd); if (ret <= 0) { return -1; } buffer[ret] = '\0'; g_module_dirname = cmdline_strdup(buffer); return 0; }
void cmdline_unset_process_name(void) { size_t len; if (!g_saved_program_name) { return; } len = strlen(g_saved_program_name); memcpy(g_arg_name, g_saved_program_name, len); memset(g_arg_name + len, 0, g_max_length - len); cmdline_free(g_saved_program_name); g_saved_program_name = NULL; }
int main(int argc, char* argv[]) { #ifdef SEQ_ALIGN_VERBOSE printf("VERBOSE: on\n"); #endif sw_set_default_scoring(); cmd = cmdline_new(argc, argv, &scoring, SEQ_ALIGN_SW_CMD); // Align! sw = smith_waterman_new(); result = alignment_create(256); if(cmd->seq1 != NULL) { // Align seq1 and seq2 align(cmd->seq1, cmd->seq2, NULL, NULL); } // Align from files size_t i, num_of_file_pairs = cmdline_get_num_of_file_pairs(cmd); for(i = 0; i < num_of_file_pairs; i++) { const char *file1 = cmdline_get_file1(cmd, i); const char *file2 = cmdline_get_file2(cmd, i); if(file1 != NULL && *file1 == '\0' && file2 == NULL) { wait_on_keystroke = 1; file1 = "-"; } align_from_file(file1, file2, &align_pair_from_file, !cmd->interactive); } // Free memory for storing alignment results smith_waterman_free(sw); alignment_free(result); cmdline_free(cmd); return EXIT_SUCCESS; }
/* Only dirname is retrieved. */ static int cmdline_get_module_path_via_cwd(const char *argv) { char buffer[PATH_MAX]; char cwd[PATH_MAX]; char *ptr; char *pwd; int ret; if (g_module_dirname) { return 0; } if (!getcwd(cwd, sizeof(cwd))) { return -1; } pwd = NULL; if (*argv != '/') { ptr = cmdline_strdup(argv); ret = snprintf(buffer, sizeof(buffer), "%s/%s", cwd, dirname(ptr)); cmdline_free(ptr); if (ret < 0 || (size_t)ret >= sizeof(buffer)) { return -1; } pwd = make_clean_path(buffer, 0); } if (!pwd) { return -1; } g_module_dirname = cmdline_strdup(pwd); free(pwd); return 0; }
void cmdline_shutdown(void) { cmdline_free(); lib_free(options); }
int cmdline_set_process_name(const char *fmt, ...) { int with_prefix; int eraser; va_list ap; size_t max; size_t off; if (!g_max_length || !g_arg_name) { errno = EINVAL; return -1; } if (!fmt) { fmt = g_module_arg; with_prefix = 0; } else if (*fmt == '-') { with_prefix = 0; ++fmt; } else { with_prefix = g_prefix_length ? 1 : 0; } if (with_prefix) { if (g_prefix_length <= g_max_length) { off = g_prefix_length; } else { off = g_max_length; } memcpy(g_arg_name, g_prefix, off); max = g_max_length - off; } else { max = g_max_length; off = 0; } cmdline_free(g_saved_program_name); g_saved_program_name = cmdline_strdup(g_arg_name); /* g_max_length doesn't include the trailing zero, so add 1 to it. */ va_start(ap, fmt); eraser = vsnprintf(g_arg_name + off, max + 1, fmt, ap); va_end(ap); if (eraser < 0) { return -1; } /* And we erase all remaining buffer to 0, since some OS might remember the old length. */ if (max > (size_t)eraser) { off += eraser; } else { off += max; } memset(g_arg_name + off, 0, g_max_length - off); return 0; }