windows-nt/Source/XPSP1/NT/sdktools/windiff/client/sum.c
2020-09-26 16:20:57 +08:00

116 lines
2.1 KiB
C

/*
* basic client for sumserve remote checksum server
*
*
* sends a request over a named pipe for a list of files and checksums,
* and printf's the returned list
*/
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include "..\server\sumserve.h"
#include "ssclient.h"
extern int __argc;
extern char ** __argv;
/* program entry point
*
* creates the named pipe, and loops waiting for client connections and
* calling ss_handleclient for each connection. only exits when told
* to by a client.
*
* currently permits only one client connection at once.
*/
int PASCAL
WinMain (HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpszCmdParam,
int nCmdShow)
{
HANDLE hpipe;
SSRESPONSE resp;
PSTR tag;
/* we expect two args: the server name, and the pathname */
if (__argc != 3) {
printf("usage: client <servername> <pathname>");
return(1);
}
hpipe = ss_connect(__argv[1]);
if (hpipe == INVALID_HANDLE_VALUE) {
printf("cannot connect to server %s\n", __argv[1]);
return(2);
}
/* make a packet to send */
if (!ss_sendrequest(hpipe, SSREQ_SCAN, __argv[2], strlen(__argv[2])+1)) {
printf("pipe write error %d\n", GetLastError());
return(3);
}
/* loop reading responses */
for (; ;) {
if (!ss_getresponse(hpipe, &resp)) {
printf("pipe read error %d\n", GetLastError());
return(4);
}
if (resp.lCode == SSRESP_END) {
printf("-----------------end of list");
break;
}
switch(resp.lCode) {
case SSRESP_ERROR:
tag = "ERROR";
printf("%s\t\t\t%s\n", tag, resp.szFile);
break;
case SSRESP_DIR:
tag = "dir";
printf("%s\t\t\t%s\n", tag, resp.szFile);
break;
case SSRESP_FILE:
tag = "file";
printf("%s\t%08lx\t%d bytes\t%s\n", tag, resp.ulSum, resp.ulSize, resp.szFile);
break;
}
}
ss_terminate(hpipe);
return(0);
}
/* error output functions - called by the ssclient library functions
*
* defined here so the library can be called from cmdline and windows
* programs.
*
*/
BOOL
Trace_Error(LPSTR str, BOOL fCancel)
{
printf("%s\n", str);
return(TRUE);
}
/*
* status update messages
*/
void
Trace_Status(LPSTR str)
{
printf("%s\n", str);
}