///**************************************************************
///          Microsoft LAN Manager          *
///        Copyright(c) Microsoft Corp., 1990-1992       *
///**************************************************************
//
//  Add and delete access record
//

#include <nt.h> // TIME definition
#include <ntrtl.h>      // TIME definition
#include <nturtl.h>     // TIME definition
#define NOMINMAX        // Avoid redefinition of min and max in stdlib.h
#include        <windef.h>

#include        <stdio.h>
#include        <stdlib.h>
#include        <string.h>
#include        <lmcons.h>
#include        <lmapibuf.h>
#include        <netlib.h>
#include        <netdebug.h>
#include        <lmaccess.h>
#include        <lmerr.h>

#include <ntsam.h>
#include <netlogon.h>
#include <logonp.h>


#define     TEST_USER1  L"USER1"
#define     TEST_PERM1  07
#define     TEST_PERM2  31
#define     TEST_PERM3  63
#define     TEST_RESOURCE   L"C:\\UASTEST"



//
//  AddAccess
//
//
void
AddAccess(server, username, resource, perms)
LPWSTR   server;
LPWSTR   resource;
LPWSTR   username;
DWORD    perms;
{
    NET_API_STATUS err;
    char    ebuf[512];
    PACCESS_INFO_1 acc = (PACCESS_INFO_1) ebuf;
    PACCESS_LIST acl;


    acc->acc1_resource_name = resource;
    acc->acc1_attr = 1;
    acc->acc1_count = 1;

    acl = (PACCESS_LIST) (ebuf + sizeof(ACCESS_INFO_1));
    acl->acl_ugname = username;
    acl->acl_access = perms;

    if (err = NetAccessAdd(server, 1, ebuf, NULL ))
        NetpKdPrint(("NetAccessAdd failed, ret = %d\n", err));
    else
        NetpKdPrint(("%ws added successfully\n", resource));
}


//
//  DelAccess
//
void
DelAccess(server, resource)
LPWSTR server;
LPWSTR resource;
{
    NET_API_STATUS err;

    if (err = NetAccessDel(server, resource))
        NetpKdPrint(("NetAccessDel failed, ret = %d\n", err));
    else
        NetpKdPrint(("%ws deleted successfully\n", resource));
}


//
//  GetAccess
//
void
GetAccess(server, resource)
LPWSTR server;
LPWSTR resource;
{
    NET_API_STATUS err;
    LPBYTE buf;
    DWORD   level;



    for (level = 0; level < 2; level++) {
        if (err = NetAccessGetInfo(server, resource, level, &buf))
            NetpKdPrint(("NetAccessGetInfo failed, ret = %d\n", err));
        else {
            NetpKdPrint(("NetAccessGetInfo: Level %d OK\n", level));
            NetApiBufferFree( buf );
        }
    }
}


//
//  main driver for NetAccessAdd and NetAccessDel tests
//
//
void
main(argc, argv)
int argc;
char    **argv;
{
    LPWSTR resource;
    LPWSTR user;
    LPWSTR server;
    DWORD   perm;

    if ((argc == 1) || (*argv[1] == '?')) {
        printf("usage: uastest6 resource user perms server\n");
        exit(0);
    }

    resource = TEST_RESOURCE;
    user = TEST_USER1;
    perm = TEST_PERM1;
    server = NULL;

    if (argv[1] != NULL) {
        resource = NetpLogonOemToUnicode(argv[1]);
        if (argv[2] != NULL) {
            user = NetpLogonOemToUnicode(argv[2]);
            if (argv[3] != NULL) {
                perm = atoi(argv[3]) & 0x3F;
                if (argv[4] != NULL)
                    server = NetpLogonOemToUnicode(argv[4]);
            }
        }
    }

    AddAccess(server, user, resource, perm);

    GetAccess(server, resource);

    DelAccess(server, resource);

}