static int match_and_count(struct device * dev, void * data) { struct match_count * m = data; struct parisc_device * pdev = to_parisc_device(dev); if (check_dev(dev)) { if (match_device(m->driver, pdev)) m->count++; } return 0; }
static int find_device(struct device * dev, void * data) { struct parisc_device * pdev = to_parisc_device(dev); struct find_data * d = (struct find_data*)data; if (check_dev(dev)) { if (pdev->hpa.start == d->hpa) { d->dev = pdev; return 1; } } return 0; }
LRESULT CDECL SF_GetDevCaps10u(SFDEVINDEX ndx, CSFDevObject10u *caps) { check_dev(ndx); check(caps); if(caps && caps->m_SizeOf==sizeof(CSFCapsObject)) // actually, 10x, not '10u' { debug("kx sfman32: trying caps 1.01, not 1.00\n"); return SF_GetDevCaps10x(ndx,(CSFCapsObject *)caps); } CSFDevObject10x dev; memset(&dev,0,sizeof(dev)); dev.m_SizeOf=SFDEV_CAPSIZE_102; // sizeof(CSFDevObject) LRESULT ret=call_driver(ndx,SFDEV_GET_DEVICE_CAPS,device_handles[ndx].subdev,(LPARAM)&dev); if(ret==SFERR_NOERR) { if(caps && caps->m_SizeOf>=sizeof(CSFDevObject10u)) { memset(caps,0,sizeof(CSFDevObject10u)); caps->m_SizeOf=sizeof(CSFDevObject10u); caps->m_DevID=ndx; caps->m_DevCaps=dev.m_DevCaps; caps->m_RomID=dev.m_RomId; /* ID for a Sound ROM used in a device */ caps->m_RomVer=dev.m_RomVer; /* Version for a Sound ROM used in a device */ strncpy(caps->m_DevName,dev.m_DevName,sizeof(caps->m_DevName)); /* MMSystem name for MIDI Output Device */ return ret; } return SFERR_RESOURCE_INSUFFICIENT; } else return ret; }
static void ParseParam(int argc, char *argv[], struct dynamo_param *param) { // Local variables char *pcOption; BOOL bParamIometer = FALSE; BOOL bParamDynamo = FALSE; int count = 0; ifstream devfile; // Walk through the parameter list for (int I = 1; I < argc; I++) { // NOTE: The following piece is from the Syntax() function: // =====BEGIN============================================ // // Solaris 2.7 must have the switch (? is used for its own purpose). // cout << "dynamo \\?" << endl; // =====END============================================== // Given Solaris 7 is pretty old (released in 1998), we // no longer support this option. If it is nevertheless // still needed, then add support back into the // ParseParam()and Syntax() function. // Ensure minimal parameter length if (strlen(argv[I]) < 2) { Syntax("Options must have a length of at least 2 characters."); return; } // Ensure that each parameter has a leading option indicator if (argv[I][0] == '-') { pcOption = &argv[I][1]; if (argv[I][1] == '-') { pcOption = &argv[I][2]; } } else { Syntax("Options must start with a leading option indicator (\"-\" or \"--\")."); return; } // Process parameters that have no argument // (alphabetic order; short options followed by long options) if (strcasecmp(pcOption, "?") == 0) { Syntax(); return; } if (strcasecmp(pcOption, "H") == 0 || strcasecmp(pcOption, "HELP") == 0) { Syntax(); return; } #if defined(IOMTR_OS_LINUX) || defined(IOMTR_OS_OSX) || defined(IOMTR_OS_SOLARIS) if (strcasecmp(pcOption, "L") == 0) { do_syslog = TRUE; openlog(NEW_WORKER_EXECUTABLE, 0, LOG_USER); continue; } #endif // Process parameters that have (an) argument(s) // (alphabetic order; short options followed by long options) I++; if (I >= argc) { Syntax("Options requires one or more argument(s)."); return; } #if defined (IOMTR_SETTING_CPU_AFFINITY) && (defined(IOMTR_OSFAMILY_WINDOWS) || defined(IOMTR_OS_LINUX)) if (strcasecmp(pcOption, "C") == 0) { if (argv[I]) { // Lets use sscanf below to support hex input ULONG_PTR tempMask = 0; // Handle both hex and decimal values. Abstract format spec syntax (in iocommon.h) if (argv[I][0] == '0' && argv[I][1] == 'x') sscanf(argv[I],"0x%" IOMTR_FORMAT_SPEC_64BIT "x", &tempMask); else sscanf(argv[I],"%" IOMTR_FORMAT_SPEC_64BIT "d", &tempMask); //#if defined (IOMTR_SETTING_CPU_AFFINITY) param->cpu_affinity = tempMask; //#endif } continue; } #endif #if defined(IOMTR_OS_LINUX) || defined(IOMTR_OS_OSX) || defined(IOMTR_OS_SOLARIS) if (strcasecmp(pcOption, "D") == 0) { if (check_dev(argv[I])) { Syntax("Not a valid device."); return; } if (count < MAX_TARGETS) { strcpy((*param->blkdevlist)[count++], argv[I]); } else { cout << "Too many targets you want to test, skip " << argv[I] << endl; } continue; } if (strcasecmp(pcOption, "F") == 0) { char devname[MAX_NAME]; devfile.open(argv[I]); if (!devfile.is_open()) { Syntax("Can not open device file list."); return; } while (!devfile.eof()) { memset(devname, 0, MAX_NAME); devfile.getline(devname, MAX_NAME - 1); if (check_dev(devname)) continue; if (count < MAX_TARGETS) { strcpy((*param->blkdevlist)[count++], devname); } else { cout << "Too many targets you want to test, skip " << devname << endl; } } continue; } #endif if (strcasecmp(pcOption, "I") == 0) { if (bParamIometer == TRUE) { Syntax("Iometer address was specified more than once."); return; } if (strlen(argv[I]) >= MAX_NETWORK_NAME) { Syntax("Iometer address parameter was too long."); return; } strcpy(param->iometer, argv[I]); bParamIometer = TRUE; continue; } if (strcasecmp(pcOption, "M") == 0) { // No check for more then once specification (as we have a default) if (strlen(argv[I]) >= MAX_NETWORK_NAME) { Syntax("Manager network name parameter was too long."); return; } strcpy(param->manager_computer_name, argv[I]); bParamDynamo = TRUE; continue; } if (strcasecmp(pcOption, "N") == 0) { if (param->manager_name[0] != '\0') { Syntax("Manager name was specified more than once."); return; } if (strlen(argv[I]) >= MAX_WORKER_NAME) { Syntax("Manager name parameter was too long."); return; } strcpy(param->manager_name, argv[I]); continue; } if (strcasecmp(pcOption, "P") == 0) { if (argv[I]) param->login_port_number = atoi(argv[I]); if (param->login_port_number < 1 || param->login_port_number > 65535) { Syntax("Port number was out of range."); param->login_port_number = 0; return; } continue; } #if defined(IOMTR_OS_LINUX) || defined(IOMTR_OSFAMILY_NETWARE) || defined(IOMTR_OS_OSX) || defined(IOMTR_OS_SOLARIS) if (strcasecmp(pcOption, "X") == 0) { if ((strlen(argv[I]) + strlen(param->manager_exclude_fs)) >= MAX_EXCLUDE_FILESYS) { Syntax("Excluded filesystem list too long."); return; } strcat(param->manager_exclude_fs, argv[I]); strcat(param->manager_exclude_fs, " "); continue; } #endif if (strcasecmp(pcOption, "FLAG") == 0) { if (strcasecmp(argv[I], "FORCE_RAW") == 0) { param->disk_control = RAWDISK_VIEW_FULL; cout << "Dynamo will display raw disks with valid partitions." << endl; continue; } #if defined(IOMTR_OSFAMILY_WINDOWS) || defined(IOMTR_OS_OSX) if (strcasecmp(argv[I], "USE_RDTSC") == 0) { param->timer_type = TIMER_RDTSC; // // Kludge, we don't really need the above param->timer_type since we can // directly access the TimerType global defines in IoTime.h. This should // be cleaned up better. // if (param->timer_type != TIMER_UNDEFINED && param->timer_type < TIMER_TYPE_MAX) { TimerType = (timer_type) param->timer_type; cout << "Dynamo will attempt to use the processor's high precision timer." << endl; } continue; } #endif // Unknown flag { char temp[256]; snprintf(temp, 256, "Flag unknown or not supported on this platform: %s", argv[I]); Syntax(temp); return; } } // Unknown parameter { char temp[256]; snprintf(temp, 256, "Option unknown or not supported on this platform: %s", argv[I-1]); Syntax(temp); return; } } // Enforce switch combinations if (bParamIometer && !bParamDynamo) { Syntax("Specifying the Iometer address, the Manager network name parameter becomes mandatory."); } cout << endl; // add one more newline. return; }
/* ######################################################################### */ static void ParseParam(int argc, char *argv[], struct dynamo_param *param) { // Local variables char cSwitchKey; BOOL bParamIometer = FALSE; BOOL bParamDynamo = FALSE; int count = 0; ifstream devfile; // Walk through the parameter list for( int I = 1; I < argc; I++ ) { // See if the user is requesting syntax help. if ( ( argv[I][0] == '?' ) || ( argv[I][1] == '?' ) ) { Syntax(); return; } // Ensure that the each parameter has a leading switch if ( ( argv[I][0] != '-' ) && ( argv[I][0] != '/' ) ) { Syntax( "Exactly one letter must follow a switch character.\n" "Switch characters are \"-\" and \"/\"." ); return; } if ( strlen( argv[I] ) != 2 ) { Syntax( "Exactly one letter must follow a switch character.\n" "Switch characters are \"-\" and \"/\"." ); return; } // Ensure that each parameter has a value following the switch if( ( I + 1 ) >= argc ) { Syntax("An additional parameter was expected after the last switch."); return; } // Process the parameters based on the switch cSwitchKey = toupper( argv[I][1] ); I++; switch( cSwitchKey ) { case 'I': if ( bParamIometer == TRUE ) { Syntax("Iometer address was specified more than once."); return; } if ( strlen( argv[I] ) >= MAX_NETWORK_NAME ) { Syntax("Iometer address parameter was too long."); return; } strcpy( param->iometer, argv[I] ); bParamIometer = TRUE; break; case 'M': // No check for more then once specification (as we have a default) if ( strlen( argv[I] ) >= MAX_NETWORK_NAME ) { Syntax("Manager network name parameter was too long."); return; } strcpy( param->manager_computer_name, argv[I] ); bParamDynamo = TRUE; break; case 'N': if ( param->manager_name[0] != '\0' ) { Syntax("Manager name was specified more than once."); return; } if ( strlen( argv[I] ) >= MAX_WORKER_NAME ) { Syntax("Manager name parameter was too long."); return; } strcpy( param->manager_name, argv[I] ); break; #if defined(IOMTR_OS_LINUX) || defined(IOMTR_OS_NETWARE) || defined(IOMTR_OS_SOLARIS) case 'X': if ( ( strlen( argv[I] ) + strlen( param->manager_exclude_fs ) ) >= MAX_EXCLUDE_FILESYS ) { Syntax("Excluded filesystem list too long."); return; } strcat( param->manager_exclude_fs, argv[I] ); strcat( param->manager_exclude_fs, " " ); break; #endif #if defined(IOMTR_OS_LINUX) || defined(IOMTR_OS_SOLARIS) case 'D': if (check_dev(argv[I])) { Syntax("Not a valid device."); return; } if (count < MAX_TARGETS) { strcpy((*param->blkdevlist)[count++], argv[I]); } else { cout << "Too many targets you want to test, skip " << argv[I] << endl; } break; case 'F': char devname[MAX_NAME]; devfile.open(argv[I]); if (!devfile.is_open()) { Syntax("Can not open device file list."); return; } while (!devfile.eof()) { memset(devname, 0, MAX_NAME); devfile.getline(devname, MAX_NAME - 1); if (check_dev(devname)) continue; if (count < MAX_TARGETS) { strcpy((*param->blkdevlist)[count++], devname); } else { cout << "Too many targets you want to test, skip " << devname << endl; } } break; case 'L': do_syslog = TRUE; openlog(NEW_WORKER_EXECUTABLE, 0, LOG_USER); break; #endif #if defined(IOMTR_OS_LINUX) || defined(IOMTR_OS_WIN32) || defined(IOMTR_OS_WIN64) case 'C': if (argv[I]) param->cpu_affinity = (unsigned long)atol(argv[I]); break; #endif default: { char tmpary[2] = { cSwitchKey, 0 }; #if defined(IOMTR_OSFAMILY_NETWARE) || defined(IOMTR_OSFAMILY_UNIX) char temp_array[128]; strcpy(temp_array, "Unrecognized switch: "); strcat(temp_array, tmpary); strcat(temp_array, "."); Syntax(temp_array); #elif defined(IOMTR_OSFAMILY_WINDOWS) Syntax("Unrecognized switch: " + (CString)tmpary + "."); #else #warning ===> WARNING: You have to do some coding here to get the port done! #endif } break; } } // Enforce switch combinations if( bParamIometer && !bParamDynamo ) { Syntax( "When specifying the Iometer address, the Manager network name parameter is mandatory." ); } return; }