%% options copyright owner = Dirk Krause copyright year = 2013-2014 license = bsd %% header #ifdef __cplusplus extern "C" { #endif /** Read dk3print.conf files. @param pc Configuration to set up. @return 1 on success, 0 on error. */ int dk3print_read_config_files(dk3_print_conf_t *pc); #ifdef __cplusplus } #endif %% module #include "dk3all.h" #include "dk3print.h" #include "dk3prcfg.h" $!trace-include /** Print configuration file processor. */ typedef struct { dk3_print_conf_t *pc; /**< Print configuration to set up. */ dk3_printer_t *pr; /**< Current printer to modify. */ dk3_print_host_t *ho; /**< Current host to modify. */ } dk3_print_config_processor_t; /** Keywords used by the module, not localized. */ static dkChar const * const dk3prcfg_nl[] = { $!string-table macro=dkT # # 0: File name of print configuration. # dk3print.conf # # 1: Conversion format. # %u # # 2: Conversion format. # %d # # 3: Conversion format. # %lf $!end }; /** SNMP versions. */ static dkChar const * const dk3prcfg_snmp_versions[] = { $!string-table macro=dkT 1 2c 2p 3 $!end }; /** Keywords for section start. */ static dkChar const * const dk3prcfg_host_or_printer[] = { $!string-table macro=dkT host printer $!end }; /** Keywords for printer configuration lines. */ static dkChar const * const dk3prcfg_printer_keywords[] = { $!string-table macro=dkT # # 0 # alias # # 1 # type # # 2 # host # # 3 # queue # # 4 # port # # 5 # ps # # 6 # ps level # # 7 # default # # 8 # snmp host # # 9 # snmp community # # 10 # snmp version # # 11 # connect timeout # # 12 # send timeout # # 13 # receive timeout # # 14 # orderly release $!end }; /** Keywords to configure print hosts. */ static dkChar const * const dk3prcfg_host_keywords[] = { $!string-table macro=dkT # # 0 # alias # # 1 # encoding # # 2 # connect timeout # # 3 # send timeout # # 4 # receive timeout # # 5 # default $!end }; /** Print queues host types. */ static dkChar const * const dk3print_queue_types[] = { $!string-table macro=dkT socket lpd lprng $!end }; /** Initialize a print configuration processor. @param pr Processor to initialize. @param pc Print configuration to set up. */ static void dk3print_initialize_print_config_processor( dk3_print_config_processor_t *pr, dk3_print_conf_t *pc ) { pr->pc = pc; pr->pr = NULL; pr->ho = NULL; } /** Process configuration line to process current printer or host. @param proc Configuration processor. @param pc Print configuration to set up. @param il Input line to process. @return 1 on succuess, 0 on recoverable errors, -1 on unrecoverable errors. */ static int dk3print_lh_printer_or_host( dk3_print_config_processor_t *proc, dk3_print_conf_t *pc, dkChar *il ) { dkChar *p1; /* Start of value. */ dkChar *p2; /* Finalizing square bracket. */ dkChar *p3; /* Start of input line. */ int back = 0; $? "+ dk3print_lh_printer_or_host" p3 = il; p3++; p3 = dk3str_start(p3, NULL); if(p3) { p1 = dk3str_next(p3, NULL); if(p1) { $? ". p1" p2 = dk3str_chr(p1, dkT(']')); if(p2) { *p2 = dkT('\0'); } else { $? "! p2" /* WARNING: Missing closing bracket! */ dk3app_log_1(pc->app, DK3_LL_WARNING, pc->msg, 27); } switch(dk3str_array_index(dk3prcfg_host_or_printer, p3, 0)) { case 1: { $? ". printer" proc->pr = dk3print_printer_new(pc, p1); if(proc->pr) { back = 1; } else { back = -1; } } break; case 0: { $? ". host" proc->ho = dk3print_host_new(pc, p1); if(proc->ho) { back = 1; } else { back = -1; } } break; default: { $? "! not host or printer \"%s\"", p3 /* ERROR: Not "host" or "printer"! */ dk3app_log_3(pc->app, DK3_LL_ERROR, pc->msg, 28, 29, p3); } break; } } else { $? "! p1" /* ERROR: Printer or host name is missing! */ dk3app_log_1(pc->app, DK3_LL_ERROR, pc->msg, 30); } } $? "- dk3print_lh_printer_or_host %d", back return back; } /** Create a printer alias. @param pc Print configuration to set up. @param pr Current printer. @param vptr Alias name. @return 1 on success, 0 on recoverable, -1 on unrecoverable error. */ static int dk3print_lh_pr_alias( dk3_print_conf_t *pc, dk3_printer_t *pr, dkChar const *vptr ) { dk3_printer_alias_t *al; /* Alias already found. */ int back = -1; $? "+ dk3print_lh_pr_alias" if(vptr) { if(dk3sto_it_find_like(pc->iPrinters, (void *)vptr, 1)) { /* ERROR: Printer name already exists! */ dk3app_log_3(pc->app, DK3_LL_ERROR, pc->msg, 31, 32, vptr); } else { if(dk3sto_it_find_like(pc->iPrintAliases, (void *)vptr, 1)) { /* ERROR: Alias name already exists! */ dk3app_log_3(pc->app, DK3_LL_ERROR, pc->msg, 33, 34, vptr); } else { al = dk3_new_app(dk3_printer_alias_t,1,pc->app); if(al) { al->printer = pr; al->name = dk3str_dup_app(vptr, pc->app); if(al->name) { if(dk3sto_add(pc->sPrintAliases, (void *)al)) { back = 1; } else { dk3print_alias_delete(al); } } else { dk3print_alias_delete(al); } } } } } else { /* ERROR: Argument required! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 35, 36, dk3prcfg_printer_keywords[0] ); } $? "- dk3print_lh_pr_alias %d", back return back; } /** Set print queue type. @param pc Print configuration to set up. @param pr Current printer. @param pqt New print queue type. @return 1 on success, 0 on recoverable, -1 on unrecoverable errors. */ static int dk3print_lh_pr_set_pqt( dk3_print_conf_t *pc, dk3_printer_t *pr, int pqt ) { int back = -1; $? "+ dk3print_lh_pr_set_pqt" switch(pr->t_p) { case DK3_PRINTER_TYPE_NONE: { pr->t_p = pqt; dk3print_set_det(&(pr->det_p), pqt); back = 1; } break; case DK3_PRINTER_TYPE_WINDOWS: { switch(pr->t_s) { case DK3_PRINTER_TYPE_NONE: { pr->t_s = pqt; dk3print_set_det(&(pr->det_s), pqt); back = 1; } break; default: { /* ERROR: Queue type already set up! */ dk3app_log_1(pc->app, DK3_LL_ERROR, pc->msg, 37); } break; } } break; default: { /* ERROR: Queue type already set up! */ dk3app_log_1(pc->app, DK3_LL_ERROR, pc->msg, 37); } break; } $? "- dk3print_lh_pr_set_pqt %d", back return back; } /** Set printer type. @param pc Print configuration to set up. @param pr Current printer. @param vptr New value. @return 1 on success, 0 on recoverable, -1 on unrecoverable error. */ static int dk3print_lh_pr_type( dk3_print_conf_t *pc, dk3_printer_t *pr, dkChar const *vptr ) { int pqt; /* Print queue type. */ int back = -1; $? "+ dk3print_lh_pr_type" if(vptr) { pqt = dk3str_array_index(dk3print_queue_types, vptr, 0); if(-1 < pqt) { pqt = 2 + pqt; back = dk3print_lh_pr_set_pqt(pc, pr, pqt); } else { /* ERROR: Unknown print queue type! */ dk3app_log_3(pc->app, DK3_LL_ERROR, pc->msg, 38, 39, vptr); } } else { /* ERRROR: Argument required! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 35, 36, dk3prcfg_printer_keywords[1] ); } $? "- dk3print_lh_pr_type %d", back return back; } /** Process line containing host details. @param pc Print configuration to modify. @param det Current details structure to modify. @param tp Current printer type. @param name Text to apply. @return 1 on success, 0 on errors. */ static int dk3print_lh_pr_det_host( dk3_print_conf_t *pc, dk3_printer_details_t *det, int tp, dkChar const *name ) { int back = -1; $? "+ dk3print_lh_pr_det_host" switch(tp) { case DK3_PRINTER_TYPE_SOCKET: { if((det->sock).hostname) { /* WARNING: Overwriting configured host name! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 40, 41, (det->sock).hostname ); dk3_release((det->sock).hostname); } (det->sock).hostname = dk3str_dup_app(name, pc->app); if((det->sock).hostname) { back = 1; } } break; case DK3_PRINTER_TYPE_LPD: case DK3_PRINTER_TYPE_LPRNG: { if((det->lprng).hostname) { /* WARNING: Overwriting configured host name! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 40, 41, (det->lprng).hostname ); dk3_release((det->lprng).hostname); } (det->lprng).hostname = dk3str_dup_app(name, pc->app); if((det->lprng).hostname) { back = 1; } } break; } $? "- dk3print_lh_pr_det_host %d", back return back; } /** Set printer host. @param pc Print configuration to set up. @param pr Current printer. @param vptr New value. @return 1 on success, 0 on recoverable, -1 on unrecoverable error. */ static int dk3print_lh_pr_host( dk3_print_conf_t *pc, dk3_printer_t *pr, dkChar const *vptr ) { int back = -1; $? "+ dk3print_lh_pr_host" if(vptr) { switch(pr->t_p) { case DK3_PRINTER_TYPE_WINDOWS: { switch(pr->t_s) { case DK3_PRINTER_TYPE_SOCKET: case DK3_PRINTER_TYPE_LPD: case DK3_PRINTER_TYPE_LPRNG: { back = dk3print_lh_pr_det_host(pc, &(pr->det_s), pr->t_s, vptr); } break; default: { /* ERROR: Option not available for this printer type! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 42, 43, dk3prcfg_printer_keywords[2] ); } break; } } break; case DK3_PRINTER_TYPE_SOCKET: case DK3_PRINTER_TYPE_LPD: case DK3_PRINTER_TYPE_LPRNG: { back = dk3print_lh_pr_det_host(pc, &(pr->det_p), pr->t_p, vptr); } break; default: { /* ERROR: Option not available for this printer type! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 42, 43, dk3prcfg_printer_keywords[2] ); } break; } } else { /* ERROR: Argument required! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 35, 36, dk3prcfg_printer_keywords[2] ); } $? "- dk3print_lh_pr_host %d", back return back; } /** Set print queue entry for current printer. @param pc Print configuration to modify. @param det Details structure for current printer. @param tp Current printer type. @param name Configuration text to apply. @return 1 on success, 0 on error. */ static int dk3print_lh_pr_set_queue( dk3_print_conf_t *pc, dk3_printer_details_t *det, int tp, dkChar const *name ) { int back = -1; $? "+ dk3print_lh_pr_set_queue" switch(tp) { case DK3_PRINTER_TYPE_LPD: case DK3_PRINTER_TYPE_LPRNG: { if((det->lprng).queuename) { /* WARNING: Overriding queue name! */ dk3app_log_3( pc->app, DK3_LL_WARNING, pc->msg, 44, 45, (det->lprng).queuename ); dk3_release((det->lprng).queuename); } (det->lprng).queuename = dk3str_dup_app(name, pc->app); if((det->lprng).queuename) { back = 1; } } break; } $? "- dk3print_lh_pr_set_queue %d", back return back; } /** Set printer queue. @param pc Print configuration to set up. @param pr Current printer. @param vptr New value. @return 1 on success, 0 on recoverable, -1 on unrecoverable error. */ static int dk3print_lh_pr_queue( dk3_print_conf_t *pc, dk3_printer_t *pr, dkChar const *vptr ) { int back = -1; $? "+ dk3print_lh_pr_queue" if(vptr) { switch(pr->t_p) { case DK3_PRINTER_TYPE_WINDOWS: { switch(pr->t_s) { case DK3_PRINTER_TYPE_LPD: case DK3_PRINTER_TYPE_LPRNG: { back = dk3print_lh_pr_set_queue(pc, &(pr->det_s), pr->t_s, vptr); } break; default: { /* ERROR: Option not available for printer type! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 42, 43, dk3prcfg_printer_keywords[3] ); } break; } } break; case DK3_PRINTER_TYPE_LPD: case DK3_PRINTER_TYPE_LPRNG: { back = dk3print_lh_pr_set_queue(pc, &(pr->det_p), pr->t_p, vptr); } break; default: { /* ERROR: Option not available for printer type! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 42, 43, dk3prcfg_printer_keywords[3] ); } break; } } else { /* ERROR: Argument required! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 35, 36, dk3prcfg_printer_keywords[3] ); } $? "- dk3print_lh_pr_queue %d", back return back; } /** Set port number for current printer. @param pc Print configuration to modify. @param det Details structure for current printer. @param tp Current printer type. @param name Configuration text to apply. @return 1 on success, 0 on error. */ static int dk3print_lh_pr_set_port( dk3_print_conf_t *pc, dk3_printer_details_t *det, int tp, dkChar const *name ) { dkChar buf[64]; /* Used to show existing port no. */ int back = -1; int conr = 0; /* Result from conversion. */ unsigned u; /* Temporary conversion result. */ unsigned short us; /* New port number. */ $? "+ dk3print_lh_pr_set_port" switch(tp) { case DK3_PRINTER_TYPE_SOCKET: { $? ". socket" if((det->sock).portno) { /* Warning: Overriding port number! */ #if VERSION_BEFORE_20140716 dk3sf_sprintf3(buf,dkT("%u"),(unsigned)((det->sock).portno)); dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 46, 47, buf); #else conr = dk3ma_um_to_string( buf, DK3_SIZEOF(buf,dkChar), (dk3_um_t)((det->sock).portno) ); if (0 != conr) { dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 46, 47, buf); } #endif } #if VERSION_BEFORE_20140716 if(dk3sf_sscanf3(name, dk3prcfg_nl[1], &u)) #else if (0 != dk3ma_ui_from_string(&u, name, NULL)) #endif { us = (unsigned short)u; #if VERSION_BEFORE_20140809 if(u == (unsigned)us) #else if (u <= (unsigned)(DK3_US_MAX)) #endif { $? ". success" (det->sock).portno = us; back = 1; } else { $? "! overflow" /* ERROR: Numeric overflow! */ dk3app_log_1(pc->app, DK3_LL_ERROR, pc->msg, 48); } } else { $? "! not a number" /* ERROR: Not a number! */ dk3app_log_i3(pc->app, DK3_LL_ERROR, 141, 142, name); } } break; default: { $? "! wrong type %d", tp } break; } $? "- dk3print_lh_pr_set_port %d", back return back; } /** Set printer port. @param pc Print configuration to set up. @param pr Current printer. @param vptr New value. @return 1 on success, 0 on recoverable, -1 on unrecoverable error. */ static int dk3print_lh_pr_port( dk3_print_conf_t *pc, dk3_printer_t *pr, dkChar const *vptr ) { int back = -1; $? "+ dk3print_lh_pr_port" if(vptr) { switch(pr->t_p) { case DK3_PRINTER_TYPE_WINDOWS: { switch(pr->t_s) { case DK3_PRINTER_TYPE_SOCKET: { $? ". socket" back = dk3print_lh_pr_set_port(pc, &(pr->det_s), pr->t_s, vptr); } break; default: { /* ERROR: Option not available for print queue type! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 42, 43, dk3prcfg_printer_keywords[4] ); } break; } } break; case DK3_PRINTER_TYPE_SOCKET: { $? ". primary socket" back = dk3print_lh_pr_set_port(pc, &(pr->det_p), pr->t_p, vptr); } break; default: { /* ERROR: Option not available for print queue type! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 42, 43, dk3prcfg_printer_keywords[4] ); } break; } } else { /* ERROR: Argument required! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 35, 36, dk3prcfg_printer_keywords[4] ); } $? "- dk3print_lh_pr_port %d", back return back; } /** Set printer PS. @param pc Print configuration to set up. @param pr Current printer. @param vptr New value. @return 1 on success, 0 on recoverable, -1 on unrecoverable error. */ static int dk3print_lh_pr_ps( dk3_print_conf_t *pc, dk3_printer_t *pr, dkChar const *vptr ) { int back = -1; $? "+ dk3print_lh_pr_ps" if(vptr) { if(dk3str_is_bool(vptr)) { pr->ps = ((dk3str_is_on(vptr)) ? (pc->defPsl) : (0)); } else { /* ERROR: Not a boolean value! */ dk3app_log_i3(pc->app, DK3_LL_ERROR, 146, 147, vptr); } } else { pr->ps = pc->defPsl; } $? "- dk3print_lh_pr_ps %d", back return back; } /** Set printer PS level. @param pc Print configuration to set up. @param pr Current printer. @param vptr New value. @return 1 on success, 0 on recoverable, -1 on unrecoverable error. */ static int dk3print_lh_pr_psl( dk3_print_conf_t *pc, dk3_printer_t *pr, dkChar const *vptr ) { int back = -1; int i; /* Temporary conversion result. */ $? "+ dk3print_lh_pr_psl" if(vptr) { #if VERSION_BEFORE_20140716 if(dk3sf_sscanf3(vptr,dk3prcfg_nl[2],&i)) #else if (0 != dk3ma_i_from_string(&i, vptr, NULL)) #endif { if((2 <= i) && (3 >= i)) { pr->ps = i; back = 1; } else { /* ERROR: Out of range! */ dk3app_log_3(pc->app, DK3_LL_ERROR, pc->msg, 49, 50, vptr); } } else { /* ERROR: Not a number! */ dk3app_log_i3(pc->app, DK3_LL_ERROR, 141, 142, vptr); } } else { /* ERROR: Value required! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 35, 36, dk3prcfg_printer_keywords[6] ); } $? "- dk3print_lh_pr_psl %d", back return back; } /** Set printer as default. @param pc Print configuration to set up. @param pr Current printer. @param vptr New value. @return 1 on success, 0 on recoverable, -1 on unrecoverable error. */ static int dk3print_lh_pr_default( dk3_print_conf_t *pc, dk3_printer_t *pr, dkChar const *vptr ) { int back = -1; $? "+ dk3print_lh_pr_default" if(vptr) { if(dk3str_is_bool(vptr)) { if(dk3str_is_on(vptr)) { pc->defPrinter = pr; back = 1; } } else { /* ERROR: Not a boolean value! */ dk3app_log_i3(pc->app, DK3_LL_ERROR, 146, 147, vptr); } } else { pc->defPrinter = pr; back = 1; } $? "- dk3print_lh_pr_default %d", back return back; } /** Set SNMP host. @param pc Print configuration to set up. @param pr Current printer. @param vptr New value. @return 1 on success, 0 on recoverable, -1 on unrecoverable error. */ static int dk3print_lh_pr_snmp_host( dk3_print_conf_t *pc, dk3_printer_t *pr, dkChar const *vptr ) { int back = -1; $? "+ dk3print_lh_pr_snmp_host" if(vptr) { if(pr->h_snmp) { /* WARNING: Overwriting SNMP host! */ dk3app_log_3( pc->app, DK3_LL_WARNING, pc->msg, 51, 52, pr->h_snmp ); dk3_release(pr->h_snmp); } pr->h_snmp = dk3str_dup_app(vptr, pc->app); if(pr->h_snmp) { back = 1; } } else { /* ERROR: Value required! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 35, 36, dk3prcfg_printer_keywords[8] ); } $? "- dk3print_lh_pr_snmp_host %d", back return back; } /** Set SNMP community. @param pc Print configuration to set up. @param pr Current printer. @param vptr New value. @return 1 on success, 0 on recoverable, -1 on unrecoverable error. */ static int dk3print_lh_pr_snmp_community( dk3_print_conf_t *pc, dk3_printer_t *pr, dkChar const *vptr ) { int back = -1; $? "+ dk3print_lh_pr_snmp_community" if(vptr) { if(pr->c_snmp) { /* WARNING: Overwriting SNMP community! */ dk3app_log_3( pc->app, DK3_LL_WARNING, pc->msg, 53, 54, pr->c_snmp ); dk3_release(pr->c_snmp); } pr->c_snmp = dk3str_dup_app(vptr, pc->app); if(pr->c_snmp) { back = 1; } } else { /* ERROR: Value required! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 35, 36, dk3prcfg_printer_keywords[9] ); } $? "- dk3print_lh_pr_snmp_community %d", back return back; } /** Set SNMP version. @param pc Print configuration to set up. @param pr Current printer. @param vptr New value. @return 1 on success, 0 on recoverable, -1 on unrecoverable error. */ static int dk3print_lh_pr_snmp_version( dk3_print_conf_t *pc, dk3_printer_t *pr, dkChar const *vptr ) { int back = -1; $? "+ dk3print_lh_pr_snmp_version" if(vptr) { if(DK3_SNMP_VERSION_UNKNOWN != pr->v_snmp) { /* Warning: Overwriting SNMP version! */ dk3app_log_1(pc->app, DK3_LL_WARNING, pc->msg, 55); } switch(dk3str_array_index(dk3prcfg_snmp_versions, vptr, 0)) { case 0: { pr->v_snmp = DK3_SNMP_VERSION_1; back = 1; } break; case 1: { pr->v_snmp = DK3_SNMP_VERSION_2C; back = 1; } break; case 2: { pr->v_snmp = DK3_SNMP_VERSION_2P; back = 1; } break; case 3: { pr->v_snmp = DK3_SNMP_VERSION_3; back = 1; } break; default: { /* ERROR: Unknown SNMP version! */ dk3app_log_3(pc->app, DK3_LL_ERROR, pc->msg, 56, 57, vptr); } break; } } else { /* ERROR: Value required! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 35, 36, dk3prcfg_printer_keywords[10] ); } $? "- dk3print_lh_pr_snmp_version %d", back return back; } /** Set timeout. @param pc Print configuration to set up. @param det Details for current printer. @param tp Current printer type. @param vptr Value text. @param sel Timeout selection (0=connect, 1=send, 2=receive). @return 1 on success, 0 on recoverable, -1 on unrecoverable errors. */ static int dk3print_lh_pr_set_timeout( dk3_print_conf_t *pc, dk3_printer_details_t *det, int tp, dkChar const *vptr, int sel ) { dkChar buf[128]; /* Buffer to show existing value. */ double d = -1.0; /* Temporary conversion result. */ int conr = 0; /* Result from conversion. */ int back = -1; $? "+ dk3print_lh_pr_set_timeout" if(vptr) { #if VERSION_BEFORE_20140716 if(dk3sf_sscanf3(vptr, dk3prcfg_nl[3],&d)) #else if(0 != dk3ma_d_from_string(&d, vptr, NULL)) #endif { if(d < 0.0) { d = -1.0; } switch(tp) { case DK3_PRINTER_TYPE_SOCKET: { switch(sel) { case 2: { if((det->sock).to_r > 0.0) { /* WARNING: Overwriting receive timeout! */ #if VERSION_BEFORE_20140716 dk3sf_sprintf3(buf,dkT("%lg"),(det->sock).to_r); dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 58, 59, buf); #else conr = dk3ma_d_to_string( buf, DK3_SIZEOF(buf,dkChar), (det->sock).to_r ); if (0 != conr) { dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 58, 59, buf); } #endif } (det->sock).to_r = d; back = 1; } break; case 1: { if((det->sock).to_s > 0.0) { /* WARNING: Overwriting send timeout! */ #if VERSION_BEFORE_20140716 dk3sf_sprintf3(buf,dkT("%lg"),(det->sock).to_s); dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 60, 61, buf); #else conr = dk3ma_d_to_string( buf, DK3_SIZEOF(buf,dkChar), (det->sock).to_s ); if (0 != conr) { dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 60, 61, buf); } #endif } (det->sock).to_s = d; back = 1; } break; default: { if((det->sock).to_c > 0.0) { /* WARNING: Overwriting connect timeout! */ #if VERSION_BEFORE_20140716 dk3sf_sprintf3(buf,dkT("%lg"),(det->sock).to_c); dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 62, 63, buf); #else conr = dk3ma_d_to_string( buf, DK3_SIZEOF(buf,dkChar), (det->sock).to_c ); if (0 != conr) { dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 62, 63, buf); } #endif } (det->sock).to_c = d; back = 1; } break; } } break; case DK3_PRINTER_TYPE_LPD: case DK3_PRINTER_TYPE_LPRNG: { switch(sel) { case 2: { if((det->lprng).to_r > 0.0) { /* WARNING: Overwriting receive timeout! */ #if VERSION_BEFORE_20140716 dk3sf_sprintf3(buf,dkT("%lg"),(det->lprng).to_r); dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 58, 59, buf); #else conr = dk3ma_d_to_string( buf, DK3_SIZEOF(buf,dkChar), (det->lprng).to_r ); if (0 != conr) { dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 58, 59, buf); } #endif } (det->lprng).to_r = d; back = 1; } break; case 1: { if((det->lprng).to_s > 0.0) { /* WARNING: Overwriting send timeout! */ #if VERSION_BEFORE_20140716 dk3sf_sprintf3(buf,dkT("%lg"),(det->lprng).to_s); dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 60, 61, buf); #else conr = dk3ma_d_to_string( buf, DK3_SIZEOF(buf,dkChar), (det->lprng).to_s ); if (0 != conr) { dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 60, 61, buf); } #endif } (det->lprng).to_s = d; back = 1; } break; default: { if((det->lprng).to_c > 0.0) { /* WARNING: Overwriting connect timeout! */ #if VERSION_BEFORE_20140716 dk3sf_sprintf3(buf,dkT("%lg"),(det->lprng).to_c); dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 62, 63, buf); #else conr = dk3ma_d_to_string( buf, DK3_SIZEOF(buf,dkChar), (det->lprng).to_c ); if (0 != conr) { dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 62, 63, buf); } #endif } (det->lprng).to_c = d; back = 1; } break; } } break; } } else { /* ERROR: Not a number! */ dk3app_log_i3(pc->app, DK3_LL_ERROR, 141, 142, vptr); } } $? "- dk3print_lh_pr_set_timeout %d", back return back; } /** Set connect timeout. @param pc Print configuration to set up. @param pr Current printer. @param vptr New value. @return 1 on success, 0 on recoverable, -1 on unrecoverable error. */ static int dk3print_lh_pr_connect_timeout( dk3_print_conf_t *pc, dk3_printer_t *pr, dkChar const *vptr ) { int back = -1; $? "+ dk3print_lh_pr_connect_timeout" if(vptr) { switch(pr->t_p) { case DK3_PRINTER_TYPE_WINDOWS: { switch(pr->t_s) { case DK3_PRINTER_TYPE_SOCKET: { back = dk3print_lh_pr_set_timeout(pc,&(pr->det_s),pr->t_s,vptr,0); } break; case DK3_PRINTER_TYPE_LPD: case DK3_PRINTER_TYPE_LPRNG: { back = dk3print_lh_pr_set_timeout(pc,&(pr->det_s),pr->t_s,vptr,0); } break; default: { /* ERROR: Option not available! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 42, 43, dk3prcfg_printer_keywords[11] ); } break; } } break; case DK3_PRINTER_TYPE_SOCKET: { back = dk3print_lh_pr_set_timeout(pc, &(pr->det_p), pr->t_p, vptr, 0); } break; case DK3_PRINTER_TYPE_LPD: case DK3_PRINTER_TYPE_LPRNG: { back = dk3print_lh_pr_set_timeout(pc, &(pr->det_p), pr->t_p, vptr, 0); } break; default: { /* ERROR: Option not available! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 42, 43, dk3prcfg_printer_keywords[11] ); } break; } } else { /* ERROR: Value required! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 35, 36, dk3prcfg_printer_keywords[11] ); } $? "- dk3print_lh_pr_connect_timeout %d", back return back; } /** Set send timeout. @param pc Print configuration to set up. @param pr Current printer. @param vptr New value. @return 1 on success, 0 on recoverable, -1 on unrecoverable error. */ static int dk3print_lh_pr_send_timeout( dk3_print_conf_t *pc, dk3_printer_t *pr, dkChar const *vptr ) { int back = -1; $? "+ dk3print_lh_pr_send_timeout" if(vptr) { switch(pr->t_p) { case DK3_PRINTER_TYPE_WINDOWS: { switch(pr->t_s) { case DK3_PRINTER_TYPE_SOCKET: { back = dk3print_lh_pr_set_timeout(pc,&(pr->det_s),pr->t_s,vptr,1); } break; case DK3_PRINTER_TYPE_LPD: case DK3_PRINTER_TYPE_LPRNG: { back = dk3print_lh_pr_set_timeout(pc,&(pr->det_s),pr->t_s,vptr,1); } break; default: { /* ERROR: Option not available! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 42, 43, dk3prcfg_printer_keywords[12] ); } break; } } break; case DK3_PRINTER_TYPE_SOCKET: { back = dk3print_lh_pr_set_timeout(pc, &(pr->det_p), pr->t_p, vptr, 1); } break; case DK3_PRINTER_TYPE_LPD: case DK3_PRINTER_TYPE_LPRNG: { back = dk3print_lh_pr_set_timeout(pc, &(pr->det_p), pr->t_p, vptr, 1); } break; default: { /* ERROR: Option not available! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 42, 43, dk3prcfg_printer_keywords[12] ); } break; } } else { /* ERROR: Value required! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 35, 36, dk3prcfg_printer_keywords[12] ); } $? "- dk3print_lh_pr_send_timeout %d", back return back; } /** Set receive timeout. @param pc Print configuration to set up. @param pr Current printer. @param vptr New value. @return 1 on success, 0 on recoverable, -1 on unrecoverable error. */ static int dk3print_lh_pr_receive_timeout( dk3_print_conf_t *pc, dk3_printer_t *pr, dkChar const *vptr ) { int back = -1; $? "+ dk3print_lh_pr_receive_timeout" if(vptr) { switch(pr->t_p) { case DK3_PRINTER_TYPE_WINDOWS: { switch(pr->t_s) { case DK3_PRINTER_TYPE_SOCKET: { back = dk3print_lh_pr_set_timeout(pc,&(pr->det_s),pr->t_s,vptr,2); } break; case DK3_PRINTER_TYPE_LPD: case DK3_PRINTER_TYPE_LPRNG: { back = dk3print_lh_pr_set_timeout(pc,&(pr->det_s),pr->t_s,vptr,2); } break; default: { /* ERROR: Option not available! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 42, 43, dk3prcfg_printer_keywords[13] ); } break; } } break; case DK3_PRINTER_TYPE_SOCKET: { back = dk3print_lh_pr_set_timeout(pc, &(pr->det_p), pr->t_p, vptr, 2); } break; case DK3_PRINTER_TYPE_LPD: case DK3_PRINTER_TYPE_LPRNG: { back = dk3print_lh_pr_set_timeout(pc, &(pr->det_p), pr->t_p, vptr, 2); } break; default: { /* ERROR: Option not available! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 42, 43, dk3prcfg_printer_keywords[13] ); } break; } } else { /* ERROR: Value required! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 35, 36, dk3prcfg_printer_keywords[13] ); } $? "- dk3print_lh_pr_receive_timeout %d", back return back; } /** Set orderly release. @param pc Print configuration to set up. @param pr Printer to set up. @param det Details for current printer. @param tp Current printer type. @param vptr Value text. @return 1 on success, 0 on recoverable, -1 on unrecoverable errors. */ static int dk3print_lh_pr_set_orderly_release( dk3_print_conf_t *pc, dk3_printer_t *pr, dk3_printer_details_t *det, int tp, dkChar const *vptr ) { int back = -1; $? "+ dk3print_lh_pr_set_orderly_release" if(DK3_PRINTER_TYPE_SOCKET == tp) { if(vptr) { if(dk3str_is_bool(vptr)) { (det->sock).ordrel = ((dk3str_is_on(vptr)) ? 0x01 : 0x00); back = 1; } else { /* ERROR: Not a boolean! */ dk3app_log_i3(pc->app, DK3_LL_ERROR, 146, 147, vptr); } } else { (det->sock).ordrel = 0x01; back = 1; } } $? "- dk3print_lh_pr_set_orderly_release %d", back return back; } /** Set orderly release. @param pc Print configuration to set up. @param pr Current printer. @param vptr New value. @return 1 on success, 0 on recoverable, -1 on unrecoverable error. */ static int dk3print_lh_pr_orderly_release( dk3_print_conf_t *pc, dk3_printer_t *pr, dkChar const *vptr ) { int back = -1; $? "+ dk3print_lh_pr_orderly_release" switch(pr->t_p) { case DK3_PRINTER_TYPE_WINDOWS: { switch(pr->t_s) { case DK3_PRINTER_TYPE_SOCKET: { back = dk3print_lh_pr_set_orderly_release(pc,pr,&(pr->det_s),pr->t_s,vptr); } break; default: { /* ERROR: Option not available */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 42, 43, dk3prcfg_printer_keywords[14] ); } break; } } break; case DK3_PRINTER_TYPE_SOCKET: { back = dk3print_lh_pr_set_orderly_release(pc,pr,&(pr->det_p),pr->t_p,vptr); } break; default: { /* ERROR: Option not available */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 42, 43, dk3prcfg_printer_keywords[14] ); } break; } $? "- dk3print_lh_pr_orderly_release %d", back return back; } /** Process configuration line for current printer. @param proc Configuration processor. @param pc Print configuration to set up. @param pr Current printer to modify. @param il Input line to process. @return 1 on succuess, 0 on recoverable errors, -1 on unrecoverable errors. */ static int dk3print_lh_printer_line( dk3_print_config_processor_t *proc, dk3_print_conf_t *pc, dk3_printer_t *pr, dkChar *il ) { dkChar *kptr; /* Start of key text. */ dkChar *vptr; /* Start of value text. */ int back = -1; $? "+ dk3print_lh_printer_line" kptr = vptr = NULL; kptr = dk3str_start(il, NULL); if(kptr) { vptr = dk3str_chr(kptr, dkT('=')); if(vptr) { *(vptr++) = dkT('\0'); vptr = dk3str_start(vptr, NULL); } dk3str_normalize(kptr, NULL, dkT(' ')); switch(dk3str_array_index(dk3prcfg_printer_keywords, kptr, 0)) { case 0: { $? ". alias" back = dk3print_lh_pr_alias(pc, pr, vptr); } break; case 1: { $? ". type" back = dk3print_lh_pr_type(pc, pr, vptr); } break; case 2: { $? ". host" back = dk3print_lh_pr_host(pc, pr, vptr); } break; case 3: { $? ". queue" back = dk3print_lh_pr_queue(pc, pr, vptr); } break; case 4: { $? ". port" back = dk3print_lh_pr_port(pc, pr, vptr); } break; case 5: { $? ". ps" back = dk3print_lh_pr_ps(pc, pr, vptr); } break; case 6: { $? ". ps level" back = dk3print_lh_pr_psl(pc, pr, vptr); } break; case 7: { $? ". default" back = dk3print_lh_pr_default(pc, pr, vptr); } break; case 8: { $? ". snmp host" back = dk3print_lh_pr_snmp_host(pc, pr, vptr); } break; case 9: { $? ". snmp community" back = dk3print_lh_pr_snmp_community(pc, pr, vptr); } break; case 10: { $? ". snmp version" back = dk3print_lh_pr_snmp_version(pc, pr, vptr); } break; case 11: { $? ". connect timeout" back = dk3print_lh_pr_connect_timeout(pc, pr, vptr); } break; case 12: { $? ". send timeout" back = dk3print_lh_pr_send_timeout(pc, pr, vptr); } break; case 13: { $? ". receive timeout" back = dk3print_lh_pr_receive_timeout(pc, pr, vptr); } break; case 14: { back = dk3print_lh_pr_orderly_release(pc, pr, vptr); } break; default: { /* ERROR: Unknown keyword! */ dk3app_log_3(pc->app, DK3_LL_ERROR, pc->msg, 64, 65, vptr); } break; } } else { back = 1; } $? "- dk3print_lh_printer_line %d", back return back; } /** Set alias. @param pc Print configuration to set up. @param ho Current host. @param vptr Text containing the value. @return 1 on success, 0 on recoverable, -1 on unrecoverable errors. */ static int dk3print_lh_ho_alias( dk3_print_conf_t *pc, dk3_print_host_t *ho, dkChar const *vptr ) { dk3_print_host_alias_t *al; /* New alias. */ void *ptr; /* Existing alias. */ int back = -1; $? "+ dk3print_lh_ho_alias" if(vptr) { ptr = dk3sto_it_find_like(pc->iPrintHosts, (void *)vptr, 1); if(ptr) { /* ERROR: Print host already exists! */ dk3app_log_3(pc->app, DK3_LL_ERROR, pc->msg, 66, 67, vptr); } else { ptr = dk3sto_it_find_like(pc->iHostAliases, (void *)vptr, 1); if(ptr) { /* ERROR: Host alias already exists! */ dk3app_log_3(pc->app, DK3_LL_ERROR, pc->msg, 68, 69, vptr); } else { al = dk3_new_app(dk3_print_host_alias_t,1,pc->app); if(al) { al->host = ho; al->name = dk3str_dup_app(vptr, pc->app); if(al->name) { if(dk3sto_add(pc->sHostAliases, (void *)al)) { back = 1; } else { dk3print_host_alias_delete(al); } } else { dk3print_host_alias_delete(al); } } } } } else { /* ERROR: Value required! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 35, 36, dk3prcfg_host_keywords[0] ); } $? "- dk3print_lh_ho_alias %d", back return back; } /** Set encoding. @param pc Print configuration to set up. @param ho Current host. @param vptr Text containing the value. @return 1 on success, 0 on recoverable, -1 on unrecoverable errors. */ static int dk3print_lh_ho_encoding( dk3_print_conf_t *pc, dk3_print_host_t *ho, dkChar const *vptr ) { int back = -1; int enc; /* Encoding used on host. */ $? "+ dk3print_lh_ho_encoding" if(vptr) { enc = dk3enc_get_text_encoding_app(vptr, pc->app); if(-1 != enc) { switch(enc) { case DK3_FILE_ENCODING_UTF8: { ho->enc = enc; back = 1; } break; case DK3_FILE_ENCODING_ASCII: { ho->enc = enc; back = 1; } break; default: { /* ERROR: Illegal encoding for LPD protocol! */ dk3app_log_3(pc->app, DK3_LL_ERROR, pc->msg, 70, 71, vptr); } break; } } } else { /* ERROR: Value required! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 35, 36, dk3prcfg_host_keywords[1] ); } $? "- dk3print_lh_ho_encoding %d", back return back; } /** Set timeout. @param pc Print configuration to set up. @param ho Current host. @param vptr Text containing the value. @param sel Timeout type selector (0=connect, 1=send, 2=receive). @return 1 on success, 0 on recoverable, -1 on unrecoverable errors. */ static int dk3print_lh_ho_timeout( dk3_print_conf_t *pc, dk3_print_host_t *ho, dkChar const *vptr, int sel ) { dkChar buf[64]; /* Buffer to show existing value. */ double d; /* Temporary conversion result. */ int conr = 0; /* Conversion result. */ int back = -1; $? "+ dk3print_lh_ho_timeout" if(vptr) { #if VERSION_BEFORE_20140716 if(dk3sf_sscanf3(vptr,dk3prcfg_nl[3],&d)) #else if (0 != dk3ma_d_from_string(&d, vptr, NULL)) #endif { switch(sel) { case 2: { if(-1.0 < ho->to_r) { /* Warning: Overwriting receive timeout! */ #if VERSION_BEFORE_20140716 dk3sf_sprintf3(buf,dkT("%lg"),ho->to_r); dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 58, 59, buf); #else conr = dk3ma_d_to_string( buf, DK3_SIZEOF(buf,dkChar), ho->to_r ); if (0 != conr) { dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 58, 59, buf); } #endif } ho->to_r = d; back = 1; } break; case 1: { if(-1.0 < ho->to_s) { /* Warning: Overwriting send timeout! */ #if VERSION_BEFORE_20140716 dk3sf_sprintf3(buf,dkT("%lg"),ho->to_s); dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 60, 61, buf); #else conr = dk3ma_d_to_string( buf, DK3_SIZEOF(buf,dkChar), ho->to_s ); if (0 != conr) { dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 60, 61, buf); } #endif } ho->to_s = d; back = 1; } break; case 0: { if(-1.0 < ho->to_c) { /* Warning: Overwriting connect timeout! */ #if VERSION_BEFORE_20140716 dk3sf_sprintf3(buf,dkT("%lg"),ho->to_c); dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 62, 63, buf); #else conr = dk3ma_d_to_string( buf, DK3_SIZEOF(buf,dkChar), ho->to_c ); if (0 != conr) { dk3app_log_3(pc->app, DK3_LL_WARNING, pc->msg, 62, 63, buf); } #endif } ho->to_c = d; back = 1; } break; } } else { /* ERROR: Not numeric! */ dk3app_log_i3(pc->app, DK3_LL_ERROR, 141, 142, vptr); } } else { /* ERROR: Value required! */ dk3app_log_3( pc->app, DK3_LL_ERROR, pc->msg, 35, 36, dk3prcfg_host_keywords[2 + sel] ); } $? "- dk3print_lh_ho_timeout %d", back return back; } /** Set default host. @param pc Print configuration to set up. @param ho Current host. @param vptr Text containing the value. @return 1 on success, 0 on recoverable, -1 on unrecoverable errors. */ static int dk3print_lh_ho_default( dk3_print_conf_t *pc, dk3_print_host_t *ho, dkChar const *vptr ) { int back = -1; if(vptr) { if(dk3str_is_bool(vptr)) { if(dk3str_is_on(vptr)) { pc->defHost = ho; back = 1; } } else { /* ERROR: Not a boolean! */ dk3app_log_i3(pc->app, DK3_LL_ERROR, 146, 147, vptr); } } else { pc->defHost = ho; back = 1; } return back; } /** Process configuration line for current host. @param proc Configuration processor. @param pc Print configuration to set up. @param ho Current host. @param il Input line to process. @return 1 on succuess, 0 on recoverable errors, -1 on unrecoverable errors. */ static int dk3print_lh_host_line( dk3_print_config_processor_t *proc, dk3_print_conf_t *pc, dk3_print_host_t *ho, dkChar *il ) { dkChar *kptr; /* Start of key text. */ dkChar *vptr; /* Start of value text. */ int back = -1; $? "+ dk3print_lh_host_line" kptr = vptr = NULL; kptr = dk3str_start(il, NULL); if(kptr) { vptr = dk3str_chr(kptr, dkT('=')); if(vptr) { *(vptr++) = dkT('\0'); vptr = dk3str_start(vptr, NULL); } dk3str_normalize(kptr, NULL, dkT(' ')); switch(dk3str_array_index(dk3prcfg_host_keywords, kptr, 0)) { case 0: { $? ". alias" back = dk3print_lh_ho_alias(pc, ho, vptr); } break; case 1: { $? ". encoding" back = dk3print_lh_ho_encoding(pc, ho, vptr); } break; case 2: { $? ". connect timeout" back = dk3print_lh_ho_timeout(pc, ho, vptr, 0); } break; case 3: { $? ". send timeout" back = dk3print_lh_ho_timeout(pc, ho, vptr, 1); } break; case 4: { $? ". receive timeout" back = dk3print_lh_ho_timeout(pc, ho, vptr, 2); } break; case 5: { back = dk3print_lh_ho_default(pc, ho, vptr); } break; default: { $? "! unknown" /* ERROR: Unknown option! */ dk3app_log_3(pc->app, DK3_LL_ERROR, pc->msg, 64, 65, vptr); } break; } } else { back = 1; } $? "- dk3print_lh_host_line %d", back return back; } /** Handler function to process one configuration line. @param obj Print configuration processor. @param il Input line to process. @return 1 on success, 0 on recoverable error, -1 on unrecoverable error. */ static int dk3print_config_line_handler(void *obj, dkChar *il) { dk3_print_config_processor_t *pr; /* Print conf processor. */ dk3_print_conf_t *pc; /* Configuration to set up. */ dkChar *p1; /* Start of text line. */ int back = 1; $? "+ dk3print_config_line_handler" pr = (dk3_print_config_processor_t *)obj; pc = pr->pc; p1 = dk3str_start(il, NULL); if(p1) { dk3str_delnl(p1); $? ". line \"%s\"", p1 if(dkT('#') != *p1) { $? ". comment line" if(dkT('[') == *p1) { $? ". start printer or host" pr->pr = NULL; pr->ho = NULL; back = dk3print_lh_printer_or_host(pr, pc, p1); } else { $? ". printer or host details" if(pr->pr) { $? ". configure printer" back = dk3print_lh_printer_line(pr, pc, pr->pr, p1); } else { if(pr->ho) { $? ". configure host" back = dk3print_lh_host_line(pr, pc, pr->ho, p1); } else { $? ". no printer or host open" /* WARNING: Line not belonging to printer or host! */ dk3app_log_1(pc->app, DK3_LL_WARNING, pc->msg, 72); } } } } } else { $? ". empty line ok" } $? "- dk3print_config_line_handler %d", back return back; } /** Process one configuration file. @param pc Configuration to set up. @param fn File name to apply to configuration. @return 1 on success, 0 on error. */ static int dk3print_process_one_config_file(dk3_print_conf_t *pc, dkChar const *fn) { dkChar buf[1024]; /* Input line buffer. */ dk3_print_config_processor_t pr; /* Config processor. */ dkChar const *oldsrcname = NULL; /* Old source file. */ unsigned long oldsrcline = 0UL; /* Old source line. */ int se; /* System encoding. */ int de; /* Default encoding. */ int back = 0; $? "+ dk3print_process_one_config_file \"%s\"", fn if(pc->app) { oldsrcname = dk3app_get_source_file(pc->app); oldsrcline = dk3app_get_source_line(pc->app); dk3app_set_source_file(pc->app, fn); dk3app_set_source_line(pc->app, 0UL); se = dk3app_get_encoding(pc->app); de = dk3app_get_input_file_encoding(pc->app); } else { #if DK3_ON_WINDOWS se = dk3enc_get_encoding(NULL); de = DK3_ENCODING_PLAIN; #else se = de = dk3enc_get_encoding(NULL); #endif } dk3print_initialize_print_config_processor(&pr, pc); back = dk3stream_process_filename_lines_app( (void *)(&pr), dk3print_config_line_handler, fn, buf, DK3_SIZEOF(buf,dkChar), se, de, pc->app ); if(pc->app) { dk3app_set_source_file(pc->app, oldsrcname); dk3app_set_source_line(pc->app, oldsrcline); } $? "- dk3print_process_one_config_file %d", back return back; } int dk3print_read_config_files(dk3_print_conf_t *pc) { dk3_search_t *srch; /* Configuration file search results. */ dkChar const *fn; /* Current file name to process. */ int back = 1; $? "+ dk3print_read_config_files" if(pc) { if(pc->app) { srch = dk3app_find_config_file(pc->app, dk3prcfg_nl[0], 0); if(srch) { dk3search_reset(srch); while(NULL != (fn = dk3search_next(srch))) { $? ". fn=\"%s\"", fn if(!dk3print_process_one_config_file(pc, fn)) { back = 0; } } dk3search_close(srch); } } } $? "- dk3print_read_config_files %d", back return back; }