windows-nt/Source/XPSP1/NT/com/rpc/uuidgen/uuidgen.c

294 lines
7.2 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (C) Microsoft Corporation, 1992 - 1999
Module Name:
uuidgen.c {v1.00}
Abstract:
usage: uuidgen [-xisconvh?]
x - Generate sequential (V1) UUIDs
i - Output UUID in an IDL interface template
s - Output UUID as an initialized C struct
c - Output UUID in upper case
o<filename> - redirect output to a file, specified immediately after o
n<number> - Number of UUIDs to generate, specified immediately after n
v - display version information about uuidgen
h,? - Display command option summary
This command-line program simply uses the procedure I_UuidStringGenerate
to output one or more UUIDs in one of the formats normal, IDL, or C struct.
This code should build under nt to nt and nmake under os2 to dos.
Requires uuidfmt.c.
Author:
Joev Dubach (t-joevd) 6/11/92
Revision History:
--*/
//
// Inclusions
//
// The order in which these includes are performed seems, after
// extensive testing and analysis, to be highly crucial to an
// NT build.
#include <sysinc.h>
#include <rpc.h>
#include <uuidfmt.h>
#include <stdio.h>
#include <stdlib.h>
#include <common.ver>
//
// Defines
//
#define IDL_BIT_FLAG 0x01
#define CSTRUCT_BIT_FLAG 0x02
#define SEQUENTIAL_UUIDS 0x04
#define UPPER_CASE_UUIDS 0x08
#define BAD_SWITCH_STR "Invalid Switch Usage: %s\n\n"
#define CANNOT_OPEN_STR "Cannot open output file: %s\n\n"
#define TOO_SMALL_STR "Argument to %s must be an integer greater than 0.\n\n"
#define VERSION_INFO_STR \
"Microsoft UUID Generator v1.01 " \
VER_LEGALCOPYRIGHT_STR \
"\n\n"
#define BAD_ARGS_STR "The arguments i and s are mutually exclusive.\n\n"
#define NO_ADDRESS_STR \
"Cannot find the RPC End Point Mapper (RPCSS.EXE); Unable to allocate UUIDs.\n\n"
#define OUT_OF_MEMORY_STR \
"Unable to allocate enough memory to create string.\n\n"
#define LOCAL_ONLY_STR \
"Warning: Unable to determine your network address. The UUID generated is\n" \
"unique on this computer only. It should not be used on another computer.\n"
//
// Function prototypes.
//
#ifdef NTENV
int __cdecl
#else // NTENV
int
#endif // NTENV
main(
int argc,
char **argv
);
void Usage(void);
void ErrorUsageAndExit(void);
void NoErrorUsageAndExit(void);
//
// Global variables
//
FILE * OutputFile = stdout;
#ifdef NTENV
int __cdecl
#else // NTENV
int
#endif // NTENV
main(
int argc,
char **argv
)
{
int ConditionFlags = 0; // Holds conditions IDL_BIT_FLAG and
// CSTRUCT_BIT_FLAG.
char MyUuidString[255]; // The UUID string returned by
// I_UuidStringGenerate.
int NumberOfUuids = 1; // How many to make.
int i; // Current arg#.
int Flag; // UUID Format requested.
RPC_STATUS Result;
int FirstTime = 1;
//
// Parse the command line.
//
for (i=1;argc-i;i++)
{
//
// Make sure arg is in proper format.
//
if ( (argv[i][0] != '/') && (argv[i][0] != '-') )
{
fprintf(stderr, BAD_SWITCH_STR, argv[i]);
ErrorUsageAndExit();
}
//
// Which arg is it?
//
switch (argv[i][1])
{
case 'c':
case 'C':
ConditionFlags |= UPPER_CASE_UUIDS;
break;
case 'I':
case 'i':
ConditionFlags |= IDL_BIT_FLAG;
break;
case 'S':
case 's':
ConditionFlags |= CSTRUCT_BIT_FLAG;
break;
case 'O':
case 'o':
OutputFile = fopen(argv[i]+2, "wt");
if (OutputFile == NULL)
{
fprintf(stderr,CANNOT_OPEN_STR, argv[i]+2);
exit(1);
}
break;
case 'N':
case 'n':
NumberOfUuids = atoi(argv[i]+2);
if (NumberOfUuids <= 0)
{
fprintf(stderr, TOO_SMALL_STR, argv[i-1]);
ErrorUsageAndExit();
}
break;
case 'x':
case 'X':
ConditionFlags |= SEQUENTIAL_UUIDS;
break;
case 'V':
case 'v':
fprintf(OutputFile, VERSION_INFO_STR);
exit(0);
case 'H':
case 'h':
case '?':
NoErrorUsageAndExit();
default:
fprintf(stderr, BAD_SWITCH_STR, argv[i]);
ErrorUsageAndExit();
} // switch
} // for
//
// Fulfill the user's request
//
if ((ConditionFlags & IDL_BIT_FLAG) && (ConditionFlags & CSTRUCT_BIT_FLAG))
{
fprintf(stderr,BAD_ARGS_STR);
ErrorUsageAndExit();
}
if (ConditionFlags & IDL_BIT_FLAG)
{
Flag = UUIDGEN_FORMAT_IDL;
}
else if (ConditionFlags & CSTRUCT_BIT_FLAG)
{
Flag = UUIDGEN_FORMAT_CSTRUCT;
}
else
{
Flag = UUIDGEN_FORMAT_PLAIN;
}
for (;NumberOfUuids;NumberOfUuids--)
{
Result = I_UuidStringGenerate(
Flag,
(ConditionFlags & SEQUENTIAL_UUIDS) != 0,
(ConditionFlags & UPPER_CASE_UUIDS) != 0,
MyUuidString,
"INTERFACENAME"
);
ASSERT((Result == RPC_S_OK)
|| (Result == RPC_S_UUID_LOCAL_ONLY)
|| (Result == RPC_S_OUT_OF_MEMORY)
|| (Result == RPC_S_UUID_NO_ADDRESS));
switch(Result)
{
case RPC_S_OUT_OF_MEMORY:
fprintf(stderr,OUT_OF_MEMORY_STR);
exit(1);
case RPC_S_UUID_NO_ADDRESS:
fprintf(stderr,NO_ADDRESS_STR);
exit(1);
case RPC_S_UUID_LOCAL_ONLY:
if (FirstTime)
{
fprintf(stderr,LOCAL_ONLY_STR);
FirstTime = 0;
}
// Fall through to the valid case.
case RPC_S_OK:
fprintf(
OutputFile,
MyUuidString
);
} // end switch
} // end for
return(0);
}
void Usage(void)
{
fprintf(OutputFile, VERSION_INFO_STR
"usage: uuidgen [-xisconvh?]\n"
"\tx - Generate sequential (V1) UUIDs\n"
"\ti - Output UUID in an IDL interface template\n"
"\ts - Output UUID as an initialized C struct\n"
"\tc - Output UUID in upper case\n"
"\to<filename> - redirect output to a file, specified immediately after o\n"
"\tn<number> - Number of UUIDs to generate, specified immediately after n\n"
"\tv - display version information about uuidgen\n"
"\th,? - Display command option summary\n"
);
}
void ErrorUsageAndExit(void)
{
OutputFile = stderr;
Usage();
exit(1);
}
void NoErrorUsageAndExit(void)
{
Usage();
exit(0);
}