From a689b24db14436ab1faa2f2f79b9f27b777b1fdb Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 14 Oct 2001 12:10:29 +0000 Subject: the next step in the intl changeover. This should get us compiling agian, and also completes the switch to lang_tdb.c. SWAT should now work with a po file in the lib/ directory also removed useless SYSLOG defines in many files (This used to be commit 5296b20ad85d7519c870768455cb4d8df048c55a) --- source3/web/cgi.c | 39 +++---- source3/web/neg_lang.c | 274 ++++++----------------------------------------- source3/web/statuspage.c | 137 ++++++++++++------------ source3/web/swat.c | 32 ++---- 4 files changed, 130 insertions(+), 352 deletions(-) (limited to 'source3/web') diff --git a/source3/web/cgi.c b/source3/web/cgi.c index caba28396f..e1b26d99b4 100644 --- a/source3/web/cgi.c +++ b/source3/web/cgi.c @@ -20,7 +20,6 @@ #include "includes.h" #include "smb.h" -#include "webintl.h" #define MAX_VARIABLES 10000 @@ -138,7 +137,7 @@ void cgi_load_variables(void) #ifdef DEBUG_COMMENTS char dummy[100]=""; print_title(dummy); - printf("\n",__FILE__); + d_printf("\n",__FILE__); #endif if (!content_length) { @@ -270,7 +269,7 @@ static void cgi_setup_error(char *err, char *header, char *info) } } - printf("HTTP/1.0 %s\r\n%sConnection: close\r\nContent-Type: text/html\r\n\r\n%s

%s

%s

\r\n\r\n", err, header, err, err, info); + d_printf("HTTP/1.0 %s\r\n%sConnection: close\r\nContent-Type: text/html\r\n\r\n%s

%s

%s

\r\n\r\n", err, header, err, err, info); fclose(stdin); fclose(stdout); exit(0); @@ -448,9 +447,7 @@ static void cgi_download(char *file) char buf[1024]; int fd, l, i; char *p; -#if I18N_SWAT - int nLangDesc; -#endif + char *lang; /* sanitise the filename */ for (i=0;file[i];i++) { @@ -464,11 +461,8 @@ static void cgi_download(char *file) cgi_setup_error("404 File Not Found","", "The requested file was not found"); } -#if I18N_SWAT - fd = sys_open(ln_get_pref_file(file, &st, &nLangDesc),O_RDONLY,0); -#else - fd = sys_open(file,O_RDONLY,0); -#endif + + fd = web_open(file,O_RDONLY,0); if (fd == -1) { cgi_setup_error("404 File Not Found","", "The requested file was not found"); @@ -486,10 +480,12 @@ static void cgi_download(char *file) } } printf("Expires: %s\r\n", http_timestring(time(NULL)+EXPIRY_TIME)); -#if I18N_SWAT - if(ln_get_lang(nLangDesc)) - printf("Content-Language: %s\r\n", ln_get_lang(nLangDesc)); -#endif + + lang = lang_tdb_current(); + if (lang) { + printf("Content-Language: %s\r\n", lang); + } + printf("Content-Length: %d\r\n\r\n", (int)st.st_size); while ((l=read(fd,buf,sizeof(buf)))>0) { fwrite(buf, 1, l, stdout); @@ -511,6 +507,7 @@ void cgi_setup(char *rootdir, int auth_required) char line[1024]; char *url=NULL; char *p; + char *lang; if (chdir(rootdir)) { cgi_setup_error("400 Server Error", "", @@ -520,10 +517,10 @@ void cgi_setup(char *rootdir, int auth_required) /* Handle the possability we might be running as non-root */ sec_init(); -#if I18N_SWAT - if(getenv("HTTP_ACCEPT_LANGUAGE")) /* if running as a cgi program */ - ln_negotiate_language(getenv("HTTP_ACCEPT_LANGUAGE")); -#endif + if ((lang=getenv("HTTP_ACCEPT_LANGUAGE"))) { + /* if running as a cgi program */ + web_set_lang(lang); + } /* maybe we are running under a web server */ if (getenv("CONTENT_LENGTH") || getenv("REQUEST_METHOD")) { @@ -559,10 +556,8 @@ void cgi_setup(char *rootdir, int auth_required) authenticated = cgi_handle_authorization(&line[15]); } else if (strncasecmp(line,"Content-Length: ", 16)==0) { content_length = atoi(&line[16]); -#if I18N_SWAT } else if (strncasecmp(line,"Accept-Language: ", 17)==0) { - ln_negotiate_language(&line[17]); -#endif + web_set_lang(&line[17]); } /* ignore all other requests! */ } diff --git a/source3/web/neg_lang.c b/source3/web/neg_lang.c index 32f52aa473..8a5b60d99f 100644 --- a/source3/web/neg_lang.c +++ b/source3/web/neg_lang.c @@ -1,7 +1,7 @@ /* Unix SMB/Netbios implementation. - Version 1.9. - Samba Web Administration Tool + Version 3.0 + SWAT language handling This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,251 +21,47 @@ */ #include "includes.h" -/* #include "config.h" */ -#include "webintl.h" -#if I18N_SWAT -/* constants. */ -/* it is ok to make them bigger.*/ -#define LN_PREFLANG_MAX 10 -#define LN_LNAME_LENGTH 8+1+8 - -#define LN_DEFAULT_LANG I18N_DEFAULT_LANG -#define LN_LANGDESC_DEFAULT -1 -#define LN_NO_AVAILABLE_LANG -1 - -/* ****************************************************************** - * macros for debugging. - ***************************************************************** */ -#ifdef LN_R_NODEBUG - -#else /* - *#define LN_DEBUG_LOG "/tmp/lndebug.log" - *void ln_debug_error(const char *info, int nLine) - *{ - * FILE* fp; - * fp = sys_fopen(LN_DEBUG_LOG, "a"); - * fprintf(fp, "%s at %d.\n", info, nLine); - * fclose(fp); - *} - *void rassert_help(BOOL b, int l) - *{ - * if(!b) - * { - * ln_debug_error("language negotiation error.", l); - * exit(1); - * } - *} - */ -#endif /* LN_R_NODEBUG */ - -/* **************************************************************** - LNNegotiator struct. It contains... - [aPrefLang] - the array of strings. each string is the name of - languages ("ja", "ko"...), given by web browser. - [nPrefLang] - the number of the languages in aPrefLang. - [lOriginalLang] - == "en": indicates what language the default(original) files - are written with. -**************************************************************** */ -typedef char lnstring[LN_LNAME_LENGTH + 1]; -#define lnstrcpy(d,s) safe_strcpy((d),(s),sizeof(lnstring)-1) - -typedef struct tagLNNegotiator -{ - lnstring aPrefLang[LN_PREFLANG_MAX]; - int nPrefLang; - lnstring lOriginalLang; -}LNNegotiator; - -/* ************************************************************** - * some access functions & macros for LNNegotiator struct. - * ************************************************************ */ -#define ln_getPreflangCount(pLn) ((pLn)->nPrefLang) -#define ln_getOriginalLang(pLn) ((pLn)->lOriginalLang) -#define ln_getDefaultPrefLang(pLn) ((pLn)->lDefaultPrefLang) - -/* make it inline-expanded (or macro) to get better performance */ -static const char* ln_getPreflang(LNNegotiator* pLn, int i) -{ - rassert(i == LN_LANGDESC_DEFAULT - || (0 <= i && i < ln_getPreflangCount(pLn))); - - if(i == LN_LANGDESC_DEFAULT) - return NULL; - if(0 <= i && i < ln_getPreflangCount(pLn)) - return pLn->aPrefLang[i]; - return NULL; -} -/* initialize structures */ -static void ln_resetln(LNNegotiator* pLn) -{ - pLn->nPrefLang = 0; - /* using fixed memory.*/ -} -static BOOL ln_addPreflang(LNNegotiator* pLn, const char* pLang) -{ - int nPref = ln_getPreflangCount(pLn); - - if(nPref >= LN_PREFLANG_MAX) - return False; - - lnstrcpy(pLn->aPrefLang[nPref], pLang); - (pLn->nPrefLang)++; - return True; -} -static void ln_initln_help(LNNegotiator* pLn) -{ - ln_resetln(pLn); - lnstrcpy(pLn->lOriginalLang, I18N_ORIGINAL_LANG); - /* I18N_ORIGINAL_LANG = "en" is hardcoded in - webintl.h. */ - if (I18N_DEFAULT_PREF_LANG[0] != '\0') - ln_addPreflang(pLn, I18N_DEFAULT_PREF_LANG); - - /* this entry is used only when web browser didn't send - ACCEPT-LANGUAGE header. */ -} -/* **************************************************************** - * store acceptable languages into LNNegotiator object. - * [pstrLangarray] The arguments of "accept-language" http header, - * which is like "en-GB, es;q=0.5, ja". "q=0.5" is called quality value, - * but it is ignored now. wiled card "*" is also ignored. - ***************************************************************** */ -static BOOL ln_negotiate_language_help( LNNegotiator* pLn, const char* pstrLangarray ) + during a file download we first check to see if there is a language + specific file available. If there is then use that, otherwise + just open the specified file +*/ +int web_open(const char *fname, int flags, mode_t mode) { - char* pToken; - const char* pDelim = " \n\r\t,;"; - pstring strBuffer; - - rassert(pstrLangarray); - rassert(pLn); - - ln_resetln(pLn); - pstrcpy(strBuffer, pstrLangarray); - pToken = strtok(strBuffer, pDelim); - while(pToken != NULL) - { - if(strncmp(pToken, "q=", strlen("q=")) == 0) - { - pToken = strtok(NULL, pDelim); - continue; + char *p = NULL; + char *lang = lang_tdb_current(); + int fd; + if (lang) { + asprintf(&p, "lang/%s/%s", lang, fname); + if (p) { + fd = sys_open(p, flags, mode); + free(p); + if (fd != -1) { + return fd; + } } - if(!ln_addPreflang(pLn, pToken)) - break; - pToken = strtok(NULL, pDelim); } - rassert(ln_getPreflangCount(pLn) != 0); - return (ln_getPreflangCount(pLn) != 0); -} - -/* ************************************************************** - initialize gettext. Before this, cgi_setup() should be done. - cgi_setup() calls ln_negotiate_language() if the user specifies - languages in web browser. Then, ln_set_pref_language() will work. - ************************************************************* */ -static BOOL ln_init_lang_env_help(LNNegotiator* pLn) -{ -#if I18N_GETTEXT - int nLang; - nLang = ln_set_pref_language(pLn); - rstrace(getenv("LANGUAGE")); -#endif /* I18N_GETTEXT */ - return True; + /* fall through to default name */ + return sys_open(fname, flags, mode); } -/* ***************************************************************** - * This function searches for the "PrefLang" version of pFile. - * if not available, returns pFile. - * [pFile] the filename. - * [pst] the address of a struct. it will be filled with the information - * of the file. - * [pLangDesc] The address of an integer. a value which indicates the - * language of the returned value is written to the address. the value - * is used in ln_get_lang(). - * [return value] address of the name of the language version of the file. - * It is static object so it will be destroyed at the time ln_get_pref_file() - * is called. - **************************************************************** */ -static void ln_make_filename( pstring afname, const char* pFile, const char* pAdd ) -{ -#if LANG_PREFIX - /* LANG_PREFIX is already undefined, maybe removed soon */ - /* maybe, foo.html.ja */ - pstrcpy(afname, pFile); - pstrcat(afname, "."); - pstrcat(afname, pAdd); -#else - /* maybe, lang/ja/foo.html */ - pstrcpy(afname, "lang/"); - pstrcat(afname, pAdd); - pstrcat(afname, "/"); - pstrcat(afname, pFile); -#endif -} -static const char* ln_get_pref_file_help( - LNNegotiator* pLn, const char* pFile, - SMB_STRUCT_STAT* pst, int* pLangDesc) -{ - static pstring afname; - int i; - for(i = 0; i < ln_getPreflangCount(pLn); i++) - { - if(strcmp(ln_getPreflang(pLn, i), ln_getOriginalLang(pLn)) - == 0) - break; - ln_make_filename(afname, pFile, ln_getPreflang(pLn, i)); - if(file_exist(afname, pst)) - { - *pLangDesc = i; - return afname; - } - } - pstrcpy(afname, pFile); - file_exist(afname, pst); - *pLangDesc = LN_LANGDESC_DEFAULT; - return afname; -} -/* ******************************************************************* - * file scope variables. this variable is not locked. - * (not multithread-safe) - ******************************************************************** */ -static LNNegotiator lnLanguagenegotiator; -/* ******************************************************************* - * interfaces to the outside of this file. - ******************************************************************** */ -void ln_initln(void) -{ - ln_initln_help(&lnLanguagenegotiator); -} -BOOL ln_init_lang_env(void) -{ - return ln_init_lang_env_help(&lnLanguagenegotiator); -} -const char* ln_get_lang(int nLangDesc) -{ - return ln_getPreflang(&lnLanguagenegotiator, nLangDesc); -} -const char* ln_get_pref_file(const char* pFile, - SMB_STRUCT_STAT* pst, int* pLangDesc) -{ - return ln_get_pref_file_help( - &lnLanguagenegotiator, pFile, pst, pLangDesc); -} -BOOL ln_negotiate_language(const char* pstrLangarray) -{ - return ln_negotiate_language_help( - &lnLanguagenegotiator, pstrLangarray); -} -const char* ln_get_pref_file_n_o(const char* pFile) +/* + choose from a list of languages. The list can be comma or space + separated + Keep choosing until we get a hit +*/ +void web_set_lang(const char *lang_list) { - SMB_STRUCT_STAT st; - int nLangDesc; - return ln_get_pref_file(pFile, &st, &nLangDesc); + fstring lang; + char *p = (char *)lang_list; + + while (next_token(&p, lang, ", \t\r\n", sizeof(lang))) { + if (lang_tdb_init(lang)) return; + } + + /* it's not an error to not initialise - we just fall back to + the default */ } -#endif /* I18N_SWAT */ diff --git a/source3/web/statuspage.c b/source3/web/statuspage.c index b49fc7b656..6af7674dc9 100644 --- a/source3/web/statuspage.c +++ b/source3/web/statuspage.c @@ -20,7 +20,6 @@ */ #include "includes.h" -#include "webintl.h" #define PIDMAP struct PidMap @@ -40,7 +39,7 @@ static void initPid2Machine (void) { /* show machine name rather PID on table "Open Files"? */ if (PID_or_Machine) { - PIDMAP *p, *q; + PIDMAP *p; for (p = pidmap; p != NULL; ) { DLIST_REMOVE(pidmap, p); @@ -105,41 +104,41 @@ static char *tstring(time_t t) static void print_share_mode(share_mode_entry *e, char *fname) { - printf("%s",_(mapPid2Machine(e->pid))); - printf(""); + d_printf("%s",_(mapPid2Machine(e->pid))); + d_printf(""); switch ((e->share_mode>>4)&0xF) { - case DENY_NONE: printf(_("DENY_NONE")); break; - case DENY_ALL: printf(_("DENY_ALL ")); break; - case DENY_DOS: printf(_("DENY_DOS ")); break; - case DENY_READ: printf(_("DENY_READ ")); break; - case DENY_WRITE:printf(_("DENY_WRITE ")); break; + case DENY_NONE: d_printf("DENY_NONE"); break; + case DENY_ALL: d_printf("DENY_ALL "); break; + case DENY_DOS: d_printf("DENY_DOS "); break; + case DENY_READ: d_printf("DENY_READ "); break; + case DENY_WRITE:d_printf("DENY_WRITE "); break; } - printf(""); + d_printf(""); - printf(""); + d_printf(""); switch (e->share_mode&0xF) { - case 0: printf(_("RDONLY ")); break; - case 1: printf(_("WRONLY ")); break; - case 2: printf(_("RDWR ")); break; + case 0: d_printf("RDONLY "); break; + case 1: d_printf("WRONLY "); break; + case 2: d_printf("RDWR "); break; } - printf(""); + d_printf(""); - printf(""); + d_printf(""); if((e->op_type & (EXCLUSIVE_OPLOCK|BATCH_OPLOCK)) == (EXCLUSIVE_OPLOCK|BATCH_OPLOCK)) - printf(_("EXCLUSIVE+BATCH ")); + d_printf("EXCLUSIVE+BATCH "); else if (e->op_type & EXCLUSIVE_OPLOCK) - printf(_("EXCLUSIVE ")); + d_printf("EXCLUSIVE "); else if (e->op_type & BATCH_OPLOCK) - printf(_("BATCH ")); + d_printf("BATCH "); else if (e->op_type & LEVEL_II_OPLOCK) - printf(_("LEVEL_II ")); + d_printf("LEVEL_II "); else - printf(_("NONE ")); - printf(""); + d_printf("NONE "); + d_printf(""); - printf("%s%s\n", + d_printf("%s%s\n", fname,tstring(e->time.tv_sec)); } @@ -179,15 +178,15 @@ static int traverse_fn2(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void* st addPid2Machine (crec.pid, crec.machine); - printf("%d%s%s%s\n", + d_printf("%d%s%s%s\n", (int)crec.pid, crec.machine,crec.addr, tstring(crec.start)); if (geteuid() == 0) { - printf("\n", + d_printf("\n", (int)crec.pid); } - printf("\n"); + d_printf("\n"); return 0; } @@ -205,7 +204,7 @@ static int traverse_fn3(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void* st if (crec.cnum == -1 || !process_exists(crec.pid)) return 0; - printf("%s%s%s%d%s%s\n", + d_printf("%s%s%s%d%s%s\n", crec.name,uidtoname(crec.uid), gidtoname(crec.gid),(int)crec.pid, crec.machine, @@ -270,22 +269,22 @@ void status_page(void) initPid2Machine (); - printf("

%s

\n", _("Server Status")); + d_printf("

%s

\n", _("Server Status")); - printf("
\n"); + d_printf("\n"); if (!autorefresh) { - printf("\n", _("Auto Refresh")); - printf("
%s", _("Refresh Interval: ")); - printf("\n", + d_printf("\n", _("Auto Refresh")); + d_printf("
%s", _("Refresh Interval: ")); + d_printf("\n", refresh_interval); } else { - printf("\n", _("Stop Refreshing")); - printf("
%s%d\n", _("Refresh Interval: "), refresh_interval); - printf("\n"); + d_printf("\n", _("Stop Refreshing")); + d_printf("
%s%d\n", _("Refresh Interval: "), refresh_interval); + d_printf("\n"); } - printf("

\n"); + d_printf("

\n"); if (!tdb) { /* open failure either means no connections have been @@ -293,83 +292,83 @@ void status_page(void) } - printf("\n"); + d_printf("
\n"); - printf("", _("version:"), VERSION); + d_printf("", _("version:"), VERSION); fflush(stdout); - printf("\n", _("smbd:"), smbd_running()?_("running"):_("not running")); + d_printf("\n", _("smbd:"), smbd_running()?_("running"):_("not running")); if (geteuid() == 0) { if (smbd_running()) { - printf("\n", _("Stop smbd")); + d_printf("\n", _("Stop smbd")); } else { - printf("\n", _("Start smbd")); + d_printf("\n", _("Start smbd")); } - printf("\n", _("Restart smbd")); + d_printf("\n", _("Restart smbd")); } - printf("\n"); + d_printf("\n"); fflush(stdout); - printf("\n", _("nmbd:"), nmbd_running()?_("running"):_("not running")); + d_printf("\n", _("nmbd:"), nmbd_running()?_("running"):_("not running")); if (geteuid() == 0) { if (nmbd_running()) { - printf("\n", _("Stop nmbd")); + d_printf("\n", _("Stop nmbd")); } else { - printf("\n", _("Start nmbd")); + d_printf("\n", _("Start nmbd")); } - printf("\n", _("Restart nmbd")); + d_printf("\n", _("Restart nmbd")); } - printf("\n"); + d_printf("\n"); - printf("
%s%s
%s%s
%s%s
%s%s
%s%s
%s%s
\n"); + d_printf("\n"); fflush(stdout); - printf("

%s

\n", _("Active Connections")); - printf("\n"); - printf("\n", _("PID"), _("Client"), _("IP address"), _("Date")); + d_printf("

%s

\n", _("Active Connections")); + d_printf("
%s%s%s%s
\n"); + d_printf("\n", _("PID"), _("Client"), _("IP address"), _("Date")); if (geteuid() == 0) { - printf("\n", _("Kill")); + d_printf("\n", _("Kill")); } - printf("\n"); + d_printf("\n"); if (tdb) tdb_traverse(tdb, traverse_fn2, NULL); - printf("
%s%s%s%s%s%s

\n"); + d_printf("

\n"); - printf("

%s

\n", _("Active Shares")); - printf("\n"); - printf("\n\n", + d_printf("

%s

\n", _("Active Shares")); + d_printf("
%s%s%s%s%s%s
\n"); + d_printf("\n\n", _("Share"), _("User"), _("Group"), _("PID"), _("Client"), _("Date")); if (tdb) tdb_traverse(tdb, traverse_fn3, NULL); - printf("
%s%s%s%s%s%s

\n"); + d_printf("

\n"); - printf("

%s

\n", _("Open Files")); - printf("\n"); - printf("\n", _("PID"), _("Sharing"), _("R/W"), _("Oplock"), _("File"), _("Date")); + d_printf("

%s

\n", _("Open Files")); + d_printf("
%s%s%s%s%s%s
\n"); + d_printf("\n", _("PID"), _("Sharing"), _("R/W"), _("Oplock"), _("File"), _("Date")); locking_init(1); share_mode_forall(print_share_mode); locking_end(); - printf("
%s%s%s%s%s%s
\n"); + d_printf("\n"); if (tdb) tdb_close(tdb); - printf("
\n"); - printf("\n"); + d_printf("
\n"); + d_printf("\n"); - printf("
\n"); + d_printf("\n"); if (autorefresh) { /* this little JavaScript allows for automatic refresh of the page. There are other methods but this seems to be the best alternative */ - printf("\n"); + d_printf("//-->\n\n"); } } diff --git a/source3/web/swat.c b/source3/web/swat.c index a6286dc93b..3deaafbc76 100644 --- a/source3/web/swat.c +++ b/source3/web/swat.c @@ -19,13 +19,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#ifdef SYSLOG -#undef SYSLOG -#endif - #include "includes.h" -#include "smb.h" -#include "webintl.h" #define GLOBALS_SNUM -1 @@ -110,24 +104,22 @@ static char *make_parm_name(char *label) ****************************************************************************/ static int include_html(char *fname) { - FILE *f; + int fd; char buf[1024]; int ret; - f = sys_fopen((char*)LN_(fname), "r"); + fd = web_open(fname, O_RDONLY, 0); - if (!f) { - d_printf(_("ERROR: Can't open %s\n"), fname); + if (fd == -1) { + d_printf("ERROR: Can't open %s\n", fname); return 0; } - while (!feof(f)) { - ret = fread(buf, 1, sizeof(buf), f); - if (ret <= 0) break; - fwrite(buf, 1, ret, stdout); + while ((ret = read(fd, buf, sizeof(buf))) > 0) { + write(1, buf, ret); } - fclose(f); + close(fd); return 1; } @@ -475,7 +467,7 @@ static void commit_parameters(int snum) /**************************************************************************** spit out the html for a link with an image ****************************************************************************/ -static void image_link(char *name,char *hlink, char *src) +static void image_link(const char *name, const char *hlink, const char *src) { d_printf("\"%s\"\n", cgi_baseurl(), hlink, src, name); @@ -1045,6 +1037,8 @@ static void printers_page(void) /* just in case it goes wild ... */ alarm(300); + setlinebuf(stdout); + /* we don't want any SIGPIPE messages */ BlockSignals(True,SIGPIPE); @@ -1071,14 +1065,8 @@ static void printers_page(void) iNumNonAutoPrintServices = lp_numservices(); load_printers(); -#if I18N_SWAT - ln_initln(); - cgi_setup(SWATDIR, !demo_mode); - ln_init_lang_env(); -#else cgi_setup(SWATDIR, !demo_mode); -#endif print_header(); cgi_load_variables(); -- cgit