/* * LYShowInfo prints a page of info about the current file and the link that * the cursor is on. */ int LYShowInfo(DocInfo *doc, DocInfo *newdoc, char *owner_address) { static char tempfile[LY_MAXPATH] = "\0"; int url_type; FILE *fp0; char *Title = NULL; const char *cp; char *temp = NULL; char *buffer = NULL; BOOLEAN LYInfoAdvanced = (BOOL) (user_mode == ADVANCED_MODE); #ifdef DIRED_SUPPORT struct stat dir_info; const char *name; #endif /* DIRED_SUPPORT */ if (LYReuseTempfiles) { fp0 = LYOpenTempRewrite(tempfile, HTML_SUFFIX, "w"); } else { (void) LYRemoveTemp(tempfile); fp0 = LYOpenTemp(tempfile, HTML_SUFFIX, "w"); } if (fp0 == NULL) { HTAlert(CANNOT_OPEN_TEMP); return (-1); } /* * Point the address pointer at this Url */ LYLocalFileToURL(&newdoc->address, tempfile); if (nlinks > 0 && links[doc->link].lname != NULL && (url_type = is_url(links[doc->link].lname)) != 0 && (url_type == LYNXEXEC_URL_TYPE || url_type == LYNXPROG_URL_TYPE)) { char *last_slash = strrchr(links[doc->link].lname, '/'); int next_to_last = (int) strlen(links[doc->link].lname) - 1; if ((last_slash - links[doc->link].lname) == next_to_last) { links[doc->link].lname[next_to_last] = '\0'; } } label_columns = 9; WriteInternalTitle(fp0, SHOWINFO_TITLE); fprintf(fp0, "<h1>%s %s (%s) (<a href=\"%s\">%s</a>)", LYNX_NAME, LYNX_VERSION, LYVersionDate(), (LYVersionIsRelease()? LYNX_WWW_HOME : LYNX_WWW_DIST), LYVersionStatus()); fprintf(fp0, "</h1>\n"); /* don't forget to close <h1> */ #ifdef DIRED_SUPPORT if (lynx_edit_mode && nlinks > 0) { BEGIN_DL(gettext("Directory that you are currently viewing")); temp = HTfullURL_toFile(doc->address); ADD_SS(gettext("Name:"), temp); FREE(temp); dt_URL(fp0, doc->address); END_DL(); temp = HTfullURL_toFile(links[doc->link].lname); if (lstat(temp, &dir_info) == -1) { CTRACE((tfp, "lstat(%s) failed, errno=%d\n", temp, errno)); HTAlert(CURRENT_LINK_STATUS_FAILED); } else { char modes[80]; label_columns = 16; if (S_ISDIR(dir_info.st_mode)) { BEGIN_DL(gettext("Directory that you have currently selected")); } else if (S_ISREG(dir_info.st_mode)) { BEGIN_DL(gettext("File that you have currently selected")); #ifdef S_IFLNK } else if (S_ISLNK(dir_info.st_mode)) { BEGIN_DL(gettext("Symbolic link that you have currently selected")); #endif } else { BEGIN_DL(gettext("Item that you have currently selected")); } ADD_SS(gettext("Full name:"), temp); #ifdef S_IFLNK if (S_ISLNK(dir_info.st_mode)) { char buf[MAX_LINE]; int buf_size; size_t limit = sizeof(buf) - 1; if ((buf_size = (int) readlink(temp, buf, limit)) != -1) { if (buf_size > (int) limit) buf_size = (int) limit; buf[buf_size] = '\0'; } else { sprintf(buf, "%.*s", (int) limit, gettext("Unable to follow link")); } ADD_SS(gettext("Points to file:"), buf); } #endif name = HTAA_UidToName((int) dir_info.st_uid); if (*name) ADD_SS(gettext("Name of owner:"), name); name = HTAA_GidToName((int) dir_info.st_gid); if (*name) ADD_SS(gettext("Group name:"), name); if (S_ISREG(dir_info.st_mode)) { ADD_NN(gettext("File size:"), (long) dir_info.st_size, gettext("(bytes)")); } /* * Include date and time information. */ ADD_SS(gettext("Creation date:"), ctime(&dir_info.st_ctime)); ADD_SS(gettext("Last modified:"), ctime(&dir_info.st_mtime)); ADD_SS(gettext("Last accessed:"), ctime(&dir_info.st_atime)); END_DL(); label_columns = 9; BEGIN_DL(gettext("Access Permissions")); modes[0] = '\0'; modes[1] = '\0'; /* In case there are no permissions */ modes[2] = '\0'; if ((dir_info.st_mode & S_IRUSR)) strcat(modes, ", read"); if ((dir_info.st_mode & S_IWUSR)) strcat(modes, ", write"); if ((dir_info.st_mode & S_IXUSR)) { if (S_ISDIR(dir_info.st_mode)) strcat(modes, ", search"); else { strcat(modes, ", execute"); if ((dir_info.st_mode & S_ISUID)) strcat(modes, ", setuid"); } } ADD_SS(gettext("Owner:"), &modes[2]); modes[0] = '\0'; modes[1] = '\0'; /* In case there are no permissions */ modes[2] = '\0'; if ((dir_info.st_mode & S_IRGRP)) strcat(modes, ", read"); if ((dir_info.st_mode & S_IWGRP)) strcat(modes, ", write"); if ((dir_info.st_mode & S_IXGRP)) { if (S_ISDIR(dir_info.st_mode)) strcat(modes, ", search"); else { strcat(modes, ", execute"); if ((dir_info.st_mode & S_ISGID)) strcat(modes, ", setgid"); } } ADD_SS(gettext("Group:"), &modes[2]); modes[0] = '\0'; modes[1] = '\0'; /* In case there are no permissions */ modes[2] = '\0'; if ((dir_info.st_mode & S_IROTH)) strcat(modes, ", read"); if ((dir_info.st_mode & S_IWOTH)) strcat(modes, ", write"); if ((dir_info.st_mode & S_IXOTH)) { if (S_ISDIR(dir_info.st_mode)) strcat(modes, ", search"); else { strcat(modes, ", execute"); #ifdef S_ISVTX if ((dir_info.st_mode & S_ISVTX)) strcat(modes, ", sticky"); #endif } } ADD_SS(gettext("World:"), &modes[2]); END_DL(); } FREE(temp); } else { #endif /* DIRED_SUPPORT */ BEGIN_DL(gettext("File that you are currently viewing")); LYformTitle(&Title, doc->title); HTSprintf(&temp, "%s%s", LYEntifyTitle(&buffer, Title), ((doc->isHEAD && !strstr(Title, " (HEAD)") && !strstr(Title, " - HEAD")) ? " (HEAD)" : "")); ADD_SS(gettext("Linkname:"), temp); FREE(temp); dt_URL(fp0, doc->address); if (HTLoadedDocumentCharset()) { ADD_SS(gettext("Charset:"), HTLoadedDocumentCharset()); } else { LYUCcharset *p_in = HTAnchor_getUCInfoStage(HTMainAnchor, UCT_STAGE_PARSER); if (!p_in || isEmpty(p_in->MIMEname) || HTAnchor_getUCLYhndl(HTMainAnchor, UCT_STAGE_PARSER) < 0) { p_in = HTAnchor_getUCInfoStage(HTMainAnchor, UCT_STAGE_MIME); } if (p_in && non_empty(p_in->MIMEname) && HTAnchor_getUCLYhndl(HTMainAnchor, UCT_STAGE_MIME) >= 0) { HTSprintf(&temp, "%s %s", LYEntifyTitle(&buffer, p_in->MIMEname), gettext("(assumed)")); ADD_SS(gettext("Charset:"), p_in->MIMEname); FREE(temp); } } if ((cp = HText_getServer()) != NULL && *cp != '\0') ADD_SS(gettext("Server:"), cp); if ((cp = HText_getDate()) != NULL && *cp != '\0') ADD_SS(gettext("Date:"), cp); if ((cp = HText_getLastModified()) != NULL && *cp != '\0') ADD_SS(gettext("Last Mod:"), cp); if (LYInfoAdvanced) { if (HTMainAnchor && HTMainAnchor->expires) { ADD_SS(gettext("Expires:"), HTMainAnchor->expires); } if (HTMainAnchor && HTMainAnchor->cache_control) { ADD_SS(gettext("Cache-Control:"), HTMainAnchor->cache_control); } if (HTMainAnchor && HTMainAnchor->content_length > 0) { ADD_NN(gettext("Content-Length:"), HTMainAnchor->content_length, gettext("bytes")); } else { ADD_NN(gettext("Length:"), HText_getNumOfBytes(), gettext("bytes")); } if (HTMainAnchor && HTMainAnchor->content_language) { ADD_SS(gettext("Language:"), HTMainAnchor->content_language); } } if (doc->post_data) { fprintf(fp0, "<dt><em>%s</em> <xmp>%.*s</xmp>\n", LYEntifyTitle(&buffer, gettext("Post Data:")), BStrLen(doc->post_data), BStrData(doc->post_data)); ADD_SS(gettext("Post Content Type:"), doc->post_content_type); } ADD_SS(gettext("Owner(s):"), (owner_address ? owner_address : NO_NOTHING)); ADD_NN(gettext("size:"), HText_getNumOfLines(), gettext("lines")); StrAllocCopy(temp, ((lynx_mode == FORMS_LYNX_MODE) ? gettext("forms mode") : (HTisDocumentSource() ? gettext("source") : gettext("normal")))); if (doc->safe) StrAllocCat(temp, gettext(", safe")); if (doc->internal_link) StrAllocCat(temp, gettext(", via internal link")); if (LYInfoAdvanced) { if (HText_hasNoCacheSet(HTMainText)) StrAllocCat(temp, gettext(", no-cache")); if (HTAnchor_isISMAPScript((HTAnchor *) HTMainAnchor)) StrAllocCat(temp, gettext(", ISMAP script")); if (doc->bookmark) StrAllocCat(temp, gettext(", bookmark file")); } ADD_SS(gettext("mode:"), temp); FREE(temp); END_DL(); if (nlinks > 0) { BEGIN_DL(gettext("Link that you currently have selected")); ADD_SS(gettext("Linkname:"), LYGetHiliteStr(doc->link, 0)); if (lynx_mode == FORMS_LYNX_MODE && links[doc->link].type == WWW_FORM_LINK_TYPE) { if (links[doc->link].l_form->submit_method) { int method = links[doc->link].l_form->submit_method; char *enctype = links[doc->link].l_form->submit_enctype; ADD_SS(gettext("Method:"), ((method == URL_POST_METHOD) ? "POST" : ((method == URL_MAIL_METHOD) ? "(email)" : "GET"))); ADD_SS(gettext("Enctype:"), (non_empty(enctype) ? enctype : "application/x-www-form-urlencoded")); } if (links[doc->link].l_form->submit_action) { ADD_SS(gettext("Action:"), links[doc->link].l_form->submit_action); } if (!(links[doc->link].l_form->submit_method && links[doc->link].l_form->submit_action)) { fprintf(fp0, "<dt> %s\n", LYEntifyTitle(&buffer, gettext("(Form field)"))); } } else { dt_URL(fp0, NonNull(links[doc->link].lname)); } END_DL(); } else { fprintf(fp0, "<h2>%s</h2>", LYEntifyTitle(&buffer, gettext("No Links on the current page"))); } if ((cp = HText_getHttpHeaders()) != 0) { fprintf(fp0, "<h2>%s</h2>", LYEntifyTitle(&buffer, gettext("Server Headers:"))); fprintf(fp0, "<pre>%s</pre>", LYEntifyTitle(&buffer, cp)); } #ifdef DIRED_SUPPORT } #endif /* DIRED_SUPPORT */ EndInternalPage(fp0); LYrefresh(); LYCloseTemp(tempfile); FREE(Title); FREE(buffer); return (0); }
static void send_file_to_printer(DocInfo *newdoc, char *content_base, char *sug_filename, int printer_number) { BOOLEAN FirstRecall = TRUE; FILE *outfile_fp; char *the_command = 0; bstring *my_file = NULL; char my_temp[LY_MAXPATH]; int FnameTotal, FnameNum = -1; lynx_list_item_type *cur_printer; outfile_fp = LYOpenTemp(my_temp, (HTisDocumentSource()) ? HTML_SUFFIX : TEXT_SUFFIX, "w"); if (outfile_fp == NULL) { CannotPrint(FILE_ALLOC_FAILED); } if (LYPrependBaseToSource && HTisDocumentSource()) { /* * Added the document's base as a BASE tag to the top of the file. May * create technically invalid HTML, but will help get any partial or * relative URLs resolved properly if no BASE tag is present to replace * it. - FM */ fprintf(outfile_fp, "<!-- X-URL: %s -->\n<BASE HREF=\"%s\">\n\n", newdoc->address, content_base); } print_wwwfile_to_fd(outfile_fp, FALSE, FALSE); /* PRINTER */ if (keypad_mode) printlist(outfile_fp, FALSE); LYCloseTempFP(outfile_fp); /* find the right printer number */ { int count = 0; for (cur_printer = printers; count < printer_number; count++, cur_printer = cur_printer->next) ; /* null body */ } /* * Commands have the form "command %s [%s] [etc]" where %s is the filename * and the second optional %s is the suggested filename. */ if (cur_printer->command == NULL) { CannotPrint(PRINTER_MISCONF_ERROR); } /* * Check for two '%s' and ask for the second filename argument if there * is. */ BStrCopy0(my_file, ""); if (HTCountCommandArgs(cur_printer->command) >= 2) { _statusline(FILENAME_PROMPT); again: SetupFilename(&my_file, sug_filename); check_again: switch (RecallFilename(&my_file, &FirstRecall, &FnameNum, &FnameTotal, PRINT_FLAG)) { case FN_INIT: goto again; case FN_READ: goto check_again; case FN_QUIT: goto done; default: break; } if (no_dotfiles || !show_dotfiles) { if (*LYPathLeaf(my_file->str) == '.') { HTAlert(FILENAME_CANNOT_BE_DOT); _statusline(NEW_FILENAME_PROMPT); FirstRecall = TRUE; FnameNum = FnameTotal; goto again; } } /* * Cancel if the user entered "/dev/null" on Unix, or an "nl:" path * on VMS. - FM */ if (LYIsNullDevice(my_file->str)) { CancelPrint(PRINT_REQUEST_CANCELLED); } HTAddSugFilename(my_file->str); } #ifdef SH_EX /* 1999/01/04 (Mon) 09:37:03 */ HTAddParam(&the_command, cur_printer->command, 1, my_temp); if (!isBEmpty(my_file)) { HTAddParam(&the_command, cur_printer->command, 2, my_file->str); HTEndParam(&the_command, cur_printer->command, 3); } else { HTEndParam(&the_command, cur_printer->command, 2); } #else HTAddParam(&the_command, cur_printer->command, 1, my_temp); HTAddParam(&the_command, cur_printer->command, 2, my_file->str); HTEndParam(&the_command, cur_printer->command, 2); #endif /* * Move the cursor to the top of the screen so that output from system'd * commands don't scroll up the screen. */ LYmove(1, 1); stop_curses(); CTRACE((tfp, "command: %s\n", the_command)); SetOutputMode(O_TEXT); printf(PRINTING_FILE); /* * Set various bits of document information as environment variables, for * use by external print scripts/etc. On UNIX, We assume there are values, * and leave NULL value checking up to the external PRINTER: cmd/script - * KED */ SET_ENVIRON(LYNX_PRINT_TITLE, HText_getTitle(), "No Title"); SET_ENVIRON(LYNX_PRINT_URL, newdoc->address, "No URL"); SET_ENVIRON(LYNX_PRINT_DATE, HText_getDate(), "No Date"); SET_ENVIRON(LYNX_PRINT_LASTMOD, HText_getLastModified(), "No LastMod"); LYSystem(the_command); FREE(the_command); (void) LYRemoveTemp(my_temp); /* * Remove the various LYNX_PRINT_xxxx logicals. - KED * [could use unsetenv(), but it's not portable] */ SET_ENVIRON(LYNX_PRINT_TITLE, "", ""); SET_ENVIRON(LYNX_PRINT_URL, "", ""); SET_ENVIRON(LYNX_PRINT_DATE, "", ""); SET_ENVIRON(LYNX_PRINT_LASTMOD, "", ""); fflush(stdout); #ifndef VMS signal(SIGINT, cleanup_sig); #endif /* !VMS */ #ifdef SH_EX fprintf(stdout, gettext(" Print job complete.\n")); fflush(stdout); #endif SetOutputMode(O_BINARY); LYSleepMsg(); start_curses(); done: /* send_file_to_printer() */ BStrFree(my_file); return; }
int LYShowInfo( DocInfo *doc, DocInfo *newdoc, char *owner_address ) { int eax; int edx; static char tempfile[256]; int url_type; FILE *fp0; char *Title = 0; char *cp; char *temp = 0; BOOLEAN LYInfoAdvanced = user_mode == 2; struct stat dir_info; static char *name; if ( LYReuseTempfiles ) { fp0 = LYOpenTempRewrite( tempfile, ".html", "w" ); } else { LYRemoveTemp( tempfile ); fp0 = LYOpenTemp( tempfile, ".html", "w" ); } if ( fp0 == 0 ) { HTAlert( gettext( "Can't open temporary file!" ) ); return -1; } else { LYLocalFileToURL( &newdoc->address, tempfile ); if ( nlinks > 0 && links[ doc->link ] ) { url_type = is_url( links[ doc->link ].lname ); switch ( url_type ) { case 26: case 27: { char *last_slash = strrchr( links[ doc->link ].lname, '/' ); int next_to_last = strlen( links[ doc->link ].lname ) + -1; if ( next_to_last == last_slash - links[ doc->link ].lname ) links[ doc->link ].lname[ ebp_1152 ] = 0; } break; } } label_columns = 9; WriteInternalTitle( fp0, gettext( "Information about the current document" ) ); fprintf( fp0, "<h1>%s %s (%s) (<a href=\"%s\">%s</a>)", "Lynx", "2.8.7dev.11", LYVersionDate( ), "http://lynx.isc.org/current/", LYVersionStatus( ) ); fwrite( "</h1>\n", 1, 6, fp0 ); if ( lynx_edit_mode && nlinks > 0 ) { fprintf( fp0, "<h2>%s</h2>\n<dl compact>", gettext( "Directory that you are currently viewing" ) ); temp = HTnameOfFile_WWW( &doc->address, 0, 1 ); dt_String( fp0, gettext( "Name:" ), temp ); if ( temp ) { free( temp ); temp = 0; } dt_String( fp0, gettext( "URL:" ), &doc->address ); fwrite( "\n</dl>\n", 1, 7, fp0 ); temp = HTnameOfFile_WWW( links[ doc->link ].lname, 0, 1 ); if ( lstat64( temp, &dir_info.st_dev ) == -1 ) { if ( WWW_TraceFlag ) { fprintf( TraceFP( ), "lstat(%s) failed, errno=%d\n", temp, *(int*)(__errno_location( )) ); } HTAlert( gettext( "Failed to obtain status of current link!" ) ); } else { char modes[80]; label_columns = 16; if ( ( dir_info.st_mode & 61440 ) == 16384 ) { fprintf( fp0, "<h2>%s</h2>\n<dl compact>", gettext( "Directory that you have currently selected" ) ); } else if ( ( dir_info.st_mode & 61440 ) == 32768 ) { fprintf( fp0, "<h2>%s</h2>\n<dl compact>", gettext( "File that you have currently selected" ) ); } else if ( ( dir_info.st_mode & 61440 ) == 40960 ) { fprintf( fp0, "<h2>%s</h2>\n<dl compact>", gettext( "Symbolic link that you have currently selected" ) ); } else { fprintf( fp0, "<h2>%s</h2>\n<dl compact>", gettext( "Item that you have currently selected" ) ); } dt_String( fp0, gettext( "Full name:" ), temp ); if ( ( dir_info.st_mode & 61440 ) == 40960 ) { char buf[1024]; int buf_size = readlink( temp, buf, 1023 ); if ( buf_size != -1 ) buf[ buf_size ] = 0; else { sprintf( buf, "%.*s", 1023, gettext( "Unable to follow link" ) ); } dt_String( fp0, gettext( "Points to file:" ), buf ); } name = HTAA_UidToName( (int)dir_info.st_uid ); if ( name[0] ) { dt_String( fp0, gettext( "Name of owner:" ), name ); } name = HTAA_GidToName( (int)dir_info.st_gid ); if ( name[0] ) { dt_String( fp0, gettext( "Group name:" ), name ); } if ( ( dir_info.st_mode & 61440 ) == 32768 ) { dt_Number( fp0, gettext( "File size:" ), (int)( (long)(dir_info.st_size & 0xFFFFFFFF) ), gettext( "(bytes)" ) ); } dt_String( fp0, gettext( "Creation date:" ), ctime( &dir_info.st_ctim.tv_sec ) ); dt_String( fp0, gettext( "Last modified:" ), ctime( &dir_info.st_mtim.tv_sec ) ); dt_String( fp0, gettext( "Last accessed:" ), ctime( &dir_info.st_atim.tv_sec ) ); fwrite( "\n</dl>\n", 1, 7, fp0 ); label_columns = 9; fprintf( fp0, "<h2>%s</h2>\n<dl compact>", gettext( "Access Permissions" ) ); modes[0] = 0; modes[1] = 0; modes[2] = 0; if ( dir_info.st_mode & 256 ) { memcpy( modes[0] + strlen( modes ) ); } if ( dir_info.st_mode & 128 ) { memcpy( modes[0] + strlen( modes ) ); } if ( dir_info.st_mode & 64 ) { if ( ( dir_info.st_mode & 61440 ) == 16384 ) { memcpy( modes[0] + strlen( modes ) ); } else { memcpy( modes[0] + strlen( modes ) ); if ( dir_info.st_mode & 2048 ) { memcpy( modes[0] + strlen( modes ) ); } } } dt_String( fp0, gettext( "Owner:" ), &modes[2] ); modes[0] = 0; modes[1] = 0; modes[2] = 0; if ( dir_info.st_mode & 32 ) { memcpy( modes[0] + strlen( modes ) ); } if ( dir_info.st_mode & 16 ) { memcpy( modes[0] + strlen( modes ) ); } if ( dir_info.st_mode & 8 ) { if ( ( dir_info.st_mode & 61440 ) == 16384 ) { memcpy( modes[0] + strlen( modes ) ); } else { memcpy( modes[0] + strlen( modes ) ); if ( dir_info.st_mode & 1024 ) { memcpy( modes[0] + strlen( modes ) ); } } } dt_String( fp0, gettext( "Group:" ), &modes[2] ); modes[0] = 0; modes[1] = 0; modes[2] = 0; if ( dir_info.st_mode & 4 ) { memcpy( modes[0] + strlen( modes ) ); } if ( dir_info.st_mode & 2 ) { memcpy( modes[0] + strlen( modes ) ); } if ( dir_info.st_mode & 1 ) { if ( ( dir_info.st_mode & 61440 ) == 16384 ) { memcpy( modes[0] + strlen( modes ) ); } else { memcpy( modes[0] + strlen( modes ) ); if ( dir_info.st_mode & 512 ) { memcpy( modes[0] + strlen( modes ) ); } } } dt_String( fp0, gettext( "World:" ), &modes[2] ); fwrite( "\n</dl>\n", 1, 7, fp0 ); } if ( temp ) { free( temp ); temp = 0; } } else { fprintf( fp0, "<h2>%s</h2>\n<dl compact>", gettext( "File that you are currently viewing" ) ); LYformTitle( &Title, &doc->title[0] ); HTSprintf( &temp, "%s%s", Title, "" ); dt_String( fp0, gettext( "Linkname:" ), temp ); if ( temp ) { free( temp ); temp = 0; } dt_String( fp0, "URL:", &doc->address ); if ( HTLoadedDocumentCharset( ) ) { dt_String( fp0, gettext( "Charset:" ), HTLoadedDocumentCharset( ) ); } else { LYUCcharset *p_in = HTAnchor_getUCInfoStage( HTMainAnchor, 1 ); if ( p_in == 0 || p_in->MIMEname == 0 || p_in->MIMEname[0] == 0 || HTAnchor_getUCLYhndl( HTMainAnchor, 1 ) < 0 ) { p_in = HTAnchor_getUCInfoStage( HTMainAnchor, 0 ); } if ( p_in && p_in->MIMEname && p_in->MIMEname[0] && HTAnchor_getUCLYhndl( HTMainAnchor, 0 ) >= 0 ) { HTSprintf( &temp, "%s %s", p_in->MIMEname, gettext( "(assumed)" ) ); dt_String( fp0, gettext( "Charset:" ), &p_in->MIMEname ); if ( temp ) { free( temp ); temp = 0; } } } cp = HText_getServer( ); if ( cp && cp[0] ) { dt_String( fp0, gettext( "Server:" ), cp ); } cp = HText_getDate( ); if ( cp && cp[0] ) { dt_String( fp0, gettext( "Date:" ), cp ); } cp = HText_getLastModified( ); if ( cp && cp[0] ) { dt_String( fp0, gettext( "Last Mod:" ), cp ); } if ( LYInfoAdvanced ) { if ( HTMainAnchor && HTMainAnchor->expires ) { dt_String( fp0, gettext( "Expires:" ), &HTMainAnchor->expires ); } if ( HTMainAnchor && HTMainAnchor->cache_control ) { dt_String( fp0, gettext( "Cache-Control:" ), &HTMainAnchor->cache_control ); } if ( HTMainAnchor && HTMainAnchor->content_length > 0 ) { dt_Number( fp0, gettext( "Content-Length:" ), HTMainAnchor->content_length, gettext( "bytes" ) ); } else { dt_Number( fp0, gettext( "Length:" ), HText_getNumOfBytes( ), gettext( "bytes" ) ); } if ( HTMainAnchor && HTMainAnchor->content_language ) { dt_String( fp0, gettext( "Language:" ), &HTMainAnchor->content_language ); } } if ( doc->post_data ) { fprintf( fp0, "<dt><em>%s</em> <xmp>%.*s</xmp>\n", gettext( "Post Data:" ), 0, 0 ); dt_String( fp0, gettext( "Post Content Type:" ), &doc->post_content_type ); } dt_String( fp0, gettext( "Owner(s):" ), owner_address ? owner_address : gettext( "Owner(s):" ) ); dt_Number( fp0, gettext( "size:" ), HText_getNumOfLines( ), gettext( "lines" ) ); if ( lynx_mode != 2 ) { if ( HTisDocumentSource( ) ) { } else { } } else { } HTSACopy( &temp, gettext( "source" ) ); if ( doc->safe ) { HTSACat( &temp, gettext( ", safe" ) ); } if ( doc->internal_link ) { HTSACat( &temp, gettext( ", via internal link" ) ); } if ( LYInfoAdvanced ) { if ( HText_hasNoCacheSet( HTMainText ) & 255 ) { HTSACat( &temp, gettext( ", no-cache" ) ); } if ( HTAnchor_isISMAPScript( (int)( &HTMainAnchor->parent->parent ) ) & 255 ) { HTSACat( &temp, gettext( ", ISMAP script" ) ); } if ( doc->bookmark ) { HTSACat( &temp, gettext( ", bookmark file" ) ); } } dt_String( fp0, gettext( "mode:" ), temp ); if ( temp ) { free( temp ); temp = 0; } fwrite( "\n</dl>\n", 1, 7, fp0 ); if ( nlinks > 0 ) { fprintf( fp0, "<h2>%s</h2>\n<dl compact>", gettext( "Link that you currently have selected" ) ); dt_String( fp0, gettext( "Linkname:" ), LYGetHiliteStr( doc->link, 0 ) ); if ( lynx_mode == 2 && links[ doc->link ].type == 1 ) { if ( links[ doc->link ].l_form->submit_method ) { int method = links[ doc->link ].l_form->submit_method; char *enctype = &links[ doc->link ].l_form->submit_enctype; dt_String( fp0, gettext( "Method:" ), "POST" ); dt_String( fp0, gettext( "Enctype:" ), "application/x-www-form-urlencoded" ); } if ( links[ doc->link ].l_form->submit_action ) { dt_String( fp0, gettext( "Action:" ), &links[ doc->link ].l_form->submit_action ); } if ( links[ doc->link ].l_form->submit_method == 0 || links[ doc->link ].l_form->submit_action == 0 ) { fprintf( fp0, "<dt> %s\n", gettext( "(Form field)" ) ); } } else { dt_String( fp0, "URL:", "" ); } fwrite( "\n</dl>\n", 1, 7, fp0 ); } else { fprintf( fp0, "<h2>%s</h2>", gettext( "No Links on the current page" ) ); } } EndInternalPage( fp0 ); LYrefresh( ); LYCloseTemp( tempfile ); if ( Title ) { free( Title ); Title = 0; } return 0; } }
static void send_file_to_file(DocInfo *newdoc, char *content_base, char *sug_filename) { BOOLEAN FirstRecall = TRUE; BOOLEAN use_cte; const char *disp_charset; FILE *outfile_fp; bstring *buffer = NULL; bstring *filename = NULL; int FnameNum = -1; int FnameTotal; int c = 0; _statusline(FILENAME_PROMPT); retry: SetupFilename(&filename, sug_filename); if (lynx_save_space) { BStrCopy0(buffer, lynx_save_space); BStrCat(buffer, filename); BStrCopy(filename, buffer); } else { BStrCopy0(buffer, ""); } check_recall: switch (RecallFilename(&filename, &FirstRecall, &FnameNum, &FnameTotal, PRINT_FLAG)) { case FN_INIT: goto retry; case FN_READ: goto check_recall; case FN_QUIT: goto done; default: break; } if (!LYValidateFilename(&buffer, &filename)) { CancelPrint(SAVE_REQUEST_CANCELLED); } /* * See if it already exists. */ switch (c = LYValidateOutput(buffer->str)) { case 'Y': break; case 'N': _statusline(NEW_FILENAME_PROMPT); FirstRecall = TRUE; FnameNum = FnameTotal; goto retry; default: goto done; } /* * See if we can write to it. */ CTRACE((tfp, "LYPrint: filename is %s, action is `%c'\n", buffer->str, c)); #ifdef HAVE_POPEN if (buffer->str[0] == '|') { if (no_shell) { HTUserMsg(SPAWNING_DISABLED); FirstRecall = TRUE; FnameNum = FnameTotal; goto retry; } else if ((outfile_fp = popen(buffer->str + 1, "w")) == NULL) { CTRACE((tfp, "LYPrint: errno is %d\n", errno)); HTAlert(CANNOT_WRITE_TO_FILE); _statusline(NEW_FILENAME_PROMPT); FirstRecall = TRUE; FnameNum = FnameTotal; goto retry; } } else #endif if ((outfile_fp = (TOUPPER(c) == 'A' ? LYAppendToTxtFile(buffer->str) : LYNewTxtFile(buffer->str))) == NULL) { CTRACE((tfp, "LYPrint: errno is %d\n", errno)); HTAlert(CANNOT_WRITE_TO_FILE); _statusline(NEW_FILENAME_PROMPT); FirstRecall = TRUE; FnameNum = FnameTotal; goto retry; } if (LYPrependBaseToSource && HTisDocumentSource()) { /* * Added the document's base as a BASE tag to the top of the file. May * create technically invalid HTML, but will help get any partial or * relative URLs resolved properly if no BASE tag is present to replace * it. - FM * * Add timestamp (last reload). */ fprintf(outfile_fp, "<!-- X-URL: %s -->\n", newdoc->address); if (HText_getDate() != NULL) { fprintf(outfile_fp, "<!-- Date: %s -->\n", HText_getDate()); if (HText_getLastModified() != NULL && strcmp(HText_getLastModified(), HText_getDate()) && strcmp(HText_getLastModified(), "Thu, 01 Jan 1970 00:00:01 GMT")) { fprintf(outfile_fp, "<!-- Last-Modified: %s -->\n", HText_getLastModified()); } } fprintf(outfile_fp, "<BASE HREF=\"%s\">\n", content_base); } if (LYPrependCharsetToSource && HTisDocumentSource()) { /* * Added the document's charset as a META CHARSET tag to the top of the * file. May create technically invalid HTML, but will help to resolve * properly the document converted via chartrans: printed document * correspond to a display charset and we *should* override both * assume_local_charset and original document's META CHARSET (if any). * * Currently, if several META CHARSETs are found Lynx uses the first * only, and it is opposite to BASE where the original BASE in the * <HEAD> overrides ones from the top. * * As in print-to-email we write charset only if the document has 8-bit * characters, and we have no CJK or an unofficial "x-" charset. */ use_cte = HTLoadedDocumentEightbit(); disp_charset = LYCharSet_UC[current_char_set].MIMEname; if (!use_cte || LYHaveCJKCharacterSet || strncasecomp(disp_charset, "x-", 2) == 0) { } else { fprintf(outfile_fp, "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=%s\">\n\n", disp_charset); } } print_wwwfile_to_fd(outfile_fp, FALSE, FALSE); /* FILE */ if (keypad_mode) printlist(outfile_fp, FALSE); #ifdef HAVE_POPEN if (LYIsPipeCommand(buffer->str)) pclose(outfile_fp); else #endif LYCloseOutput(outfile_fp); #ifdef VMS if (0 == strncasecomp(buffer->str, "sys$disk:", 9)) { if (0 == StrNCmp((buffer->str + 9), "[]", 2)) { HTAddSugFilename(buffer->str + 11); } else { HTAddSugFilename(buffer->str + 9); } } else { HTAddSugFilename(buffer->str); } #else HTAddSugFilename(buffer->str); #endif /* VMS */ done: BStrFree(buffer); BStrFree(filename); return; }