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); }