home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Divers / lynx2.8.1dev.10.tar.gz / lynx2.8.1dev.10.tar / lynx2-8 / src / LYShowInfo.c < prev    next >
C/C++ Source or Header  |  1998-04-23  |  11KB  |  366 lines

  1. #include <HTUtils.h>
  2. #include <tcp.h>
  3. #include <HTParse.h>
  4. #include <HTAlert.h>
  5. #include <HTTP.h>
  6. #include <LYCurses.h>
  7. #include <LYStrings.h>
  8. #include <LYUtils.h>
  9. #include <LYStructs.h>
  10. #include <LYGlobalDefs.h>
  11. #include <LYShowInfo.h>
  12. #include <LYSignal.h>
  13. #include <LYCharUtils.h>
  14. #include <GridText.h>
  15.  
  16. #include <LYLeaks.h>
  17.  
  18. #ifdef DIRED_SUPPORT
  19. #include <pwd.h>
  20. #include <grp.h>
  21. #include <time.h>
  22. #include <LYLocal.h>
  23. #endif /* DIRED_SUPPORT */
  24.  
  25. #define FREE(x) if (x) {free(x); x = NULL;}
  26.  
  27. /*
  28.  *  Showinfo prints a page of info about the current file and the link
  29.  *  that the cursor is on.
  30.  */
  31.  
  32. PUBLIC int showinfo ARGS4(
  33.     document *,    doc,
  34.     int,        size_of_file,
  35.     document *,    newdoc,
  36.     char *,     owner_address)
  37. {
  38.     static char tempfile[256];
  39.     static BOOLEAN first = TRUE;
  40.     static char info_url[256];
  41.     int url_type;
  42.     FILE *fp0;
  43.     char *Address = NULL, *Title = NULL;
  44.     char *cp;
  45.  
  46. #ifdef DIRED_SUPPORT
  47.     char temp[300];
  48.     struct stat dir_info;
  49.     struct passwd *pw;
  50.     struct group *grp;
  51. #endif /* DIRED_SUPPORT */
  52.     if (first) {
  53.     tempname(tempfile, NEW_FILE);
  54.     /*
  55.      *  Make the temporary file a URL now.
  56.      */
  57. #if defined (VMS) || defined (DOSPATH)    || defined (__EMX__)
  58.     sprintf(info_url, "file://localhost/%s", tempfile);
  59. #else
  60.     sprintf(info_url, "file://localhost%s", tempfile);
  61. #endif /* VMS */
  62.     first = FALSE;
  63. #ifdef VMS
  64.     } else {
  65.     remove(tempfile);   /* Remove duplicates on VMS. */
  66. #endif /* VMS */
  67.     }
  68.  
  69.     if ((fp0 = LYNewTxtFile(tempfile)) == NULL) {
  70.     HTAlert(CANNOT_OPEN_TEMP);
  71.     return(0);
  72.     }
  73.  
  74.     /*
  75.      *    Point the address pointer at this Url
  76.      */
  77.     StrAllocCopy(newdoc->address, info_url);
  78.  
  79.     if (nlinks > 0 && links[doc->link].lname != NULL &&
  80.     (url_type = is_url(links[doc->link].lname)) != 0 &&
  81.     (url_type == LYNXEXEC_URL_TYPE ||
  82.      url_type == LYNXPROG_URL_TYPE)) {
  83.     char *last_slash = strrchr(links[doc->link].lname,'/');
  84.     int next_to_last = strlen(links[doc->link].lname) - 1;
  85.  
  86.     if ((last_slash - links[doc->link].lname) == next_to_last) {
  87.         links[doc->link].lname[next_to_last] = '\0';
  88.     }
  89.     }
  90.  
  91.     fprintf(fp0, "<head>\n");
  92.     LYAddMETAcharsetToFD(fp0, -1);
  93.     fprintf(fp0, "<title>%s</title>\n</head>\n<body>\n",
  94.          SHOWINFO_TITLE);
  95.     fprintf(fp0,"<h1>You have reached the Information Page</h1>\n");
  96.     fprintf(fp0,"<h2>%s Version %s</h2>\n", LYNX_NAME, LYNX_VERSION);
  97.  
  98. #ifdef DIRED_SUPPORT
  99.     if (lynx_edit_mode && nlinks > 0) {
  100.     fprintf(fp0,
  101.      "<h2>Directory that you are currently viewing</h2>\n<pre>");
  102.  
  103.     cp = doc->address;
  104.     if (!strncmp(cp, "file://localhost", 16))
  105.         cp += 16;
  106.     else if (!strncmp(cp, "file:", 5))
  107.         cp += 5;
  108.     strcpy(temp, cp);
  109.     HTUnEscape(temp);
  110.  
  111.     fprintf(fp0,"   <em>Name:</em>  %s\n", temp);
  112.     fprintf(fp0,"   <em> URL:</em>  %s\n", doc->address);
  113.  
  114.     cp = links[doc->link].lname;
  115.     if (!strncmp(cp, "file://localhost", 16))
  116.         cp += 16;
  117.     else if (!strncmp(cp, "file:", 5))
  118.         cp += 5;
  119.     strcpy(temp, cp);
  120.     HTUnEscape(temp);
  121.     if (lstat(temp, &dir_info) == -1) {
  122.         _statusline(CURRENT_LINK_STATUS_FAILED);
  123.         sleep(AlertSecs);
  124.     } else {
  125.         char modes[80];
  126.         if (((dir_info.st_mode) & S_IFMT) == S_IFDIR) {
  127.         fprintf(fp0,
  128.          "\nDirectory that you have currently selected\n\n");
  129.         } else if (((dir_info.st_mode) & S_IFMT) == S_IFREG) {
  130.         fprintf(fp0,
  131.               "\nFile that you have currently selected\n\n");
  132. #ifdef S_IFLNK
  133.         } else if (((dir_info.st_mode) & S_IFMT) == S_IFLNK) {
  134.         fprintf(fp0,
  135.          "\nSymbolic link that you have currently selected\n\n");
  136. #endif
  137.         } else {
  138.         fprintf(fp0,
  139.               "\nItem that you have currently selected\n\n");
  140.         }
  141.         fprintf(fp0,"       <em>Full name:</em>  %s\n", temp);
  142. #ifdef S_IFLNK
  143.         if (((dir_info.st_mode) & S_IFMT) == S_IFLNK) {
  144.         char buf[1025];
  145.         int buf_size;
  146.  
  147.         if ((buf_size = readlink(temp, buf, sizeof(buf)-1)) != -1) {
  148.             buf[buf_size] = '\0';
  149.         } else {
  150.             strcpy(buf, "Unable to follow link");
  151.         }
  152.         fprintf(fp0, "  <em>Points to file:</em>  %s\n", buf);
  153.         }
  154. #endif
  155.         pw = getpwuid(dir_info.st_uid);
  156.         if (pw)
  157.         fprintf(fp0, "   <em>Name of owner:</em>  %s\n", pw->pw_name);
  158.         grp = getgrgid(dir_info.st_gid);
  159.         if (grp && grp->gr_name)
  160.         fprintf(fp0, "      <em>Group name:</em>  %s\n", grp->gr_name);
  161.         if (((dir_info.st_mode) & S_IFMT) == S_IFREG) {
  162.         sprintf(temp, "       <em>File size:</em>  %ld (bytes)\n",
  163.                   (long)dir_info.st_size);
  164.         fprintf(fp0, "%s", temp);
  165.         }
  166.         /*
  167.          *    Include date and time information.
  168.          */
  169.         cp = ctime(&dir_info.st_ctime);
  170.         fprintf(fp0, "   <em>Creation date:</em>  %s", cp);
  171.  
  172.         cp = ctime(&dir_info.st_mtime);
  173.         fprintf(fp0, "   <em>Last modified:</em>  %s", cp);
  174.  
  175.         cp = ctime(&dir_info.st_atime);
  176.         fprintf(fp0, "   <em>Last accessed:</em>  %s\n", cp);
  177.  
  178.         fprintf(fp0, "   <em>Access Permissions</em>\n");
  179.         fprintf(fp0, "      <em>Owner:</em>  ");
  180.         modes[0] = '\0';
  181.         modes[1] = '\0';   /* In case there are no permissions */
  182.         modes[2] = '\0';
  183.         if ((dir_info.st_mode & S_IRUSR))
  184.         strcat(modes, ", read");
  185.         if ((dir_info.st_mode & S_IWUSR))
  186.         strcat(modes, ", write");
  187.         if ((dir_info.st_mode & S_IXUSR)) {
  188.         if (((dir_info.st_mode) & S_IFMT) == S_IFDIR)
  189.             strcat(modes, ", search");
  190.         else {
  191.             strcat(modes, ", execute");
  192.             if ((dir_info.st_mode & S_ISUID))
  193.             strcat(modes, ", setuid");
  194.         }
  195.         }
  196.         fprintf(fp0, "%s\n", (char *)&modes[2]); /* Skip leading ', ' */
  197.  
  198.         fprintf(fp0, "      <em>Group:</em>  ");
  199.         modes[0] = '\0';
  200.         modes[1] = '\0';   /* In case there are no permissions */
  201.         modes[2] = '\0';
  202.         if ((dir_info.st_mode & S_IRGRP))
  203.         strcat(modes, ", read");
  204.         if ((dir_info.st_mode & S_IWGRP))
  205.         strcat(modes, ", write");
  206.         if ((dir_info.st_mode & S_IXGRP)) {
  207.         if (((dir_info.st_mode) & S_IFMT) == S_IFDIR)
  208.             strcat(modes, ", search");
  209.         else {
  210.             strcat(modes, ", execute");
  211.             if ((dir_info.st_mode & S_ISGID))
  212.             strcat(modes, ", setgid");
  213.         }
  214.         }
  215.         fprintf(fp0, "%s\n", (char *)&modes[2]);  /* Skip leading ', ' */
  216.  
  217.         fprintf(fp0, "      <em>World:</em>  ");
  218.         modes[0] = '\0';
  219.         modes[1] = '\0';   /* In case there are no permissions */
  220.         modes[2] = '\0';
  221.         if ((dir_info.st_mode & S_IROTH))
  222.         strcat(modes, ", read");
  223.         if ((dir_info.st_mode & S_IWOTH))
  224.         strcat(modes, ", write");
  225.         if ((dir_info.st_mode & S_IXOTH)) {
  226.         if (((dir_info.st_mode) & S_IFMT) == S_IFDIR)
  227.             strcat(modes, ", search");
  228.         else {
  229.             strcat(modes, ", execute");
  230. #ifdef S_ISVTX
  231.             if ((dir_info.st_mode & S_ISVTX))
  232.             strcat(modes, ", sticky");
  233. #endif
  234.         }
  235.         }
  236.         fprintf(fp0, "%s\n", (char *)&modes[2]);  /* Skip leading ', ' */
  237.     }
  238.     fprintf(fp0,"</pre>\n");
  239.     } else {
  240. #endif /* DIRED_SUPPORT */
  241.  
  242.     fprintf(fp0,
  243.        "<h2>File that you are currently viewing</h2>\n<dl compact>");
  244.  
  245.     StrAllocCopy(Title, doc->title);
  246.     LYEntify(&Title, TRUE);
  247.     fprintf(fp0, "<dt><em>Linkname:</em> %s%s\n",
  248.          Title, (doc->isHEAD ? " (HEAD)" : ""));
  249.  
  250.     StrAllocCopy(Address, doc->address);
  251.     LYEntify(&Address, TRUE);
  252.     fprintf(fp0,
  253.         "<dt>     <em>URL:</em> %s\n", Address);
  254.  
  255.     if (HTLoadedDocumentCharset()) {
  256.     fprintf(fp0, "<dt><em> Charset:</em> %s\n",
  257.              HTLoadedDocumentCharset());
  258.     } else {
  259.       LYUCcharset * p_in = HTAnchor_getUCInfoStage(HTMainAnchor,
  260.                                  UCT_STAGE_PARSER);
  261.       if (!p_in || !(p_in->MIMEname) || !*(p_in->MIMEname) ||
  262.        HTAnchor_getUCLYhndl(HTMainAnchor, UCT_STAGE_PARSER) < 0) {
  263.        p_in = HTAnchor_getUCInfoStage(HTMainAnchor, UCT_STAGE_MIME);
  264.       }
  265.       if (p_in && p_in->MIMEname && *(p_in->MIMEname) &&
  266.       HTAnchor_getUCLYhndl(HTMainAnchor, UCT_STAGE_MIME) >= 0) {
  267.     fprintf(fp0, "<dt><em> Charset:</em> %s (assumed)\n",
  268.              p_in->MIMEname);
  269.       }
  270.     }
  271.  
  272.     if ((cp = HText_getServer()) != NULL && *cp != '\0')
  273.     fprintf(fp0, "<dt><em>  Server:</em> %s\n", cp);
  274.  
  275.     if ((cp = HText_getDate()) != NULL && *cp != '\0')
  276.     fprintf(fp0, "<dt><em>    Date:</em> %s\n", cp);
  277.  
  278.     if ((cp = HText_getLastModified()) != NULL && *cp != '\0')
  279.     fprintf(fp0, "<dt><em>Last Mod:</em> %s\n", cp);
  280.  
  281.     if (doc->post_data) {
  282.     fprintf(fp0,
  283.         "<dt><em>Post Data:</em> <xmp>%s</xmp>\n", doc->post_data);
  284.     fprintf(fp0,
  285.          "<dt><em>Post Content Type:</em> %s\n", doc->post_content_type);
  286.     }
  287.  
  288.     if (owner_address) {
  289.     StrAllocCopy(Address, owner_address);
  290.     LYEntify(&Address, TRUE);
  291.     } else {
  292.     StrAllocCopy(Address, "None");
  293.     }
  294.     fprintf(fp0, "<dt><em>Owner(s):</em> %s\n", Address);
  295.  
  296.     fprintf(fp0,
  297.     "<dt>    <em>size:</em> %d lines\n", size_of_file);
  298.  
  299.     fprintf(fp0, "<dt>    <em>mode:</em> %s%s%s\n",
  300.          (lynx_mode == FORMS_LYNX_MODE ?
  301.                   "forms mode" : "normal"),
  302.          (doc->safe ? ", safe" : ""),
  303.          (doc->internal_link ? ", internal link" : "")
  304.         );
  305.  
  306.     fprintf(fp0, "</dl>\n");  /* end of list */
  307.  
  308.     if (nlinks > 0) {
  309.     fprintf(fp0,
  310.       "<h2>Link that you currently have selected</h2>\n<dl compact>");
  311.     StrAllocCopy(Title, links[doc->link].hightext);
  312.     LYEntify(&Title, TRUE);
  313.     fprintf(fp0, "<dt><em>Linkname:</em> %s\n", Title);
  314.     if (lynx_mode == FORMS_LYNX_MODE &&
  315.         links[doc->link].type == WWW_FORM_LINK_TYPE) {
  316.         if (links[doc->link].form->submit_method) {
  317.         int method = links[doc->link].form->submit_method;
  318.         char *enctype = links[doc->link].form->submit_enctype;
  319.  
  320.         fprintf(fp0, "<dt>  <em>Method:</em> %s\n",
  321.                  (method == URL_POST_METHOD) ? "POST" :
  322.                  (method == URL_MAIL_METHOD) ? "(email)" :
  323.                                "GET");
  324.         fprintf(fp0, "<dt> <em>Enctype:</em> %s\n",
  325.                  (enctype &&
  326.                   *enctype ?
  327.                    enctype : "application/x-www-form-urlencoded"));
  328.         }
  329.         if (links[doc->link].form->submit_action) {
  330.         StrAllocCopy(Address, links[doc->link].form->submit_action);
  331.         LYEntify(&Address, TRUE);
  332.         fprintf(fp0, "<dt>  <em>Action:</em> %s\n", Address);
  333.         }
  334.         if (!(links[doc->link].form->submit_method &&
  335.           links[doc->link].form->submit_action)) {
  336.         fprintf(fp0,"<dt> (Form field)\n");
  337.         }
  338.     } else {
  339.         if (links[doc->link].lname) {
  340.         StrAllocCopy(Title, links[doc->link].lname);
  341.         LYEntify(&Title, TRUE);
  342.         } else {
  343.         StrAllocCopy(Title, "");
  344.         }
  345.         fprintf(fp0,
  346.            "<dt>     <em>URL:</em> %s\n", Title);
  347.     }
  348.     fprintf(fp0, "</dl>\n");  /* end of list */
  349.  
  350.     } else
  351.     fprintf(fp0, "<h2>No Links on the current page</h2>");
  352.  
  353. #ifdef DIRED_SUPPORT
  354.     }
  355. #endif /* DIRED_SUPPORT */
  356.     fprintf(fp0, "</body>\n");
  357.  
  358.     refresh();
  359.  
  360.     fclose(fp0);
  361.     FREE(Address);
  362.     FREE(Title);
  363.  
  364.     return(1);
  365. }
  366.