summaryrefslogtreecommitdiffstats
path: root/src/ccapi/server/win/ccs_request_proc.c
blob: 40713fb502c214898448e41746d6d85829bd3e9c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*

 * $Header$

 *

 * Copyright 2008 Massachusetts Institute of Technology.

 * All Rights Reserved.

 *

 * Export of this software from the United States of America may

 * require a specific license from the United States Government.

 * It is the responsibility of any person or organization contemplating

 * export to obtain such a license before exporting.

 *

 * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and

 * distribute this software and its documentation for any purpose and

 * without fee is hereby granted, provided that the above copyright

 * notice appear in all copies and that both that copyright notice and

 * this permission notice appear in supporting documentation, and that

 * the name of M.I.T. not be used in advertising or publicity pertaining

 * to distribution of the software without specific, written prior

 * permission.  Furthermore if you modify this software you must label

 * your software as modified software and not distribute it in such a

 * fashion that it might be confused with the original M.I.T. software.

 * M.I.T. makes no representations about the suitability of

 * this software for any purpose.  It is provided "as is" without express

 * or implied warranty.

 */

#include <stdlib.h>

#include <stdio.h>


#include "ccs_request.h"    // header file generated by MIDL compiler

#include "cci_debugging.h"

#include "WorkQueue.h"

#include "win-utils.h"

#include "ccs_win_pipe.h"


void ccs_rpc_request(
    const long  rpcmsg,             /* Message type */
    const char  tspHandle[],        /* Client's tspdata* */
    const char* pszUUID,            /* Where client will listen for the reply */
    const long  lenRequest,         /* Length of buffer */
    const char  pbRequest[],        /* Data buffer */
    const long  serverStartTime,    /* Which server session we're talking to */
    long*       return_status ) {   /* Return code */

    cc_int32        status  = 0;
    cci_stream_t    stream;
    DWORD*          p       = (DWORD*)(tspHandle);
    WIN_PIPE*       pipe    = NULL;

    cci_debug_printf("%s rpcmsg:%d; UUID:<%s> SST:<%s>", 
        __FUNCTION__, rpcmsg, pszUUID, serverStartTime);

    status = (rpcmsg != CCMSG_REQUEST) && (rpcmsg != CCMSG_PING);
    
    if (!status) {                         
        status = cci_stream_new (&stream);  /* Create a stream for the request data */
        }

    if (!status) {                          /* Put the data into the stream */
        status = cci_stream_write (stream, pbRequest, lenRequest);
        }

    pipe = ccs_win_pipe_new(pszUUID, *p);    
    worklist_add(rpcmsg, pipe, stream, serverStartTime);
    *return_status = status;
    }


void ccs_rpc_connect(
    const long  rpcmsg,             /* Message type */
    const char  tspHandle[],        /* Client's tspdata* */
    const char* pszUUID,            /* Data buffer */
    long*       return_status ) {   /* Return code */

    DWORD*      p       = (DWORD*)(tspHandle);
    WIN_PIPE*   pipe    = ccs_win_pipe_new(pszUUID, *p);

    cci_debug_printf("%s; rpcmsg:%d; UUID: <%s>", __FUNCTION__, rpcmsg, pszUUID);

    worklist_add(   rpcmsg, 
                    pipe,
                    NULL,               /* No payload with connect request */
                    (const time_t)0 );  /* No server session number with connect request */
    }


// 'Authentication' is client setting a value in a file and the server

//   returning that value plus one.

CC_UINT32 ccs_authenticate(const CC_CHAR* name) {
    HANDLE      hMap    = 0;
    PDWORD      pvalue  = 0;
    CC_UINT32   result  = 0;
    DWORD       status  = 0;

    cci_debug_printf("%s ( %s )", __FUNCTION__, name);

    hMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, (LPSTR)name);
    status  = !hMap;

    if (!status) {
        pvalue = (PDWORD)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);
        status = !pvalue;
        }

    if (!status) {
        *pvalue += 1;
        result = *pvalue;
        }

    if (pvalue) {
        UnmapViewOfFile(pvalue);
        }

    if (hMap) CloseHandle(hMap);
    return result;
    }