void slideshow_save_image(winwidget win) { char *tmpname; Imlib_Load_Error err; if (win->file) { tmpname = feh_unique_filename("", FEH_FILE(win->file->data)->name); } else if (mode) { char *tmp; tmp = estrjoin(".", mode, "png", NULL); tmpname = feh_unique_filename("", tmp); free(tmp); } else { tmpname = feh_unique_filename("", "noname.png"); } if (opt.verbose) fprintf(stderr, "saving image to filename '%s'\n", tmpname); ungib_imlib_save_image_with_error_return(win->im, tmpname, &err); if (err) feh_imlib_print_load_error(tmpname, win, err); free(tmpname); return; }
void slideshow_save_image(winwidget win) { char *tmpname; Imlib_Load_Error err; if (win->file) { tmpname = feh_unique_filename("", FEH_FILE(win->file->data)->name); } else if (mode) { char *tmp; tmp = estrjoin(".", mode, "png", NULL); tmpname = feh_unique_filename("", tmp); free(tmp); } else { tmpname = feh_unique_filename("", "noname.png"); } if (opt.verbose) printf("saving image to filename '%s'\n", tmpname); /* XXX gib_imlib_save_image_with_error_return breaks with *.XXX and * similar because it tries to set the image format, which only works * with .xxx . * So we leave that part out. */ imlib_context_set_image(win->im); imlib_save_image_with_error_return(tmpname, &err); if (err) im_weprintf(win, "Can't save image %s:", tmpname); free(tmpname); return; }
void feh_save_filelist() { char *tmpname; tmpname = feh_unique_filename("", "filelist"); if (!opt.quiet) printf("saving filelist to filename '%s'\n", tmpname); feh_write_filelist(filelist, tmpname); free(tmpname); return; }
static char *feh_http_load_image(char *url) { CURL *curl; CURLcode res; char *sfn; FILE *sfp; int fd = -1; char *ebuff; char *tmpname; char *basename; char *path = NULL; if (opt.keep_http) { if (opt.output_dir) path = opt.output_dir; else path = ""; } else path = "/tmp/"; curl = curl_easy_init(); if (!curl) { weprintf("open url: libcurl initialization failure"); return NULL; } basename = strrchr(url, '/') + 1; tmpname = feh_unique_filename(path, basename); if (strlen(tmpname) > (NAME_MAX-6)) tmpname[NAME_MAX-7] = '\0'; sfn = estrjoin("_", tmpname, "XXXXXX", NULL); free(tmpname); fd = mkstemp(sfn); if (fd != -1) { sfp = fdopen(fd, "w+"); if (sfp != NULL) { #ifdef DEBUG curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); #endif curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_WRITEDATA, sfp); ebuff = emalloc(CURL_ERROR_SIZE); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, ebuff); curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); res = curl_easy_perform(curl); curl_easy_cleanup(curl); if (res != CURLE_OK) { weprintf("open url: %s", ebuff); unlink(sfn); close(fd); free(sfn); sfn = NULL; } free(ebuff); fclose(sfp); return sfn; } else { weprintf("open url: fdopen failed:"); unlink(sfn); free(sfn); close(fd); } } else { weprintf("open url: mkstemp failed:"); free(sfn); } curl_easy_cleanup(curl); return NULL; }
static char *feh_magick_load_image(char *filename) { char argv_fd[12]; char *basename; char *tmpname; char *sfn; int fd = -1, devnull = -1; int status; if (opt.magick_timeout < 0) return NULL; basename = strrchr(filename, '/'); if (basename == NULL) basename = filename; else basename++; tmpname = feh_unique_filename("/tmp/", basename); if (strlen(tmpname) > (NAME_MAX-6)) tmpname[NAME_MAX-7] = '\0'; sfn = estrjoin("_", tmpname, "XXXXXX", NULL); free(tmpname); fd = mkstemp(sfn); if (fd == -1) return NULL; snprintf(argv_fd, sizeof(argv_fd), "png:fd:%d", fd); if ((childpid = fork()) == 0) { /* discard convert output */ devnull = open("/dev/null", O_WRONLY); dup2(devnull, 0); dup2(devnull, 1); dup2(devnull, 2); /* * convert only accepts SIGINT via killpg, a normal kill doesn't work */ setpgid(0, 0); execlp("convert", "convert", filename, argv_fd, NULL); exit(1); } else { alarm(opt.magick_timeout); waitpid(childpid, &status, 0); alarm(0); if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0)) { close(fd); unlink(sfn); free(sfn); sfn = NULL; if (!opt.quiet) { if (WIFSIGNALED(status)) weprintf("%s - Conversion took too long, skipping", filename); } /* * Reap child. The previous waitpid call was interrupted by * alarm, but convert doesn't terminate immediately. * XXX * normally, if (WIFSIGNALED(status)) waitpid(childpid, &status, 0); * would suffice. However, as soon as feh has its own window, * this doesn't work anymore and the following workaround is * required. Hm. */ waitpid(-1, &status, 0); } childpid = 0; } return sfn; }
char *feh_printf(char *str, feh_file * file, winwidget winwid) { char *c; char buf[20]; static char ret[4096]; char *filelist_tmppath; ret[0] = '\0'; filelist_tmppath = NULL; for (c = str; *c != '\0'; c++) { if ((*c == '%') && (*(c+1) != '\0')) { c++; switch (*c) { case 'f': if (file) strncat(ret, file->filename, sizeof(ret) - strlen(ret) - 1); break; case 'F': if (file) strncat(ret, shell_escape(file->filename), sizeof(ret) - strlen(ret) - 1); break; case 'h': if (file && (file->info || !feh_file_info_load(file, NULL))) { snprintf(buf, sizeof(buf), "%d", file->info->height); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); } break; case 'l': snprintf(buf, sizeof(buf), "%d", gib_list_length(filelist)); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); break; case 'L': if (filelist_tmppath != NULL) { strncat(ret, filelist_tmppath, sizeof(ret) - strlen(ret) - 1); } else { filelist_tmppath = feh_unique_filename("/tmp/","filelist"); feh_write_filelist(filelist, filelist_tmppath); strncat(ret, filelist_tmppath, sizeof(ret) - strlen(ret) - 1); } break; case 'm': strncat(ret, mode, sizeof(ret) - strlen(ret) - 1); break; case 'n': if (file) strncat(ret, file->name, sizeof(ret) - strlen(ret) - 1); break; case 'N': if (file) strncat(ret, shell_escape(file->name), sizeof(ret) - strlen(ret) - 1); break; case 'o': if (winwid) { snprintf(buf, sizeof(buf), "%d,%d", winwid->im_x, winwid->im_y); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); } break; case 'p': if (file && (file->info || !feh_file_info_load(file, NULL))) { snprintf(buf, sizeof(buf), "%d", file->info->pixels); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); } break; case 'P': if (file && (file->info || !feh_file_info_load(file, NULL))) { strncat(ret, format_size(file->info->pixels), sizeof(ret) - strlen(ret) - 1); } break; case 'r': if (winwid) { snprintf(buf, sizeof(buf), "%.1f", winwid->im_angle); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); } break; case 's': if (file && (file->info || !feh_file_info_load(file, NULL))) { snprintf(buf, sizeof(buf), "%d", file->info->size); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); } break; case 'S': if (file && (file->info || !feh_file_info_load(file, NULL))) { strncat(ret, format_size(file->info->size), sizeof(ret) - strlen(ret) - 1); } break; case 't': if (file && (file->info || !feh_file_info_load(file, NULL))) { strncat(ret, file->info->format, sizeof(ret) - strlen(ret) - 1); } break; case 'u': snprintf(buf, sizeof(buf), "%d", current_file != NULL ? gib_list_num(filelist, current_file) + 1 : 0); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); break; case 'v': strncat(ret, VERSION, sizeof(ret) - strlen(ret) - 1); break; case 'V': snprintf(buf, sizeof(buf), "%d", getpid()); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); break; case 'w': if (file && (file->info || !feh_file_info_load(file, NULL))) { snprintf(buf, sizeof(buf), "%d", file->info->width); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); } break; case 'z': if (winwid) { snprintf(buf, sizeof(buf), "%.2f", winwid->zoom); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); } break; case '%': strncat(ret, "%", sizeof(ret) - strlen(ret) - 1); break; default: weprintf("Unrecognized format specifier %%%c", *c); if ((strlen(ret) + 3) < sizeof(ret)) strncat(ret, c - 1, 2); break; } } else if ((*c == '\\') && (*(c+1) != '\0') && ((strlen(ret) + 3) < sizeof(ret))) { c++; switch (*c) { case 'n': strcat(ret, "\n"); break; default: strncat(ret, c - 1, 2); break; } } else if ((strlen(ret) + 2) < sizeof(ret)) strncat(ret, c, 1); } if (filelist_tmppath != NULL) free(filelist_tmppath); return(ret); }