BOOLEAN setup( char *terminal ) { char *term_putenv = 0; char *buffer = 0; char *cp = LYgetXDisplay( ); if ( cp ) HTSACopy( &x_display, cp ); else if ( x_display ) { free( x_display ); x_display = 0; } if ( terminal ) { HTSprintf0( &term_putenv, "TERM=%.106s", terminal ); putenv( term_putenv ); } if ( dumbterm( LYGetEnv( "TERM" ) ) ) { printf( "\n\n %s\n\n", gettext( "Your Terminal type is unknown!" ) ); printf( " %s [vt100] ", gettext( "Enter a terminal type:" ) ); if ( LYSafeGets( &buffer, stdin ) ) { LYTrimLeading( buffer ); LYTrimTrailing( buffer ); } if ( buffer == 0 || buffer[0] == 0 ) HTSACopy( &buffer, "vt100" ); HTSprintf0( &term_putenv, "TERM=%.106s", buffer ); if ( buffer ) { free( buffer ); buffer = 0; } putenv( term_putenv ); printf( "\n%s %s\n", gettext( "TERMINAL TYPE IS SET TO" ), LYGetEnv( "TERM" ) ); LYSleepMsg( ); } start_curses( ); if ( strncmp( ttytype, "sun", 3 ) == 0 ) LYnoVideo( 2 ); LYlines = LYscreenHeight( ); LYcols = LYscreenWidth( ); return 1; }
/* ** mailform() sends form content to the mailto address(es). - FM */ PUBLIC void mailform ARGS4( CONST char *, mailto_address, CONST char *, mailto_subject, CONST char *, mailto_content, CONST char *, mailto_type) { FILE *fd; char *address = NULL; char *ccaddr = NULL; char *keywords = NULL; char *cp = NULL; char self[MAX_SUBJECT + 10]; char subject[MAX_SUBJECT + 10]; char *searchpart = NULL; char buf[512]; int ch, len, i; #if USE_VMS_MAILER static char *cmd; char *command = NULL; BOOLEAN isPMDF = LYMailPMDF(); char hdrfile[LY_MAXPATH]; #endif #if !CAN_PIPE_TO_MAILER char my_tmpfile[LY_MAXPATH]; #endif CTRACE((tfp, "mailto_address: \"%s\"\n", NONNULL(mailto_address))); CTRACE((tfp, "mailto_subject: \"%s\"\n", NONNULL(mailto_subject))); CTRACE((tfp, "mailto_content: \"%s\"\n", NONNULL(mailto_content))); CTRACE((tfp, "mailto_type: \"%s\"\n", NONNULL(mailto_type))); if (!LYSystemMail()) return; if (!mailto_address || !mailto_content) { HTAlert(BAD_FORM_MAILTO); return; } subject[0] = '\0'; self[0] = '\0'; if ((cp = (char *)strchr(mailto_address,'\n')) != NULL) *cp = '\0'; StrAllocCopy(address, mailto_address); /* * Check for a ?searchpart. - FM */ if ((cp = strchr(address, '?')) != NULL) { StrAllocCopy(searchpart, cp); *cp = '\0'; cp = (searchpart + 1); if (*cp != '\0') { /* * Seek and handle a subject=foo. - FM */ extract_subject(subject, searchpart); /* * Seek and handle to=address(es) fields. * Appends to address. - FM */ extract_field(&address, searchpart, "to="); /* * Seek and handle cc=address(es) fields. Excludes * Bcc=address(es) as unsafe. We may append our own * cc (below) as a list for the actual mailing. - FM */ extract_field(&ccaddr, searchpart, "cc="); /* * Seek and handle keywords=term(s) fields. - FM */ extract_field(&keywords, searchpart, "keywords="); if (keywords != NULL) { if (*keywords != '\0') { SafeHTUnEscape(keywords); } else { FREE(keywords); } } FREE(searchpart); } } if (convert_explorer(address)) { HTAlert(BAD_FORM_MAILTO); goto cleanup; } if (ccaddr != NULL) { if (convert_explorer(ccaddr)) { FREE(ccaddr); } } /* * Unescape the address and ccaddr fields. - FM */ SafeHTUnEscape(address); if (ccaddr != NULL) { SafeHTUnEscape(ccaddr); } /* * Allow user to edit the default Subject - FM */ if (isEmpty(subject)) { if (!isEmpty(mailto_subject)) { LYstrncpy(subject, mailto_subject, MAX_SUBJECT); } else { sprintf(subject, "mailto:%.63s", address); } } _statusline(SUBJECT_PROMPT); if ((ch = LYgetstr(subject, VISIBLE, MAX_SUBJECT, NORECALL)) < 0) { /* * User cancelled via ^G. - FM */ HTInfoMsg(FORM_MAILTO_CANCELLED); goto cleanup; } /* * Allow user to specify a self copy via a CC: * entry, if permitted. - FM */ if (!LYNoCc) { sprintf(self, "%.*s", MAX_SUBJECT, isEmpty(personal_mail_address) ? "" : personal_mail_address); _statusline("Cc: "); if ((ch = LYgetstr(self, VISIBLE, MAX_SUBJECT, NORECALL)) < 0) { /* * User cancelled via ^G. - FM */ HTInfoMsg(FORM_MAILTO_CANCELLED); goto cleanup; } remove_tildes(self); if (ccaddr == NULL) { StrAllocCopy(ccaddr, self); } else { StrAllocCat(ccaddr, ","); StrAllocCat(ccaddr, self); } } #if CAN_PIPE_TO_MAILER if ((fd = LYPipeToMailer()) == 0) { HTAlert(FORM_MAILTO_FAILED); goto cleanup; } if (!isEmpty(mailto_type)) { fprintf(fd, "Mime-Version: 1.0\n"); fprintf(fd, "Content-Type: %s\n", mailto_type); } fprintf(fd, "To: %s\n", address); if (!isEmpty(personal_mail_address)) fprintf(fd, "From: %s\n", personal_mail_address); if (!isEmpty(ccaddr)) fprintf(fd, "Cc: %s\n", ccaddr); fprintf(fd, "Subject: %s\n\n", subject); if (!isEmpty(keywords)) fprintf(fd, "Keywords: %s\n", keywords); _statusline(SENDING_FORM_CONTENT); #else /* e.g., VMS, DOS */ if ((fd = LYOpenTemp(my_tmpfile, ".txt", "w")) == NULL) { HTAlert(FORM_MAILTO_FAILED); goto cleanup; } #if USE_VMS_MAILER if (isPMDF) { FILE *hfd; if ((hfd = LYOpenTemp(hdrfile, ".txt", "w")) == NULL) { HTAlert(FORM_MAILTO_FAILED); LYCloseTempFP(fd); goto cleanup; } if (!isEmpty(mailto_type)) { fprintf(hfd, "Mime-Version: 1.0\n"); fprintf(hfd, "Content-Type: %s\n", mailto_type); if (!isEmpty(personal_mail_address)) fprintf(hfd, "From: %s\n", personal_mail_address); } /* * For PMDF, put any keywords and the subject * in the header file and close it. - FM */ if (!isEmpty(keywords)) { fprintf(hfd, "Keywords: %s\n", keywords); } fprintf(hfd, "Subject: %s\n\n", subject); LYCloseTempFP(hfd); } else if (mailto_type && !strncasecomp(mailto_type, "multipart/form-data", 19)) { /* * Ugh! There's no good way to include headers while * we're still using "generic" VMS MAIL, so we'll put * this in the body of the message. - FM */ fprintf(fd, "X-Content-Type: %s\n\n", mailto_type); } #else /* !VMS (DOS) */ #if USE_BLAT_MAILER if (mail_is_blat) { if (strlen(subject) > MAX_SUBJECT) subject[MAX_SUBJECT] = '\0'; } else #endif { if (!isEmpty(mailto_type)) { fprintf(fd, "Mime-Version: 1.0\n"); fprintf(fd, "Content-Type: %s\n", mailto_type); } fprintf(fd,"To: %s\n", address); if (!isEmpty(personal_mail_address)) fprintf(fd,"From: %s\n", personal_mail_address); fprintf(fd,"Subject: %.70s\n\n", subject); } #endif /* VMS */ #endif /* CAN_PIPE_TO_MAILER */ /* * Break up the content into lines with a maximum length of 78. * If the ENCTYPE was text/plain, we have physical newlines and * should take them into account. Otherwise, the actual newline * characters in the content are hex escaped. - FM */ while((cp = strchr(mailto_content, '\n')) != NULL) { *cp = '\0'; i = 0; len = strlen(mailto_content); while (len > 78) { strncpy(buf, &mailto_content[i], 78); buf[78] = '\0'; fprintf(fd, "%s\n", buf); i += 78; len = strlen(&mailto_content[i]); } fprintf(fd, "%s\n", &mailto_content[i]); mailto_content = (cp+1); } i = 0; len = strlen(mailto_content); while (len > 78) { strncpy(buf, &mailto_content[i], 78); buf[78] = '\0'; fprintf(fd, "%s\n", buf); i += 78; len = strlen(&mailto_content[i]); } if (len) fprintf(fd, "%s\n", &mailto_content[i]); #if CAN_PIPE_TO_MAILER pclose(fd); LYSleepMsg(); #else LYCloseTempFP(fd); #if USE_VMS_MAILER /* * Set the mail command. - FM */ if (isPMDF) { /* * Now set up the command. - FM */ HTSprintf0(&cmd, "%s %s %s,%s ", system_mail, system_mail_flags, hdrfile, my_tmpfile); } else { /* * For "generic" VMS MAIL, include the subject in the * command, and ignore any keywords to minimize risk * of them making the line too long or having problem * characters. - FM */ HTSprintf0(&cmd, "%s %s%s/subject=\"%s\" %s ", system_mail, system_mail_flags, (strncasecomp(system_mail, "MAIL", 4) ? "" : "/noself"), subject, my_tmpfile); } StrAllocCopy(command, cmd); vms_append_addrs(&command, address, ""); if (!isEmpty(ccaddr)) { vms_append_addrs(&command, ccaddr, "/CC"); } stop_curses(); printf("%s\n\n$ %s\n\n%s", SENDING_FORM_CONTENT, command, PLEASE_WAIT); LYSystem(command); /* Mail (VMS) */ FREE(command); LYSleepAlert(); start_curses(); LYRemoveTemp(my_tmpfile); if (isPMDF) LYRemoveTemp(hdrfile); #else /* DOS */ LYSendMailFile ( address, my_tmpfile, subject, ccaddr, SENDING_FORM_CONTENT); LYRemoveTemp(my_tmpfile); #endif /* USE_VMS_MAILER */ #endif /* CAN_PIPE_TO_MAILER */ cleanup: FREE(address); FREE(ccaddr); FREE(keywords); return; }
PUBLIC int LYSendMailFile ARGS5( char *, the_address, char *, the_filename, char *, the_subject GCC_UNUSED, char *, the_ccaddr GCC_UNUSED, char *, message) { char *cmd = NULL; #ifdef __DJGPP__ char *shell; #endif /* __DJGPP__ */ int code; if (!LYSystemMail()) return 0; #if USE_BLAT_MAILER if (mail_is_blat) StrAllocCopy(cmd, blat_cmd( system_mail, the_filename, the_address, the_subject, the_ccaddr, personal_mail_address ) ); else #endif #ifdef __DJGPP__ if ((shell = LYGetEnv("SHELL")) != NULL) { if (strstr(shell, "sh") != NULL) { HTSprintf0(&cmd, "%s -c %s -t \"%s\" -F %s", shell, system_mail, the_address, the_filename); } else { HTSprintf0(&cmd, "%s /c %s -t \"%s\" -F %s", shell, system_mail, the_address, the_filename); } } else { HTSprintf0(&cmd, "%s -t \"%s\" -F %s", system_mail, the_address, the_filename); } #else HTSprintf0(&cmd, "%s -t \"%s\" -F %s", system_mail, the_address, the_filename); #endif /* __DJGPP__ */ stop_curses(); SetOutputMode(O_TEXT); printf("%s\n\n$ %s\n\n%s", *message ? message : gettext("Sending"), cmd, PLEASE_WAIT); code = LYSystem(cmd); LYSleepMsg(); start_curses(); SetOutputMode( O_BINARY ); FREE(cmd); return code; }
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; }