Annotation of libwww/Library/src/HTHome.c, revision 2.25
2.1 frystyk 1: /* HTHome.c
2.2 frystyk 2: ** ANCHOR TRANSLATIONS
2.1 frystyk 3: **
4: ** (c) COPYRIGHT MIT 1995.
5: ** Please first read the full copyright statement in the file COPYRIGH.
2.25 ! frystyk 6: ** @(#) $Id: HTHome.c,v 2.24 1996/08/08 12:35:39 frystyk Exp $
2.1 frystyk 7: **
8: ** Authors
9: ** TBL Tim Berners-Lee timbl@w3.org
10: ** JFG Jean-Francois Groff jfg@dxcern.cern.ch
11: ** DD Denis DeLaRoca (310) 825-4580 <CSP1DWD@mvs.oac.ucla.edu>
2.2 frystyk 12: ** HFN Henrik Frystyk
2.1 frystyk 13: ** History
14: ** 8 Jun 92 Telnet hopping prohibited as telnet is not secure TBL
15: ** 26 Jun 92 When over DECnet, suppressed FTP, Gopher and News. JFG
16: ** 6 Oct 92 Moved HTClientHost and HTlogfile into here. TBL
17: ** 17 Dec 92 Tn3270 added, bug fix. DD
18: ** 4 Feb 93 Access registration, Search escapes bad chars TBL
19: ** PARAMETERS TO HTSEARCH AND HTLOADRELATIVE CHANGED
20: ** 28 May 93 WAIS gateway explicit if no WAIS library linked in.
21: ** Dec 93 Bug change around, more reentrant, etc
22: ** 09 May 94 logfile renamed to HTlogfile to avoid clash with WAIS
2.13 frystyk 23: ** 8 Jul 94 Insulate free from _free structure element.
2.1 frystyk 24: ** Sep 95 Rewritten, HFN
25: ** Nov 95 Spawned from HTAccess.c
26: */
27:
28: /* Library include files */
29: #include "WWWLib.h"
30: #include "HTHome.h" /* Implemented here */
31:
32: /* ------------------------------------------------------------------------- */
33:
34: /* Find Related Name
35: ** -----------------
36: ** Creates a string that can be used as a related name when
37: ** calling HTParse initially.
38: **
39: ** The code for this routine originates from the Linemode
40: ** browser and was moved here by howcome@w3.org
41: ** in order for all clients to take advantage.
2.18 frystyk 42: ** The string returned must be freed by the caller
2.1 frystyk 43: */
2.18 frystyk 44: PUBLIC char * HTGetCurrentDirectoryURL (void)
2.1 frystyk 45: {
46: char* default_default = NULL; /* Parse home relative to this */
2.16 frystyk 47: char * host = HTGetHostName();
2.1 frystyk 48: StrAllocCopy(default_default, "file://");
2.16 frystyk 49: if (host) {
2.1 frystyk 50: StrAllocCat(default_default, host);
2.16 frystyk 51: HT_FREE(host);
52: } else
2.1 frystyk 53: StrAllocCat(default_default, "localhost");
54: {
55: char wd[HT_MAX_PATH+1];
56:
2.14 frystyk 57: #ifdef HAVE_GETCWD /* System V variant SIGN CHANGED TBL 921006 !! */
58: char *result = (char *) getcwd(wd, sizeof(wd));
59: #else
2.12 frystyk 60: #ifdef HAVE_GETWD
61: char *result = (char *) getwd(wd);
62: #else
63: #error "This platform does not support neither getwd nor getcwd\n"
2.1 frystyk 64: char *result = NULL;
2.14 frystyk 65: #endif /* HAVE_GETWD */
2.12 frystyk 66: #endif /* HAVE_GETCWD */
2.1 frystyk 67: *(wd+HT_MAX_PATH) = '\0';
68: if (result) {
69: #ifdef VMS
70: /* convert directory name to Unix-style syntax */
71: char * disk = strchr (wd, ':');
72: char * dir = strchr (wd, '[');
73: if (disk) {
74: *disk = '\0';
75: StrAllocCat (default_default, "/"); /* needs delimiter */
76: StrAllocCat (default_default, wd);
77: }
78: if (dir) {
79: char *p;
80: *dir = '/'; /* Convert leading '[' */
81: for (p = dir ; *p != ']'; ++p)
82: if (*p == '.') *p = '/';
83: *p = '\0'; /* Cut on final ']' */
84: StrAllocCat (default_default, dir);
85: }
86: #else /* not VMS */
87: #ifdef WIN32
88: char * p = wd ; /* a colon */
89: StrAllocCat(default_default, "/");
90: while( *p != 0 ) {
91: if (*p == '\\') /* change to one true slash */
92: *p = '/' ;
93: p++;
94: }
95: StrAllocCat( default_default, wd);
96: #else /* not WIN32 */
97: StrAllocCat (default_default, wd);
98: #endif /* not WIN32 */
99: #endif /* not VMS */
100: }
101: }
102: StrAllocCat(default_default, "/default.html");
103: return default_default;
104: }
105:
106:
107: /* Generate the anchor for the home page
108: ** -------------------------------------
109: **
110: ** As it involves file access, this should only be done once
111: ** when the program first runs.
112: ** This is a default algorithm -- browser don't HAVE to use this.
113: ** But consistency betwen browsers is STRONGLY recommended!
114: **
115: ** Priority order is:
116: **
117: ** 1 WWW_HOME environment variable (logical name, etc)
118: ** 2 ~/WWW/default.html
119: ** 3 /usr/local/bin/default.html
120: ** 4 http://www.w3.org/default.html
121: **
122: */
123: PUBLIC HTParentAnchor * HTHomeAnchor (void)
124: {
125: char * my_home_document = NULL;
126: char * home = (char *) getenv(LOGICAL_DEFAULT);
127: char * ref;
128: HTParentAnchor * anchor;
129:
130: /* Someone telnets in, they get a special home */
131: if (home) {
132: StrAllocCopy(my_home_document, home);
133: } else if (HTLib_secure()) { /* Telnet server */
134: FILE * fp = fopen(REMOTE_POINTER, "r");
135: char * status;
136: if (fp) {
2.10 frystyk 137: if ((my_home_document = (char *) HT_MALLOC(HT_MAX_PATH)) == NULL)
138: HT_OUTOFMEM("my_home_document ");
2.1 frystyk 139: status = fgets(my_home_document, HT_MAX_PATH, fp);
140: if (!status) {
2.10 frystyk 141: HT_FREE(my_home_document);
2.1 frystyk 142: my_home_document = NULL;
143: }
144: fclose(fp);
145: }
146: if (!my_home_document) StrAllocCopy(my_home_document, REMOTE_ADDRESS);
147: }
148:
149: if (!my_home_document) {
150: FILE * fp = NULL;
151: char * home = (char *) getenv("HOME");
152: if (home) {
2.10 frystyk 153: if ((my_home_document = (char *) HT_MALLOC(strlen(home)+1+ strlen(PERSONAL_DEFAULT)+1)) == NULL)
154: HT_OUTOFMEM("HTLocalName");
2.1 frystyk 155: sprintf(my_home_document, "%s/%s", home, PERSONAL_DEFAULT);
156: fp = fopen(my_home_document, "r");
157: }
158:
159: if (!fp) {
160: StrAllocCopy(my_home_document, LOCAL_DEFAULT_FILE);
161: fp = fopen(my_home_document, "r");
162: }
163: if (fp) {
164: fclose(fp);
165: } else {
166: if (WWWTRACE)
2.12 frystyk 167: HTTrace("Home Anchor. No local home document in ~/%s or %s\n",
2.1 frystyk 168: PERSONAL_DEFAULT, LOCAL_DEFAULT_FILE);
2.10 frystyk 169: HT_FREE(my_home_document);
2.1 frystyk 170: my_home_document = NULL;
171: }
172: }
2.12 frystyk 173:
2.1 frystyk 174: ref = HTParse(my_home_document ? my_home_document :
175: HTLib_secure() ? REMOTE_ADDRESS : LAST_RESORT, "file:",
176: PARSE_ACCESS|PARSE_HOST|PARSE_PATH|PARSE_PUNCTUATION);
177: if (my_home_document) {
178: if (WWWTRACE)
2.12 frystyk 179: HTTrace("Home Anchor. `%s\' used for custom home page as\n`%s\'\n",
2.1 frystyk 180: my_home_document, ref);
2.10 frystyk 181: HT_FREE(my_home_document);
2.1 frystyk 182: }
183: anchor = (HTParentAnchor*) HTAnchor_findAddress(ref);
2.10 frystyk 184: HT_FREE(ref);
2.1 frystyk 185: return anchor;
2.19 frystyk 186: }
187:
188: /*
2.22 frystyk 189: ** Creates a temporary anchor that doesn't exist
190: */
191: PUBLIC HTParentAnchor * HTTmpAnchor (HTUserProfile * up)
192: {
193: static int offset = 0; /* Just keep counting... */
194: time_t t = time(NULL);
195: char * tmpfile = HTGetTmpFileName(HTUserProfile_tmp(up));
196: char * tmpurl = HTParse(tmpfile, "file:", PARSE_ALL);
197: if (tmpfile && tmpurl && t >= 0) {
198: char * result;
199: if (!(result = (char *) HT_MALLOC(strlen(tmpurl)+20)))
200: HT_OUTOFMEM("HTTmpAnchor");
2.23 frystyk 201: sprintf(result, "%s.%ld.%d", tmpurl, t, offset++);
2.22 frystyk 202: if (APP_TRACE) HTTrace("Tmp Anchor.. With location `%s\'\n", result);
203: return HTAnchor_parent(HTAnchor_findAddress(result));
204: HT_FREE(result);
205: }
206: HT_FREE(tmpfile);
207: HT_FREE(tmpurl);
208: return NULL;
209: }
210:
211: /*
2.19 frystyk 212: ** Standard interface to libwww TRACE messages. Pass this function a
213: ** string of characters and it will set up the appropriate TRACE flags.
214: ** The shortnames for the trace messages are not as intuitive as they
215: ** could be :-(. The string must be null terminated
216: */
217: PUBLIC int HTSetTraceMessageMask (const char * shortnames)
218: {
219: #ifdef WWWTRACE
220: WWWTRACE = 0;
2.24 frystyk 221: if (shortnames && *shortnames) {
2.21 frystyk 222: char * ptr = (char *) shortnames;
223: for(; *ptr; ptr++) {
2.19 frystyk 224: switch (*ptr) {
2.22 frystyk 225: case 'f': WWWTRACE |= SHOW_UTIL_TRACE; break;
226: case 'l': WWWTRACE |= SHOW_APP_TRACE; break;
2.19 frystyk 227: case 'c': WWWTRACE |= SHOW_CACHE_TRACE; break;
228: case 'g': WWWTRACE |= SHOW_SGML_TRACE; break;
2.22 frystyk 229: case 'b': WWWTRACE |= SHOW_BIND_TRACE; break;
230: case 't': WWWTRACE |= SHOW_THREAD_TRACE; break;
231: case 's': WWWTRACE |= SHOW_STREAM_TRACE; break;
232: case 'p': WWWTRACE |= SHOW_PROTOCOL_TRACE; break;
233: case 'm': WWWTRACE |= SHOW_MEM_TRACE; break;
234: case 'u': WWWTRACE |= SHOW_URI_TRACE; break;
2.19 frystyk 235: case 'h': WWWTRACE |= SHOW_AUTH_TRACE; break;
2.22 frystyk 236: case 'a': WWWTRACE |= SHOW_ANCHOR_TRACE; break;
2.19 frystyk 237: case 'i': WWWTRACE |= SHOW_PICS_TRACE; break;
238: case 'o': WWWTRACE |= SHOW_CORE_TRACE; break;
239: default:
240: if (WWWTRACE) HTTrace("Trace....... Bad argument\n");
241: }
242: }
2.20 frystyk 243: if (!WWWTRACE) WWWTRACE = SHOW_ALL_TRACE;
2.25 ! frystyk 244: } else {
! 245: WWWTRACE = SHOW_ALL_TRACE;
2.19 frystyk 246: }
247: return WWWTRACE;
248: #else
249: return 0;
250: #endif
2.1 frystyk 251: }
Webmaster