--- gv-3.5.8.orig/source/Imakefile +++ gv-3.5.8/source/Imakefile @@ -311,8 +311,8 @@ @echo "!########## gv_intern_res.dat (generated by makefile)" >> $(GV_INTERN_RES_DAT) @echo "" >> $(GV_INTERN_RES_DAT) @echo "GV.gsInterpreter: gs" >> $(GV_INTERN_RES_DAT) - @echo "GV.gsCmdScanPDF: gs -dNODISPLAY -dQUIET -sPDFname=%s -sDSCname=%s pdf2dsc.ps -c quit" >> $(GV_INTERN_RES_DAT) - @echo "GV.gsCmdConvPDF: gs -dNODISPLAY -dQUIET $(PS_LEVEL) -dNOPAUSE -sPSFile=%s %s -c quit" >> $(GV_INTERN_RES_DAT) + @echo "GV.gsCmdScanPDF: pdf2dsc %pdf %dsc" >> $(GV_INTERN_RES_DAT) + @echo "GV.gsCmdConvPDF: pdf2ps $(PS_LEVEL) %pdf %ps" >> $(GV_INTERN_RES_DAT) @echo "GV.gsX11Device: -sDEVICE=x11" >> $(GV_INTERN_RES_DAT) @echo "GV.gsX11AlphaDevice: -dNOPLATFONTS -sDEVICE=x11alpha" >> $(GV_INTERN_RES_DAT) @echo "GV.gsSafer: True" >> $(GV_INTERN_RES_DAT) --- gv-3.5.8.orig/source/ps.c +++ gv-3.5.8/source/ps.c @@ -417,10 +417,15 @@ struct document *retval = NULL; FILE *tmpfile = (FILE*)NULL; char *filename_unc; + char *quoted_filename, *quoted_filename_unc; char cmd[512]; char s[512]; filename_unc=file_getTmpFilename(NULL,filename_raw); - sprintf(cmd,cmd_uncompress,filename,filename_unc); + quoted_filename = quote_filename(filename); + quoted_filename_unc = quote_filename(filename_unc); + sprintf(cmd,cmd_uncompress,quoted_filename,quoted_filename_unc); + GV_XtFree(quoted_filename); + GV_XtFree(quoted_filename_unc); INFMESSAGE(is compressed) INFSMESSAGE(uncompress command,cmd) if (ps_system(cmd) || file_fileIsNotUseful(filename_unc)) { @@ -488,10 +493,35 @@ struct document *retval = NULL; FILE *tmpfile = (FILE*)NULL; char *filename_dsc; + char *quoted_filename, *quoted_filename_dsc; + char *pdfpos; + char *dscpos; char cmd[512]; char s[512]; - filename_dsc=file_getTmpFilename(NULL,filename_raw); - sprintf(cmd,cmd_scan_pdf,filename,filename_dsc); + filename_dsc=file_getTmpFilename(NULL,filename_raw); + quoted_filename = quote_filename(filename); + quoted_filename_dsc = quote_filename(filename_dsc); + if ((pdfpos = strstr(cmd_scan_pdf,"%pdf")) && + (dscpos = strstr(cmd_scan_pdf,"%dsc"))) { + cmd[0] = '\0'; + if (pdfpos < dscpos) { + strncat(cmd,cmd_scan_pdf,(pdfpos-cmd_scan_pdf)); + strcat(cmd,quoted_filename); + strncat(cmd,pdfpos+4,(dscpos-pdfpos-4)); + strcat(cmd,quoted_filename_dsc); + strcat(cmd,dscpos+4); + } else { + strncat(cmd,cmd_scan_pdf,(dscpos-cmd_scan_pdf)); + strcat(cmd,quoted_filename_dsc); + strncat(cmd,dscpos+4,(pdfpos-dscpos-4)); + strcat(cmd,quoted_filename); + strcat(cmd,pdfpos+4); + } + } else { + sprintf(cmd,cmd_scan_pdf,quoted_filename,quoted_filename_dsc); + } + GV_XtFree(quoted_filename); + GV_XtFree(quoted_filename_dsc); INFMESSAGE(is PDF) INFSMESSAGE(scan command,cmd) #ifdef VMS --- gv-3.5.8.orig/source/misc.c +++ gv-3.5.8/source/misc.c @@ -1154,7 +1154,7 @@ misc_setSensitive(w_printAllPages , show_printAllPages , (gv_psfile != NULL)); misc_setSensitive(w_checkFile , show_checkFile , (gv_filename != NULL)); misc_setSensitive(w_updateFile , show_updateFile , (gv_filename != NULL)); - misc_setSensitive(w_showThisPage , show_showThisPage , (gv_filename != NULL)); + misc_setSensitive(w_showThisPage , show_showThisPage , (gv_psfile != NULL)); misc_setSensitive(w_prevPage , show_prevPage , (toc_text != NULL)); misc_setSensitive(w_nextPage , show_nextPage , (gv_filename != NULL)); misc_setSensitive(w_toggleCurrentPage , show_toggleCurrentPage , (toc_text != NULL)); @@ -1168,7 +1168,7 @@ XtSetSensitive(saveAllEntry, (gv_psfile != NULL)); XtSetSensitive(saveMarkedEntry, (toc_text != NULL)); XtSetSensitive(nextEntry, (gv_filename != NULL)); - XtSetSensitive(redisplayEntry, (gv_filename != NULL)); + XtSetSensitive(redisplayEntry, (gv_psfile != NULL)); XtSetSensitive(prevEntry, (toc_text != NULL)); XtSetSensitive(currentEntry, (toc_text != NULL)); XtSetSensitive(oddEntry, (toc_text != NULL)); @@ -1717,4 +1717,52 @@ XtDestroyWidget(toplevel); ENDMESSAGE(catch_Xerror) return 0; +} + +/*############################################################*/ +/* quote_filename */ +/* Quotes special characters in filenames */ +/* (taken from bash sources) */ +/*############################################################*/ + +char * +quote_filename (string) + char *string; +{ + int c; + char *result, *r, *s; + + BEGINMESSAGE(quote_filename) + + result = (char*) GV_XtMalloc((2 * strlen (string) + 1) * sizeof(char)); + + for (r = result, s = string; s && (c = *s); s++) + { + switch (c) + { + case ' ': case '\t': case '\n': /* IFS white space */ + case '\'': case '"': case '\\': /* quoting chars */ + case '|': case '&': case ';': /* shell metacharacters */ + case '(': case ')': case '<': case '>': + case '!': case '{': case '}': /* reserved words */ + case '*': case '[': case '?': case ']': /* globbing chars */ + case '^': + case '$': case '`': /* expansion chars */ + *r++ = '\\'; + *r++ = c; + break; + case '#': /* comment char */ + if (s == string) + *r++ = '\\'; + /* FALLTHROUGH */ + default: + *r++ = c; + break; + } + } + *r = '\0'; + + ENDMESSAGE(quote_filename) + + return (result); } --- gv-3.5.8.orig/source/callbacks.c +++ gv-3.5.8/source/callbacks.c @@ -870,7 +870,7 @@ char *s; BEGINMESSAGE(cb_page) - if (gv_psfile && client_data) { + if (gv_filename && client_data) { s = (char*)client_data; if (*s=='-' || *s=='+') { k = 1; --- gv-3.5.8.orig/source/descrip.mms +++ gv-3.5.8/source/descrip.mms @@ -262,7 +262,7 @@ @ WRITE_ file "" @ WRITE_ file "GV.gsInterpreter: gs" @ WRITE_ file "GV.gsCmdScanPDF: gs ""-dNODISPLAY"" ""-dQUIET"" ""-sPDFname""=%s ""-sDSCname""=%s pdf2dsc.ps -c quit" - @ WRITE_ file "GV.gsCmdConvPDF: gs ""-dNODISPLAY"" ""-dQUIET"" $(PS_LEVEL) ""-dNOPAUSE"" ""-sPSFile""=%s %s -c quit" + @ WRITE_ file "GV.gsCmdConvPDF: gs ""-dNODISPLAY"" ""-dQUIET"" $(PS_LEVEL) ""-dNOPAUSE"" ""-sPSFile""=%s %s -c quit" @ WRITE_ file "GV.gsX11Device: ""-sDEVICE=x11""" @ WRITE_ file "GV.gsX11AlphaDevice:""-dNOPLATFONTS"" ""-sDEVICE=x11alpha""" @ WRITE_ file "GV.gsSafer: True" --- gv-3.5.8.orig/source/misc.h +++ gv-3.5.8/source/misc.h @@ -115,6 +115,12 @@ #endif ); +extern char * quote_filename ( +#if NeedFunctionPrototypes + char* +#endif +); + #endif /* _GV_MISC_H_ */ --- gv-3.5.8.orig/source/file.c +++ gv-3.5.8/source/file.c @@ -145,6 +145,25 @@ } /*############################################################*/ +/* file_assureDirectory */ +/*############################################################*/ + +void +file_assureDirectory(to,from) + char *to; + char *from; +{ + int len; + BEGINMESSAGE(file_assureDirectory) + strcpy(to,from); +# ifndef VMS + len = strlen(to); + if (to[len-1] != '/') { to[len] = '/'; to[len+1] = '\0'; } +# endif + ENDMESSAGE(file_assureDirectory) +} + +/*############################################################*/ /* file_getTmpFilename */ /* provide some temporary file name */ /*############################################################*/ @@ -164,11 +183,13 @@ BEGINMESSAGE(file_getTmpFilename) - if (!baseDirectory) baseDirectory = app_res.scratch_dir; - strcpy(tmpDirBuf,baseDirectory); - pos = file_locateFilename(tmpDirBuf); - if (pos) { ++pos; *pos='\0'; } - else strcpy(tmpDirBuf,app_res.scratch_dir); + pos = NULL; + if (baseDirectory) { + strcpy(tmpDirBuf,baseDirectory); + pos = file_locateFilename(tmpDirBuf); + } + if (pos) *pos='\0'; + else file_assureDirectory(tmpDirBuf,app_res.scratch_dir); if (!baseFilename) baseFilename= "."; strcpy(tmpNameBuf,baseFilename); --- gv-3.5.8.orig/source/save.c +++ gv-3.5.8/source/save.c @@ -112,17 +112,19 @@ String print_filename; { String error=NULL; + char *print_quoted_filename; char *c,*p; Cardinal m,n; String printfail=GV_ERROR_PRINT_FAIL; BEGINMESSAGE(print_file) + print_quoted_filename = quote_filename(print_filename); p = GV_XtNewString(print_command); n=0; c=p; while ((c=strstr(c,"%s"))) { c+=2; n++; } - m = (strlen(p)+(n>0?n:1)*strlen(print_filename)+5)*sizeof(char); + m = (strlen(p)+(n>0?n:1)*strlen(print_quoted_filename)+5)*sizeof(char); c = (char*) GV_XtMalloc(m); if (n>0) { char *e,*s; @@ -133,13 +135,13 @@ if (s) *s='\0'; strcat(c,e); if (s) { - strcat(c,print_filename); + strcat(c,print_quoted_filename); e=s+2; } else s=NULL; } } else { - sprintf(c, "%s %s",p,print_filename); + sprintf(c, "%s %s",p,print_quoted_filename); } INFSMESSAGE(printing:,c) if (SYSTEM_FAILED_ON(c)) { @@ -149,6 +151,7 @@ } GV_XtFree(c); GV_XtFree(p); + GV_XtFree(print_quoted_filename); ENDMESSAGE(print_file) return(error); } @@ -198,6 +201,9 @@ char proc_name[256]; char *error=NULL; char *pos; + char *pdfpos; + char *pspos; + char *quoted_src_fn, *quoted_conv_fn; BEGINMESSAGE(save_forkPDFToPSConversion) @@ -205,7 +211,30 @@ strcpy(proc_name,pos); strcat(proc_name," conversion"); - sprintf(command,gv_gs_cmd_conv_pdf,sd->conv_fn,sd->src_fn); + quoted_src_fn = quote_filename(sd->src_fn); + quoted_conv_fn = quote_filename(sd->conv_fn); + if ((pdfpos = strstr(gv_gs_cmd_conv_pdf,"%pdf")) && + (pspos = strstr(gv_gs_cmd_conv_pdf,"%ps"))) { + command[0] = '\0'; + if (pdfpos < pspos) { + strncat(command,gv_gs_cmd_conv_pdf,(pdfpos-gv_gs_cmd_conv_pdf)); + strcat(command,quoted_src_fn); + strncat(command,pdfpos+4,(pspos-pdfpos-4)); + strcat(command,quoted_conv_fn); + strcat(command,pspos+3); + } else { + strncat(command,gv_gs_cmd_conv_pdf,(pspos-gv_gs_cmd_conv_pdf)); + strcat(command,quoted_conv_fn); + strncat(command,pspos+3,(pdfpos-pspos-3)); + strcat(command,quoted_src_fn); + strcat(command,pdfpos+4); + } + } else { + sprintf(command,gv_gs_cmd_conv_pdf,quoted_conv_fn,quoted_src_fn); + } + GV_XtFree(quoted_src_fn); + GV_XtFree(quoted_conv_fn); + INFSMESSAGE(starting conversion:,command) process_fork(proc_name,command,save_forkPDFToPSConversionDone,(XtPointer)sd); ENDMESSAGE(save_forkPDFToPSConversion) --- gv-3.5.8.orig/source/process.c +++ gv-3.5.8/source/process.c @@ -272,8 +272,7 @@ pid = fork(); if (pid == 0) { /* child */ - int argc=0; - char *argv[20]; + char *argv[3]; char *c; INFMESSAGE(child process) @@ -286,15 +285,10 @@ */ system(c); #else - while (isspace(*c)) c++; - while (*c) { - argv[argc++] = c; - while (*c && !isspace(*c)) c++; - if (*c) *c++ = '\0'; - while (isspace(*c)) c++; - SMESSAGE(argv[argc-1]) - } - argv[argc] = NULL; + argv[0] = "sh"; + argv[1] = "-c"; + argv[2] = c; + argv[3] = NULL; INFMESSAGE(spawning conversion process) /* --- gv-3.5.8.orig/source/miscmenu.c +++ gv-3.5.8/source/miscmenu.c @@ -60,7 +60,7 @@ static MiscMenuEntryStruct miscmenu_entries[] = { { "update",cb_checkFile,(XtPointer)CHECK_FILE_DATE,2 }, - { "redisplay",cb_redisplay,NULL,2 }, + { "redisplay",cb_redisplay,NULL,3 }, { "toggle_current" , cb_setPageMark, (XtPointer)(SPM_CURRENT|SPM_TOGGLE),1 }, { "toggle_even" , cb_setPageMark, (XtPointer)(SPM_EVEN|SPM_TOGGLE),1 }, { "toggle_odd" , cb_setPageMark, (XtPointer)(SPM_ODD|SPM_TOGGLE),1 }, --- gv-3.5.8.orig/source/options_fs.c +++ gv-3.5.8/source/options_fs.c @@ -105,7 +105,6 @@ Widget w; XtPointer client_data, call_data; { - BEGINMESSAGE(options_fs_cb_apply) Arg args[5]; Cardinal n; static Boolean s_scratch_dir = False;