bool extl_set_userdirs(const char *appname) { const char *home; char *tmp; int fails=2; if(userdir!=NULL) return FALSE; home=getenv("HOME"); if(home==NULL){ extl_warn(TR("$HOME not set")); }else{ libtu_asprintf(&userdir, "%s/.%s", home, appname); if(userdir!=NULL) fails-=extl_add_searchdir(userdir); libtu_asprintf(&tmp, "%s/.%s/lib", home, appname); if(tmp!=NULL){ fails-=extl_add_searchdir(tmp); free(tmp); } } return (fails==0); }
XFontSet de_create_font_kludged(const char *fontname) { XFontSet fs = NULL; #ifndef CF_NO_FONTSET_KLUDGE char *pattern2=NULL; char weight[CF_FONT_ELEMENT_SIZE], slant[CF_FONT_ELEMENT_SIZE]; int pixel_size=0; LOG(DEBUG, FONT, "Doing the fontset_kludge with fontname %s.", fontname); get_font_element(fontname, weight, CF_FONT_ELEMENT_SIZE, "-medium-", "-bold-", "-demibold-", "-regular-", NULL); get_font_element(fontname, slant, CF_FONT_ELEMENT_SIZE, "-r-", "-i-", "-o-", "-ri-", "-ro-", NULL); get_font_size(fontname, &pixel_size); if(!strcmp(weight, "*")) strncpy(weight, "medium", CF_FONT_ELEMENT_SIZE); if(!strcmp(slant, "*")) strncpy(slant, "r", CF_FONT_ELEMENT_SIZE); if(pixel_size<3) pixel_size=3; else if(pixel_size>97) pixel_size=97; if(ioncore_g.enc_utf8){ libtu_asprintf(&pattern2, "%s," "-misc-fixed-%s-%s-*-*-%d-*-*-*-*-*-*-*," "-misc-fixed-*-*-*-*-%d-*-*-*-*-*-*-*", fontname, weight, slant, pixel_size, pixel_size); }else{ libtu_asprintf(&pattern2, "%s," "-*-*-%s-%s-*-*-%d-*-*-*-*-*-*-*," "-*-*-*-*-*-*-%d-*-*-*-*-*-*-*", fontname, weight, slant, pixel_size, pixel_size); } if(pattern2!=NULL){ LOG(DEBUG, FONT, "no_fontset_kludge resulted in fontname %s", pattern2); fs = de_create_font_in_current_locale(pattern2); free(pattern2); } #endif return fs; }
void check_new_user_help() { const char *userdir=extl_userdir(); char *oldbeard=NULL; char *tmp=NULL, *cmd=NULL; bool ret; if(userdir==NULL){ warn(TR("Could not get user configuration file directory.")); return; } libtu_asprintf(&oldbeard, "%s/.welcome_msg_displayed", userdir); if(oldbeard==NULL) return; if(access(oldbeard, F_OK)==0){ free(oldbeard); return; } libtu_asprintf(&tmp, TR("%s/welcome.txt"), SHAREDIR); if(tmp!=NULL){ if(access(tmp, F_OK)==0) libtu_asprintf(&cmd, "%s %s", CF_XMESSAGE, tmp); else libtu_asprintf(&cmd, "%s %s/welcome.txt", CF_XMESSAGE, SHAREDIR); free(tmp); if(cmd!=NULL){ ret=ioncore_exec(cmd); free(cmd); if(ret){ /* This should actually be done when less or xmessage returns, * but that would mean yet another script... */ mkdir(userdir, 0700); if(open(oldbeard, O_CREAT|O_RDWR, 0600)<0) warn_err_obj(oldbeard); } } } free(oldbeard); }
bool extl_set_sessiondir(const char *session) { char *tmp; bool ret=FALSE; if(strchr(session, '/')!=NULL){ tmp=extl_scopy(session); }else if(userdir!=NULL){ libtu_asprintf(&tmp, "%s/%s", userdir, session); }else{ extl_warn(TR("User directory not set. " "Unable to set session directory.")); return FALSE; } if(tmp==NULL) return FALSE; if(sessiondir!=NULL) free(sessiondir); sessiondir=tmp; return TRUE; }
static int do_try(const char *dir, const char *file, ExtlTryConfigFn *tryfn, void *tryfnparam) { char *tmp=NULL; int ret; libtu_asprintf(&tmp, "%s/%s", dir, file); if(tmp==NULL) return EXTL_TRYCONFIG_MEMERROR; ret=tryfn(tmp, tryfnparam); free(tmp); return ret; }
/*EXTL_DOC * Get a file name to save (session) data in. The string \var{basename} * should contain no path or extension components. */ EXTL_EXPORT char *extl_get_savefile(const char *basename) { char *res=NULL; if(sessiondir==NULL) return NULL; if(!ensuredir(sessiondir)){ extl_warn(TR("Unable to create session directory \"%s\"."), sessiondir); return NULL; } libtu_asprintf(&res, "%s/%s." EXTL_EXTENSION, sessiondir, basename); return res; }
int main(int argc, char*argv[]) { const char *cfgfile="cfg_notion"; const char *display=NULL; char *cmd=NULL; int stflags=0; int opt; ErrorLog el; FILE *ef=NULL; char *efnam=NULL; bool may_continue=FALSE; bool noerrorlog=FALSE; char *localedir; libtu_init(argv[0]); #ifdef CF_RELOCATABLE_BIN_LOCATION prefix_set(argv[0], CF_RELOCATABLE_BIN_LOCATION); #endif localedir=prefix_add(LOCALEDIR); if(!ioncore_init(CF_EXECUTABLE, argc, argv, localedir)) return EXIT_FAILURE; if(localedir!=NULL) free(localedir); prefix_wrap_simple(extl_add_searchdir, EXTRABINDIR); /* ion-completefile */ prefix_wrap_simple(extl_add_searchdir, MODULEDIR); prefix_wrap_simple(extl_add_searchdir, ETCDIR); prefix_wrap_simple(extl_add_searchdir, SHAREDIR); prefix_wrap_simple(extl_add_searchdir, LCDIR); extl_set_userdirs(CF_EXECUTABLE); optparser_init(argc, argv, OPTP_MIDLONG, ion_opts); while((opt=optparser_get_opt())){ switch(opt){ case OPT_ID('d'): display=optparser_get_arg(); break; case 'c': cfgfile=optparser_get_arg(); break; case 's': extl_add_searchdir(optparser_get_arg()); break; case OPT_ID('S'): ioncore_g.sm_client_id=optparser_get_arg(); break; case OPT_ID('o'): stflags|=IONCORE_STARTUP_ONEROOT; break; case OPT_ID('s'): extl_set_sessiondir(optparser_get_arg()); break; case OPT_ID('N'): noerrorlog=TRUE; break; case 'h': help(); return EXIT_SUCCESS; case 'V': printf("%s\n", ION_VERSION); return EXIT_SUCCESS; case OPT_ID('a'): printf("%s\n", ioncore_aboutmsg()); return EXIT_SUCCESS; default: warn(TR("Invalid command line.")); help(); return EXIT_FAILURE; } } if(!noerrorlog){ /* We may have to pass the file to xmessage so just using tmpfile() * isn't sufficient. */ libtu_asprintf(&efnam, "%s/ion-%d-startup-errorlog", P_tmpdir, getpid()); if(efnam==NULL){ warn_err(); }else{ ef=fopen(efnam, "wt"); if(ef==NULL){ warn_err_obj(efnam); free(efnam); efnam=NULL; }else{ cloexec_braindamage_fix(fileno(ef)); fprintf(ef, TR("Notion startup error log:\n")); errorlog_begin_file(&el, ef); } } } if(ioncore_startup(display, cfgfile, stflags)) may_continue=TRUE; if(!may_continue) warn(TR("Refusing to start due to encountered errors.")); else check_new_user_help(); if(ef!=NULL){ pid_t pid=-1; if(errorlog_end(&el) && ioncore_g.dpy!=NULL){ fclose(ef); pid=fork(); if(pid==0){ ioncore_setup_display(DefaultScreen(ioncore_g.dpy)); if(!may_continue) XCloseDisplay(ioncore_g.dpy); else close(ioncore_g.conn); libtu_asprintf(&cmd, CF_XMESSAGE " %s", efnam); if(cmd==NULL){ warn_err(); }else if(system(cmd)==-1){ warn_err_obj(cmd); } unlink(efnam); exit(EXIT_SUCCESS); } if(!may_continue && pid>0) waitpid(pid, NULL, 0); }else{ fclose(ef); } if(pid<0) unlink(efnam); free(efnam); } if(!may_continue) return EXIT_FAILURE; ioncore_mainloop(); /* The code should never return here */ return EXIT_SUCCESS; }