294 lines
7.2 KiB
C
294 lines
7.2 KiB
C
/*++
|
|
|
|
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);
|
|
}
|
|
|