home *** CD-ROM | disk | FTP | other *** search
- /* *********************************************************************
- * WHOHAS is a utility to determine whether or not someone else on the
- * network is using a file, and if they are to alert them to the fact
- * that you would like to use the file.
- ***********************************************************************/
- #include <stdio.h>
- #include <nit.h>
-
- char path[255], server[48]; /* for parsing path */
- char volume[16], directories[255];
-
- /* for conns. using file call */
- WORD connectionID; /* server ID number */
- BYTE directoryHandle; /* handle number at server */
- char filePath[255];
- int lastRecord, taskID; /* end of reply/buffers indicators */
- CONN_USING_FILE fileUse; /* the data structure */
-
- /* for connection info. call */
- char objectName[48]; /* bindery name of user */
- int objectType;
- long objectID;
- BYTE loginTime[7];
-
- /* for send message call */
- char message[56]; /* place for message text */
- WORD connectionList[100]; /* list of workstation connection IDs */
- BYTE resultList[100]; /* completion codes for broadcast */
- WORD connectionCount;
-
- ErrorOut(char *errorString, int errorLevel)
- {
- printf("%s\n", errorString);
- exit(errorLevel);
- }
-
- main(int argc, char *argv[])
- {
- unsigned ccode;
- char ch;
- int i;
-
- if (argc!=2)
- {
- printf("Usage: whohas filename.\n");
- exit(0);
- }
- strcpy(filePath, argv[1]);
- if (ConvertNameToFullPath(filePath, path))
- ErrorOut("Invalid filename/path.", 1);
-
- ParsePath(filePath, server, volume, directories);
- if (strlen(server)==0)
- ErrorOut("Please indicate a file on a network drive.", 1);
-
- if (GetConnectionID(server, &connectionID))
- ErrorOut("Invalid server.", 1);
-
- directoryHandle = 0; /* use null handle since path is full */
- taskID = lastRecord = 0; /* get first buffer in first reply */
- connectionCount = 0; /* start counting connections from 0 */
- do
- { /* here's where all the real work gets done */
- ccode = GetConnectionsUsingFile(connectionID, &lastRecord, &taskID,
- directoryHandle, path, sizeof(fileUse), &fileUse);
- if (fileUse.logicalConnNumber)
- connectionList[connectionCount++] = fileUse.logicalConnNumber;
- } while (taskID || lastRecord);
-
- /* if file is in use, print users and allow message send */
- if (connectionCount)
- { /* direct these bindery requests to correct server */
- SetPreferredConnectionID(connectionID);
- for (i=0; i<connectionCount; i++)
- {
- ccode = GetConnectionInformation(connectionList[i], objectName,
- &objectType, &objectID, loginTime);
- printf("User %s is using file %s.\n", objectName, filePath);
- }
- printf("Send a message to persons using the file? (y/n)");
- while(!kbhit())
- ;
- ch = getche(); /* get & echo response */
- printf("\n");
- if (ch=='y' || ch=='Y')
- { /* message can go to end of line (56 chars) */
- printf("Enter a short message =>");
- gets(message); /* send the message to the whole list */
- ccode = SendBroadcastMessage(message, connectionList, resultList,
- connectionCount);
- /* I ignore the resultList of completion codes */
- }
- }
- else
- printf("Nobody is currently using file %s.\n", filePath);
- return(0);
- }