void logger( i4 errnum, i4 arg1, i4 arg2) { char buf[ ER_MAX_LEN ]; #ifdef EX_DEBUG EX_CONTEXT context; if (EXdeclare(ex_handler, &context) != OK) { /* some exception was raised */ Psem( &SIsem ); SIfprintf( stderr,"Error: unexpected exception in logger()..."); Vsem( &SIsem ); EXdelete(); return; } #endif Psem( &SIsem ); if( ERreport( errnum, buf ) == OK ) SIfprintf(stderr, "%s\n", buf); else SIfprintf(stderr, "ERROR %d (%x), %s %d\n", errnum, errnum, arg1, arg2 ); Vsem( &SIsem ); #ifdef EX_DEBUG EXdelete(); #endif if(errnum != E_CS0018_NORMAL_SHUTDOWN) PCexit(FAIL); PCexit(OK); }
/*{ ** Name: main - print the LG/LK shared memory key ** ** Description: ** Used by build and install tools to clean up the LG/LK shared memory. ** ** Inputs: ** None ** ** Outputs: ** ** Returns: ** OK - success ** !OK - failure (CS*() routine failure, segment not mapped, ...) ** ** History: ** 21-nov-1992 (bryanp) ** Created to solve LG/LK memory cleanup problems. ** 15-may-1995 (thoro01) ** Added NO_OPTIM hp8_us5 to file. ** 10-may-1999 (walro03) ** Remove obsolete version string sqs_u42. ** 28-sep-2002 (devjo01) ** Add CXget_context, so NUMA cluster context can be established. */ int main(int argc, char *argv[]) { key_t key; #if defined(conf_BUILD_ARCH_32_64) && defined(BUILD_ARCH32) { char *lp64enabled; /* ** Try to exec the 64-bit version */ NMgtAt("II_LP64_ENABLED", &lp64enabled); if ( (lp64enabled && *lp64enabled) && ( !(STbcompare(lp64enabled, 0, "ON", 0, TRUE)) || !(STbcompare(lp64enabled, 0, "TRUE", 0, TRUE)))) { PCexeclp64(argc, argv); } } #endif /* hybrid */ if ( OK != CXget_context( &argc, argv, CX_NSC_STD_NUMA, NULL, 0 ) ) PCexit(FAIL); if ((key = ME_getkey("lglkdata.mem")) != (key_t)-1) SIprintf("0x%x\n", (i4)key); PCexit(OK); }
void main(int argc, char *argv[]) { char buf[256]; char *bufptr = (char *)buf; int iarg; /* ** Put the program name and its parameters in the buffer. */ STcopy("ntrcpst", bufptr); for (iarg = 1; iarg<argc; iarg++) { STcat(bufptr, " "); STcat(bufptr, argv[iarg]); } /* ** Execute the command. */ if( PCexec_suid(&buf) != OK ) PCexit(FAIL); PCexit(OK); }
int main() { #ifdef LNX #ifndef SIMULATE_PROCESS_SHARED if ( sysconf(_SC_THREAD_PROCESS_SHARED) < 0 ) { if (errno == EINVAL) PCexit( OK ); SIprintf("\n\nIngres build is not compatible with the OS POSIX threading library.\n"); PCexit( FAIL ); } #endif #endif PCexit( OK ); }
void yyerror() { SIfprintf( stderr, ERget( S_ST0410_crs_syntax_error ), yylineno, file_name ); PCexit( FAIL ); }
int main(argc, argv) { MEadvise( ME_INGRES_ALLOC ); SIprintf( "iimerge is for UNIX only!\n"); PCexit( FAIL ); }
/* ** Name: cpres_catch - Catch any exceptions. ** ** Description: ** This routine mirrors the action of EXcatch(). Because ** cpres_mbx_complete() functions in an AST it is not ** possible to use the normal EX routines to trap exceptions. ** In an AST, there may not be a "cs_current" session, and ** the so the EXdeclare() call will ACCVIO, causing the ** server to enter an infinite loop. ** ** This routine is envoked when an ACCIO occurs trying to resume ** a session, it will wind back the thread to the point where ** the exception handler was declared. ** ** Because the Cross Process resume is done via an AST, and is ** thus synchronous, the AST has exclusive access to the static ** variable cpres_context. ** ** For more information on the steps being performed to return ** to the CSCPdeclare() call, see EXcatch(). ** ** Inputs: ** chf$signal_array ** chf$mech_array ** ** Outputs: ** EXDECLARE ** ** Side effects: ** Control returned to point where exception occured. ** ** History: ** 20-aug-2003 (horda03) ** Created. */ static i4 cpres_catch( struct chf$signal_array *sigs, struct chf$mech_array *mechs) { EX_CONTEXT cpres_context; int64 establisher_fp = mechs->chf$q_mch_frame & 0xffffffff; INVO_CONTEXT_BLK *jmpbuf = &cpres_context.iijmpbuf; uint64 invo_value = EX_DECLARE; i4 sts; #if defined(ALPHA) uint64 invo_mask = 0x0FFFCul | ((uint64) 0X03FCul << (BITS_IN(uint64) / 2)); int establishers_handle = lib$get_invo_handle( jmpbuf ); lib$put_invo_registers( establishers_handle, jmpbuf, &invo_mask ); /* Return to CSCPdeclare() call, but EX_DECLARE returned */ sys$goto_unwind(&establishers_handle, jmpbuf+2, &invo_value, 0); #elif defined(IA64) uint64 establishers_handle; i4 gr_mask[4]; i4 fr_mask[4]; i4 msk; i4 k; sts = lib$i64_get_invo_handle(jmpbuf, &establishers_handle); if (!(sts & STS$M_SUCCESS)) /* returns 0 == fail, 1==success */ { /* lib$signal (SS$_DEBUG); */ /* if we carry on after this we'll just get an accvio ... so resignal */ return (SS$_RESIGNAL); } for (k=0; k<4; k++) gr_mask[k] = jmpbuf->libicb$o_gr_valid[k]; fr_mask[0] = jmpbuf->libicb$l_fr_valid; msk = (jmpbuf->libicb$ph_f32_f127) ? 0xFFFFFFFF : 0; for (k=1; k<4; k++) fr_mask[k] = msk; sts = lib$i64_put_invo_registers( establishers_handle, jmpbuf, gr_mask, fr_mask ); /* Return to CSCPdeclare() call, but EX_DECLARE returned */ /* (target_invo, target_pc, new_retval1, new_retval2) */ sys$goto_unwind_64(&establishers_handle, &jmpbuf->libicb$ih_pc, &invo_value, 0); #else #error "cpres_catch:: missing code for this platform" #endif /* Should never reach here */ TRdisplay( "%@ cscpres_catch:: SYS$GOTO_UNWIND failed\n\n"); PCexit( FAIL ); return SS$_RESIGNAL; }
void main(int argc, char *argv[]) { #define MAXBUF 4095 char buf[ MAXBUF+1 ]; int iarg, ibuf, ichr; /* * Put the program name and first parameter in the buffer. */ STprintf(buf, ERx( "dmfjsp relocdb" )); switch(argc) { case 1: break; /* * Append any args from the command line, e.g., * dmfjsp relocdb -new_ckp_location dbname */ default: ibuf = sizeof(ERx("dmfjsp relocdb")) - 1; for (iarg = 1; (iarg < argc) && (ibuf < MAXBUF); iarg++) { buf[ibuf++] = ' '; for (ichr = 0; (argv[iarg][ichr] != '\0') && (ibuf < MAXBUF); ichr++, ibuf++) buf[ibuf] = argv[iarg][ichr]; } buf[ibuf] = '\0'; } /* * Execute the command. */ if( PCexec_suid(&buf) != OK ) PCexit(FAIL); PCexit(OK); }
void main(int argc, char *argv[]) { #define MAXBUF 4095 char buf[ MAXBUF+1 ]; int iarg, ibuf, ichr; /* * Put the program name and first parameter in the buffer. */ STprintf(buf, ERx( "esqlc -cplusplus -extension=cpp" )); switch(argc) { case 1: break; /* * Append any args from the command line, e.g., * esqlc -cplusplus -extension=EXT [files] */ default: ibuf = sizeof(ERx("esqlc -cplusplus -extension=cpp")) - 1; for (iarg = 1; (iarg < argc) && (ibuf < MAXBUF); iarg++) { buf[ibuf++] = ' '; for (ichr = 0; (argv[iarg][ichr] != '\0') && (ibuf < MAXBUF); ichr++, ibuf++) buf[ibuf] = argv[iarg][ichr]; } buf[ibuf] = '\0'; } /* * Execute the command. */ if( execute(buf) != OK ) PCexit(FAIL); PCexit(OK); }
static bool checkArgs (char *arg, i4 argc, char **argv, char *altPath, char * drvMgr) { i4 i; for ( i = 1; i < argc; i++ ) { if ( !STbcompare( arg, 0, argv[i], 0, TRUE ) && !STbcompare( arg, 0, "-p", 0, TRUE ) && i < (argc - 1) ) { i++; STcopy( argv[i], altPath ); return TRUE; } if ( !STbcompare( arg, 0, argv[i], 0, TRUE ) && !STbcompare( arg, 0, "-m", 0, TRUE ) && i < (argc - 1) ) { i++; if ( !STbcompare( MGR_STR_UNIX_ODBC, 0, argv[i], 0, TRUE ) ) { STcopy( argv[i], drvMgr ); return TRUE; } else if ( !STbcompare( MGR_STR_CAI_PT, 0, argv[i], 0, TRUE ) ) { STcopy( argv[i], drvMgr ); return TRUE; } else { display_help(); PCexit(FAIL); } } if ( !STbcompare( arg, 0, argv[i], 0, TRUE ) && !STbcompare ( arg, 0, "-r", 0, TRUE ) ) return TRUE; if ( !STbcompare( arg, 0, argv[i], 0, TRUE ) && !STbcompare ( arg, 0, "-rmpkg", 0, TRUE ) ) return TRUE; if ( !STbcompare( arg, 0, argv[i], 0, TRUE ) && !STbcompare ( arg, 0, "-batch", 0, TRUE ) ) return TRUE; if ( !STbcompare( arg, 0, argv[i], 0, TRUE ) && !STbcompare ( arg, 0, "-h", 0, TRUE ) ) return TRUE; if ( !STbcompare( arg, 0, argv[i], 0, TRUE ) && !STbcompare ( arg, 0, "-help", 0, TRUE ) ) return TRUE; } return FALSE; }
void usage() { SIprintf("Usage: iicvtgcn [ -h | --h | -help | --help ] " \ "[ -v ] [ -c | -u ]\n\n"); SIprintf("-h, --h, -help, --help\tDisplays this help page\n"); SIprintf("-v\t\t\tVerbose - Display detailed output\n"); SIprintf("-c\t\t\tCluster - Convert unclustered to clustered " \ "\n\t\t\t(merge files)\n"); SIprintf("-u\t\t\tUncluster - Convert clustered to unclustered " \ "\n\t\t\t(unmerge files)\n"); PCexit(1); }
void main(int argc, char *argv[]) { char buf[ MAXBUF+1 ]; i4 c; if (argc == 1) PCexit(FAIL); for(;argc > 1 ; --argc) SIfprintf(stdout,"%s ",*++argv); }
i4 main( i4 argc, char **argv ) { i4 arg = 1; MEadvise(ME_INGRES_ALLOC); SIeqinit(); PMinit(); if ( argc > 1 && argv[1][0] == '-' ) { arg++; switch( argv[1][1] ) { case 'v' : verbose = TRUE; break; default : usage( argc >= 1 ? argv[0] : NULL ); PCexit(FAIL); } } if ( arg >= argc ) { usage( argc >= 1 ? argv[0] : NULL ); PCexit(FAIL); } else { analyze( argv[ arg ] ); PCexit(OK); } return(OK); }
void main(int argc, char *argv[]) { char buf[ 4096 ]; LPSTR lpCmdLine; char *startquote; char *endquote; STprintf(buf, ERx( "iiabf abf" )); lpCmdLine = GetCommandLine(); /* ** The current executable could have been invoked with the ** executable name in quotes. If that is the case, skip ** over the quotes before looking for the arguments. */ lpCmdLine = STskipblank( lpCmdLine, STlength(lpCmdLine) ); if ( *lpCmdLine == '"' ) { startquote = lpCmdLine; CMnext( startquote ); if ( (endquote = STindex( startquote, "\"", 0 )) != NULL ) { CMnext( endquote ); lpCmdLine = endquote; } } if ( lpCmdLine = STindex(lpCmdLine, " ", 0) ) STcat(buf, lpCmdLine); if ( execute(buf) != OK ) PCexit(FAIL); PCexit(OK); }
/* ** Name: error ** ** Description: ** Prints an error message to stderr. If two error strings are passed ** to the function, the function will make a win32 api call to obtain ** a detailed error code. ** ** Re-entrancy: ** yes. ** ** Inputs: ** s1 - mandatory error message ** s2 - optional error message(should only be used if a win32 api call ** failed. ** ** Outputs: ** An error message. ** ** Returns: ** To operating system a FAIL return code. ** ** Side effects: ** Causes process to terminate. ** ** History: ** 14-jun-95 (reijo01) ** Created. */ void error(char *s1, char *s2) { DWORD error_code; if (s2) { error_code = GetLastError(); SIfprintf( stderr, "%s: %s %s %d\n", iirundbms, s1, s2, error_code ); } else { SIfprintf( stderr, "%s: %s %s\n", iirundbms, s1, s2 ); } PCexit(FAIL); }
static void yydump( ) { i4 filenum; for (filenum = 0; filenum <= filex; filenum++) { if (filenum < MAX_INCLUDE && file[filenum].yyopen == TRUE) SIfprintf(stderr, E_YAPP00D, file[filenum].name, file[filenum].yylineno, file[filenum].yytext); } SIfprintf(stderr, ERx("\n") ); PCexit( FAIL ); }
void yyinit( void ) { char *name, *value, *map_path; /* zero the line counter */ yylineno = 0; if( rulemap_path == NULL ) { NMloc( FILES, FILENAME, ERx( "default.rfm" ), &loc ); LOcopy( &loc, file_name, &loc ); LOtos( &loc, &map_path ); } else { STcopy( rulemap_path, file_name ); LOfroms( FILENAME, file_name, &loc ); map_path = rulemap_path; } (void) PMmInit( &rulemap ); if( PMmLoad( rulemap, &loc, PMerror ) != OK ) PCexit( FAIL ); /* initiate scan of rule map */ if( PMmScan( rulemap, ERx( ".*" ), &rfm_scan, NULL, &name, &value ) != OK ) { F_ERROR( "Rule file map %s is empty.", map_path ); } /* set up LOCATION of first rule file */ STcopy( value, file_name ); NMloc( FILES, FILENAME, file_name, &loc ); LOcopy( &loc, file_name, &loc ); /* initialize input pointer */ yyp = &dummy; /* open rule file */ if( SIfopen( &loc, ERx( "r" ), SI_TXT, SI_MAX_TXT_REC, &yyin ) != OK && yywrap() ) { ERROR( "No configuration rule files were found." ); } }
/* ** Name: cpres_q_read_io - queue a read I/O on our CP mailbox ** ** Description: ** This subroutine queues an I/O on this process's CPRES mailbox. ** ** Inputs: ** None ** ** Outputs: ** None ** ** Returns: ** void ** ** History: ** Summer, 1992 (bryanp) ** Working on the new portable logging and locking system. ** 18-oct-1993 (rachael) ** Call lib$signal(SS$_DEBUG) only when compiled with xDEBUG flag. ** Modified TRdisplay statement to reflect calling function. ** 04-Apr-2008 (jonj) ** Use EFN to assure thread-safeness rather than defaulting ** to EFN zero. */ static void cpres_q_read_io(void) { i4 vms_status; vms_status = sys$qio(EFN$C_ENF, cpres_mbx_chan, IO$_READVBLK, &cpres_iosb, cpres_mbx_read_complete, (__int64)&cpres_iosb, &cpres_msg_buffer, sizeof(CS_CP_WAKEUP_MSG), 0, 0, 0, 0); if ( vms_status != SS$_NORMAL ) { TRdisplay("cpres_q_read_io QIO failed, status %x\n", vms_status); #ifdef xDEBUG lib$signal(SS$_DEBUG); #endif PCexit(FAIL); } return; }
main( i4 argc, char **argv ) { bool usage = FALSE; STACK_FRAME stack_frame; char *filename = NULL; char buf[ MAX_LOC + 1]; i4 i; stack_frame.prev = NULL; stack_frame.display_mode = TRUE; /* Initialize the Include directory list, make sure the resulting */ /* path is not NULL by calling LOfaddpath with an empty path string */ ihead.next = NULL; ihead.pathloc = &defdir; STcopy(ERx(""), buf); LOfroms(PATH, buf, ihead.pathloc); /* Clear the default path */ /* Process the command line */ for( i = 1; i < argc; i++ ) { char *p; char *v; /* process -C options */ if( STbcompare( argv[ i ], 0, ERx( "-C" ), 0, TRUE ) == 0) { pass_comments = TRUE; continue; } /* process -D options */ if( STbcompare( argv[ i ], 2, ERx( "-D" ), 2, TRUE ) == 0 && STlength( argv[ i ] ) > 2 ) { p = argv[ i ]; CMnext( p ); CMnext( p ); /* Check for a value specified, -Dsymbol=value */ if (NULL == (v = STindex(p, ERx("="), STlength(p)) ) ) v = ERx(""); else CMnext(v); define( p, v, FALSE ); continue; } /* process -H option */ if( STbcompare( argv[ i ], 2, ERx( "-H" ), 2, TRUE ) == 0 && STlength( argv[ i ] ) > 2 ) { p = argv[ i ]; CMnext( p ); CMnext( p ); define( p, ERx(""), TRUE ); continue; } /* process -I option */ if( STbcompare( argv[ i ], 2, ERx( "-I" ), 2, TRUE ) == 0 && STlength( argv[ i ] ) > 2 ) { p = argv[ i ]; CMnext( p ); CMnext( p ); yyadd_path( p ); continue; } if( *argv[ i ] != '-' ) { /* file name must be final argument */ if( i != argc - 1 ) { usage = TRUE; break; } filename = argv[ i ]; } else usage = TRUE; break; } if( usage ) { SIfprintf( stderr, E_YAPP000 ); PCexit( FAIL ); } pp_file( &stack_frame, filename, TRUE ); PCexit( OK ); }
/* ** Name: PCexec_suid - Execute a command as the ingres user. ** ** Description: ** This procedure works with the Ingres service to run the given ** command as the ingres user. It mimicks the "setuid" bit in UNIX. ** ** Inputs: ** cmdbuf - command to execute as the ingres user ** ** Outputs: ** none ** ** Returns: ** OK ** FAIL ** ** Side Effects: ** none ** ** History: ** 08-jan-1998 (somsa01) ** Created. ** 19-feb-1998 (somsa01) ** We need to pass to the service the current working directory ** as well. (Bug #89006) ** 25-feb-1998 (somsa01) ** We now have an input file for the process' stdin which ** runs through the OpenIngres service. ** 19-jun-1998 (somsa01) ** Use SYSTEM_PRODUCT_NAME for the name of the service. ** 10-jul-1998 (kitch01) ** Bug 91362. If user is 'system' run through OpenIngres service ** despite having access to server shared memory 'system' does not ** have required privilege to access semaphores/mutexes. ** 11-jun-1999 (somsa01) ** If the command is a startup command, then it is always run through ** the Ingres service. ** 03-nov-1999 (somsa01) ** A failure from ControlService() should be treated as a severe ** error which should not let us continue. ** 22-jan-2000 (somsa01) ** Return the exit code of the spawned process. Also, if the ** files exist, truncate them. The service name is now keyed off ** of II_INSTALLATION. ** 05-jun-2000 (somsa01) ** The Ingres installation may be started as the SYSTEM account, ** in which the 'ingres' user will not automatically have access ** to the shared memory segments. Therefore, even if the real ** user is 'ingres', check to see if he has access. ** 24-oct-2000 (somsa01) ** Removed the check on shared memory access. Access to the shared ** memory segment does not necessarily mean that the user running ** the process does not need to run the specified process as the ** Ingres owner. Also, generalized the check of the user with ** IDname_service(). ** 18-dec-2000 (somsa01) ** Modified the cases to run the command "as is" without the Ingres ** service. ** 20-mar-2002 (somsa01) ** If all is well, return the exit code of the child process that ** was executed. ** 29-mar-2002 (somsa01) ** Properly return the child process exit code. ** 11-apr-2003 (somsa01) ** While waiting for "pending" to not be set, give some CPU back ** to the OS. ** 29-Jul-2005 (drivi01) ** Allow user to run the command if he/she owns a shared ** segment and ingres is not running as a service. ** 06-Dec-2006 (drivi01) ** Adding support for Vista, Vista requires "Global\" prefix for ** shared objects as well. Replacing calls to GVosvers with ** GVshobj which returns the prefix to shared objects. ** Added PCadjust_SeDebugPrivilege to allow quering of ** System processes. ** 25-Jul-2007 (drivi01) ** On Vista, PCexec_suid is unable to use SE_DEBUG Privilege ** to query process status and retireve its exit code. ** The routine for monitoring a process and retrieving ** its exit code has been moved to Ingres Service. ** 05-Nov-2009 (wanfr01) b122847 ** Don't do a PCsleep unless you are waiting for more input */ STATUS PCexec_suid(char *cmdbuf) { EX_CONTEXT context; SERVICE_STATUS ssServiceStatus; LPSERVICE_STATUS lpssServiceStatus = &ssServiceStatus; struct SETUID setuid; DWORD ProcID; HANDLE SaveStdout; SECURITY_ATTRIBUTES sa; CHAR szRealUserID[25] = ""; CHAR *pszRealUserID = szRealUserID; CHAR szServiceUserID[25] = ""; CHAR *pszServiceUserID = szServiceUserID; DWORD BytesWritten, BytesRead = 0; CHAR *inst_id; CHAR SetuidShmName[64]; CHAR *temp_loc; CHAR InBuf[256], OutBuf[256]; static CHAR SetuidPipeName[32]; CL_ERR_DESC err_code; CHAR ServiceName[255]; DWORD ExitCode = 0; CHAR tchII_INSTALLATION[3]; BOOL SetuidDbCmd = FALSE, ServiceCommand = FALSE; int i, cmdlen; char *ObjectPrefix; u_i4 drType; SC_HANDLE schSCManager, OpIngSvcHandle; BOOL bServiceStarted = FALSE; if (EXdeclare(ex_handler, &context) != OK) { EXdelete(); PCexit(FAIL); } NMgtAt("II_INSTALLATION", &inst_id); STcopy(inst_id, tchII_INSTALLATION); /* ** See if this is a command that MUST be run through the Ingres ** service. */ cmdlen = (i4)STlength(cmdbuf); for (i = 0; ServiceCommands[i] ; i++) { if (STbcompare( cmdbuf, cmdlen, ServiceCommands[i], (i4)STlength(ServiceCommands[i]), FALSE ) == 0) { ServiceCommand = TRUE; break; } } /* ** If the user is the same as the user who started the Ingres ** service, just spawn the command. */ if (!ServiceCommand) { IDname(&pszRealUserID); if (!IDname_service(&pszServiceUserID) && STcompare(pszServiceUserID, pszRealUserID) == 0 && PCisAdmin()) { /* ** Attempt to just execute the command. */ return( PCcmdline( (LOCATION *) NULL, cmdbuf, PC_WAIT, (LOCATION *) NULL, &err_code) ); } else { /* ** If current user is not the same as service user and ingres is not ** running as a service, check if shared memory segment is owned ** by current user, if user has access to shared segment allow him ** to run the command. */ PTR shmem; SIZE_TYPE allocated_pages=0; STATUS status; if((status = MEget_pages(ME_MSHARED_MASK, 1, "lglkdata.mem", &shmem, &allocated_pages, &err_code)) == OK) { STprintf(ServiceName, "%s_Database_%s", SYSTEM_SERVICE_NAME, tchII_INSTALLATION); if ((schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT)) != NULL) { if ((OpIngSvcHandle = OpenService(schSCManager, ServiceName, SERVICE_QUERY_STATUS)) != NULL) { if (QueryServiceStatus(OpIngSvcHandle,lpssServiceStatus)) { if (ssServiceStatus.dwCurrentState != SERVICE_STOPPED) bServiceStarted = TRUE; } } } if (!bServiceStarted) return(PCcmdline( (LOCATION *) NULL, cmdbuf, PC_WAIT, (LOCATION *) NULL, &err_code) ); } } /* ** See if this command is an Ingres command which needs to interact ** with at least one database. */ for (i = 0; validSetuidDbCmds[i] ; i++) { if (STbcompare( cmdbuf, cmdlen, validSetuidDbCmds[i], (i4)STlength(validSetuidDbCmds[i]), FALSE ) == 0) { SetuidDbCmd = TRUE; break; } } /* ** If the user has access to the Ingres shared memory segment, ** just spawn the command provided that it is not in the ** validSetuidDbCmds list. */ if (!SetuidDbCmd) { PTR shmem; SIZE_TYPE allocated_pages=0; STATUS status; if (((status = MEget_pages(ME_MSHARED_MASK, 1, "lglkdata.mem", &shmem, &allocated_pages, &err_code)) == OK) || (status == ME_NO_SUCH_SEGMENT)) { if (status != ME_NO_SUCH_SEGMENT) MEfree_pages(shmem, allocated_pages, &err_code); return( PCcmdline( (LOCATION *) NULL, cmdbuf, PC_WAIT, (LOCATION *) NULL, &err_code) ); } } } /* ** We must run the command through the Ingres service. */ if ( STstrindex(cmdbuf, "-silent", 0, FALSE ) ) SilentMode = TRUE; iimksec(&sa); GVshobj(&ObjectPrefix); STprintf(SetuidShmName, "%s%sSetuidShm", ObjectPrefix, tchII_INSTALLATION); if ( (SetuidShmHandle = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, SetuidShmName)) == NULL ) { error_exit(GetLastError()); return(FAIL); } if ( (SetuidShmPtr = MapViewOfFile(SetuidShmHandle, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, sizeof(struct SETUID_SHM))) == NULL ) { error_exit(GetLastError()); return(FAIL); } /* Set up the information to send to the service. */ STcopy(cmdbuf, setuid.cmdline); GetCurrentDirectory(sizeof(setuid.WorkingDirectory), setuid.WorkingDirectory); NMgtAt("II_TEMPORARY", &temp_loc); drType = GetDriveType(NULL); if (drType == DRIVE_REMOTE) { STcopy(temp_loc, setuid.WorkingDirectory); } SaveStdout = GetStdHandle(STD_OUTPUT_HANDLE); CVla(GetCurrentProcessId(), setuid.ClientProcID); STprintf(SetuidPipeName, "\\\\.\\PIPE\\INGRES\\%s\\SETUID", inst_id); /* Set up the stdout file for the command. */ STprintf(OutfileName, "%s\\%sstdout.tmp", temp_loc, setuid.ClientProcID); if ( (OutFile = CreateFile(OutfileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, &sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE ) { error_exit(GetLastError()); return(FAIL); } /* Set up the stdin file for the command. */ STprintf(InfileName, "%s\\%sstdin.tmp", temp_loc, setuid.ClientProcID); if ( (InFile = CreateFile(InfileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, &sa, CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH, NULL)) == INVALID_HANDLE_VALUE ) { error_exit(GetLastError()); return(FAIL); } /* Wait until the service is ready to process our request. */ while (SetuidShmPtr->pending == TRUE) PCsleep(100); SetuidShmPtr->pending = TRUE; /* Trigger the "setuid" event of the service. */ if ( (schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT)) == NULL) { error_exit(GetLastError()); return(FAIL); } STprintf(ServiceName, "%s_Database_%s", SYSTEM_SERVICE_NAME, tchII_INSTALLATION ); OpIngSvcHandle = OpenService(schSCManager, ServiceName, SERVICE_USER_DEFINED_CONTROL); if (OpIngSvcHandle == NULL) { STprintf(ServiceName, "%s_DBATools_%s", SYSTEM_SERVICE_NAME, tchII_INSTALLATION ); OpIngSvcHandle = OpenService(schSCManager, ServiceName, SERVICE_USER_DEFINED_CONTROL); } if ( OpIngSvcHandle == NULL) { error_exit(GetLastError()); return(FAIL); } if (!ControlService(OpIngSvcHandle, RUN_COMMAND_AS_INGRES, lpssServiceStatus)) { error_exit(GetLastError()); CloseServiceHandle(schSCManager); return(FAIL); } WaitNamedPipe(SetuidPipeName, NMPWAIT_WAIT_FOREVER); /* Send the information to the service. */ if ( (Setuid_Handle = CreateFile(SetuidPipeName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, &sa, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE ) { error_exit(GetLastError()); return(FAIL); } if (!WriteFile(Setuid_Handle, &setuid, sizeof(struct SETUID), &BytesWritten, NULL)) { error_exit(GetLastError()); return(FAIL); } /* ** Retrieve information back from the service, and then ** disconnect from the pipe. */ if (!ReadFile(Setuid_Handle, &setuid, sizeof(struct SETUID), &BytesRead, NULL)) { error_exit(GetLastError()); return(FAIL); } ProcID = setuid.CreatedProcID; SetuidShmPtr->pending = FALSE; UnmapViewOfFile(SetuidShmPtr); SetuidShmPtr = NULL; CloseHandle(SetuidShmHandle); if ( (ProcID != -1) && (ProcID != -2) ) { /* ** Wait for the "spawned" process to exit, reading its output ** from the stdout file. */ for (;;) { if ( ((!ReadFile(OutFile, OutBuf, sizeof(OutBuf), &BytesRead, NULL) || (BytesRead == 0)) && setuid.ExitCode != STILL_ACTIVE )) break; if ( BytesRead && (!WriteFile(SaveStdout, OutBuf, BytesRead, &BytesWritten, NULL)) && setuid.ExitCode != STILL_ACTIVE) break; else if (BytesRead < sizeof(OutBuf)) PCsleep(200); /* ** Currently, the only DBA program which can require ** user input is verifydb. Therefore, when it spits out ** the appropriate messages asking for user input, get ** it from the end user and pass it along to the spawned ** process. */ if ( (STrstrindex(OutBuf, "S_DU04FF_CONTINUE_PROMPT", 0, FALSE) != NULL) || (STrstrindex(OutBuf, "S_DU0300_PROMPT", 0, FALSE) != NULL) ) { SIflush(stdout); MEfill(sizeof(OutBuf), ' ', &OutBuf); MEfill(sizeof(InBuf), ' ', &InBuf); SIgetrec(InBuf, 255, 0); WriteFile(InFile, InBuf, sizeof(OutBuf), &BytesWritten, NULL); } } ExitCode = setuid.ExitCode; CloseHandle(Setuid_Handle); CloseHandle(InFile); DeleteFile(InfileName); CloseHandle(OutFile); DeleteFile(OutfileName); CloseServiceHandle(OpIngSvcHandle); CloseServiceHandle(schSCManager); return(ExitCode); } else { error_exit(GetLastError()); return(FAIL); } }
int main( int argc, char **argv ) { CL_ERR_DESC err; PTR handle; PTR handle1; PTR handle2; PTR addr; STATUS status; int (*int_fcn)(); char *(*str_fcn)(); int int_ret; char *cp_ret; LOCATION srcfile; char srcbuf[MAX_LOC+1]; LOCATION objfile; char objbuf[MAX_LOC+1]; bool pristine; LOCATION modloc; char modbuf[MAX_LOC+1]; LOCATION dlloc; char dlbuf[MAX_LOC+1]; LOCATION errloc; char errbuf[MAX_LOC+1]; LOCATION nameloc; char namebuf[MAX_LOC+1]; char *nameptr; char *parms[2]; i4 flags; STATUS mod2status = OK; /* find the working directory */ NMgtAt( "IIDLDIR", &cp_ret ); if ( cp_ret == NULL || *cp_ret == EOS ) { SIprintf( "%sDLDIR not set\n", SystemVarPrefix ); PCexit( 1 ); } /* save the directory name into a larger buffer for LO */ STcopy( cp_ret, srcbuf ); /* initialize a LOCATION with the directory */ LOfroms( PATH, srcbuf, &srcfile ); /* initialize the object file LOCATION with same directory */ LOcopy( &srcfile, objbuf, &objfile ); LOcopy( &srcfile, modbuf, &modloc ); LOcopy( &srcfile, dlbuf, &dlloc ); LOcopy( &srcfile, errbuf, &errloc ); /* add filenames to LOCATION */ LOfstfile( srcs[0], &srcfile ); LOfstfile( objs[0], &objfile ); LOfstfile( erroutput, &errloc ); /* compile with error */ #ifdef NT_GENERIC parms[0] = "-g"; #else NT_GENERIC parms[0] = "-Zi"; #endif NT_GENERIC parms[1] = NULL; status = UTcompile_ex( &srcfile, &objfile, &errloc, parms, FALSE, &pristine, &err ); if ( status != OK ) { SIprintf( "Compile error test returns: " ); if ( status == UT_CO_FILE ) SIprintf( "\n utcom.def file not found or II_COMPILE_DEF not set\n" ); else if ( status == UT_CO_IN_NOT ) SIprintf( "source file not found.\n" ); else SIprintf( "%d\n", status ); SIprintf( "Contents of error file:\n" ); SIprintf( "------------------------------------------------------\n" ); SIcat( &errloc, stdout ); SIprintf( "------------------------------------------------------\n" ); SIprintf( "\n" ); } else { SIprintf( "Test of compile error returned OK.\n" ); SIprintf( "Contents of error file:\n" ); SIprintf( "------------------------------------------------------\n" ); SIcat( &errloc, stdout ); SIprintf( "------------------------------------------------------\n" ); SIprintf( "\n" ); } /* add filenames to LOCATION */ LOfstfile( srcs[0], &srcfile ); LOfstfile( objs[0], &objfile ); /* do a good compile */ #ifdef NT_GENERIC parms[0] = "-Zi"; #else NT_GENERIC parms[0] = "-g"; #endif NT_GENERIC status = UTcompile_ex( &srcfile, &objfile, NULL, parms, FALSE, &pristine, &err ); if ( status != OK ) { SIprintf( "Error compiling module: %d\n", status ); PCexit( 1 ); } LOfstfile( srcs1[0], &srcfile ); LOfstfile( objs1[0], &objfile ); status = UTcompile( &srcfile, &objfile, NULL, &pristine, &err ); if ( status != OK ) { SIprintf( "Error compiling module1\n" ); PCexit( 1 ); } LOfstfile( srcs2[0], &srcfile ); LOfstfile( objs2[0], &objfile ); mod2status = UTcompile( &srcfile, &objfile, NULL, &pristine, &err ); if ( mod2status != OK ) { SIprintf( "Error compiling module2\n" ); SIprintf( "This is not an error if C++ is not installed.\n" ); SIprintf( "Skipping further processing of this module\n\n" ); } /* link first module into shared library */ if ( DLcreate( NULL, NULL, module, objs, NULL, lookups, &err) != OK ) { SIprintf( "Error creating module\n" ); PCexit( 1 ); } if ( DLcreate_loc( NULL, NULL, module1, objs1, NULL, lookups1, &dlloc, NULL, &errloc, FALSE, NULL, &err) != OK ) { SIprintf( "Error creating module1\n" ); PCexit( 1 ); } SIprintf( "Contents of DLcreate_loc() error file for module1:\n" ); SIprintf( "------------------------------------------------------\n" ); SIcat( &errloc, stdout ); SIprintf( "------------------------------------------------------\n" ); SIprintf( "\n" ); if ( mod2status == OK ) { if ( DLcreate_loc( NULL, NULL, module2, objs2, NULL, lookups2, &dlloc, NULL, &errloc, FALSE, "C++", &err) != OK ) { SIprintf( "Error creating module2\n" ); PCexit( 1 ); } SIprintf( "Contents of DLcreate_loc() error file for module2:\n" ); SIprintf( "------------------------------------------------------\n" ); SIcat( &errloc, stdout ); SIprintf( "------------------------------------------------------\n" ); SIprintf( "\n" ); } STcopy( module1, namebuf ); LOfroms( FILENAME, namebuf, &nameloc ); DLconstructloc( &nameloc, namebuf, &nameloc, &err ); LOtos( &nameloc, &nameptr ); SIprintf( "Full path for %s is \"%s\"\n", module1, nameptr ); LOcopy( &dlloc, namebuf, &nameloc ); LOfstfile( module, &nameloc ); DLconstructloc( &nameloc, namebuf, &nameloc, &err); LOtos( &nameloc, &nameptr ); SIprintf( "Full path for %s is \"%s\"\n", module, nameptr ); /* test an error */ SIprintf( "Testing DLprepare of non-existant module.\n" ); if ( DLprepare((char *)NULL, "XXX", lookups, &handle, &err) == OK ) { SIprintf( "Error: returned success, should be failure.\n" ); PCexit( 1 ); } /* load the modules into the executable */ SIprintf( "Now loading the real modules.\n" ); if ( DLprepare((char *)NULL, module, lookups, &handle, &err) != OK ) { SIprintf( "Error loading module\n" ); PCexit( 1 ); } if ( mod2status == OK && DLprepare((char *)NULL, module2, lookups2, &handle2, &err) != OK ) { SIprintf( "Error loading module2\n" ); PCexit( 1 ); } putenv( "IIDLDIR=XXX" ); flags=0; if ( DLprepare_loc((char *)NULL, module1, lookups1, &dlloc, flags, &handle1, &err) != OK ) { SIprintf( "Error loading module1\n" ); PCexit( 1 ); } /* get the address of a function and test it */ if ( DLbind(handle1, "returns_onehundred", &addr, &err) != OK ) { /* "returns_onehundred" function isn't there */ DLunload( handle, &err ); PCexit( 1 ); } int_fcn = (int (*)()) addr; int_ret = (*int_fcn)(); SIprintf( "\"returns_onehundred\" returns %d\n", int_ret ); if ( int_ret != 100 ) { /* function didn't correctly return 100 */ PCexit( 1 ); } if ( mod2status == OK ) { if ( DLbind(handle2, "returns_ninetynine", &addr, &err) != OK ) { SIprintf( "Error binding \"returns_ninetynine\"\n" ); /* "returns_ninetynine" function isn't there */ DLunload( handle2, &err ); PCexit( 1 ); } int_fcn = (int (*)()) addr; int_ret = (*int_fcn)(); SIprintf( "\"returns_ninetynine\" returns %d\n", int_ret ); if ( int_ret != 99 ) { /* function didn't correctly return 99 */ PCexit( 1 ); } } if ( DLbind(handle, "returns_one", &addr, &err) != OK ) { /* "returns_one" function isn't there */ DLunload( handle, &err ); PCexit( 1 ); } int_fcn = (int (*)()) addr; int_ret = (*int_fcn)(); SIprintf( "\"returns_one\" returns %d\n", int_ret ); if ( int_ret != 1 ) { /* function didn't correctly return 1 */ PCexit( 1 ); } if ( DLbind(handle, "returns_zero", &addr, &err) != OK ) { /* "returns_zero" function isn't there */ DLunload( handle, &err ); PCexit( 1 ); } int_fcn = (int (*)()) addr; int_ret = (*int_fcn)(); SIprintf( "\"returns_zero\" returns %d\n", int_ret ); if ( int_ret != 0 ) { /* function didn't correctly return 0 */ PCexit( 1 ); } if ( DLbind(handle, "returns_minus_one", &addr, &err) != OK ) { /* "returns_minus_one" function isn't there */ DLunload( handle, &err ); PCexit( 1 ); } int_fcn = (int (*)()) addr; int_ret = (*int_fcn)(); SIprintf( "\"returns_minus_one\" returns %d\n", int_ret ); if ( int_ret != -1 ) { /* function didn't correctly return -1 */ PCexit( 1 ); } if ( DLbind(handle, "returns_string", &addr, &err) != OK ) { /* "returns_string" function isn't there */ DLunload( handle, &err ); PCexit( 1 ); } str_fcn = (char *(*)()) addr; cp_ret = (*str_fcn)(); SIprintf( "\"returns_string\" returns \"%s\"\n", cp_ret ); if ( STcompare(cp_ret, "String") != OK ) { /* function didn't correctly return "String" */ PCexit( 1 ); } /* functions were called successfully, now unload the modules */ if ( DLunload( handle, &err ) != OK ) { SIprintf( "Error unloading module.\n" ); PCexit( 1 ); } if ( DLunload( handle1, &err ) != OK ) { SIprintf( "Error unloading module.\n" ); PCexit( 1 ); } if ( mod2status == OK && DLunload( handle2, &err ) != OK ) { SIprintf( "Error unloading module2.\n" ); PCexit( 1 ); } if ( DLdelete_loc( module1, &dlloc, &err ) != OK ) { SIprintf( "Error deleting module1.\n" ); PCexit( 1 ); } SIprintf( "Successfully executed.\n" ); PCexit( 0 ); }
/* ** Name: GClanman_init ** Description: ** LANMAN inititialization function. This routine is called from ** GCpinit() -- the routine GCC calls to initialize protocol drivers. ** ** This function does initialization specific to the protocol: ** Creates Events and Mutex's for the protocol ** Finds and saves a pointer to it's input event Q. ** Fires up the thread which will do asynch I/O ** History: ** 11-Nov-93 (edg) ** created. ** 15-jul-95 (emmag) ** Use a NULL Discretionary Access Control List (DACL) for ** security, to give implicit access to everyone. ** 23-Feb-1998 (thaal01) ** Make space for port_id, stops gcc crashing on startup, sometimes. ** 13-may-2004 (somsa01) ** Updated config.dat string used to retrieve port information such ** that we do not rely specifically on the GCC port. ** 06-Aug-2009 (Bruce Lunsford) Sir 122426 ** Change arglist pointer in _beginthreadex for async_thread from ** uninitialized "dummy" to NULL to eliminate compiler warning ** and possible startup problem. */ STATUS GClanman_init(GCC_PCE * pptr) { char *ptr, *host, *server_id, *port_id; char config_string[256]; char buffer[MAX_COMPUTERNAME_LENGTH + 1]; int real_name_size = MAX_COMPUTERNAME_LENGTH + 1; i4 i; int tid; HANDLE hThread; int status; SECURITY_ATTRIBUTES sa; char port_id_buf[8]; port_id = port_id_buf; iimksec (&sa); /* ** Look for trace variable. */ NMgtAt( "II_LANMAN_TRACE", &ptr ); if ( !(ptr && *ptr) && PMget("!.lanman_trace_level", &ptr) != OK ) { GCLANMAN_trace = 0; } else { GCLANMAN_trace = atoi( ptr ); } /* ** Create MUTEX and EVENT for the input queue of this protocol ** driver. */ if ( ( hMutexThreadInQ = CreateMutex(&sa, FALSE, NULL) ) == NULL ) { return FAIL; } GCTRACE(3)( "GClanman_init: MutexInQ Handle = %d\n", hMutexThreadInQ ); if ( ( hEventThreadInQ = CreateEvent(&sa, FALSE, FALSE, NULL)) == NULL ) { CloseHandle( hMutexThreadInQ ); return FAIL; } GCTRACE(3)( "GClanman_init: EventInQ Handle = %d\n", hEventThreadInQ ); GCTRACE(4)( "Start GClanman_init\n" ); /* ** Get set up for the PMget call. */ PMinit(); if( PMload( NULL, (PM_ERR_FUNC *)NULL ) != OK ) PCexit( FAIL ); /* ** Construct the network port identifier. */ host = PMhost(); server_id = PMgetDefault(3); if (!server_id) server_id = "*" ; STprintf( config_string, ERx("!.lanman.port"), SystemCfgPrefix, host, server_id); /* ** Search config.dat for a match on the string we just built. ** If we don't find it, then use the value for II_INSTALLATION ** failing that, default to II. */ PMget( config_string, &port_id ); if (port_id == NULL ) { NMgtAt("II_INSTALLATION", &ptr); if (ptr != NULL && *ptr != '\0') { STcopy(ptr, port_id); } else { STcopy(SystemVarPrefix, port_id); } } NMgtAt( "II_NETBIOS_NODE", &ptr ); if ( !ptr || !*ptr ) { /* ** Get Computer Name into buffer. */ *buffer = (char)NULL; GetComputerName( buffer, &real_name_size ); if ( !*buffer ) STcopy( "NONAME", buffer ); ptr = buffer; } /* ** MyName holds ID for outgoing connections. */ STpolycat( 2, ptr, "_", MyName ); /* ** Create listen port ID. */ STpolycat( 3, ptr, "_", port_id, GCc_listen_port ); CVupper( MyName ); CVupper( GCc_listen_port ); STcopy( GCc_listen_port, pptr->pce_port ); GCTRACE(2)("GClanman_init: port = %s\n", pptr->pce_port ); /* ** Go thru the the protocol threads event list and find the index ** of the lanman thread. Set the Global Tptr for easy reference ** to the event q's for this protocols thread. */ for ( i = 0; i < IIGCc_proto_threads.no_threads; i++ ) { THREAD_EVENTS *p = &IIGCc_proto_threads.thread[i]; if ( !STcompare( LANMAN_ID, p->thread_name ) ) { Tptr = p; break; } } if ( Tptr == NULL ) { CloseHandle( hEventThreadInQ ); CloseHandle( hMutexThreadInQ ); return FAIL; } /* ** Finally we start the asynchronous I/O thread */ hThread = (HANDLE)_beginthreadex(&sa, GC_STACK_SIZE, (LPTHREAD_START_ROUTINE) GClanman_async_thread, NULL, (unsigned long)NULL, &tid); if (hThread) { CloseHandle(hThread); } else { status = errno; GCTRACE(1)("GClanman_init: Couldn't create thread errno = %d '%s'\n", status, strerror(status) ); return FAIL; } return OK; }
int main(int argc, char *argv[]) { #define MAXBUF 4095 char buf[ MAXBUF+1 ]; int iarg, ibuf, ichr; bool debug = FALSE; CL_ERR_DESC err_code; char *p1 = NULL; char pid[MAXBUF]; char *database = ERx(""); char *user = ERx(""); char *xmlfile = ERx(""); char sql_fname[LO_NM_LEN + 1]; char *work_dir = NULL; char directory[MAX_LOC + 1]; char *tmp_dir = NULL; char tmp_buf[MAX_LOC + 1]; char subdir_buf[MAX_LOC + 1]; char sql_loc_buf[MAX_LOC + 1]; char *progname; LOCATION tmp_dir_loc; LOCATION tmp_subdir_loc; LOCATION tmp_buff_loc; LOCATION curr_loc; LOCATION sql_file_loc; char *password = ERx(""); char *groupid = ERx(""); ARGRET rarg; i4 pos; LOCATION xmlfile_loc; FILE *xmlfile_read; STATUS stat = FAIL; char dbuf[256]; char encode[32]; u_i4 tmppid; TM_STAMP tm_stamp; /* Tell EX this is an ingres tool. */ (void) EXsetclient(EX_INGRES_TOOL); /* Call IIUGinit to initialize character set attribute table */ if ( IIUGinit() != OK) PCexit(FAIL); progname = ERget(F_XM0006_IMPXML); FEcopyright(progname, ERx("2001")); /* ** Get arguments from command line */ /* required parameters */ if (FEutaopen(argc, argv, ERx("xmlimport")) != OK) PCexit(FAIL); /* database name is required */ if (FEutaget(ERx("database"), 0, FARG_PROMPT, &rarg, &pos) != OK) PCexit(FAIL); database = rarg.dat.name; if (FEutaget(ERx("xmlfile"), 0, FARG_PROMPT, &rarg, &pos) != OK) PCexit(FAIL); xmlfile = rarg.dat.name; if (FEutaget(ERx("user"), 0, FARG_FAIL, &rarg, &pos) == OK) user = rarg.dat.name; if (FEutaget(ERx("password"), 0, FARG_FAIL, &rarg, &pos) == OK) { char *IIUIpassword(); if ((password = IIUIpassword(ERx("-P"))) == NULL) { FEutaerr(BADARG, 1, ERx("")); PCexit(FAIL); } } if (FEutaget(ERx("groupid"), 0, FARG_FAIL, &rarg, &pos) == OK) groupid = rarg.dat.name; if (FEutaget(ERx("debug"), 0, FARG_FAIL, &rarg, &pos) == OK) debug = TRUE; ibuf = STlength(buf); /* b121678: pid is no longer based on process id, but it's ** a random number instead. */ PCpid(&tmppid); TMget_stamp(&tm_stamp); MHsrand2(tmppid * tm_stamp.tms_usec); STprintf(pid, "%x", MHrand2()); #ifdef xDEBUG SIprintf(" the pid is: %s \n", pid); #endif /* create the sql file */ /* Avoid a name like "foo.xml.sql" on VMS, use pid.sql instead */ STcopy(pid, sql_fname); STcat(sql_fname, ".sql"); /* ** create in the temp location a directory ** with the name pid. set this directory ** as the working directory for impxml */ NMloc (TEMP, PATH, NULL, &tmp_dir_loc); /* make a location for TMP loc */ /* print location name */ LOcopy (&tmp_dir_loc, tmp_buf, &tmp_buff_loc); LOtos (&tmp_buff_loc, &tmp_dir); #ifdef xDEBUG SIprintf ("temploc: %s \n", tmp_dir); #endif /* make a subdir location with filename, pid */ STcopy (pid, subdir_buf); /* Initialize result loc so that everyone is happy */ LOcopy (&tmp_dir_loc, sql_loc_buf, &sql_file_loc); /* Generate location for temp subdirectory */ if (LOfaddpath (&tmp_dir_loc, subdir_buf, &sql_file_loc) != OK) { IIUGerr(E_XM0007_Locname_Failed, UG_ERR_FATAL, 2, tmp_dir, subdir_buf); /* NOTREACHED */ } /* print the location name */ LOcopy (&sql_file_loc, tmp_buf, &tmp_buff_loc); LOtos (&tmp_buff_loc, &work_dir); #ifdef xDEBUG SIprintf ("work dir loc: %s \n", work_dir); #endif /* create the subdir */ if (LOcreate (&sql_file_loc) != OK) { IIUGerr(E_XM0008_Create_Temp_Dir, UG_ERR_ERROR, 1, work_dir); PCexit(FAIL); } STcopy(work_dir, directory); #ifdef xDEBUG SIprintf ("sql file name: %s \n", sql_fname); SIprintf ("xml file name: %s \n", xmlfile); #endif /* Execute the command impxml */ STprintf (buf, ERx( "impxml -d=\"%s\" -o=\"%s\" " ), directory, sql_fname); /* encoding? */ if ( (LOfroms(PATH & FILENAME, xmlfile, &xmlfile_loc) != OK) || (SIopen(&xmlfile_loc, "r", &xmlfile_read) != OK) || (xmlfile_read == NULL) ) { IIUGerr(E_XM0009_Cannot_Open_File, UG_ERR_ERROR, 1, xmlfile); PCexit(FAIL); } /* scan XML declaration for encoding, if any */ if (stat = SIgetrec(dbuf, sizeof(dbuf) - 1, xmlfile_read) == OK) { char *d = dbuf; i4 i = 0; for (d = dbuf; d != (dbuf + sizeof(dbuf)); d++) { if (MEcmp(d, ERx("encoding="), sizeof(ERx("encoding=")) - 1) == 0) { d += sizeof(ERx("encoding=")); while (MEcmp (d, "\'", sizeof(char)) && MEcmp(d, "\"", sizeof(char))) MEcopy(d++, sizeof(char), &encode[i++]); encode[i++] = MIN_CHAR; encode[i] = EOS; STcat(buf, ERx("-x=")); STcat(buf, encode); break; } } } else if (stat != ENDFILE) { /* unable to read file, report error */ IIUGerr(E_XM000A_Cannot_Read_File, UG_ERR_ERROR, 1, xmlfile); PCexit(FAIL); } stat = SIclose(xmlfile_read); STcat(buf, xmlfile); #ifdef xDEBUG SIprintf ( " query send: %s \n", buf); #endif /* Execute the command. */ if( PCcmdline((LOCATION *) NULL, buf, PC_WAIT, (LOCATION *)NULL, &err_code) != OK ) { if (!debug) LOdelete(&sql_file_loc); PCexit(FAIL); } /* ** we should run the sql script ** sql dbname < new_filename */ /* save the current location */ LOcopy(&sql_file_loc, tmp_buf, &curr_loc); /* make a full location path to the location first */ LOfroms(FILENAME, sql_fname, &tmp_buff_loc); LOstfile(&tmp_buff_loc, &curr_loc); LOcopy (&curr_loc, tmp_buf, &tmp_buff_loc); LOtos (&tmp_buff_loc, &tmp_dir); #ifdef xDEBUG SIprintf ("sql file is: %s \n", tmp_dir); #endif /* No space between < and input file for VMS */ STprintf(buf, ERx( "sql -s %s %s %s %s <%s" ), database, user, password, groupid, tmp_dir); #ifdef xDEBUG SIprintf (" query send: %s \n", buf); #endif /* ** Execute the command. */ if( PCcmdline((LOCATION *) NULL, buf, PC_WAIT, (LOCATION *)NULL, &err_code) != OK ) { if (!debug) LOdelete(&sql_file_loc); PCexit(FAIL); } /* ** Delete the location */ if (!debug) LOdelete(&sql_file_loc); PCexit(OK); }
i4 main (int argc, char **argv) { STATUS status=OK; PTR drvH=NULL; char **list=NULL; ATTR_ID **attrList=NULL; char **defAttr=NULL; i4 count=0, attrCount = 0, retcount; i4 i; bool badCmdLine = FALSE, rmPkg = FALSE, has_default = FALSE, has_alt = FALSE, isReadOnly = FALSE, mgrSpecified = FALSE, batch = FALSE, def_or_alt=FALSE; i4 pathType = OCFG_SYS_PATH; char altPath[OCFG_MAX_STRLEN] = "\0"; char drvMgr[OCFG_MAX_STRLEN] = "\0"; char line[MAXLINE],prompt[MAXLINE]; char driverPath[OCFG_MAX_STRLEN]; char *dirPath; char driverName[OCFG_MAX_STRLEN]; char *ii_installation; char *p = NULL; char custName[OCFG_MAX_STRLEN]; char etxt[512]; ATTR_ID driverList[6] = { { DRV_ATTR_DRIVER, "\0" }, { DRV_ATTR_DRIVER_ODBC_VER, DRV_STR_VERSION }, { DRV_ATTR_DRIVER_READONLY, DRV_STR_N }, { DRV_ATTR_DRIVER_TYPE, DRV_STR_INGRES }, { DRV_ATTR_VENDOR, DRV_STR_INGRES_CORP }, { DRV_ATTR_DONT_DLCLOSE, DRV_STR_ONE } }; int drvCount = sizeof(driverList) / sizeof(driverList[0]); ATTR_ID **drvList = (ATTR_ID **)MEreqmem( (u_i2) 0, (u_i4)drvCount, TRUE, (STATUS *) NULL); for (i = 0; i < drvCount; i++) { drvList[i] = (ATTR_ID *)MEreqmem( (u_i2) 0, (u_i4)sizeof(ATTR_ID), TRUE, (STATUS *) NULL); drvList[i]->id = driverList[i].id; drvList[i]->value = (char *)MEreqmem( (u_i2) 0, (u_i4)OCFG_MAX_STRLEN, TRUE, (STATUS *) NULL); STcopy(driverList[i].value, drvList[i]->value); } if ( argc > 7 ) badCmdLine = TRUE; /* ** Parse the command line. Reject invalid arguments. */ if ( !badCmdLine && argc > 1 ) { if (checkArgs("-h", argc, argv, NULL, NULL ) ) { display_help(); PCexit(0); } if (checkArgs("-help", argc, argv, NULL, NULL ) ) { display_help(); PCexit(0); } if ( checkArgs("-batch", argc, argv, NULL, NULL ) ) batch = TRUE; if ( checkArgs("-rmpkg", argc, argv, NULL, NULL ) ) rmPkg = TRUE; if (checkArgs("-r", argc, argv, NULL, NULL ) ) isReadOnly = TRUE; if ( checkArgs("-p", argc, argv, altPath, NULL ) ) pathType = OCFG_ALT_PATH; if ( checkArgs("-m", argc, argv, NULL, drvMgr ) ) mgrSpecified = TRUE; } /* ** Set driver manager according to user input. Default is unixODBC. */ if (mgrSpecified && !STbcompare( drvMgr, 0, MGR_STR_CAI_PT, 0, TRUE ) ) driverManager = MGR_VALUE_CAI_PT; else driverManager = MGR_VALUE_UNIX_ODBC; /* ** If none of the arguments are recognized, flag an error. */ if ( !batch && !rmPkg && !isReadOnly && pathType != OCFG_ALT_PATH && !mgrSpecified && argc > 1) badCmdLine = TRUE; if ( badCmdLine ) { display_help(); PCexit(FAIL); } if ( isReadOnly ) STcopy(DRV_STR_Y, drvList[2]->value); else STcopy(DRV_STR_N, drvList[2]->value); if ( !writeMgrFile( altPath ) ) { SIprintf("Aborting due to error writing %s/files/%s\n", SYSTEM_LOCATION_SUBDIRECTORY, MGR_STR_FILE_NAME); PCexit(FAIL); } defAttr = getDefaultInfo(); if (defAttr == NULL) { SIprintf("Aborting due to error reading %s/install/%s\n", SYSTEM_LOCATION_VARIABLE, INFO_STR_FILE_NAME); PCexit(FAIL); } /* ** Get the path of the driver library and create the path/libname string. */ NMgtAt(SYSTEM_LOCATION_VARIABLE,&dirPath); /* usually II_SYSTEM */ if (dirPath != NULL && *dirPath) STlcopy(dirPath,driverPath,sizeof(driverPath)-20-1); else { SIprintf("Error--%s is not defined\n",SYSTEM_LOCATION_VARIABLE); PCexit(FAIL); } # ifdef VMS STcat(driverPath,"["); STcat(driverPath,SYSTEM_LOCATION_SUBDIRECTORY); /* usually "ingres" */ STcat(driverPath,".library]"); if ( isReadOnly ) STcat(driverPath,defAttr[INFO_ATTR_RONLY_DRV_FNAME]); else STcat(driverPath,defAttr[INFO_ATTR_DRIVER_FILE_NAME]); # else STcat(driverPath,"/"); STcat(driverPath,SYSTEM_LOCATION_SUBDIRECTORY); /* usually "ingres" */ STcat(driverPath,"/lib/"); if ( isReadOnly ) STcat(driverPath,defAttr[INFO_ATTR_RONLY_DRV_FNAME]); else STcat(driverPath,defAttr[INFO_ATTR_DRIVER_FILE_NAME]); # endif /* ifdef VMS */ STcopy(driverPath,drvList[0]->value); /* ** Initialize the cache from the odbcinst.ini file. */ openConfig(NULL, pathType, altPath, &drvH, &status); if (status != OK) { STprintf(etxt,"Could not open from path %s.\n", pathType == OCFG_ALT_PATH ? altPath : "/usr/local/etc"); display_err(etxt,status); PCexit(FAIL); } if (rmPkg) { delConfigEntry( drvH, defAttr[INFO_ATTR_DRIVER_NAME], &status ); delConfigEntry( drvH, defAttr[INFO_ATTR_ALT_DRIVER_NAME], &status ); closeConfig(drvH, &status); PCexit(OK); } /* ** Get the driver count. */ retcount = listConfig( drvH, count, list, &status ); if (status != OK) { STprintf(etxt,"Could not list drivers.\n"); display_err(etxt,status); PCexit(FAIL); } count = retcount; if (count) { /* ** Get the list of recognized drivers. */ list = (char **)MEreqmem( (u_i2) 0, (u_i4)(count * sizeof(char *)), TRUE, (STATUS *) NULL); for (i = 0; i < count; i++) list[i] = (char *)MEreqmem( (u_i2) 0, (u_i4)OCFG_MAX_STRLEN, TRUE, (STATUS *) NULL); listConfig( drvH, count, list, &status ); if (status != OK) { STprintf(etxt,"Could not list drivers.\n"); display_err(etxt,status); PCexit(FAIL); } } for (i = 0; i < count; i++) { def_or_alt = FALSE; if (!has_default) { has_default = STbcompare( list[i], 0, defAttr[INFO_ATTR_DRIVER_NAME], 0, TRUE ) == 0 ? TRUE : FALSE; if (has_default) def_or_alt = TRUE; } if (!has_alt) { has_alt = STbcompare( list[i], 0, defAttr[INFO_ATTR_ALT_DRIVER_NAME], 0, TRUE ) == 0 ? TRUE : FALSE; if (has_alt) def_or_alt = TRUE; } if (def_or_alt) { if ( !batch ) { STprintf(prompt, "\tInstallation has pre-defined version of %s.\n\tOverwrite? (Yes/No)", list[i]); if ( line_get( prompt, "", FALSE, line ) == EOF ) { SIprintf("ODBC driver installation safely aborted\n"); PCexit(OK); } STzapblank(line,line); if ( line[0] != 'y' && line [0] != 'Y' ) { SIprintf( "%s left untouched\n", list[i] ); continue; } } /* if (!batch) */ STcopy(list[i],driverName); setConfigEntry( drvH, driverName, drvCount, drvList, &status ); if (status != OK) { STprintf(etxt,"Could not write driver entry.\n"); display_err(etxt,status); PCexit(FAIL); } } /* if (has_default || has_alt) */ else if ( !batch ) { STprintf(prompt, "\tInstallation has custom version of %s.\n\tDelete? (Yes/No)", list[i]); if ( line_get( prompt, "", FALSE, line ) == EOF ) { SIprintf("ODBC driver installation safely aborted\n"); PCexit(OK); } STzapblank(line,line); if ( line[0] != 'y' && line [0] != 'Y' ) { SIprintf( "%s left untouched\n", list[i] ); continue; } STcopy(list[i],driverName); delConfigEntry( drvH, driverName, &status ); if (status != OK) { STprintf(etxt,"Could not write driver entry.\n"); display_err(etxt,status); PCexit(FAIL); } } /* if (!batch) && !has_default */ } /* for (count... */ if (!has_default) { setConfigEntry( drvH, defAttr[INFO_ATTR_DRIVER_NAME], drvCount, drvList, &status ); if (status != OK) { STprintf(etxt,"Could not write driver entry.\n"); display_err(etxt,status); PCexit(FAIL); } } if (!has_alt) { setConfigEntry( drvH, defAttr[INFO_ATTR_ALT_DRIVER_NAME], drvCount, drvList, &status ); if (status != OK) { STprintf(etxt,"Could not write driver entry.\n"); display_err(etxt,status); PCexit(FAIL); } } closeConfig(drvH, &status); if (status != OK) { STprintf(etxt,"Could not close driver info.\n"); display_err(etxt,status); PCexit(FAIL); } if (count) { for (i = 0; i < count; i++) MEfree((PTR)list[i]); MEfree((PTR)list); } for (i = 0; i < drvCount; i++) { MEfree((PTR)drvList[i]->value); MEfree((PTR)drvList[i]); } MEfree((PTR)drvList); PCexit(OK); }
/* ** Name: CScp_resume - Resume (a thread in) a process ** ** Description: ** This routine resumes the indicated thread in the indicated process. ** ** If the indicated process is this process, then this is a simple ** CSresume operation. If the indicated process is another process, then ** that process must be notified that it should CSresume the indicated ** thread. ** ** Inputs: ** cpid pointer to CS_CPID with ** .pid - the indicated process ** .sid - the indicated session ** .iosb - a thread-safe IOSB ** .data - where we'll place a pointer ** to the CPchan written to. ** ** Outputs: ** None ** ** Returns: ** void ** ** History: ** Summer, 1992 (bryanp) ** Working on the new portable logging and locking system. ** 9-oct-1992 (bryanp) ** Use global IOSB, not stack IOSB, so that when QIO completes ** some time from now it will not overwrite arbitrary stack stuff. ** 19-oct-1992 (bryanp) ** CSresume expects to be called at AST level. Oblige it by invoking it ** via sys$dclast(). ** 20-oct-1992 (bryanp) ** Back out the DCLAST change; CSresume can now be called at normal ** level. ** 14-dec-1992 (bryanp) ** ERsend() calls should be ERlog() calls. ** 29-sep-1993 (walt) ** Get an event flag number from lib$get_ef rather than use event flag ** zero in the sys$qio call. ** 18-oct-1993 (rachael) ** Call lib$signal(SS$_DEBUG) only when compiled with xDEBUG flag. ** 16-Nov-1998 (jenjo02) ** Prototype changed to pass CS_CPID * instead of PID, SID. ** 08-Nov-2007 (jonj) ** Write with IO$M_NOW and IO$M_READERCHECK, check for dead reader ** process (NOREADER), mark this PID/channel as dead for subsequent ** resumers to ignore. IO$M_NOW does not wait for the reader to ** read. ** 04-Apr-2008 (jonj) ** Embed IOSB in CS_CPID and reinstate lib$get_ef() to assure ** thread-safeness. ** Disable/reenable ASTs to prevent seen duplicate reads on the ** other end. ** Supply cpres_mbx_write_complete() AST to check IOSB status ** for NOREADER. */ void CScp_resume( CS_CPID *cpid ) { i4 vms_status; CS_CP_WAKEUP_MSG wakeup_msg; i4 mbox_chan; char msg_buf[100]; CL_ERR_DESC local_sys_err; CP_CHANNEL *CPchan; II_VMS_EF_NUMBER efn; i4 ReenableASTs; if (cpid->pid == Cs_srv_block.cs_pid) { CSresume(cpid->sid); } else { /* Disable AST delivery */ ReenableASTs = (sys$setast(0) == SS$_WASSET); /* Initialize to success */ vms_status = SS$_NORMAL; if ( cpres_mbx_assign(cpid->pid, &CPchan) == OK ) { /* If reader is not alive, do nothing */ if ( CPchan->state == CPchanIsAlive ) { /* The SID of the session to resume */ wakeup_msg.wakeup_sid = cpid->sid; /* horda03 - Fill in details to help track Cross-Process ** ACCVIO problem. */ wakeup_msg.wakeup_pid = cpid->pid; wakeup_msg.from_pid = Cs_srv_block.cs_pid; /* If from AST, "from_sid" is meaningless */ if ( (wakeup_msg.sender_in_ast = lib$ast_in_prog()) ) wakeup_msg.from_sid = 0; else wakeup_msg.from_sid = (CS_SID)Cs_srv_block.cs_current; /* ** Plunk message, don't wait for reader to read it. ** ** Use IOSB embedded in CS_CPID, pass CS_CPID* to ** AST completion. */ /* Set CPchan in the CS_CPID for AST's use */ cpid->data = (PTR)CPchan; vms_status = sys$qio(EFN$C_ENF, CPchan->chan, IO$_WRITEVBLK | IO$M_NOW | IO$M_READERCHECK, &cpid->iosb, cpres_mbx_write_complete, cpid, &wakeup_msg, sizeof(wakeup_msg), 0, 0, 0, 0); if ( vms_status != SS$_NORMAL ) { STprintf(msg_buf, "[%x.%x] Error (%x) queueing write to %x on channel %d", wakeup_msg.from_pid, wakeup_msg.from_sid, vms_status, CPchan->pid, CPchan->chan); ERlog(msg_buf, STlength(msg_buf), &local_sys_err); } } } else { STprintf(msg_buf, "Unable to assign channel to %x", cpid->pid); ERlog(msg_buf, STlength(msg_buf), &local_sys_err); STprintf(msg_buf, "Ignoring error in assigning mailbox for PID %x", cpid->pid); ERlog(msg_buf, STlength(msg_buf), &local_sys_err); /* ** The process we were going to send this message to will probably ** "hang", which at least allows some sort of diagnosis. Killing ** ourselves at this point is less useful, since it tends to crash ** the entire installation. */ } if ( vms_status != SS$_NORMAL ) { STprintf(msg_buf, "CScp_resume QIO to %x failed with status %x", cpid->pid, vms_status); ERlog(msg_buf, STlength(msg_buf), &local_sys_err); #ifdef xDEBUG lib$signal(SS$_DEBUG); #endif PCexit(FAIL); } if ( ReenableASTs ) sys$setast(1); } return; }
int main(int c, char **v) { i4 msg_id; i4 cnt = 0; char mbuf[ER_MAX_LEN]; i4 ret_len = 0; char msgbuf[101]; CL_ERR_DESC clerror; CL_ERR_DESC err_code; STATUS stat; i4 flag = 0; bool testsysdep = FALSE; bool logoper = FALSE; MEadvise(ME_INGRES_ALLOC); for (++v, --c; c > 0; ++v, --c) { char *w = *v; if (w[0] == '-') { switch (w[1]) { case 't': flag |= ER_TIMESTAMP; break; case 'n': flag |= ER_NOPARAM; break; case 's': testsysdep = TRUE; break; case 'o': logoper = TRUE; break; default: SIfprintf(stderr, "only valid options are -t, -s, -n and -o\n"); PCexit(FAIL); } } else SIfprintf(stderr, "ignoring invalid argument \"%s\"\n", v); } if (testsysdep) /* test system dependent error reporting */ { extern int errno; errno = 13; /* EACCES */ SETCLERR(&clerror, 0x10911, /* ER_INTERR_TESTMSG */ ER_open); STcopy("II_MSGDIR/erclf.msg", clerror.moreinfo[0].data.string); clerror.moreinfo[0].size = STlength(clerror.moreinfo[0].data.string); } while ((cnt++) < MAX_NUM_OF_LOOKUPS) { msg_id = -1; SIfprintf(stderr, "msg id, in hex, no 0x%s: ", testsysdep? " (try 10904) " : ""); if( OK != SIgetrec(msgbuf, 100, stdin) ) break; #if defined(any_aix) && defined(BUILD_ARCH64) (VOID) STscanf(msgbuf, "%x", &msg_id); #else (VOID) STscanf(msgbuf, "%p", &msg_id); #endif if (msg_id == -1) break; if ((stat = ERslookup(msg_id, testsysdep? &clerror : NULL, flag, (char *) NULL, mbuf, ER_MAX_LEN, -1, &ret_len, &err_code, 5, er_arg)) != OK) { SIfprintf(stderr, "ERslookup error. msg id is 0x%x, status is 0x%x\n", msg_id, stat); } else { SIfprintf(stderr, "*** ERslookup:\n%s\n", mbuf); SIfprintf(stderr, "*** ERget:\n%s\n", ERget(msg_id)); } if (testsysdep) { if ((stat = ERslookup(0, &clerror, flag, (char *) NULL, mbuf, ER_MAX_LEN, -1, &ret_len, &err_code, 5, er_arg)) != OK) { SIfprintf(stderr, "ERslookup error on CL_ERR_DESC. Status is 0x%x\n", stat); } else SIfprintf(stderr, "*** ERslookup (CL error):\n%s\n",mbuf); } if (logoper) { ERsend( ER_ERROR_MSG|ER_OPER_MSG, mbuf, ret_len, &err_code ); } } PCexit(OK); }
void main(int argc, char *argv[]) { #define MAXBUF 4095 #define MAX_NAME 32 char buf[ MAXBUF+1 ]; char repbuf[ MAXBUF+1 ]; int iarg, ibuf, ichr; char *database = NULL; char username[MAX_NAME] = {""}; LOCATION tloc; LOCATION loc_out; LOCATION loc_in; char loc_buf[MAX_LOC + 1]; char tmp_buf[MAX_LOC + 1]; char otmp_buf[MAX_LOC + 1]; char dev[MAX_LOC + 1]; char path[MAX_LOC + 1]; char fprefix[MAX_LOC + 1]; char fsuffix[MAX_LOC + 1]; char version[MAX_LOC + 1]; char odev[MAX_LOC + 1]; char opath[MAX_LOC + 1]; char ofprefix[MAX_LOC + 1]; char ofsuffix[MAX_LOC + 1]; char oversion[MAX_LOC + 1]; char *new_filename; char *temploc; CL_ERR_DESC err_code; char *p1 = NULL; bool usergiven = FALSE; bool Repmod = FALSE; bool nowait = TRUE; char waitflag[3]; if (argc < 2) { usage(); PCexit(FAIL); } /* Get the temporary path location */ NMloc(TEMP, PATH, NULL, &tloc); LOcopy(&tloc, tmp_buf, &loc_in); LOtos(&tloc, &temploc); LOcopy(&tloc, otmp_buf, &loc_out); /* Get the new filename for path location */ LOuniq(ERx("usrmod"), ERx("sql"), &loc_in); LOtos(&loc_in, &new_filename); LOuniq(ERx("usrmod"), ERx("out"), &loc_out); /* Get just the filename for copydb code */ LOdetail(&loc_in, dev, path, fprefix, fsuffix, version); if ( *fsuffix != '\0' ) { STcat(fprefix, "."); STcat(fprefix, fsuffix); } /* Get just the filename for copydb code */ LOdetail(&loc_out, odev, opath, ofprefix, ofsuffix,oversion); STcat(ofprefix, "."); STcat(ofprefix, ofsuffix); STprintf(buf, ERx("copydb -with_modify -nodependency_check -with_index -with_comments -no_persist -parallel -no_repmod -group_tab_idx -no_warn -d\"%s\" -infile=\"%s\" -outfile=\"%s\"" ), temploc, fprefix,ofprefix); ibuf = STlength(buf); for (iarg = 1; (iarg < argc) && (ibuf < MAXBUF); iarg++) { if( STscompare( argv[ iarg ], 1, ERx( "-" ), 1 ) == 0 ) { p1 = argv[ iarg ]; (void) CMnext( p1 ); if ( (STlength(p1) == 0) || !(((STscompare( p1, 1, ERx( "u" ), 1 ) == 0 ) || (STscompare( p1, 5, ERx( "noint" ), 5 ) == 0 ) || (STscompare( p1, 6, ERx( "repmod" ), 6 ) == 0 ) || (STscompare( p1, 1, ERx( "w" ), 6 ) == 0 ) || (STscompare( p1, 6, ERx( "online"), 6 ) == 0 )) && ( argc > 2 ) )) { usage(); PCexit(FAIL); } /* ** Get the username if the -u flag is passed in ** with the input */ if (STscompare( p1, 1, ERx( "u" ), 1 ) == 0 ) { STcopy(&argv[iarg][2] , (char *)&username); usergiven = TRUE; } else if (STscompare( p1, 1, ERx( "r" ), 1 ) == 0 ) { Repmod = TRUE; continue; } else if (STscompare( p1, 1, ERx( "w"), 1 ) == 0) { nowait = TRUE; continue; } } if( STscompare( argv[ iarg ], 1, ERx( "+" ), 1 ) == 0 ) { p1 = argv[ iarg ]; (void) CMnext( p1 ); if (STscompare( p1, 1, ERx( "w" ), 1 ) == 0 ) { nowait = FALSE; continue; } else { usage(); PCexit(FAIL); } } if((database == NULL) && (STscompare( argv[ iarg ], 1, ERx( "+" ), 1 ) != 0) && (STscompare( argv[ iarg ], 1, ERx( "-" ), 1 ) != 0)) { database = argv[ iarg ]; } buf[ibuf++] = ' '; for (ichr = 0; (argv[iarg][ichr] != '\0') && (ibuf < MAXBUF); ichr++, ibuf++) { buf[ibuf] = argv[iarg][ichr]; } buf[ibuf] = '\0'; } /* ** Execute the command. */ if( PCcmdline((LOCATION *) NULL, buf, PC_WAIT, (LOCATION *) NULL, &err_code) != OK ) PCexit(FAIL); /* ** we should run the sql script ** sql dbname < new_filename ** if -u flag given then run: ** sql -uusername dbname < new_filename */ if (usergiven) STprintf(buf, ERx( "sql -u%s -s %s <%s" ), username, database, new_filename ); else STprintf(buf, ERx( "sql -s %s <%s" ), database, new_filename ); /* ** Execute the command. */ if( PCcmdline((LOCATION *) NULL, buf, PC_WAIT, (LOCATION *) NULL, &err_code) != OK ) { STprintf(buf, ERx(" Warning: Non-persistent objects associated with the base table\n in the failed query may have been lost. Please refer to\n %s\n to determine whether any corrective action is required.\n"), new_filename); SIfprintf(stdout, buf); PCexit(FAIL); } /* Now execute the repmod command if the replicator ** modify is also required by the user (-repmod) */ if (Repmod) { if (nowait) STcopy("-w", waitflag) ; else STcopy("+w", waitflag) ; if (usergiven) STprintf(repbuf, ERx( "repmod -u%s %s %s" ), username, database, waitflag ); else STprintf(repbuf, ERx( "repmod %s %s" ), database, waitflag ); if( PCcmdline((LOCATION *) NULL, repbuf, PC_WAIT, (LOCATION *) NULL, &err_code) != OK ) PCexit(FAIL); } /* ** Delete the location */ LOdelete(&loc_in); LOdelete(&loc_out); PCexit(OK); }
/* ** Name: GCwintcp_init ** Description: ** WINTCP inititialization function. This routine is called from ** GCwinsock_init() -- the routine GCC calls to initialize protocol ** drivers. ** ** This function does initialization specific to the protocol: ** Reads any protocol-specific env vars. ** Sets up the winsock protocol-specific control info. ** History: ** 05-Nov-93 (edg) ** created. ** 23-Feb-1998 (thaal01) ** Allow space for port_id, stops GCC crashing on startup sometimes. ** 07-Jul-1998 (macbr01) ** Bug 91972 - jasgcc not receiving incoming communications. This is ** due to incorrect usage of PMget() in function GCwintcp_init(). ** Changed to test return code of PMget() instead of testing passed ** in parameter for not equal to NULL. ** 15-jul-1998 (canor01) ** Move assignment of port_id to port_id_buf to prevent possible ** access violation. Clean up comments. ** 09-feb-2004 (somsa01) ** When working with instance identifiers as port IDs, make sure ** we initialize sbprt with the trailing number, if set. ** 13-may-2004 (somsa01) ** Updated config.dat string used to retrieve port information such ** that we do not rely specifically on the GCC port. Also, corrected ** function used to convert subport into a number. ** 26-Jan-2006 (loera01) Bug 115671 ** Added GCWINTCP_log_rem_host to allow of gethostbyaddr() to be ** disabled. ** 06-Feb-2007 (Ralph Loen) SIR 117590 ** Removed GCWINTCP_log_rem_host, since gethostbyaddr() is no ** longer invoked for network listens. ** 22-Feb-2008 (rajus01) Bug 119987, SD issue 125582 ** Bridge server configuration requires listening on a specified ** three character listen address. During protocol initialization ** the bridge server fails to start when three character listen ** address is specified. For example, ** the following configuration entries in config.dat ** ii.<host>.gcb.*.wintcp.port: <xxn>, ** ii.<host>.gcb.*.wintcp.status:<prot_stat> ** are for command line configuration. When these entries are ** present in addition to the CBF VNODE configuration (shown below ) ** ii.rajus01.gcb.*.wintcp.port.v1:<xxn> ** ii.rajus01.gcb.*.wintcp.status.v1:<prot_stat> ** the bridge server fails even though the port is available for use. ** It has been found that the global 'sbprt' variable gets set ** by the bridge server during protocol initialization to 'n' in the ** three charater listen address 'xxn'. Later, while resolving the ** three character portname into port number by GCwintcp_port routine ** it assumes that this port is already in use even though it is not ** the case. ** Added server_type to determine the GCF server type. ** The error messages from errlog.log are the following: ** rajus01 ::[R3\BRIDGE\12c4 , 4804 , ffffffff]: Tue Feb 19 ** 19:49:27 2008 E_GC2808_NTWK_OPEN_FAIL Network open failed for ** protocol TCP_IP, port R3; status follows. ** rajus01 ::[R3\BRIDGE\12c4 , 4804 , ffffffff]: Tue Feb 19 ** 19:49:27 2008 E_CL2787_GC_OPEN_FAIL An attempted network open ** failed. ** Change description: ** The code that clears the third character in the listen address ** specified in the config.dat has been removed. This ** appears to be a wrong assumption in the protocol driver based ** on the documentation in "Appendix A:TCP/IP protocol, Listen ** Address Format seciton of Connectivity Guide". With these ** changes the protocol driver will behave the way UNIX does. ** ** WARNING: This DOES introduce the behavioural changes in the ** following cases when starting one or more servers by increa- ** sing the startup count in config.dat. ** ** Case 1: ** Both tcp_ip and win_tcp status are set to ON with Listen ** Addresses II5 and II5 for example. ** New behaviour: The GCF server will come up and listen on ** one protocol using port II5, but will fail on the other ** protocol. ** Original behaviour: ** The GCF server will listen on port II5 on the first ** protocol and the second one will listen on II6. ** This seems to be a bug in the driver as this is not the ** behaviour documented in the connectivity guide. ** Case 2: ** Both tcp_ip and win_tcp status are set to ON with Listen ** Addresses (win_tcp=II, tcp_ip = II1). ** Original behaviour: ** First GCF server will come up OK (II0, II1). The second ** GCF server will come up fine too ( II2, II3 ). ** New Behaviour: ** First GCF server will come up fine. The second GCF server ** will fail for tcp_ip protocol, but will come up on win_tcp ** protocol. This doesn't seem to be much of an issue because ** the second GCF server will still come up using win_tcp. ** 13-Apr-2010 (Bruce Lunsford) SIR 122679 ** Set wsd->pce_driver from GCC PCT rather than from ex-global ** WS_wintcp. */ STATUS GCwintcp_init(GCC_PCE * pptr, GCC_WINSOCK_DRIVER *wsd) { char *ptr = NULL; char real_name_size[] = "100"; char *host, *server_id, *port_id; char config_string[256]; char install[32]; //II_INSTALLATION code /* ** Get set up for the PMget call. */ PMinit(); if( PMload( NULL, (PM_ERR_FUNC *)NULL ) != OK ) PCexit( FAIL ); /* ** Construct the network port identifier. */ host = PMhost(); server_id = PMgetDefault(3); if (!server_id) server_id = "*" ; STprintf( config_string, ERx("!.wintcp.port"), SystemCfgPrefix, host, server_id); /* ** Search config.dat for a match on the string we just built. ** If we don't find it, then use the value for II_INSTALLATION ** failing that, default to II. */ if ((PMget( config_string, &port_id ) != OK) || (port_id == NULL )) { NMgtAt("II_INSTALLATION", &ptr); port_id = install; if (ptr != NULL && *ptr != '\0') { STcopy(ptr, port_id); } else { STcopy(SystemVarPrefix, port_id); } } STcopy(port_id, pptr->pce_port); GCTRACE(1)("GCwintcp_init: port = %s\n", pptr->pce_port ); /* ** Fill in protocol-specific info */ wsd->addr_len = sizeof( struct sockaddr_in ); wsd->sock_fam = AF_INET; wsd->sock_type = SOCK_STREAM; wsd->sock_proto = 0; wsd->block_mode = FALSE; wsd->pce_driver = pptr->pce_driver; /* ** Get trace variable */ ptr = NULL; NMgtAt( "II_WINTCP_TRACE", &ptr ); if ( !(ptr && *ptr) && PMget("!.wintcp_trace_level", &ptr) != OK ) { GCWINTCP_trace = 0; } else { GCWINTCP_trace = atoi( ptr ); } return OK; }
/* * _error() - error handling function */ void _error(char *s) { SIfprintf(stderr, "RE: %s\n", s); PCexit( FAIL ); }
main(int argc, char **argv) { char *value = NULL; char *host, *server_type, *command_line; char *server_location, *env, *arguments; u_i4 command_line_length; char config_string[256]; char iidbms[256]; STARTUPINFO si; PROCESS_INFORMATION ProcessInfo; BOOL Status; SECURITY_ATTRIBUTES sa; HANDLE hRead, hWrite; HANDLE hStdout; char buffer[512]; DWORD bufferl = sizeof(buffer); DWORD pipe_size = 0; /* Use default buffer size */ DWORD datal = 0; bool havequote, failed = FALSE; MEadvise( ME_INGRES_ALLOC ); switch (argc) { case 1: server_type = ERx("dbms"); server_location = ERx("*"); break; case 2: server_type = argv[1]; server_location = ERx("*"); break; default: server_type = argv[1]; if (STcompare(server_type, "recovery") == 0) server_location = ERx("*"); else server_location = argv[2]; break; } get_sys_dependencies(); /* ** Get the host name, formally used iipmhost. */ host = PMhost(); /* ** Build the string we will search for in the config.dat file. */ STprintf( config_string, ERx("%s.%s.%s.%s.image_name"), SystemCfgPrefix, host, server_type, server_location ); /* ** Get set up for the PMget call. */ PMinit(); if( PMload( NULL, (PM_ERR_FUNC *)NULL ) != OK ) PCexit( FAIL ); /* ** Go search config.dat for a match on the string we just built. */ PMget( config_string, &value ); if ( value == NULL ) { NMgtAt( SystemLocationVariable, &env ); if (STcompare(server_type, "recovery") == 0) { STprintf(iidbms, ERx("%s\\%s\\bin\\%sdbms"), env, SystemLocationSubdirectory, SystemCfgPrefix); } else { STprintf(iidbms, ERx("%s\\%s\\bin\\%s%s"), env, SystemLocationSubdirectory, SystemCfgPrefix, server_type); } } else if ( *value == '/' || *value == '\\' || (*(value+1) == ':' && *(value+2) == '\\') ) { /* Must be a qualified path name */ STcopy( value, iidbms ); } else { NMgtAt( SystemLocationVariable, &env ); STprintf( iidbms, ERx("%s\\%s\\bin\\%s"), env, SystemLocationSubdirectory, value ); } /* ** Initialize the startinfo structure. */ ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); /* ** Get the original command line. */ arguments = GetCommandLine(); havequote = FALSE; while (*arguments != '\0' && *arguments != '\n') { if ( *arguments == '"' ) havequote = (havequote) ? FALSE : TRUE; if ( CMwhite(arguments) && havequote == FALSE ) break; arguments++; } /* ** Put together a command line to create a process with. ** - 4 blank separators, quotes, null termination */ command_line_length = STlength(arguments) + STlength(iidbms) + STlength(iirun) + 6 + 1; if((command_line = (char *) MEreqmem(0, command_line_length, TRUE, NULL)) == NULL) { error(ERx("Request for memory failed"),NULL); } STprintf( command_line, "%s \"%s\" %s", iirun, iidbms, arguments ); /* ** Save standard out's handle, to be restored later. */ hStdout = GetStdHandle(STD_OUTPUT_HANDLE); /* ** Initialize the security attributes structure that will ** be used to make the pipe handles inheritable. */ sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; /* Make object inheritable */ /* ** Define a anonymous pipe to catch the server's startup message. */ if((Status = CreatePipe(&hRead,&hWrite,&sa,pipe_size)) != TRUE) { error(ERx("CreatePipe failed"),ERx("error code = ")); } SetStdHandle(STD_OUTPUT_HANDLE,hWrite); /* ** Initialize the security attributes structure that will ** be used to make the pipe handles inheritable. */ sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; /* Make object inheritable */ /* ** Initialize the startup information structure. */ ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); /* ** Start it up. */ /* ** Start iirun which will start the server. */ if ((Status = CreateProcess(NULL,command_line,&sa,NULL,TRUE, HIGH_PRIORITY_CLASS, NULL, NULL,&si,&ProcessInfo)) != TRUE) { DWORD dwError = GetLastError(); switch(dwError) { case ERROR_ACCESS_DENIED: error(ERROR_REQ_PRIVILEGE, ERx("")); break; case ERROR_ELEVATION_REQUIRED: error(ERROR_DENIED_PRIVILEGE, ERROR_REQ_ELEVATION); break; default: error(ERx("CreateProcess failed"),ERx("error code = ")); break; } } SetStdHandle(STD_OUTPUT_HANDLE,hStdout); for (;;) { char *tmpptr; if((Status = ReadFile(hRead,&buffer,bufferl,&datal,NULL)) != TRUE) { error(ERx("ReadFile failed"),ERx("error code = ")); } buffer[datal] = '\0'; if ((tmpptr = STstrindex(buffer, "PASS\n", 0, FALSE))) { *tmpptr = '\0'; if (STlength(buffer)) SIfprintf(stdout, "%s", buffer); break; } SIfprintf(stdout, "%s", buffer); if ((tmpptr = STstrindex(buffer, bad_msg, 0, FALSE))) { *tmpptr = '\0'; if (STlength(buffer)) SIfprintf(stdout, "%s", buffer); failed = TRUE; break; } } /* ** Close handles since we don't need them anymore. */ CloseHandle(ProcessInfo.hThread); CloseHandle(ProcessInfo.hProcess); CloseHandle(hRead); CloseHandle(hWrite); if (failed && STscompare(server_type, STlength(server_type), "gcb", 3) != 0 && STscompare(server_type, STlength(server_type), "gcc", 3) != 0 && STscompare(server_type, STlength(server_type), "jdbc", 4) != 0) { SIfprintf( stderr,"\n%s: server would not start.\n", iirundbms ); SIfprintf(stderr, " %s must be set in your environment.\n", SystemLocationVariable ); SIfprintf(stderr, " Has the csinstall program been run?\n"); SIfprintf(stderr, " %s_DATABASE, %s_CHECKPOINT, %s_JOURNAL and %s_DUMP\n", SystemVarPrefix, SystemVarPrefix, SystemVarPrefix, SystemVarPrefix ); SIfprintf(stderr, " must also be set. See %s_CONFIG\\symbol.tbl.\n", SystemVarPrefix ); SIfprintf(stderr, " Check the file '%%%s%%\\%s\\files\\errlog.log'\n", SystemLocationVariable, SystemLocationSubdirectory ); SIfprintf(stderr, " for more details concerning internal errors.\n"); SIfprintf(stderr, " See your Installation and Operation Guide for more\n"); SIfprintf(stderr, " information concerning server startup.\n"); PCexit(FAIL); } else { PCexit(OK); } }