123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332 |
- /*
- * CDE - Common Desktop Environment
- *
- * Copyright (c) 1993-2012, The Open Group. All rights reserved.
- *
- * These libraries and programs are free software; you can
- * redistribute them and/or modify them under the terms of the GNU
- * Lesser General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * These libraries and programs are distributed in the hope that
- * they will be useful, but WITHOUT ANY WARRANTY; without even the
- * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See the GNU Lesser General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with these libraries and programs; if not, write
- * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
- * Floor, Boston, MA 02110-1301 USA
- */
- /* $XConsortium: main.c /main/10 1996/10/28 12:41:03 cde-hp $ */
- /*
- * (c) Copyright 1996 Digital Equipment Corporation.
- * (c) Copyright 1996 Hewlett-Packard Company.
- * (c) Copyright 1996 International Business Machines Corp.
- * (c) Copyright 1996 Sun Microsystems, Inc.
- * (c) Copyright 1996 Novell, Inc.
- * (c) Copyright 1996 FUJITSU LIMITED.
- * (c) Copyright 1996 Hitachi.
- */
- char *ProgramRevision = "dtimsstart $Revision: /main/10 $";
- #define _EXTERN_DEFINE_
- #include "xims.h"
- #undef _EXTERN_DEFINE_
- #include <signal.h>
- #include <locale.h>
- #include <Dt/MsgCatP.h>
- #define NL_SETN 1 /* set number */
- static nl_catd catd = (nl_catd) -1;
- extern char *find_system_locale_name(char *);
- /* local functions */
- static int IsNoError(/* error */);
- static int EnvNeeded(/* error */);
- static int ErrMsgDisabled(/* error */);
- static int ximsShowImsList(/* */);
- static int ximsShowCurrentIms(/* */);
- static int prepare_remote(/* win_st */);
- static int ximsRemoteConf(/* */);
- static int ximsSetMode(/* */);
- static void show_select_mode(/* mode */);
- static int set_locale_env(/* locale */);
- static void init_command(/* progname */);
- static bool optname_match(/* name, str, minlen */);
- static int parse_options(/* argc, argv */);
- static void usage(/* force */);
- static int exitSignalNumber = 0;
- static bool do_usage = False;
- int main (int argc, char **argv)
- {
- int ret = NoError;
- int ret2;
- init_command(argv[0]);
- ret = parse_options(argc, argv);
- ret2 = set_locale_env(Opt.LocaleName); /* set LANG, LC_ALL, msg cat */
- /* get_user_environ() does check ErrNoLocale */
- if (do_usage) { /* '-help' option */
- usage(True);
- Exit(NoError);
- }
- if (ret != NoError)
- Exit(ret);
- if (OpMode == MODE_START && getenv(ENV_NO_DTIMSSTART))
- Exit(ErrDisabled);
- if ((ret = set_cmd_env()) != NoError) {
- /* get_user_environ()) & read_cmd_conf()) */
- Exit(ret);
- }
- #ifdef DEBUG
- if (DebugLvl > 2) { pr_CmdConf(); }
- if (DebugLvl > 1) { pr_CmdOpt(), pr_OpModeFlag(); pr_UserEnv(); }
- #endif
- /* set signal handler */
- if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, sigExit);
- signal(SIGTERM, sigExit);
- signal(SIGHUP, sigExit);
- signal(SIGQUIT, sigExit);
- /* create $HOME/.xims if needed */
- if (OpMode == MODE_START
- || (OpMode == MODE_MODE && Opt.SelectMode != SEL_MODE_QUERY)) {
- if ((ret = create_xims_dir()) != NoError) {
- OpErrCode = ret;
- OpState = State_Init_Err;
- ximsMain(); /* abort with error msg */
- }
- }
- OpState = State_Init_Done;
- switch (OpMode) {
- case MODE_LISTNAME:
- case MODE_LIST: ret = ximsShowImsList(); break;
- case MODE_CURRENT: ret = ximsShowCurrentIms(); break;
- case MODE_MODE: ret = ximsSetMode(); break;
- case MODE_REMCONF: ret = ximsRemoteConf(); break;
- case MODE_START:
- #ifndef DEBUG2
- # if defined(CSRG_BASED)
- setsid();
- # else
- setpgrp();
- # endif
- #endif
- ximsMain(); /* never returns */
- }
- Exit(ret);
- }
- void sigExit(int sig)
- {
- DPR(("sigExit: %s (%d)\n", sig_name(sig), sig));
- signal(sig, SIG_IGN);
- exitSignalNumber = sig;
- Exit(ErrSignaled);
- }
- void Exit(int err_code)
- {
- int exit_code = IsNoError(err_code) ? 0 : 1;
- DPR(("Exit(%s[%d]): exit(%d)\n",
- error_name(err_code), err_code, exit_code));
- if (Verbose > 0 && err_code != LastErrMsg) {
- if (exit_code != 0 && !ErrMsgDisabled(err_code)) {
- UseMsgWindow = False; /* disable msg window */
- put_xims_errmsg(err_code, 0, 0, 0);
- }
- }
- if (OpFlag & FLAG_NOTIFY)
- NotifyErrCode(exit_code == 0 ? NoError : err_code);
- /*
- * if the reason we're exiting is because of a syntax
- * error, set the exit code to 2.
- */
- if (ErrSyntax == err_code)
- exit_code = 2;
- exit(exit_code);
- }
- int NotifyErrCode(int err_code)
- {
- char buf[BUFSIZ], *bp, val[20];
- static bool notify_done = False;
- if (/* !(OpFlag & FLAG_NOTIFY) || */ notify_done)
- return False;
- notify_done = True;
- buf[0] = 0; bp = buf;
- bp = strcpyx(bp, STR_ERRORCODE);
- *bp++ = '=';
- sprintf(val, "%ld", (long)err_code);
- bp = strcpyx(bp, val);
- *bp++ = '\n'; *bp = 0;
- if (ErrFilePathNeeded(err_code)) {
- bp = strcpyx(bp, STR_ERRORPATH);
- *bp++ = '=';
- if (err_code == ErrImsAborted)
- bp = strcpyx(bp, Opt.LogPath);
- else
- bp = strcpyx(bp, errFilePath);
- *bp++ = '\n'; *bp = 0;
- }
- if (OpMode == MODE_REMCONF) {
- send_dtims_msg(WIN_ST_REMOTE_CONF, err_code);
- } else if (OpMode == MODE_START && (OpFlag & FLAG_REMOTERUN)) {
- send_dtims_msg(WIN_ST_REMOTE_RUN, err_code);
- } else {
- fflush(stdout); fflush(stderr);
- (void) fwrite((void *)buf, (size_t)(bp - buf), (size_t)1, stdout);
- fflush(stdout);
- }
- return True;
- }
- static int IsNoError(ximsError error)
- {
- switch (error) {
- case NoError: case ErrIsNone: case ErrNotRun:
- case ErrImsWaiting: case ErrImsWaitDone:
- case ErrImsConnecting: case ErrImsConnectDone:
- case ErrNoImsEntry: case ErrNoLocaleConf:
- case ErrNoSelectionFile: case ErrNoSelection: case ErrSaveSelection:
- case ErrDisabled:
- return True;
- }
- return False;
- }
- static int EnvNeeded(ximsError error)
- {
- switch (error) {
- case NoError: case ErrIsNone: case ErrNotRun:
- case ErrImsWaiting: case ErrImsWaitDone:
- case ErrImsRunning: case ErrImsTimeout:
- /* case ErrImsExecution: case ErrImsAborted: */
- case ErrOpenResource: /* case ErrSignaled: */
- return True;
- }
- return False;
- }
- static int ErrMsgDisabled(ximsError error)
- {
- switch (error) {
- case NoError: case ErrIsNone: case ErrNotRun:
- case ErrImsWaiting: case ErrImsWaitDone:
- case ErrImsConnecting: case ErrImsConnectDone:
- return True;
- case ErrSignaled:
- return (Verbose <= 2);
- case ErrInvState: case ErrInternal:
- return (Verbose <= 3);
- }
- return False;
- }
- int ErrFilePathNeeded(ximsError error)
- {
- switch (error) {
- case ErrFileOpen: case ErrFileCreate: case ErrDirCreate:
- case ErrMissEntry: case ErrNoExecutable: case ErrImsAborted:
- case ErrOpenResource:
- return True;
- }
- return False;
- }
- int InWaitingState(void)
- {
- switch (OpState) {
- case State_Init_Err:
- case State_Finish_Defered:
- case State_Mode_Done:
- return True;
- }
- return False;
- }
- void ximsMain(void)
- {
- static int call_cnt = 0;
- call_cnt++;
- DPR(("\nximsMain(call_cnt=%d): OpState=%s OpErrCode=%s[%d]\n",
- call_cnt, StateName(), error_name(OpErrCode), OpErrCode));
- #ifdef DEBUG
- pr_brk("ximsMain");
- #endif
- if (OpFlag & FLAG_REMOTERUN) {
- int ret;
- if ((ret = prepare_remote(WIN_ST_REMOTE_RUN)) != NoError) {
- Exit(ret);
- }
- }
- switch (OpState) {
- case State_Init_Done: if (Verbose > 1)
- put_xims_log("Started.", 0, 0, 0);
- ximsSelect();
- case State_Select_Done:
- case State_Select_Canceled: ximsStart();
- case State_Start_Done: ximsWait();
- case State_Init_Err:
- case State_Select_Err:
- case State_Start_Err:
- case State_Wait_Err:
- if (!WaitingDialogReply && !IsNoError(OpErrCode)) {
- LastErrMsg = OpErrCode;
- put_xims_errmsg(OpErrCode, 0, 0, 0);
- }
- case State_Wait_Done:
- ximsFinish();
- case State_Finish:
- if (WaitingDialogReply) {
- DPR(("ximsMain(): enter xevent_loop()\n"));
- xevent_loop(); /* never returns */
- WaitingDialogReply = False; /* if failed */
- }
- case State_Finish_Defered:
- if (OpState == State_Finish_Defered) {
- WaitingDialogReply = False;
- ximsFinish();
- }
- case State_Finish_Done: break;
- case State_Finish_Err: break;
- case State_Mode_Done:
- case State_Mode_Canceled: break;
- default:
- OpErrCode = ErrInvState; break;
- }
- Exit(OpErrCode);
- }
- void ximsFinish(void)
- {
- OpStateVal oldOpState = OpState;
- DPR(("ximsFinish(): OpState=%s OpErrCode=%s[%d]\n",
- StateName(), error_name(OpErrCode), OpErrCode));
- OpState = State_Finish;
- if (oldOpState != State_Finish_Defered) {
- if (!(OpFlag & FLAG_NORESOURCE) && isXsession())
- restore_resources();
- if (WaitingDialogReply) {
- DPR2(("ximsFinish(): OpState => State_Finish_Defered\n"));;
- OpState = State_Finish_Defered;
- return;
- }
- }
- if (OpMode == MODE_START && (OpFlag & FLAG_ENV)) {
- if (userSel.name && EnvNeeded(OpErrCode)) {
- OutEnv outEnv;
- CLR(&outEnv, OutEnv);
- if (make_new_environ(&outEnv, &userSel) == NoError) {
- put_new_environ(&outEnv);
- clear_OutEnv(&outEnv);
- }
- } else {
- DPR(("ximsFinish(): Not put env (pri->status=%s[%d])\n",
- error_name(userSel.renv->status), userSel.renv->status));
- }
- }
- /* if (IsNoError(OpErrCode)) OpErrCode = NoError; */
- OpState = State_Finish_Done;
- return;
- }
- static int ximsShowImsList(void)
- {
- int ret = NoError;
- int i;
- int host_type = HOST_LOCAL;
- char *hostname;
- ImsList *list = (ImsList *) 0;
- DPR(("ximsShowImsList()\n"));
- hostname = Opt.HostName;
- if (hostname) {
- host_type = check_hostname(hostname);
- userSel.hostname = NEWSTR(hostname); /* for error msg */
- }
- switch (host_type) {
- case HOST_UNKNOWN:
- ret = ErrUnknownHost;
- break;
- case HOST_REMOTE:
- ret = get_remote_conf(&list, hostname, NULL, NULL);
- break;
- case HOST_LOCAL:
- ret = get_ims_list(&list, NULL, True);
- break;
- }
- if (ret != NoError) {
- DPR2(("ximsShowImsList: ret=%s[%d]\n", error_name(ret), ret));
- /* return ret; */
- } else if (Verbose < 1) {
- for (i = 0; i < list->num_ent; i++)
- puts(list->elist[i]->name);
- } else {
- int err, len;
- for (i = 0; i < list->num_ent; i++) {
- /* If invoked from dtstyle with -listname put the "#" if this is
- the default one. */
- if (Opt.Listname == 1)
- if (i == list->default_idx)
- putchar('#');
- err = list->elist[i]->status;
- if (err) putchar('(');
- fputs(list->elist[i]->name, stdout);
- if (err) putchar(')');
- /* If invoked from dtstyle with -listname put the label */
- if (Opt.Listname == 1) {
- putchar(' ');
- fputs(list->elist[i]->label, stdout);
- }
- if (Verbose > 1) {
- char *msg = "cannot execute";
- switch (err) {
- case NoError:
- msg = "ok"; break;
- case ErrNoExecutable:
- msg = "no executable file"; break;
- case ErrNoImsConf:
- msg = "no configuration file"; break;
- case ErrMissEntry:
- msg = "invalid configuration file"; break;
- }
- len = strlen(list->elist[i]->name) + (err ? 2 : 0);
- for ( ; len < 16; len++) putchar(' ');
- putchar(' '); putchar('['); fputs(msg, stdout); putchar(']');
- }
- putchar('\n');
- }
- }
- fflush(stdout);
- if (list) {
- clear_ImsList(list); FREE(list);
- }
- return NoError;
- }
- static int ximsShowCurrentIms(void)
- {
- int ret = NoError;
- FileSel *fsel;
- DPR(("ximsShowCurrentIms()\n"));
- if (read_user_selection(&fsel, NULL) != NoError) {
- DPR2(("No selection file.\n"));
- return ErrNoSelectionFile;
- }
- if (fsel->name) {
- if (fsel->hostname)
- printf("%s\t[on %s]\n", fsel->name, fsel->hostname);
- else
- puts(fsel->name);
- fflush(stdout);
- } else {
- DPR2(("No IMS selected.\n"));
- ret = ErrNoSelection;
- }
- clear_FileSel(fsel); FREE(fsel);
- return ret;
- }
- static int prepare_remote(int win_st)
- {
- int ret;
- char **av = NULL;
- int ac = 0;
- int cur_st;
- DPR(("prepare_remote()\n"));
- #ifndef DEBUG
- Verbose = DebugLvl = 0; /* disable error messages */
- #endif
- UseMsgWindow = False;
- if ((ret = init_window_env()) != NoError)
- return ret;
- if (winEnv.atom_owner == None)
- return ErrRemoteData;
- cur_st = get_window_status();
- if (cur_st != win_st) {
- DPR(("prepare_remote(): invalid status '%d', should be '%d'\n",
- cur_st, win_st));
- return ErrRemoteData;
- }
- ret = get_window_data(&ac, &av); /* additional options */
- if (ret != NoError) {
- DPR(("prepare_remote(): get_window_data (%s[%d])\n",
- error_name(ret), ret));
- }
- if (ret == NoError) {
- ret = parse_options(ac, av);
- if (ret != NoError) {
- DPR(("secondary parse_options(): failed (%s[%d])\n",
- error_name(ret), ret));
- }
- }
- return NoError;
- }
- static int ximsRemoteConf(void)
- {
- int ret;
- char *locale;
- DPR(("ximsRemoteConf()\n"));
- if ((ret = prepare_remote(WIN_ST_REMOTE_CONF)) != NoError)
- return ret;
- locale = userEnv.real_locale ? userEnv.real_locale : userEnv.locale;
- ret = put_remote_conf(locale, Opt.ImsName);
- return ret;
- }
- static int ximsSetMode(void)
- {
- int ret = NoError;
- int cur_mode = SEL_MODE_NONE;
- ImsList imsList;
- DPR(("ximsSetMode(op=%d)\n", Opt.SelectMode));
- OpState = State_Mode;
- if ((ret = read_localeconf(&imsList, NULL)) != NoError) {
- DPR(("ximsSetMode(%s) locale '%s' isn't supported\n", userEnv.locale));
- /* return ErrNoLocaleConf; */
- }
- cur_mode = get_select_mode();
- if (cur_mode != SEL_MODE_AUTO && cur_mode != SEL_MODE_NOAUTO)
- cur_mode = imsList.def_selmode;
- switch (Opt.SelectMode) {
- case SEL_MODE_NONE:
- case SEL_MODE_QUERY: show_select_mode(cur_mode);
- break;
- case SEL_MODE_WIN: start_mode_window(cur_mode);
- /* never returned */
- break;
- #ifdef SelectMode_ONCE
- case SEL_MODE_ONCE:
- #endif /* SelectMode_ONCE */
- case SEL_MODE_AUTO:
- case SEL_MODE_NOAUTO: ret = set_select_mode(cur_mode, Opt.SelectMode);
- break;
- }
- OpErrCode = ret;
- OpState = State_Mode_Done;
- return ret;
- }
- static void show_select_mode(int mode)
- {
- char *valp;
- printf("%s: \t", (CATGETS(catd,NL_SETN,20, "SelectMode")));
- switch (mode) {
- default:
- #ifdef DEBUG
- case SEL_MODE_NONE: valp = "<NOT DEFINED>"; /* break; */
- #endif
- case SEL_MODE_NOAUTO:
- valp = (CATGETS(catd,NL_SETN,21, "ask_at_login"));
- break;
- case SEL_MODE_AUTO:
- valp = (CATGETS(catd,NL_SETN,22, "resume_current_input_method"));
- break;
- #ifdef SelectMode_ONCE
- case SEL_MODE_ONCE:
- valp = "auto-selection if once selected";
- break;
- #endif /* SelectMode_ONCE */
- }
- puts(valp); fflush(stdout);
- return;
- }
- static int set_locale_env(char *locale)
- {
- char *env_name, *env_value, *bp, *vp, buf[BUFSIZ], buf2[BUFSIZ];
- static char *last_lang_env[2] = { NULL, NULL };
- buf[0] = buf2[0] = 0;
- env_name = "LANG";
- env_value = getenv(env_name);
- if (env_value)
- snprintf(buf, sizeof(buf), "%s", env_value);
- if (locale && *locale) {
- if (!*buf || strcmp(locale, buf)) {
- bp = strcpyx(buf, env_name); *bp++ = '=';
- strcpyx(bp, locale);
- putenv(bp = NEWSTR(buf));
- FREE(last_lang_env[0]);
- last_lang_env[0] = bp;
- }
- } else if (*buf)
- locale = buf;
- else
- return ErrNoLocale;
- env_name = "LC_ALL";
- env_value = getenv(env_name);
- if (env_value)
- snprintf(buf2, sizeof(buf2), "%s", env_value);
- if (!*buf2 || strcmp(locale, buf2)) {
- bp = strcpyx(buf2, env_name); *bp++ = '=';
- strcpyx(bp, locale);
- putenv(bp = NEWSTR(buf2));
- FREE(last_lang_env[1]);
- last_lang_env[1] = bp;
- }
- setlocale(LC_ALL, locale);
- /* set XFILESEARCHPATH */
- vp = getenv(ENV_XFILESEARCHPATH);
- bp = strcpyx(buf, ENV_XFILESEARCHPATH);
- bp = strcpyx(bp, "=");
- if (vp) {
- bp = strcpyx(bp, vp);
- bp = strcpyx(bp, ":");
- }
- bp = strcpyx(bp, ENV_XFILESEARCHPATH_STRING);
- if(*buf) {
- putenv(XtNewString(buf));
- }
- /* set NLSPATH */
- vp = getenv(ENV_NLSPATH);
- bp = strcpyx(buf, ENV_NLSPATH);
- bp = strcpyx(bp, "=");
- if (vp) {
- bp = strcpyx(bp, vp);
- bp = strcpyx(bp, ":");
- }
- bp = strcpyx(bp, ENV_NLSPATH_STRING);
- /* BUG should this be putenv(bp) ? */
- if(*buf) {
- putenv(XtNewString(buf));
- }
- (void)CATCLOSE(catd);
- if (Verbose > 0) {
- catd = CATOPEN(DTIMS_PROGNAME, 0);
- }
- return NoError;
- }
- static void init_command(char *progname)
- {
- /* globals */
- ProgramName = progname;
- if (progname = strrchr(progname, '/'))
- ProgramName = progname + 1;
- #ifdef unused
- if (strstr(ProgramName, "mode")) ProgramType = MODE_MODE;
- else if (strstr(ProgramName, "list")) ProgramType = MODE_LIST;
- else if (strstr(ProgramName, "current")) ProgramType = MODE_CURRENT;
- else if (strstr(ProgramName, "conf")) ProgramType = MODE_REMCONF;
- else
- #endif
- ProgramType = MODE_START;
- OpState = State_None;
- OpMode = ProgramType;
- OpFlag = FLAG_DEFAULT;
- OpErrCode = NoError;
- LogFp = stderr;
- Wargc = 0;
- Wargv = NULL;
- WaitingDialogReply = False;
- WaitingActionDone = False;
- UseMsgWindow = True;
- IsRemote = False;
- LastErrMsg = NoError;
- Verbose = 1;
- DebugLvl = 0;
- ximsErrArgs[0] = ximsErrArgs[1] = ximsErrArgs[2] = (void *) 0;
- errFilePath[0] = 0;
- errFuncName = NULL;
- CLR(&Conf, CmdConf);
- CLR(&Opt, CmdOpt);
- CLR(&winEnv, WinEnv);
- CLR(&userEnv, UserEnv);
- CLR(&userSel, UserSelection);
- localList = (ImsList *) 0;
- return;
- }
- static bool optname_match(char *name, char *str, int minlen)
- {
- int nlen, slen;
- if (strcmp(name, str) == 0) return True;
- nlen = strlen(name);
- slen = strlen(str);
- if (slen >= nlen || slen < minlen) return False;
- if (strncmp(name, str, slen) == 0) return True;
- return False;
- }
- static int parse_options(int argc, char **argv)
- {
- char *opt;
- int i, n;
- int wac = 1;
- char *wav[80];
- int orgMode = MODE_START;
- static bool first_time = True;
- #define SET_FLAG(f) OpFlag |= (f)
- #define CLR_FLAG(f) OpFlag &= ~(f)
- #define CHK_FLAG(f) (OpFlag & (f))
- if (first_time) {
- argc--; argv++;
- /* preset */
- Opt.Listname = 0;
- orgMode = OpMode;
- if (orgMode == MODE_START) SET_FLAG(FLAG_WINDOW);
- Opt.SelectMode = SEL_MODE_NONE;
- }
- for (i = 0; i < argc; i++) {
- opt = argv[i];
- if (*opt++ != '-') goto _inv_opt;
- /* option for MODE */
- if (optname_match("mode", opt, 2)) {
- if (orgMode != MODE_START && orgMode != MODE_MODE)
- goto _inv_opt;
- OpMode = MODE_MODE;
- #if 0 /* not implemented yet */
- } else if (optname_match("style", opt, 3)) {
- if (orgMode != MODE_START && orgMode != MODE_MODE)
- goto _inv_opt;
- OpMode = MODE_STYLE;
- #endif
- } else if (optname_match("listname", opt, 5)) {
- if (orgMode != MODE_START && orgMode != MODE_LISTNAME)
- goto _inv_opt;
- OpMode = MODE_LISTNAME;
- Opt.Listname = 1;
- } else if (optname_match("list", opt, 2)) {
- if (orgMode != MODE_START && orgMode != MODE_LIST)
- goto _inv_opt;
- OpMode = MODE_LIST;
- } else if (optname_match("current", opt, 2)) {
- if (orgMode != MODE_START && orgMode != MODE_CURRENT)
- goto _inv_opt;
- OpMode = MODE_CURRENT;
- } else if (optname_match("remoteconf", opt, 7)) {
- if (orgMode != MODE_START && orgMode != MODE_REMCONF)
- goto _inv_opt;
- OpMode = MODE_REMCONF;
- SET_FLAG(FLAG_NOTIFY);
- /* option for FLAG */
- } else if (optname_match("nosave", opt, 4)) {
- SET_FLAG(FLAG_NOSAVE);
- } else if (optname_match("nostart", opt, 4)) {
- SET_FLAG(FLAG_NOSTART);
- } else if (optname_match("noenv", opt, 4)) {
- CLR_FLAG(FLAG_ENV);
- } else if (optname_match("envonly", opt, 4)) {
- SET_FLAG(FLAG_NOSTART|FLAG_ENV);
- } else if (optname_match("env", opt, 2)) {
- SET_FLAG(FLAG_ENV);
- } else if (optname_match("nowait", opt, 4)) {
- SET_FLAG(FLAG_NOWAIT);
- } else if (optname_match("notimeout", opt, 5)) {
- SET_FLAG(FLAG_NOTIMEOUT);
- } else if (optname_match("noresource", opt, 5)) {
- SET_FLAG(FLAG_NORESOURCE);
- } else if (optname_match("noremote", opt, 5)) {
- SET_FLAG(FLAG_NOREMOTE);
- } else if (optname_match("notify", opt, 5)) {
- SET_FLAG(FLAG_NOTIFY);
- } else if (optname_match("connect", opt, 4)) {
- SET_FLAG(FLAG_CONNECT);
- } else if (optname_match("dt", opt, 2)) {
- SET_FLAG(FLAG_DT);
- } else if (optname_match("window", opt, 2)) {
- SET_FLAG(FLAG_WINDOW);
- } else if (optname_match("nowindow", opt, 4)) {
- CLR_FLAG(FLAG_WINDOW);
- } else if (optname_match("remoterun", opt, 7)) {
- SET_FLAG(FLAG_REMOTERUN);
- SET_FLAG(FLAG_NOTIFY);
- } else if (optname_match("auto", opt, 2)) {
- Opt.SelectMode = SEL_MODE_AUTO;
- } else if (optname_match("noauto", opt, 3)) {
- Opt.SelectMode = SEL_MODE_NOAUTO;
- #ifdef SelectMode_ONCE
- } else if (optname_match("once", opt, 3)) {
- Opt.SelectMode = SEL_MODE_ONCE;
- #endif /* SelectMode_ONCE */
- /* help, verbose & debug options */
- } else if (optname_match("help", opt, 1)) {
- if (first_time)
- do_usage = True;
- } else if (optname_match("quiet", opt, 1)) {
- Verbose = DebugLvl = 0;
- } else if (optname_match("verbose", opt, 1)) {
- Verbose++;
- } else if (optname_match("debug", opt, 2)) {
- Verbose++; DebugLvl++;
- } else if (i >= argc - 1 || !*(argv[i+1])) {
- goto _inv_opt; /* the rest options need an argument */
- /* options with an argument */
- } else if (optname_match("imsoption", opt, 4)) {
- i++;
- Opt.ImsOption = argv[i];
- } else if (optname_match("ims", opt, 2)) {
- i++;
- Opt.ImsName = argv[i];
- } else if (optname_match("display", opt, 2)) {
- i++;
- Opt.DisplayName = argv[i];
- wav[wac++] = argv[i - 1]; wav[wac++] = argv[i]; /* ??? */
- } else if (optname_match("locale", opt, 2)) {
- i++;
- Opt.LocaleName = argv[i];
- } else if (optname_match("CDE_locale", opt, 2)) {
- i++;
- Opt.LocaleName = find_system_locale_name(argv[i]);
- } else if (optname_match("hostname", opt, 2)) {
- i++;
- Opt.HostName = argv[i];
- } else if (optname_match("config", opt, 2)) {
- i++;
- Opt.ConfPath = argv[i];
- } else if (optname_match("file", opt, 2)) {
- i++;
- Opt.UserPath = argv[i];
- } else if (optname_match("log", opt, 2)) {
- i++;
- Opt.LogPath = argv[i];
- } else if (optname_match("resource", opt, 3)) {
- i++;
- Opt.ResourceFile = argv[i];
- } else if (optname_match("shell", opt, 2)) {
- i++;
- Opt.ShellName = argv[i];
- } else if (optname_match("timeout", opt, 3)) {
- i++;
- if (str_to_int(argv[i], &n) && n >= 0)
- Opt.Timeout = n;
- } else if (optname_match("interval", opt, 3)) {
- i++;
- if (str_to_int(argv[i], &n) && n >= 0)
- Opt.Interval = n;
- /* Xt options */
- } else if (optname_match("font", opt, 2)
- || optname_match("fn", opt, 2)
- || optname_match("fg", opt, 2)
- || optname_match("bg", opt, 2)
- || optname_match("bd", opt, 2)
- || optname_match("foreground", opt, 4)
- || optname_match("backgroundg", opt, 4)
- || optname_match("bordercolor", opt, 4)
- || optname_match("geometry", opt, 2)
- || optname_match("title", opt, 2)
- || optname_match("xnlLanguage", opt, 3)
- /* || optname_match("iconic", opt, 4) */
- || optname_match("xrm", opt, 2)) {
- i++;
- wav[wac++] = argv[i - 1]; wav[wac++] = argv[i];
- } else
- goto _inv_opt;
- }
- first_time = False;
- if (do_usage) return NoError;
- switch (OpMode) { /* adjust OpFlag */
- #if 0 /* noy implemented yet */
- case MODE_STYLE:
- SET_FLAG(FLAG_DT | FLAG_WINDOW);
- CLR_FLAG(FLAG_VUE);
- break;
- #endif
- case MODE_START:
- if (Opt.ImsName) {
- SET_FLAG(FLAG_NOSAVE);
- /* CLR_FLAG(USE_WINDOW_MASK); */
- Opt.SelectMode = SEL_MODE_GIVEN;
- }
- if (Opt.LogPath) { /* open log file */
- if (set_errorlog(Opt.LogPath) != NoError)
- Opt.LogPath = NULL;
- }
- if (CHK_FLAG(FLAG_REMOTERUN)) {
- SET_FLAG(FLAG_NOTIFY);
- SET_FLAG(FLAG_NOSAVE);
- CLR_FLAG(USE_WINDOW_MASK);
- }
- break;
- case MODE_MODE:
- if (CHK_FLAG(FLAG_WINDOW)) {
- Opt.SelectMode = SEL_MODE_WIN;
- } else if (Opt.SelectMode == SEL_MODE_NONE) {
- Opt.SelectMode = SEL_MODE_QUERY;
- CLR_FLAG(USE_WINDOW_MASK);
- }
- break;
- case MODE_LISTNAME:
- SET_FLAG(FLAG_WINDOW);
- break;
- default:
- CLR_FLAG(USE_WINDOW_MASK);
- break;
- }
- if (CHK_FLAG(USE_WINDOW_MASK)) {
- /* create argc & argv for window */
- Wargv = ALLOC(wac + 1 + 4, char *); /* spare for '-xnlLanguage' */
- memcpy(Wargv, wav, sizeof(char *) * wac);
- Wargv[0] = ProgramName;
- Wargv[wac] = NULL;
- Wargc = wac;
- } else {
- UseMsgWindow = False; /* disable msg window */
- }
- #undef CLR_FLAG
- #undef SET_FLAG
- #undef CHK_FLAG
- return NoError;
- _inv_opt:
- DPR(("%s: invalid option '%s'\n", ProgramName, argv[i]));
- setErrArg1(argv[i]);
- return ErrSyntax;
- }
- /* ******** usage ******** */
- #ifdef DEBUG
- typedef struct {
- char *name;
- char *desc;
- } OptDesc;
- #if 0
- static OptDesc opts_start[] = {
- { "-env", "print modified environment variables" },
- { "-shell <name>", "override $SHELL" },
- { "-ims <name>", "specifies input method name" },
- { "-imsopt <string>", "specifies command options for input method server" },
- { "-host <name>", "specifies host where input method server should be run" },
- { "-mode", "change input method selection mode" },
- { "-list", "show registered input method" },
- { "-help", "show this message" },
- { NULL, NULL }
- };
- static OptDesc opts_mode[] = {
- { "-auto", "enable auto-selection mode" },
- { "-noauto", "disable auto-selection mode" },
- { NULL, NULL }
- };
- #endif
- static OptDesc opts_internal[] = {
- { "-display <dpy>", "override $DISPLAY" },
- { "-current", "show selected input method" },
- { "-listname", "show registered input method for dtstyle" },
- { "-remoteconf", "print IMS configuration data for remote execution" },
- { "-remoterun", "start IMS as remote execution" },
- { "-nosave", "not save the selection" },
- { "-select", "force select" },
- { "-noenv", "disable printing environment variables" },
- { "-envonly", "-noenv & -nostart" },
- { "-nostart", "not start IMS" },
- { "-noresouce", "not load session resource files" },
- { "-nowait", "immediately exits after IMS invocation" },
- { "-notimeout", "do not timeout" },
- { "-noremote", "disable remote execution" },
- { "-notify", "print error code to stderr" },
- #ifdef SelectMode_ONCE
- { "-once", "auto-selection once selected" },
- #endif /* SelectMode_ONCE */
- { "-dt" , "in CDE environment" },
- { "-window", "use window environment" },
- { "-nowindow", "do not use window environment" },
- { "-timeout <num>", "specifies timeout period (sec.)" },
- { "-interval <num>", "specifies check interval (msec.)" },
- { "-locale <locale>", "override $LANG" },
- { "-CDE_locale <CDE_locale>", "CDE generic locale name" },
- { "-resource <file>", "specifies resource file" },
- { "-config <file>", "specifies configuration file" },
- { "-file <file>", "specifies user selection file" },
- { "-log <file>", "specifies log file" },
- { "-fn <fontlist>", "specifies font" },
- { "-quiet", "print no messages" },
- { "-verbose", "print verbose messages" },
- { "-debug", "print debug messages" },
- { "<Xt options>", "standard X toolkit options" },
- { NULL, NULL }
- };
- #endif /* DEBUG */
- static void usage(int force)
- {
- char *fmt = "\t%-20s%s\n";
- if (!force && Verbose <= 0) return;
- fprintf(LogFp, (CATGETS(catd,NL_SETN,1, "usage: %s [options ..]")),
- ProgramName);
- putc('\n', LogFp);
- if (OpMode != MODE_MODE) {
- fprintf(LogFp, fmt,
- "-env", (CATGETS(catd,NL_SETN,2, "print modified environment variables")));
- fprintf(LogFp, fmt,
- "-shell <name>", (CATGETS(catd,NL_SETN,3, "override $SHELL")));
- fprintf(LogFp, fmt,
- "-ims <name>", (CATGETS(catd,NL_SETN,4, "specifies input method name")));
- fprintf(LogFp, fmt,
- "-imsopt <string>", (CATGETS(catd,NL_SETN,5, "specifies command options for input method server")));
- fprintf(LogFp, fmt,
- "-host <name>", (CATGETS(catd,NL_SETN,6, "specifies host where input method server should be run")));
- fprintf(LogFp, fmt,
- "-mode", (CATGETS(catd,NL_SETN,7, "change input method selection mode")));
- fprintf(LogFp, fmt,
- "-list", (CATGETS(catd,NL_SETN,8, "print registered input method")));
- fprintf(LogFp, fmt,
- "-help", (CATGETS(catd,NL_SETN,9, "show this message")));
- } else {
- fprintf(LogFp, fmt,
- "-auto", (CATGETS(catd,NL_SETN,23, "force 'resume_current_input_method' mode")));
- fprintf(LogFp, fmt,
- "-noauto", (CATGETS(catd,NL_SETN,24, "force 'ask_at_login' mode")));
- }
- #ifdef DEBUG
- if (Verbose > 1) {
- OptDesc *opts;
- fprintf(LogFp, "\n <internal options>\n");
- for (opts = opts_internal; opts->name; opts++)
- fprintf(LogFp, fmt, opts->name, opts->desc);
- }
- #endif
- }
- /* ******** error messages ******** */
- char *xims_errmsg(int err_num, void *arg1, void *arg2, void *arg3)
- {
- char *fmt = NULL, *bp;
- int len;
- static char msgbuf[BUFSIZ];
- switch (err_num) {
- case NoError:
- break;
- case ErrSyntax: /* arg1: option string */
- fmt = (CATGETS(catd,NL_SETN,31, "invalid option '%s'"));
- break;
- case ErrNoHome:
- fmt = (CATGETS(catd,NL_SETN,32, "environment variable 'HOME' not defined"));
- break;
- case ErrNoLocale:
- fmt = (CATGETS(catd,NL_SETN,33, "environment variable 'LANG' not defined"));
- break;
- case ErrNoCDELocale:
- fmt = (CATGETS(catd,NL_SETN,34, "this locale is not supported by the desktop."));
- break;
- case ErrNoDisplay:
- fmt = (CATGETS(catd,NL_SETN,35, "environment variable 'DISPLAY' not defined"));
- break;
- case ErrFileOpen: /* arg1: file name */
- fmt = (CATGETS(catd,NL_SETN,36, "cannot open file\n [%s]"));
- setErrArg1(errFilePath);
- break;
- case ErrFileCreate: /* arg1: file name */
- fmt = (CATGETS(catd,NL_SETN,37, "cannot create file\n [%s]"));
- setErrArg1(errFilePath);
- break;
- case ErrDirCreate: /* arg1: dir name */
- fmt = (CATGETS(catd,NL_SETN,38, "cannot create directory\n [%s]"));
- setErrArg1(errFilePath);
- break;
- case ErrMissEntry: /* arg1: entry name, arg2: file name */
- fmt = (CATGETS(catd,NL_SETN,39, "missing '%s' entry in configuration file\n [%s]"));
- setErrArg2(errFilePath);
- break;
- case ErrAnotherProg:
- fmt = (CATGETS(catd,NL_SETN,40, "another '%s' is already running"));
- setErrArg1(ProgramName);
- break;
- case ErrNoSelectionFile: /* arg1: locale name */
- fmt = (CATGETS(catd,NL_SETN,41, "no selection file for '%s'"));
- setErrArg1(userEnv.locale);
- break;
- case ErrSaveSelection: /* arg1: file name */
- fmt = (CATGETS(catd,NL_SETN,42, "cannot create selection file\n [%s]"));
- setErrArg1(errFilePath);
- break;
- case ErrNoSelection: /* arg1: locale name */
- fmt = (CATGETS(catd,NL_SETN,43, "no ims selected for '%s'"));
- setErrArg1(userEnv.locale);
- break;
- case ErrNoLocaleConf: /* arg1: file name */
- fmt = (CATGETS(catd,NL_SETN,44, "no locale configuration file for '%s'"));
- setErrArg1(userEnv.locale);
- break;
- case ErrNoImsEntry: /* arg1: locale name */
- fmt = (CATGETS(catd,NL_SETN,45, "no ims configured for '%s'"));
- setErrArg1(userEnv.locale);
- break;
- case ErrNoImsConf: /* arg1: ims name */
- fmt = (CATGETS(catd,NL_SETN,46, "no ims configuration file for '%s'"));
- setErrArg1(userSel.name);
- break;
- case ErrNotRegistered: /* arg1: ims name */
- fmt = (CATGETS(catd,NL_SETN,47, "ims '%s' not registered"));
- setErrArg1(userSel.name);
- break;
- case ErrNoExecutable: /* arg1: ims name, arg2: file name */
- fmt = (CATGETS(catd,NL_SETN,48, "no executable file for '%s'\n [%s]"));
- setErrArg1(userSel.name);
- setErrArg2(userSel.ent->ims->cmd_path);
- break;
- case ErrImsRunning: /* arg1: ims name */
- fmt = (CATGETS(catd,NL_SETN,49, "ims '%s' is already running"));
- setErrArg1(userSel.name);
- break;
- case ErrImsExecution: /* arg1: ims name */
- fmt = (CATGETS(catd,NL_SETN,50, "cannot execute ims '%s'"));
- setErrArg1(userSel.name);
- break;
- case ErrImsAborted: /* arg1: ims name, arg2: log file */
- fmt = (CATGETS(catd,NL_SETN,51, "ims '%s' aborted. See log file.\n [%s]"));
- setErrArg1(userSel.name);
- if (userSel.host_type == HOST_REMOTE)
- setErrArg2(errFilePath);
- else
- setErrArg2(Opt.LogPath);
- break;
- case ErrImsTimeout: /* arg1: file name */
- fmt = (CATGETS(catd,NL_SETN,52, "ims '%s' is not available yet"));
- setErrArg1(userSel.name);
- break;
- case ErrUnknownHost: /* arg1: host name */
- fmt = (CATGETS(catd,NL_SETN,53, "unknown host '%s'"));
- setErrArg1(userSel.hostname);
- break;
- case ErrRemoteAction: /* arg1: action name */
- fmt = (CATGETS(catd,NL_SETN,54, "action '%s' failed"));
- setErrArg1(errFuncName);
- break;
- case ErrRemoteData: /* arg1: host name */
- fmt = (CATGETS(catd,NL_SETN,55, "remote execution failed on '%s'"));
- setErrArg1(userSel.hostname);
- break;
- case ErrNoImsstart: /* arg1: host name */
- fmt = (CATGETS(catd,NL_SETN,56, "remote functionality is not available on '%s'"));
- setErrArg1(userSel.hostname);
- break;
- case ErrRemoteNoIms: /* arg1: host name */
- fmt = (CATGETS(catd,NL_SETN,57, "no ims registered on '%s'"));
- setErrArg1(userSel.hostname);
- break;
- case ErrRemoteMissIms: /* arg1: ims name, arg2: host name */
- fmt = (CATGETS(catd,NL_SETN,58, "ims '%1$s' not registered on '%2$s'"));
- setErrArg1(userSel.name);
- setErrArg2(userSel.hostname);
- break;
- case ErrOpenDpy: /* arg1: display name */
- fmt = (CATGETS(catd,NL_SETN,59, "cannot open display '%s'"));
- setErrArg1(userEnv.displayname);
- break;
- #ifdef DEBUG
- case ErrSignaled: /* arg1: signal number */
- fmt = "terminated by signal (signal=%d)";
- setErrArg1(exitSignalNumber);
- break;
- case ErrDisabled: /* arg1: program name, arg2: env name */
- fmt = "ximsstart is disabled ('%s' is set)";
- setErrArg1(ENV_NO_DTIMSSTART);
- break;
- case ErrRemoteIms: /* arg1: ims name, arg2: host name */
- fmt = "cannot execute ims '%s' on '%s'";
- setErrArg1(userSel.name);
- setErrArg2(userSel.hostname);
- break;
- case ErrOpenResource: /* arg1: file name */
- fmt = "cannot open resource file\n [%s]";
- setErrArg1(Opt.ResourceFile);
- break;
- case ErrMemory: /* arg1: function name */
- fmt = "cannot allocate memory in %s()";
- setErrArg1(errFuncName);
- break;
- case ErrIsNone: /* arg1: ims name */
- fmt = "the selected ims is '%s'";
- setErrArg1(userSel.name);
- break;
- case ErrNotRun: /* arg1: ims name */
- fmt = "the selected ims '%s' need not to run";
- setErrArg1(userSel.name);
- break;
- case ErrImsWaiting: /* arg1: ims name */
- fmt = "internal error [ImsWaiting] (ims='%s')";
- setErrArg1(userSel.name);
- break;
- case ErrImsWaitDone: /* arg1: ims name */
- fmt = "internal error [ImsWaitDone] (ims='%s')";
- setErrArg1(userSel.name);
- break;
- case ErrImsConnecting: /* arg1: ims name */
- fmt = "internal error [ImsConnecting] (ims='%s')";
- setErrArg1(userSel.name);
- break;
- case ErrImsConnectDone: /* arg1: ims name */
- fmt = "internal error [ImsConnectDone] (ims='%s')";
- setErrArg1(userSel.name);
- break;
- case ErrInvState: /* arg1: OpStateVal */
- fmt = "internal error [invalid state: '%d']";
- setErrArg1(OpState);
- break;
- case ErrInternal: /* arg1: function name */
- fmt = "internal error in %s()";
- setErrArg1(errFuncName);
- break;
- #endif /* DEBUG */
- }
- if (!fmt) return NULL;
- bp = strcpyx(msgbuf, ProgramName); *bp++ = ':'; *bp++ = ' ';
- if (!arg1) arg1 = ximsErrArgs[0];
- if (!arg2) arg2 = ximsErrArgs[1];
- if (!arg3) arg3 = ximsErrArgs[2];
- sprintf(bp, fmt, arg1, arg2, arg3);
- len = strlen(bp);
- bp[len++] = '\n'; bp[len] = '\0';
- return msgbuf;
- }
|