This is SCSISelectorPanel.m in view mode; [Download] [Up]
// SCSISelectorPanel.m
// SCSI Bus Inquirer - NeXTStep
//
// Copyright (C) 1990 by Jiro Nakamura and Canon Inc.
// Copyright (C) 1991, 1992 by Jiro Nakamura.
// All Rights Reserved.
//
// RCS Information
// Revision Number-> $Revision: 1.8 $
// Last Revised-> $Date: 92/11/13 23:32:23 $
//
static char rcsid[]="$Id: SCSISelectorPanel.m,v 1.8 92/11/13 23:32:23 jiro Exp Locker: jiro $";
static char copyrightid[]="$Copyright: Copyright (C) 1992 by Jiro Nakamura$";
#import "SCSISelectorPanel.h"
#import "SCSIControlWindow.h"
#import "SCSI.h"
#import <strings.h>
#import <appkit/Application.h>
#import <appkit/TextField.h>
#import <appkit/Matrix.h>
#import <appkit/Button.h>
#import <appkit/ButtonCell.h>
#import <appkit/Panel.h> // For NX Run alert panel
#import <defaults/defaults.h> // for NXWriteDefault()
#import <appkit/publicWraps.h> // for NXBeep()
#import <sys/types.h>
#import <libc.h> // For geteuid()
#import <pwd.h> // for password checking
#import <math.h>
#import <time.h>
#import <sys/vnode.h> // for chmod code
#define SLEEPLOOP 50 /* Loop n times */
#define SLEEPTIME 10000 /* n microsecond sleep */
@implementation SCSISelectorPanel
void removeLastSpace( char *s, int length);
//
// Brings up the information panel.
//
- info:sender
{
if (!infoPanel)
[NXApp loadNibSection:"InfoPanel.nib" owner:self withNames:NO];
[infoPanel orderFront:self];
return self;
}
//
// Brings up the help panel.
//
- help:sender
{
#ifdef DEBUG
fprintf(stderr,"Help panel.\n");
#endif
if (!helpPanel)
[NXApp loadNibSection:"HelpPanel.nib"
owner:self withNames:NO];
[helpPanel orderFront:self];
return self;
}
//
// Brings up the legal panel.
//
- legal:sender
{
if (!legalPanel)
[NXApp loadNibSection:"LegalPanel.nib"
owner:self withNames:NO];
[legalPanel orderFront:self];
return self;
}
- calculator:sender
{
if( calculatorPanel == nil)
{
[NXApp loadNibSection: "Calculator.nib"
owner:self withNames: YES];
}
[calculatorPanel makeKeyAndOrderFront:self];
return self;
}
- update
{
struct stat buf;
const char *sendTypes[3];
const char *returnTypes[2];
[super update];
sendTypes[0] = NXAsciiPboardType;
sendTypes[1] = NULL;
sendTypes[2] = NULL;
returnTypes[0] = NXAsciiPboardType;
returnTypes[1] = NULL;
[NXApp registerServicesMenuSendTypes:sendTypes andReturnTypes:returnTypes];
if( geteuid() != 0) // If we are not effectively root
if( NXRunAlertPanel("Not running as Root",
"This program must be run as root "
"in order to access all SCSI devices."
"See manual for more information.",
"Continue", "Quit", NULL) == 0)
exit(1);
stat( NXArgv[0], &buf);
#ifdef DEBUG
fprintf(stderr, "---- launching: euid = %d, uid= %d, "
"Menu is nil = %d, NXArgv[0] = %s\n",
geteuid(), getuid(), installSelfMenuItem == nil, NXArgv[0]);
fprintf(stderr,"Stat mode = %o, & 04000 = %o\n",
(unsigned int) buf.st_mode, (unsigned int) buf.st_mode & 04000);
#endif
if( buf.st_mode & 04000 )
{
[installSelfMenuItem setTitle: "Already installed SET-UID"];
}
else if( installSelfMenuItem != nil &&
( geteuid() == 0) && (getuid() == 0)
&& !(buf.st_mode & 04000 )) // really running as root
{
[installSelfMenuItem setEnabled: YES];
}
return self;
}
- installSelf: sender
{
struct stat buf;
if(getuid() != 0)
{
NXRunAlertPanel("Not running as root",
"Installation can only be done by root. Please "
"login as root and reinstall.", "OK", NULL, NULL);
[installSelfMenuItem setEnabled: NO];
return self;
}
if( NXRunAlertPanel("Install self as SET-UID root",
"Installing this program as SET-UID root allows any user "
"to run this program as root and represents a security "
"hazard for some sites. Please read the documentation for more "
"details.", "Install", "Cancel", NULL) == 0)
return nil;
stat( NXArgv[0], &buf);
chown( NXArgv[0], 0, 3);
chmod( NXArgv[0], VSUID | buf.st_mode);
fprintf( stderr, "%s: Set owner to root.bin (0.3), SET-UID root.\n",
[NXApp appName]);
[installSelfMenuItem setTitle: "Already installed SET-UID"];
[installSelfMenuItem setEnabled: NO];
NXRunAlertPanel("Installation Successful", "Program installed "
"successfully.", "OK", NULL, NULL);
return self;
}
- appDidInit: sender
{
static NXDefaultsVector myDefaults =
{
{ "License", "0000000000"},
{ "Key", "-"},
{ NULL}
};
NXRegisterDefaults( [NXApp appName], myDefaults);
return [self inquireAll: self];
}
- inquireAll:sender
{
int target, tmp, tmp2, num_mp;
FILE *mp;
struct mntent *mepp; // mount entry pointer
struct mountentry mep[7];
id titles[8] = {Title0, Title1, Title2, Title3, Title4,
Title5, Title6, Title7};
struct passwd entry;
const char *guess;
char *cp;
static BOOL check = NO, modal = NO;
// if we are sticky root then we should verify
if( getuid() != 0 && geteuid() == 0 && check == NO)
{
entry = * getpwuid(0);
guess = [passwordText stringValue];
cp = crypt ((char *) guess, entry.pw_passwd);
if (strcmp (cp, entry.pw_passwd))
{
NXBeep();
check = NO;
[passwordPanel makeKeyAndOrderFront: self];
[passwordText setStringValue: ""];
[passwordText setTextGray: NX_WHITE];
[passwordText selectText: self];
if( !modal )
{
modal = YES;
[NXApp runModalFor: passwordPanel];
}
return nil;
}
else
{
if( modal )
[NXApp stopModal];
modal = NO;
[passwordPanel close];
check = YES;
}
}
for( target = 0; target < 7; target ++)
[self inquireTarget: target];
#ifdef DEBUG
fprintf(stderr,"Figuring out mount entries.\n" );
#endif DEBUG
if( (mp = setmntent( "/etc/mtab", "r")) == NULL )
{
NXRunAlertPanel("File system error", "Could not open "
"mount table.", "Quit", NULL, NULL );
exit(1);
}
num_mp = 0;
for(; (mepp = getmntent( mp )) != NULL; )
{
strcpy( mep[num_mp].mnt_fsname, mepp->mnt_fsname );
strcpy( mep[num_mp].mnt_dir, mepp->mnt_dir );
strcpy( mep[num_mp].mnt_type, mepp->mnt_type );
strcpy( mep[num_mp].mnt_opts, mepp->mnt_opts );
mep[num_mp].mnt_freq = mepp->mnt_freq;
mep[num_mp].mnt_passno = mepp->mnt_passno;
#ifdef DEBUG
fprintf(stderr, "%d: Fsname = <%s>, dir = <%s>\n",
num_mp, mep[num_mp].mnt_fsname, mep[num_mp].mnt_dir );
#endif
if( strncmp( mep[num_mp].mnt_fsname, "/dev/sd", 7 ) == 0 ||
strncmp( mep[num_mp].mnt_fsname, "/dev/rsd", 8 ) == 0)
{
#ifdef DEBUG
fprintf(stderr, "Mount point %d:%s is SCSI\n",
num_mp, mep[num_mp].mnt_fsname);
fprintf(stderr, "Type = <%s>, opts = <%s>\n",
mep[num_mp].mnt_type,
mep[num_mp].mnt_opts);
#endif
num_mp ++;
}
}
endmntent ( mp );
tmp = 0;
for( target = 0; target < 7; target ++)
{
devInfo[target].mounted = NO;
if( devInfo[target].deviceValid && (
devInfo[target].ir.ir_devicetype == DEVTYPE_DISK ||
devInfo[target].ir.ir_devicetype == DEVTYPE_OPTICAL ||
devInfo[target].ir.ir_devicetype == DEVTYPE_CDROM
))
{
sprintf(devInfo[target].rawDevice,
"/dev/rsd%dh", tmp);
sprintf(devInfo[target].blockDevice,
"/dev/sd%da", tmp);
tmp ++;
#ifdef DEBUG
fprintf(stderr, "Target %d is raw disk <%s>\n",
target, devInfo[target].rawDevice );
#endif
devInfo[target].mounted = NO;
for( tmp2 = 0; tmp2 < num_mp; tmp2 ++ )
{
if( strcmp( devInfo[target].blockDevice,
mep[tmp2].mnt_fsname) == 0 ||
strcmp( devInfo[target].rawDevice,
mep[tmp2].mnt_fsname) == 0)
{
devInfo[target].mounted = YES;
#ifdef DEBUG
fprintf(stderr,
"Drive <%s> mounted! "
"Mount type = <%s>, "
"Opts = <%s>\n"
,
mep[tmp2].mnt_fsname,
mep[tmp2].mnt_type,
mep[tmp2].mnt_opts);
#endif
break;
}
}
}
if( devInfo[target].deviceValid &&
[controlWindow acceptsDeviceType:
(int) devInfo[target].ir.ir_devicetype
andMounted: devInfo[target].mounted ] )
{
if( devInfo[target].mounted )
[titles[target] setTextGray: NX_DKGRAY];
else
[titles[target] setTextGray: NX_BLACK];
}
else
{
[titles[target] setTextGray: NX_WHITE];
}
}
return self;
}
- inquireTarget: (int) target
{
id titles[8] = {Title0, Title1, Title2, Title3, Title4,
Title5, Title6, Title7};
SCSI *scsi;
struct inquiry_reply ibuffer;
static char vendorBuffer[50], typeBuffer[20];
static char tiffBuffer[25];
scsi = [SCSI new];
[scsi openSCSI];
if( [scsi setTarget: target lun: 0] == 0 )
{
int sleeper, error;
for( sleeper = 0; sleeper < SLEEPLOOP; sleeper ++ )
{
error = [scsi inquirySCSI: &ibuffer];
#ifdef DEBUG
fprintf(stderr,"%d: Targ %d, error = %d\n",
sleeper, target,error
);
#endif
if( error == SR_IOST_GOOD ) // no error
break;
if( error == SR_IOST_SELTO ) // no device
{
sleeper = -1; // fake no device
break;
}
usleep( SLEEPTIME );
}
if( sleeper < SLEEPLOOP && sleeper != -1)
{
#ifdef DEBUG
fprintf(stderr,
"Target = %d Lun = %d\n"
"Device type = 0x%x\n"
"ANSI Version Number = %d\n"
"Additional List Length = %d\n"
"Vendor ID = <%.8s>\n"
"Product ID = <%.16s>\n"
"Revision = <%.4s>\n"
"-----------------------\n",
target, 0,
(unsigned int) ibuffer.ir_devicetype,
ibuffer.ir_ansiversion,
ibuffer.ir_addlistlen,
ibuffer.ir_vendorid,
ibuffer.ir_productid,
ibuffer.ir_revision);
#endif
sprintf(vendorBuffer,"%.8s\n%.16s",
ibuffer.ir_vendorid,
ibuffer.ir_productid);
sprintf(devInfo[target].vendorID, "%.8s",
ibuffer.ir_vendorid);
sprintf(devInfo[target].productID,"%.16s",
ibuffer.ir_productid);
removeLastSpace( devInfo[target].vendorID, 8);
removeLastSpace( devInfo[target].productID, 16);
strcpy( typeBuffer,
[scsi identifyDeviceType: &ibuffer]);
devInfo[target].removable = ibuffer.ir_removable;
devInfo[target].deviceValid = YES;
devInfo[target].ir = ibuffer;
}
else
{
sprintf(vendorBuffer, "No device");
sprintf(typeBuffer, "No-Device");
devInfo[target].deviceValid = NO;
}
}
else
{
sprintf(vendorBuffer, "Cannot access");
sprintf(typeBuffer, "Cannot-Access");
devInfo[target].deviceValid = NO;
}
[titles[target] setStringValue: vendorBuffer];
sprintf(tiffBuffer,"%s.tiff", typeBuffer);
[[deviceButtonMatrix findCellWithTag: target] setIcon: typeBuffer];
NXPing();
[scsi closeSCSI];
[scsi free];
return self;
}
- inquireSelected: sender
{
int t;
if( [self inquireTarget: [deviceButtonMatrix selectedTag]]
== nil) // no device found
{
NXRunAlertPanel ("No device","There is no SCSI device "
"at this target number", "OK", NULL, NULL);
[controlWindow close];
return nil;
}
t = [deviceButtonMatrix selectedTag]; // target
if( [controlWindow acceptsDeviceType: [self targetDeviceType: t]
andMounted: [self targetIsMounted: t]] &&
[controlWindow setTarget: t lun: 0])
{
[controlWindow makeKeyAndOrderFront: self];
}
else
{
[controlWindow close];
NXBeep();
return nil;
}
if( controlWindow == nil)
{
NXRunAlertPanel("License Expiration", "Your evaluation "
"copy has expired. Please contact your distributor "
"for a full license.", "Quit", NULL, NULL );
exit(1);
}
return self;
}
- (BOOL) targetIsMounted: (int) targ { return devInfo[targ].mounted; }
- (BOOL) targetRemovable: (int) targ { return devInfo[targ].removable; }
- (int) targetDeviceType: (int) targ
{ return devInfo[targ].ir.ir_devicetype; }
- (char *) targetRawDevice: (int) targ
{ return devInfo[targ].rawDevice; }
- (char *) targetVendorID: (int) targ
{ return devInfo[targ].vendorID; }
- (char *) targetProductID: (int) targ
{ return devInfo[targ].productID; }
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.