Пример #1
0
int DPTDriveBusy::drvBusy(int hba, int bus, int target, int lun)
{	char          * Targets[2];
	char         ** Dirs[sizeof(Targets)/sizeof(Targets[0])];
	char         ** Suffixes[sizeof(Targets)/sizeof(Targets[0])];
	int		        SuffixIndex;
	DPTDeviceList * Mounts = (DPTDeviceList *)NULL;
	int             RetVal = -1;

	/* Initialize the local structures */
	Targets[0] = getTargetString(hba, bus, target, lun);
	Dirs[0] = TargetStringDirs;
	Suffixes[0] = TargetStringSuffixes;
	Targets[1] = getTargetPath(hba, bus, target, lun);
	Dirs[1] = TargetPathDirs;
	Suffixes[1] = TargetPathSuffixes;

	for (SuffixIndex = 0;;) {
		while (Targets[0] == (char *)NULL) {
			int Index, NoneZero = 0;

			for (Index = sizeof(Targets)/sizeof(Targets[0]); Index; --Index) {
				if ((Targets[Index-2] = Targets[Index-1]) != (char *)NULL) {
					++NoneZero;
				}
				Targets[Index-1] = (char *)NULL;
				Dirs[Index-2] = Dirs[Index-1];
				Suffixes[Index-2] = Suffixes[Index-1];
			}
			if (NoneZero == 0) {
				break;
			}
		}
		if (Targets[0] == (char *)NULL) {
			break;
		}

		/* Check if the Dirs/Targets entry exists */
		{	char * name = new char[strlen(Dirs[0][0]) + strlen(Targets[0])
			  + strlen(Suffixes[0][SuffixIndex]) + 1];

			if (name == (char *)NULL) {
				RetVal = -2;
				break;
			}
			(void)strcat(strcat(strcpy(name,
			  Dirs[0][0]), Targets[0]), Suffixes[0][SuffixIndex]);
			switch(PathExists(name)) {
	    	case PathExists_Exists:
		    case PathExists_Read:
		    case PathExists_Open:
				/* Check if the Dirs/Target entry is mounted */
				if (Mounts == (DPTDeviceList *)NULL) {
					FILE * fp = SafePopenRead("mount | sed -n '"
					  "s/^\\([^ 	][^ 	]*\\)[ 	][ 	]*on[ 	][ 	]*\\([^ 	][^ 	]*\\).*/\\1 \\2/p'");
					char * Buffer = new char[512];

					while (fgets (Buffer, 512, fp)) {
						if (newDeviceList (&Mounts, Buffer)) {
							RetVal = -2;
						}
					}
					SafePclose(fp);
					if (RetVal == -1) {
						RetVal = 0;
					}
#					if (defined(DEBUG) && (DEBUG > 0))
						if (Mounts != (DPTDeviceList *)NULL) {
						    DPTDeviceList * List = Mounts;
							DPTDeviceList * Link;

						    printf ("Mount list:\n");
							do {
								printf ("%s", List->Name);
								if ((List->Major == -2)
								 && (List->Minor == -2)) {
									printf ("/");
								} else if ((List->Major != -1)
								 || (List->Minor != -1)) {
									printf ("(%d,%d)",
									  List->Major, List->Minor);
								}
								if ((Link = List->Link)
								  == (DPTDeviceList *)NULL) {
									printf ("\n");
									Link = List->Next;
								} else {
									printf (", ");
								}
							} while ((List = Link) != (DPTDeviceList *)NULL);
						}
#					endif
				}
				/* We have an initialized mount database, search! */
				{
					DPTDeviceList * Link;
					DPTDeviceList * Names = (DPTDeviceList *)NULL;

					newDeviceList (&Names, name);
					for (Link = Mounts; Link != (DPTDeviceList *)NULL; ) {
						DPTDeviceList * Next;
                        DPTDeviceList *Name;
						for (Name = Names;
						  (Name = Name->Link) != (DPTDeviceList *)NULL; ) {
							/* Same name, or same device */
							if ((strcmp (Name->Name, Link->Name) == 0)
							 || ((Name->Major == Link->Major)
							  && (Name->Minor == Link->Minor))) {
								break;
							}
						}
						if (Name != (DPTDeviceList *)NULL) {
							RetVal = 1;
							break;
						}
						if ((Next = Link->Link) == (DPTDeviceList *)NULL) {
							Next = Link->Next;
						}
						Link = Next;
					}
					deleteDeviceList (Names);
				}
				break;
				
		    case PathExists_Busy:
				RetVal = 1;	/* It's busy even before we hit the ground */
			case PathExists_None:
				break;
			}
			delete [] name;
		}

		if ((RetVal != -1) && (RetVal != 0)) {
			break;
		}
		/* Try next */
		if (Suffixes[0][++SuffixIndex] == (char *)NULL) {
			SuffixIndex = 0;
			if ((++(Dirs[0]))[0] == (char *)NULL) {
				delete [] Targets[0];
				Targets[0] = (char *)NULL;
			}
		}
	}
	/* Free up resources */
	{	int Index;

		for (Index = 0; Index < (sizeof(Targets)/sizeof(Targets[0])); ++Index) {
			if (Targets[Index] != (char *)NULL) {
				delete [] Targets[Index];
			}
		}
	}
	deleteDeviceList (Mounts);

	return (RetVal);
}
void AardvarkCareTaker::deInit()
{
	deleteDeviceList();
	pthread_mutex_destroy(&dLmutex);
}