Generate libvirt constants from libvirt sources.
- Add a yacc-based parser and a hand-written lexer to read the remote_protocol.x file from libvirt's sources. - Use the new parser to generate the constants used to communicate with libvirt.
This commit is contained in:
parent
8b2644f7ff
commit
5a6654f07a
474
internal/constants/constants.gen.go
Normal file
474
internal/constants/constants.gen.go
Normal file
@ -0,0 +1,474 @@
|
||||
/*
|
||||
* This file generated by internal/lvgen/generate.go. DO NOT EDIT BY HAND!
|
||||
*
|
||||
* To regenerate, run 'go generate' in internal/lvgen.
|
||||
*/
|
||||
package constants
|
||||
|
||||
// libvirt procedure identifiers and other enums
|
||||
//
|
||||
// These are libvirt procedure numbers which correspond to each respective
|
||||
// API call between remote_internal driver and libvirtd. Each procedure is
|
||||
// identified by a unique number which *may change in any future libvirt
|
||||
// update*.
|
||||
//
|
||||
// Examples:
|
||||
// REMOTE_PROC_CONNECT_OPEN = 1
|
||||
// REMOTE_PROC_DOMAIN_DEFINE_XML = 11
|
||||
// REMOTE_PROC_DOMAIN_MIGRATE_SET_MAX_SPEED = 207,
|
||||
const (
|
||||
// From enums:
|
||||
AuthNone = 0
|
||||
AuthSasl = 1
|
||||
AuthPolkit = 2
|
||||
ProcConnectOpen = 1
|
||||
ProcConnectClose = 2
|
||||
ProcConnectGetType = 3
|
||||
ProcConnectGetVersion = 4
|
||||
ProcConnectGetMaxVcpus = 5
|
||||
ProcNodeGetInfo = 6
|
||||
ProcConnectGetCapabilities = 7
|
||||
ProcDomainAttachDevice = 8
|
||||
ProcDomainCreate = 9
|
||||
ProcDomainCreateXML = 10
|
||||
ProcDomainDefineXML = 11
|
||||
ProcDomainDestroy = 12
|
||||
ProcDomainDetachDevice = 13
|
||||
ProcDomainGetXMLDesc = 14
|
||||
ProcDomainGetAutostart = 15
|
||||
ProcDomainGetInfo = 16
|
||||
ProcDomainGetMaxMemory = 17
|
||||
ProcDomainGetMaxVcpus = 18
|
||||
ProcDomainGetOsType = 19
|
||||
ProcDomainGetVcpus = 20
|
||||
ProcConnectListDefinedDomains = 21
|
||||
ProcDomainLookupByID = 22
|
||||
ProcDomainLookupByName = 23
|
||||
ProcDomainLookupByUUID = 24
|
||||
ProcConnectNumOfDefinedDomains = 25
|
||||
ProcDomainPinVcpu = 26
|
||||
ProcDomainReboot = 27
|
||||
ProcDomainResume = 28
|
||||
ProcDomainSetAutostart = 29
|
||||
ProcDomainSetMaxMemory = 30
|
||||
ProcDomainSetMemory = 31
|
||||
ProcDomainSetVcpus = 32
|
||||
ProcDomainShutdown = 33
|
||||
ProcDomainSuspend = 34
|
||||
ProcDomainUndefine = 35
|
||||
ProcConnectListDefinedNetworks = 36
|
||||
ProcConnectListDomains = 37
|
||||
ProcConnectListNetworks = 38
|
||||
ProcNetworkCreate = 39
|
||||
ProcNetworkCreateXML = 40
|
||||
ProcNetworkDefineXML = 41
|
||||
ProcNetworkDestroy = 42
|
||||
ProcNetworkGetXMLDesc = 43
|
||||
ProcNetworkGetAutostart = 44
|
||||
ProcNetworkGetBridgeName = 45
|
||||
ProcNetworkLookupByName = 46
|
||||
ProcNetworkLookupByUUID = 47
|
||||
ProcNetworkSetAutostart = 48
|
||||
ProcNetworkUndefine = 49
|
||||
ProcConnectNumOfDefinedNetworks = 50
|
||||
ProcConnectNumOfDomains = 51
|
||||
ProcConnectNumOfNetworks = 52
|
||||
ProcDomainCoreDump = 53
|
||||
ProcDomainRestore = 54
|
||||
ProcDomainSave = 55
|
||||
ProcDomainGetSchedulerType = 56
|
||||
ProcDomainGetSchedulerParameters = 57
|
||||
ProcDomainSetSchedulerParameters = 58
|
||||
ProcConnectGetHostname = 59
|
||||
ProcConnectSupportsFeature = 60
|
||||
ProcDomainMigratePrepare = 61
|
||||
ProcDomainMigratePerform = 62
|
||||
ProcDomainMigrateFinish = 63
|
||||
ProcDomainBlockStats = 64
|
||||
ProcDomainInterfaceStats = 65
|
||||
ProcAuthList = 66
|
||||
ProcAuthSaslInit = 67
|
||||
ProcAuthSaslStart = 68
|
||||
ProcAuthSaslStep = 69
|
||||
ProcAuthPolkit = 70
|
||||
ProcConnectNumOfStoragePools = 71
|
||||
ProcConnectListStoragePools = 72
|
||||
ProcConnectNumOfDefinedStoragePools = 73
|
||||
ProcConnectListDefinedStoragePools = 74
|
||||
ProcConnectFindStoragePoolSources = 75
|
||||
ProcStoragePoolCreateXML = 76
|
||||
ProcStoragePoolDefineXML = 77
|
||||
ProcStoragePoolCreate = 78
|
||||
ProcStoragePoolBuild = 79
|
||||
ProcStoragePoolDestroy = 80
|
||||
ProcStoragePoolDelete = 81
|
||||
ProcStoragePoolUndefine = 82
|
||||
ProcStoragePoolRefresh = 83
|
||||
ProcStoragePoolLookupByName = 84
|
||||
ProcStoragePoolLookupByUUID = 85
|
||||
ProcStoragePoolLookupByVolume = 86
|
||||
ProcStoragePoolGetInfo = 87
|
||||
ProcStoragePoolGetXMLDesc = 88
|
||||
ProcStoragePoolGetAutostart = 89
|
||||
ProcStoragePoolSetAutostart = 90
|
||||
ProcStoragePoolNumOfVolumes = 91
|
||||
ProcStoragePoolListVolumes = 92
|
||||
ProcStorageVolCreateXML = 93
|
||||
ProcStorageVolDelete = 94
|
||||
ProcStorageVolLookupByName = 95
|
||||
ProcStorageVolLookupByKey = 96
|
||||
ProcStorageVolLookupByPath = 97
|
||||
ProcStorageVolGetInfo = 98
|
||||
ProcStorageVolGetXMLDesc = 99
|
||||
ProcStorageVolGetPath = 100
|
||||
ProcNodeGetCellsFreeMemory = 101
|
||||
ProcNodeGetFreeMemory = 102
|
||||
ProcDomainBlockPeek = 103
|
||||
ProcDomainMemoryPeek = 104
|
||||
ProcConnectDomainEventRegister = 105
|
||||
ProcConnectDomainEventDeregister = 106
|
||||
ProcDomainEventLifecycle = 107
|
||||
ProcDomainMigratePrepare2 = 108
|
||||
ProcDomainMigrateFinish2 = 109
|
||||
ProcConnectGetUri = 110
|
||||
ProcNodeNumOfDevices = 111
|
||||
ProcNodeListDevices = 112
|
||||
ProcNodeDeviceLookupByName = 113
|
||||
ProcNodeDeviceGetXMLDesc = 114
|
||||
ProcNodeDeviceGetParent = 115
|
||||
ProcNodeDeviceNumOfCaps = 116
|
||||
ProcNodeDeviceListCaps = 117
|
||||
ProcNodeDeviceDettach = 118
|
||||
ProcNodeDeviceReAttach = 119
|
||||
ProcNodeDeviceReset = 120
|
||||
ProcDomainGetSecurityLabel = 121
|
||||
ProcNodeGetSecurityModel = 122
|
||||
ProcNodeDeviceCreateXML = 123
|
||||
ProcNodeDeviceDestroy = 124
|
||||
ProcStorageVolCreateXMLFrom = 125
|
||||
ProcConnectNumOfInterfaces = 126
|
||||
ProcConnectListInterfaces = 127
|
||||
ProcInterfaceLookupByName = 128
|
||||
ProcInterfaceLookupByMacString = 129
|
||||
ProcInterfaceGetXMLDesc = 130
|
||||
ProcInterfaceDefineXML = 131
|
||||
ProcInterfaceUndefine = 132
|
||||
ProcInterfaceCreate = 133
|
||||
ProcInterfaceDestroy = 134
|
||||
ProcConnectDomainXMLFromNative = 135
|
||||
ProcConnectDomainXMLToNative = 136
|
||||
ProcConnectNumOfDefinedInterfaces = 137
|
||||
ProcConnectListDefinedInterfaces = 138
|
||||
ProcConnectNumOfSecrets = 139
|
||||
ProcConnectListSecrets = 140
|
||||
ProcSecretLookupByUUID = 141
|
||||
ProcSecretDefineXML = 142
|
||||
ProcSecretGetXMLDesc = 143
|
||||
ProcSecretSetValue = 144
|
||||
ProcSecretGetValue = 145
|
||||
ProcSecretUndefine = 146
|
||||
ProcSecretLookupByUsage = 147
|
||||
ProcDomainMigratePrepareTunnel = 148
|
||||
ProcConnectIsSecure = 149
|
||||
ProcDomainIsActive = 150
|
||||
ProcDomainIsPersistent = 151
|
||||
ProcNetworkIsActive = 152
|
||||
ProcNetworkIsPersistent = 153
|
||||
ProcStoragePoolIsActive = 154
|
||||
ProcStoragePoolIsPersistent = 155
|
||||
ProcInterfaceIsActive = 156
|
||||
ProcConnectGetLibVersion = 157
|
||||
ProcConnectCompareCPU = 158
|
||||
ProcDomainMemoryStats = 159
|
||||
ProcDomainAttachDeviceFlags = 160
|
||||
ProcDomainDetachDeviceFlags = 161
|
||||
ProcConnectBaselineCPU = 162
|
||||
ProcDomainGetJobInfo = 163
|
||||
ProcDomainAbortJob = 164
|
||||
ProcStorageVolWipe = 165
|
||||
ProcDomainMigrateSetMaxDowntime = 166
|
||||
ProcConnectDomainEventRegisterAny = 167
|
||||
ProcConnectDomainEventDeregisterAny = 168
|
||||
ProcDomainEventReboot = 169
|
||||
ProcDomainEventRtcChange = 170
|
||||
ProcDomainEventWatchdog = 171
|
||||
ProcDomainEventIOError = 172
|
||||
ProcDomainEventGraphics = 173
|
||||
ProcDomainUpdateDeviceFlags = 174
|
||||
ProcNwfilterLookupByName = 175
|
||||
ProcNwfilterLookupByUUID = 176
|
||||
ProcNwfilterGetXMLDesc = 177
|
||||
ProcConnectNumOfNwfilters = 178
|
||||
ProcConnectListNwfilters = 179
|
||||
ProcNwfilterDefineXML = 180
|
||||
ProcNwfilterUndefine = 181
|
||||
ProcDomainManagedSave = 182
|
||||
ProcDomainHasManagedSaveImage = 183
|
||||
ProcDomainManagedSaveRemove = 184
|
||||
ProcDomainSnapshotCreateXML = 185
|
||||
ProcDomainSnapshotGetXMLDesc = 186
|
||||
ProcDomainSnapshotNum = 187
|
||||
ProcDomainSnapshotListNames = 188
|
||||
ProcDomainSnapshotLookupByName = 189
|
||||
ProcDomainHasCurrentSnapshot = 190
|
||||
ProcDomainSnapshotCurrent = 191
|
||||
ProcDomainRevertToSnapshot = 192
|
||||
ProcDomainSnapshotDelete = 193
|
||||
ProcDomainGetBlockInfo = 194
|
||||
ProcDomainEventIOErrorReason = 195
|
||||
ProcDomainCreateWithFlags = 196
|
||||
ProcDomainSetMemoryParameters = 197
|
||||
ProcDomainGetMemoryParameters = 198
|
||||
ProcDomainSetVcpusFlags = 199
|
||||
ProcDomainGetVcpusFlags = 200
|
||||
ProcDomainOpenConsole = 201
|
||||
ProcDomainIsUpdated = 202
|
||||
ProcConnectGetSysinfo = 203
|
||||
ProcDomainSetMemoryFlags = 204
|
||||
ProcDomainSetBlkioParameters = 205
|
||||
ProcDomainGetBlkioParameters = 206
|
||||
ProcDomainMigrateSetMaxSpeed = 207
|
||||
ProcStorageVolUpload = 208
|
||||
ProcStorageVolDownload = 209
|
||||
ProcDomainInjectNmi = 210
|
||||
ProcDomainScreenshot = 211
|
||||
ProcDomainGetState = 212
|
||||
ProcDomainMigrateBegin3 = 213
|
||||
ProcDomainMigratePrepare3 = 214
|
||||
ProcDomainMigratePrepareTunnel3 = 215
|
||||
ProcDomainMigratePerform3 = 216
|
||||
ProcDomainMigrateFinish3 = 217
|
||||
ProcDomainMigrateConfirm3 = 218
|
||||
ProcDomainSetSchedulerParametersFlags = 219
|
||||
ProcInterfaceChangeBegin = 220
|
||||
ProcInterfaceChangeCommit = 221
|
||||
ProcInterfaceChangeRollback = 222
|
||||
ProcDomainGetSchedulerParametersFlags = 223
|
||||
ProcDomainEventControlError = 224
|
||||
ProcDomainPinVcpuFlags = 225
|
||||
ProcDomainSendKey = 226
|
||||
ProcNodeGetCPUStats = 227
|
||||
ProcNodeGetMemoryStats = 228
|
||||
ProcDomainGetControlInfo = 229
|
||||
ProcDomainGetVcpuPinInfo = 230
|
||||
ProcDomainUndefineFlags = 231
|
||||
ProcDomainSaveFlags = 232
|
||||
ProcDomainRestoreFlags = 233
|
||||
ProcDomainDestroyFlags = 234
|
||||
ProcDomainSaveImageGetXMLDesc = 235
|
||||
ProcDomainSaveImageDefineXML = 236
|
||||
ProcDomainBlockJobAbort = 237
|
||||
ProcDomainGetBlockJobInfo = 238
|
||||
ProcDomainBlockJobSetSpeed = 239
|
||||
ProcDomainBlockPull = 240
|
||||
ProcDomainEventBlockJob = 241
|
||||
ProcDomainMigrateGetMaxSpeed = 242
|
||||
ProcDomainBlockStatsFlags = 243
|
||||
ProcDomainSnapshotGetParent = 244
|
||||
ProcDomainReset = 245
|
||||
ProcDomainSnapshotNumChildren = 246
|
||||
ProcDomainSnapshotListChildrenNames = 247
|
||||
ProcDomainEventDiskChange = 248
|
||||
ProcDomainOpenGraphics = 249
|
||||
ProcNodeSuspendForDuration = 250
|
||||
ProcDomainBlockResize = 251
|
||||
ProcDomainSetBlockIOTune = 252
|
||||
ProcDomainGetBlockIOTune = 253
|
||||
ProcDomainSetNumaParameters = 254
|
||||
ProcDomainGetNumaParameters = 255
|
||||
ProcDomainSetInterfaceParameters = 256
|
||||
ProcDomainGetInterfaceParameters = 257
|
||||
ProcDomainShutdownFlags = 258
|
||||
ProcStorageVolWipePattern = 259
|
||||
ProcStorageVolResize = 260
|
||||
ProcDomainPmSuspendForDuration = 261
|
||||
ProcDomainGetCPUStats = 262
|
||||
ProcDomainGetDiskErrors = 263
|
||||
ProcDomainSetMetadata = 264
|
||||
ProcDomainGetMetadata = 265
|
||||
ProcDomainBlockRebase = 266
|
||||
ProcDomainPmWakeup = 267
|
||||
ProcDomainEventTrayChange = 268
|
||||
ProcDomainEventPmwakeup = 269
|
||||
ProcDomainEventPmsuspend = 270
|
||||
ProcDomainSnapshotIsCurrent = 271
|
||||
ProcDomainSnapshotHasMetadata = 272
|
||||
ProcConnectListAllDomains = 273
|
||||
ProcDomainListAllSnapshots = 274
|
||||
ProcDomainSnapshotListAllChildren = 275
|
||||
ProcDomainEventBalloonChange = 276
|
||||
ProcDomainGetHostname = 277
|
||||
ProcDomainGetSecurityLabelList = 278
|
||||
ProcDomainPinEmulator = 279
|
||||
ProcDomainGetEmulatorPinInfo = 280
|
||||
ProcConnectListAllStoragePools = 281
|
||||
ProcStoragePoolListAllVolumes = 282
|
||||
ProcConnectListAllNetworks = 283
|
||||
ProcConnectListAllInterfaces = 284
|
||||
ProcConnectListAllNodeDevices = 285
|
||||
ProcConnectListAllNwfilters = 286
|
||||
ProcConnectListAllSecrets = 287
|
||||
ProcNodeSetMemoryParameters = 288
|
||||
ProcNodeGetMemoryParameters = 289
|
||||
ProcDomainBlockCommit = 290
|
||||
ProcNetworkUpdate = 291
|
||||
ProcDomainEventPmsuspendDisk = 292
|
||||
ProcNodeGetCPUMap = 293
|
||||
ProcDomainFstrim = 294
|
||||
ProcDomainSendProcessSignal = 295
|
||||
ProcDomainOpenChannel = 296
|
||||
ProcNodeDeviceLookupScsiHostByWwn = 297
|
||||
ProcDomainGetJobStats = 298
|
||||
ProcDomainMigrateGetCompressionCache = 299
|
||||
ProcDomainMigrateSetCompressionCache = 300
|
||||
ProcNodeDeviceDetachFlags = 301
|
||||
ProcDomainMigrateBegin3Params = 302
|
||||
ProcDomainMigratePrepare3Params = 303
|
||||
ProcDomainMigratePrepareTunnel3Params = 304
|
||||
ProcDomainMigratePerform3Params = 305
|
||||
ProcDomainMigrateFinish3Params = 306
|
||||
ProcDomainMigrateConfirm3Params = 307
|
||||
ProcDomainSetMemoryStatsPeriod = 308
|
||||
ProcDomainCreateXMLWithFiles = 309
|
||||
ProcDomainCreateWithFiles = 310
|
||||
ProcDomainEventDeviceRemoved = 311
|
||||
ProcConnectGetCPUModelNames = 312
|
||||
ProcConnectNetworkEventRegisterAny = 313
|
||||
ProcConnectNetworkEventDeregisterAny = 314
|
||||
ProcNetworkEventLifecycle = 315
|
||||
ProcConnectDomainEventCallbackRegisterAny = 316
|
||||
ProcConnectDomainEventCallbackDeregisterAny = 317
|
||||
ProcDomainEventCallbackLifecycle = 318
|
||||
ProcDomainEventCallbackReboot = 319
|
||||
ProcDomainEventCallbackRtcChange = 320
|
||||
ProcDomainEventCallbackWatchdog = 321
|
||||
ProcDomainEventCallbackIOError = 322
|
||||
ProcDomainEventCallbackGraphics = 323
|
||||
ProcDomainEventCallbackIOErrorReason = 324
|
||||
ProcDomainEventCallbackControlError = 325
|
||||
ProcDomainEventCallbackBlockJob = 326
|
||||
ProcDomainEventCallbackDiskChange = 327
|
||||
ProcDomainEventCallbackTrayChange = 328
|
||||
ProcDomainEventCallbackPmwakeup = 329
|
||||
ProcDomainEventCallbackPmsuspend = 330
|
||||
ProcDomainEventCallbackBalloonChange = 331
|
||||
ProcDomainEventCallbackPmsuspendDisk = 332
|
||||
ProcDomainEventCallbackDeviceRemoved = 333
|
||||
ProcDomainCoreDumpWithFormat = 334
|
||||
ProcDomainFsfreeze = 335
|
||||
ProcDomainFsthaw = 336
|
||||
ProcDomainGetTime = 337
|
||||
ProcDomainSetTime = 338
|
||||
ProcDomainEventBlockJob2 = 339
|
||||
ProcNodeGetFreePages = 340
|
||||
ProcNetworkGetDhcpLeases = 341
|
||||
ProcConnectGetDomainCapabilities = 342
|
||||
ProcDomainOpenGraphicsFd = 343
|
||||
ProcConnectGetAllDomainStats = 344
|
||||
ProcDomainBlockCopy = 345
|
||||
ProcDomainEventCallbackTunable = 346
|
||||
ProcNodeAllocPages = 347
|
||||
ProcDomainEventCallbackAgentLifecycle = 348
|
||||
ProcDomainGetFsinfo = 349
|
||||
ProcDomainDefineXMLFlags = 350
|
||||
ProcDomainGetIothreadInfo = 351
|
||||
ProcDomainPinIothread = 352
|
||||
ProcDomainInterfaceAddresses = 353
|
||||
ProcDomainEventCallbackDeviceAdded = 354
|
||||
ProcDomainAddIothread = 355
|
||||
ProcDomainDelIothread = 356
|
||||
ProcDomainSetUserPassword = 357
|
||||
ProcDomainRename = 358
|
||||
ProcDomainEventCallbackMigrationIteration = 359
|
||||
ProcConnectRegisterCloseCallback = 360
|
||||
ProcConnectUnregisterCloseCallback = 361
|
||||
ProcConnectEventConnectionClosed = 362
|
||||
ProcDomainEventCallbackJobCompleted = 363
|
||||
ProcDomainMigrateStartPostCopy = 364
|
||||
ProcDomainGetPerfEvents = 365
|
||||
ProcDomainSetPerfEvents = 366
|
||||
ProcDomainEventCallbackDeviceRemovalFailed = 367
|
||||
ProcConnectStoragePoolEventRegisterAny = 368
|
||||
ProcConnectStoragePoolEventDeregisterAny = 369
|
||||
ProcStoragePoolEventLifecycle = 370
|
||||
ProcDomainGetGuestVcpus = 371
|
||||
ProcDomainSetGuestVcpus = 372
|
||||
ProcStoragePoolEventRefresh = 373
|
||||
ProcConnectNodeDeviceEventRegisterAny = 374
|
||||
ProcConnectNodeDeviceEventDeregisterAny = 375
|
||||
ProcNodeDeviceEventLifecycle = 376
|
||||
ProcNodeDeviceEventUpdate = 377
|
||||
ProcStorageVolGetInfoFlags = 378
|
||||
ProcDomainEventCallbackMetadataChange = 379
|
||||
ProcConnectSecretEventRegisterAny = 380
|
||||
ProcConnectSecretEventDeregisterAny = 381
|
||||
ProcSecretEventLifecycle = 382
|
||||
ProcSecretEventValueChanged = 383
|
||||
ProcDomainSetVcpu = 384
|
||||
ProcDomainEventBlockThreshold = 385
|
||||
ProcDomainSetBlockThreshold = 386
|
||||
ProcDomainMigrateGetMaxDowntime = 387
|
||||
ProcDomainManagedSaveGetXMLDesc = 388
|
||||
ProcDomainManagedSaveDefineXML = 389
|
||||
ProcDomainSetLifecycleAction = 390
|
||||
|
||||
|
||||
// From consts:
|
||||
StringMax = 4194304
|
||||
DomainListMax = 16384
|
||||
CpumapMax = 2048
|
||||
VcpuinfoMax = 16384
|
||||
CpumapsMax = 8388608
|
||||
IothreadInfoMax = 16384
|
||||
MigrateCookieMax = 4194304
|
||||
NetworkListMax = 16384
|
||||
InterfaceListMax = 16384
|
||||
StoragePoolListMax = 16384
|
||||
StorageVolListMax = 16384
|
||||
NodeDeviceListMax = 65536
|
||||
NodeDeviceCapsListMax = 65536
|
||||
NwfilterListMax = 16384
|
||||
DomainSchedulerParametersMax = 16
|
||||
DomainBlkioParametersMax = 16
|
||||
DomainMemoryParametersMax = 16
|
||||
DomainBlockIOTuneParametersMax = 32
|
||||
DomainNumaParametersMax = 16
|
||||
DomainPerfEventsMax = 64
|
||||
DomainBlockCopyParametersMax = 16
|
||||
NodeCPUStatsMax = 16
|
||||
NodeMemoryStatsMax = 16
|
||||
DomainBlockStatsParametersMax = 16
|
||||
NodeMaxCells = 1024
|
||||
AuthSaslDataMax = 65536
|
||||
AuthTypeListMax = 20
|
||||
DomainMemoryStatsMax = 1024
|
||||
DomainSnapshotListMax = 16384
|
||||
DomainBlockPeekBufferMax = 4194304
|
||||
DomainMemoryPeekBufferMax = 4194304
|
||||
SecurityLabelListMax = 64
|
||||
SecretValueMax = 65536
|
||||
SecretListMax = 16384
|
||||
CPUBaselineMax = 256
|
||||
DomainSendKeyMax = 16
|
||||
DomainInterfaceParametersMax = 16
|
||||
DomainGetCPUStatsNcpusMax = 128
|
||||
DomainGetCPUStatsMax = 2048
|
||||
DomainDiskErrorsMax = 256
|
||||
NodeMemoryParametersMax = 64
|
||||
DomainMigrateParamListMax = 64
|
||||
DomainJobStatsMax = 64
|
||||
ConnectCPUModelsMax = 8192
|
||||
DomainFsfreezeMountpointsMax = 256
|
||||
NetworkDhcpLeasesMax = 65536
|
||||
ConnectGetAllDomainStatsMax = 262144
|
||||
DomainEventTunableMax = 2048
|
||||
DomainFsinfoMax = 256
|
||||
DomainFsinfoDisksMax = 256
|
||||
DomainInterfaceMax = 2048
|
||||
DomainIPAddrMax = 2048
|
||||
DomainGuestVcpuParamsMax = 64
|
||||
DomainEventGraphicsIdentityMax = 20
|
||||
Program = 0x20008086
|
||||
ProtocolVersion = 1
|
||||
|
||||
)
|
@ -15,54 +15,11 @@
|
||||
// Package constants provides shared data for the libvirt package.
|
||||
package constants
|
||||
|
||||
// protocol procedure numbers
|
||||
const (
|
||||
ProgramVersion = 1
|
||||
ProgramRemote = 0x20008086
|
||||
ProgramQEMU = 0x20008087
|
||||
ProgramKeepAlive = 0x6b656570
|
||||
)
|
||||
|
||||
// libvirt procedure identifiers
|
||||
// These are libvirt procedure numbers which correspond to each respective
|
||||
// API call between remote_internal driver and libvirtd. Although stable.
|
||||
// Each call is identified by a unique number which *may change at any time*.
|
||||
//
|
||||
// Examples:
|
||||
// REMOTE_PROC_CONNECT_OPEN = 1
|
||||
// REMOTE_PROC_DOMAIN_DEFINE_XML = 11
|
||||
// REMOTE_PROC_DOMAIN_MIGRATE_SET_MAX_SPEED = 207,
|
||||
//
|
||||
// See:
|
||||
// https://libvirt.org/git/?p=libvirt.git;a=blob_plain;f=src/remote/remote_protocol.x;hb=HEAD
|
||||
const (
|
||||
ProcConnectOpen = 1
|
||||
ProcConnectClose = 2
|
||||
ProcConnectGetCapabilties = 7
|
||||
ProcDomainGetXMLDesc = 14
|
||||
ProcDomainLookupByName = 23
|
||||
ProcDomainReboot = 27
|
||||
ProcAuthList = 66
|
||||
ProcStoragePoolRefresh = 83
|
||||
ProcStoragePoolLookupByName = 84
|
||||
ProcConnectGetLibVersion = 157
|
||||
ProcDomainMemoryStats = 159
|
||||
ProcDomainCreateWithFlags = 196
|
||||
ProcDomainMigrateSetMaxSpeed = 207
|
||||
ProcDomainGetState = 212
|
||||
ProcDomainUndefineFlags = 231
|
||||
ProcDomainDestroyFlags = 234
|
||||
ProcDomainReset = 245
|
||||
ProcDomainSetBlockIOTune = 252
|
||||
ProcDomainGetBlockIOTune = 253
|
||||
ProcDomainShutdownFlags = 258
|
||||
ProcConnectListAllDomains = 273
|
||||
ProcConnectListAllStoragePools = 281
|
||||
ProcConnectListAllSecrets = 287
|
||||
ProcMigratePerformParams = 305
|
||||
ProcDomainDefineXMLFlags = 350
|
||||
)
|
||||
|
||||
// qemu procedure identifiers
|
||||
const (
|
||||
QEMUDomainMonitor = 1
|
||||
|
4
internal/lvgen/.gitignore
vendored
Normal file
4
internal/lvgen/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
# Ignore the yacc intermediate files.
|
||||
y.go
|
||||
y.output
|
||||
|
43
internal/lvgen/gen/main.go
Normal file
43
internal/lvgen/gen/main.go
Normal file
@ -0,0 +1,43 @@
|
||||
// Copyright 2017 The go-libvirt Authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path"
|
||||
|
||||
"github.com/digitalocean/go-libvirt/internal/lvgen"
|
||||
)
|
||||
|
||||
// TODO: make these an argument
|
||||
const lvPath = "../../../libvirt"
|
||||
const protoPath = "src/remote/remote_protocol.x"
|
||||
|
||||
func main() {
|
||||
fmt.Println("Generating golang bindings for libvirt")
|
||||
lvFile := path.Join(lvPath, protoPath)
|
||||
rdr, err := os.Open(lvFile)
|
||||
if err != nil {
|
||||
fmt.Printf("failed to open protocol file at %v: %v\n", lvFile, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
defer rdr.Close()
|
||||
|
||||
if err = lvgen.Generate(rdr); err != nil {
|
||||
fmt.Println("go-libvirt code generator failed:", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
564
internal/lvgen/generate.go
Normal file
564
internal/lvgen/generate.go
Normal file
@ -0,0 +1,564 @@
|
||||
// Copyright 2017 The go-libvirt Authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package lvgen
|
||||
|
||||
// The libvirt API is divided into several categories. (Gallia est omnis divisa
|
||||
// in partes tres.) The generator will output code for each category in a
|
||||
// package underneath the go-libvirt directory.
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
"text/template"
|
||||
"unicode"
|
||||
"unicode/utf8"
|
||||
)
|
||||
|
||||
var keywords = map[string]int{
|
||||
"hyper": HYPER,
|
||||
"int": INT,
|
||||
"short": SHORT,
|
||||
"char": CHAR,
|
||||
"bool": BOOL,
|
||||
"case": CASE,
|
||||
"const": CONST,
|
||||
"default": DEFAULT,
|
||||
"double": DOUBLE,
|
||||
"enum": ENUM,
|
||||
"float": FLOAT,
|
||||
"opaque": OPAQUE,
|
||||
"string": STRING,
|
||||
"struct": STRUCT,
|
||||
"switch": SWITCH,
|
||||
"typedef": TYPEDEF,
|
||||
"union": UNION,
|
||||
"unsigned": UNSIGNED,
|
||||
"void": VOID,
|
||||
"program": PROGRAM,
|
||||
"version": VERSION,
|
||||
}
|
||||
|
||||
// ConstItem stores an const's symbol and value from the parser. This struct is
|
||||
// also used for enums.
|
||||
type ConstItem struct {
|
||||
Name string
|
||||
Val string
|
||||
}
|
||||
|
||||
type Generator struct {
|
||||
// Enums holds the list of enums found by the parser.
|
||||
Enums []ConstItem
|
||||
// Consts holds all the const items found by the parser.
|
||||
Consts []ConstItem
|
||||
}
|
||||
|
||||
// Gen accumulates items as the parser runs, and is then used to produce the
|
||||
// output.
|
||||
var Gen Generator
|
||||
|
||||
// CurrentEnumVal is the auto-incrementing value assigned to enums that aren't
|
||||
// explicitly given a value.
|
||||
var CurrentEnumVal int64
|
||||
|
||||
// oneRuneTokens lists the runes the lexer will consider to be tokens when it
|
||||
// finds them. These are returned to the parser using the integer value of their
|
||||
// runes.
|
||||
var oneRuneTokens = `{}[]<>(),=;:*`
|
||||
|
||||
// Generate will output go bindings for libvirt. The lvPath parameter should be
|
||||
// the path to the root of the libvirt source directory to use for the
|
||||
// generation.
|
||||
func Generate(proto io.Reader) error {
|
||||
lexer, err := NewLexer(proto)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
go lexer.Run()
|
||||
parser := yyNewParser()
|
||||
yyErrorVerbose = true
|
||||
// Turn this on if you're debugging.
|
||||
// yyDebug = 3
|
||||
rv := parser.Parse(lexer)
|
||||
if rv != 0 {
|
||||
return fmt.Errorf("failed to parse libvirt protocol: %v", rv)
|
||||
}
|
||||
|
||||
// Generate and write the output.
|
||||
wr, err := os.Create("../constants/constants.gen.go")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer wr.Close()
|
||||
|
||||
err = genGo(wr)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func genGo(wr io.Writer) error {
|
||||
// TODO: Move this someplace nice.
|
||||
const consttempl = `/*
|
||||
* This file generated by internal/lvgen/generate.go. DO NOT EDIT BY HAND!
|
||||
*
|
||||
* To regenerate, run 'go generate' in internal/lvgen.
|
||||
*/
|
||||
package constants
|
||||
|
||||
// libvirt procedure identifiers and other enums
|
||||
//
|
||||
// These are libvirt procedure numbers which correspond to each respective
|
||||
// API call between remote_internal driver and libvirtd. Each procedure is
|
||||
// identified by a unique number which *may change in any future libvirt
|
||||
// update*.
|
||||
//
|
||||
// Examples:
|
||||
// REMOTE_PROC_CONNECT_OPEN = 1
|
||||
// REMOTE_PROC_DOMAIN_DEFINE_XML = 11
|
||||
// REMOTE_PROC_DOMAIN_MIGRATE_SET_MAX_SPEED = 207,
|
||||
const (
|
||||
// From enums:
|
||||
{{range .Enums}}{{.Name}} = {{.Val}}
|
||||
{{end}}
|
||||
|
||||
// From consts:
|
||||
{{range .Consts}}{{.Name}} = {{.Val}}
|
||||
{{end}}
|
||||
)
|
||||
`
|
||||
// Enums and consts from the protocol definition both become go consts in
|
||||
// the generated code. We'll remove "REMOTE_" and then camel-case the
|
||||
// name before making each one a go constant.
|
||||
for ix, en := range Gen.Enums {
|
||||
Gen.Enums[ix].Name = constNameTransform(en.Name)
|
||||
}
|
||||
for ix, en := range Gen.Consts {
|
||||
Gen.Consts[ix].Name = constNameTransform(en.Name)
|
||||
}
|
||||
|
||||
t := template.Must(template.New("consts").Parse(consttempl))
|
||||
if err := t.Execute(wr, Gen); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// constNameTransform changes an upcased, snake-style name like
|
||||
// REMOTE_PROTOCOL_VERSION to a comfortable Go name like ProtocolVersion. It
|
||||
// also tries to upcase abbreviations so a name like DOMAIN_GET_XML becomes
|
||||
// DomainGetXML, not DomainGetXml.
|
||||
func constNameTransform(name string) string {
|
||||
nn := fromSnakeToCamel(strings.TrimPrefix(name, "REMOTE_"))
|
||||
nn = fixAbbrevs(nn)
|
||||
return nn
|
||||
}
|
||||
|
||||
// fromSnakeToCamel transmutes a snake-cased string to a camel-cased one. All
|
||||
// runes that follow an underscore are up-cased, and the underscores themselves
|
||||
// are omitted.
|
||||
//
|
||||
// ex: "PROC_DOMAIN_GET_METADATA" -> "ProcDomainGetMetadata"
|
||||
func fromSnakeToCamel(s string) string {
|
||||
buf := make([]rune, 0, len(s))
|
||||
// Start with an upper-cased rune
|
||||
hump := true
|
||||
|
||||
for _, r := range s {
|
||||
if r == '_' {
|
||||
hump = true
|
||||
} else {
|
||||
var transform func(rune) rune
|
||||
if hump == true {
|
||||
transform = unicode.ToUpper
|
||||
} else {
|
||||
transform = unicode.ToLower
|
||||
}
|
||||
buf = append(buf, transform(r))
|
||||
hump = false
|
||||
}
|
||||
}
|
||||
|
||||
return string(buf)
|
||||
}
|
||||
|
||||
// abbrevs is a list of abbreviations which should be all upper-case in a name.
|
||||
// (This is really just to keep the go linters happy and to produce names that
|
||||
// are intuitive to a go developer.)
|
||||
var abbrevs = []string{"Xml", "Io", "Uuid", "Cpu", "Id", "Ip"}
|
||||
|
||||
// fixAbbrevs up-cases all instances of anything in the 'abbrevs' array. This
|
||||
// would be a simple matter, but we don't want to upcase an abbreviation if it's
|
||||
// actually part of a larger word, so it's not so simple.
|
||||
func fixAbbrevs(s string) string {
|
||||
for _, a := range abbrevs {
|
||||
for loc := 0; ; {
|
||||
loc = strings.Index(s[loc:], a)
|
||||
if loc == -1 {
|
||||
break
|
||||
}
|
||||
r := 'A'
|
||||
if len(a) < len(s[loc:]) {
|
||||
r, _ = utf8.DecodeRune([]byte(s[loc+len(a):]))
|
||||
}
|
||||
if unicode.IsLower(r) == false {
|
||||
s = s[:loc] + strings.Replace(s[loc:], a, strings.ToUpper(a), 1)
|
||||
}
|
||||
loc++
|
||||
}
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
// TODO: Move this lexer to its own file?
|
||||
|
||||
// eof is returned by the lexer when there's no more input.
|
||||
const eof = -1
|
||||
|
||||
type item struct {
|
||||
typ int
|
||||
val string
|
||||
line, column int
|
||||
}
|
||||
|
||||
// String will display lexer items for humans to debug. There are some
|
||||
// calculations here due to the way goyacc arranges token values; see the
|
||||
// generated file y.go for an idea what's going on here, but the basic idea is
|
||||
// that the lower token type values are reserved for single-rune tokens, which
|
||||
// the lexer reports using the value of the rune itself. Everything else is
|
||||
// allocated a range of type value up above all the possible single-rune values.
|
||||
func (i item) String() string {
|
||||
tokType := i.typ
|
||||
if tokType >= yyPrivate {
|
||||
if tokType < yyPrivate+len(yyTok2) {
|
||||
tokType = yyTok2[tokType-yyPrivate]
|
||||
}
|
||||
}
|
||||
rv := fmt.Sprintf("%s %q %d:%d", yyTokname(tokType), i.val, i.line, i.column)
|
||||
return rv
|
||||
}
|
||||
|
||||
// Lexer stores the state of this lexer.
|
||||
type Lexer struct {
|
||||
input string // the string we're scanning.
|
||||
start int // start position of the item.
|
||||
pos int // current position in the input.
|
||||
line int // the current line (for error reporting).
|
||||
column int // current position within the current line.
|
||||
width int // width of the last rune scanned.
|
||||
items chan item // channel of scanned lexer items (lexemes).
|
||||
lastItem item // The last item the lexer handed the parser
|
||||
}
|
||||
|
||||
// NewLexer will return a new lexer for the passed-in reader.
|
||||
func NewLexer(rdr io.Reader) (*Lexer, error) {
|
||||
l := &Lexer{}
|
||||
|
||||
b, err := ioutil.ReadAll(rdr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
l.input = string(b)
|
||||
l.items = make(chan item)
|
||||
|
||||
return l, nil
|
||||
}
|
||||
|
||||
// Run starts the lexer, and should be called in a goroutine.
|
||||
func (l *Lexer) Run() {
|
||||
for state := lexText; state != nil; {
|
||||
state = state(l)
|
||||
}
|
||||
close(l.items)
|
||||
}
|
||||
|
||||
// emit returns a token to the parser.
|
||||
func (l *Lexer) emit(t int) {
|
||||
l.items <- item{t, l.input[l.start:l.pos], l.line, l.column}
|
||||
l.start = l.pos
|
||||
}
|
||||
|
||||
// Lex gets the next token.
|
||||
func (l *Lexer) Lex(st *yySymType) int {
|
||||
s := <-l.items
|
||||
l.lastItem = s
|
||||
st.val = s.val
|
||||
// fmt.Println("Lex returning", s)
|
||||
return int(s.typ)
|
||||
}
|
||||
|
||||
// Error is called by the parser when it finds a problem.
|
||||
func (l *Lexer) Error(s string) {
|
||||
fmt.Printf("parse error at %d:%d: %v\n", l.lastItem.line+1, l.lastItem.column+1, s)
|
||||
fmt.Printf("error at %q\n", l.lastItem.val)
|
||||
}
|
||||
|
||||
// errorf is used by the lexer to report errors. It inserts an ERROR token into
|
||||
// the items channel, and sets the state to nil, which stops the lexer's state
|
||||
// machine.
|
||||
func (l *Lexer) errorf(format string, args ...interface{}) stateFn {
|
||||
l.items <- item{ERROR, fmt.Sprintf(format, args), l.line, l.column}
|
||||
return nil
|
||||
}
|
||||
|
||||
// next returns the rune at the current location, and advances to the next rune
|
||||
// in the input.
|
||||
func (l *Lexer) next() (r rune) {
|
||||
if l.pos >= len(l.input) {
|
||||
l.width = 0
|
||||
return eof
|
||||
}
|
||||
r, l.width = utf8.DecodeRuneInString(l.input[l.pos:])
|
||||
l.pos += l.width
|
||||
l.column++
|
||||
if r == '\n' {
|
||||
l.line++
|
||||
l.column = 0
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
// ignore discards the current text from start to pos.
|
||||
func (l *Lexer) ignore() {
|
||||
l.start = l.pos
|
||||
}
|
||||
|
||||
// backup moves back one character, but can only be called once per next() call.
|
||||
func (l *Lexer) backup() {
|
||||
l.pos -= l.width
|
||||
if l.column > 0 {
|
||||
l.column--
|
||||
} else {
|
||||
l.line--
|
||||
}
|
||||
l.width = 0
|
||||
}
|
||||
|
||||
// peek looks ahead at the next rune in the stream without consuming it.
|
||||
func (l *Lexer) peek() rune {
|
||||
r := l.next()
|
||||
l.backup()
|
||||
return r
|
||||
}
|
||||
|
||||
// accept will advance to the next rune if it's contained in the string of valid
|
||||
// runes passed in by the caller.
|
||||
func (l *Lexer) accept(valid string) bool {
|
||||
if strings.IndexRune(valid, l.next()) >= 0 {
|
||||
return true
|
||||
}
|
||||
l.backup()
|
||||
return false
|
||||
}
|
||||
|
||||
// acceptRun advances over a number of valid runes, stopping as soon as it hits
|
||||
// one not on the list.
|
||||
func (l *Lexer) acceptRun(valid string) {
|
||||
for strings.IndexRune(valid, l.next()) >= 0 {
|
||||
}
|
||||
l.backup()
|
||||
}
|
||||
|
||||
// keyword checks whether the current lexeme is a keyword or not. If so it
|
||||
// returns the keyword's token id, otherwise it returns IDENTIFIER.
|
||||
func (l *Lexer) keyword() int {
|
||||
ident := l.input[l.start:l.pos]
|
||||
tok, ok := keywords[ident]
|
||||
if ok == true {
|
||||
return int(tok)
|
||||
}
|
||||
return IDENTIFIER
|
||||
}
|
||||
|
||||
// oneRuneToken determines whether a rune is a token. If so it returns the token
|
||||
// id and true, otherwise it returns false.
|
||||
func (l *Lexer) oneRuneToken(r rune) (int, bool) {
|
||||
if strings.IndexRune(oneRuneTokens, r) >= 0 {
|
||||
return int(r), true
|
||||
}
|
||||
|
||||
return 0, false
|
||||
}
|
||||
|
||||
// State functions
|
||||
type stateFn func(*Lexer) stateFn
|
||||
|
||||
// lexText is the master lex routine. The lexer is started in this state.
|
||||
func lexText(l *Lexer) stateFn {
|
||||
for {
|
||||
if strings.HasPrefix(l.input[l.pos:], "/*") {
|
||||
return lexBlockComment
|
||||
}
|
||||
r := l.next()
|
||||
if r == eof {
|
||||
break
|
||||
}
|
||||
if unicode.IsSpace(r) {
|
||||
l.ignore()
|
||||
return lexText
|
||||
}
|
||||
if l.column == 1 && r == '%' {
|
||||
l.backup()
|
||||
return lexDirective
|
||||
}
|
||||
if unicode.IsLetter(r) {
|
||||
l.backup()
|
||||
return lexIdent
|
||||
}
|
||||
if unicode.IsNumber(r) || r == '-' {
|
||||
l.backup()
|
||||
return lexNumber
|
||||
}
|
||||
if t, isToken := l.oneRuneToken(r); isToken == true {
|
||||
l.emit(t)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// lexBlockComment is used when we find a comment marker '/*' in the input.
|
||||
func lexBlockComment(l *Lexer) stateFn {
|
||||
for {
|
||||
if strings.HasPrefix(l.input[l.pos:], "*/") {
|
||||
// Found the end. Advance past the '*/' and discard the comment body.
|
||||
l.next()
|
||||
l.next()
|
||||
l.ignore()
|
||||
return lexText
|
||||
}
|
||||
if l.next() == eof {
|
||||
return l.errorf("unterminated block comment")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// lexIdent handles identifiers.
|
||||
func lexIdent(l *Lexer) stateFn {
|
||||
for {
|
||||
r := l.next()
|
||||
if unicode.IsLetter(r) || unicode.IsDigit(r) || r == '_' {
|
||||
continue
|
||||
}
|
||||
l.backup()
|
||||
break
|
||||
}
|
||||
// We may have a keyword, so check for that before emitting.
|
||||
l.emit(l.keyword())
|
||||
|
||||
return lexText
|
||||
}
|
||||
|
||||
// lexNumber handles decimal and hexadecimal numbers. Decimal numbers may begin
|
||||
// with a '-'; hex numbers begin with '0x' and do not accept leading '-'.
|
||||
func lexNumber(l *Lexer) stateFn {
|
||||
// Leading '-' is ok
|
||||
digits := "0123456789"
|
||||
neg := l.accept("-")
|
||||
if !neg {
|
||||
// allow '0x' for hex numbers, as long as there's not a leading '-'.
|
||||
r := l.peek()
|
||||
if r == '0' {
|
||||
l.next()
|
||||
if l.accept("x") {
|
||||
digits = "0123456789ABCDEFabcdef"
|
||||
}
|
||||
}
|
||||
}
|
||||
// followed by any number of digits
|
||||
l.acceptRun(digits)
|
||||
r := l.peek()
|
||||
if unicode.IsLetter(r) {
|
||||
l.next()
|
||||
return l.errorf("invalid number: %q", l.input[l.start:l.pos])
|
||||
}
|
||||
l.emit(CONSTANT)
|
||||
return lexText
|
||||
}
|
||||
|
||||
// lexDirective handles lines beginning with '%'. These are used to emit C code
|
||||
// directly to the output file. For now we're ignoring them, but some of the
|
||||
// constants in the protocol file do depend on values from #included header
|
||||
// files, so that may need to change.
|
||||
func lexDirective(l *Lexer) stateFn {
|
||||
for {
|
||||
r := l.next()
|
||||
if r == '\n' {
|
||||
l.ignore()
|
||||
return lexText
|
||||
}
|
||||
if r == eof {
|
||||
return l.errorf("unterminated directive")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Routines called by the parser's actions.
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// StartEnum is called when the parser has found a valid enum.
|
||||
func StartEnum() {
|
||||
// Set the automatic value var to -1; it will be incremented before being
|
||||
// assigned to an enum value.
|
||||
CurrentEnumVal = -1
|
||||
}
|
||||
|
||||
// AddEnum will add a new enum value to the list.
|
||||
func AddEnum(name, val string) error {
|
||||
ev, err := parseNumber(val)
|
||||
if err != nil {
|
||||
return fmt.Errorf("invalid enum value %v = %v", name, val)
|
||||
}
|
||||
return addEnum(name, ev)
|
||||
}
|
||||
|
||||
// AddEnumAutoVal adds an enum to the list, using the automatically-incremented
|
||||
// value. This is called when the parser finds an enum definition without an
|
||||
// explicit value.
|
||||
func AddEnumAutoVal(name string) error {
|
||||
CurrentEnumVal++
|
||||
return addEnum(name, CurrentEnumVal)
|
||||
}
|
||||
|
||||
func addEnum(name string, val int64) error {
|
||||
Gen.Enums = append(Gen.Enums, ConstItem{name, fmt.Sprintf("%d", val)})
|
||||
CurrentEnumVal = val
|
||||
return nil
|
||||
}
|
||||
|
||||
// AddConst adds a new constant to the parser's list.
|
||||
func AddConst(name, val string) error {
|
||||
_, err := parseNumber(val)
|
||||
if err != nil {
|
||||
return fmt.Errorf("invalid const value %v = %v", name, val)
|
||||
}
|
||||
Gen.Consts = append(Gen.Consts, ConstItem{name, val})
|
||||
return nil
|
||||
}
|
||||
|
||||
// parseNumber makes sure that a parsed numerical value can be parsed to a 64-
|
||||
// bit integer.
|
||||
func parseNumber(val string) (int64, error) {
|
||||
base := 10
|
||||
if strings.HasPrefix(val, "0x") {
|
||||
base = 16
|
||||
val = val[2:]
|
||||
}
|
||||
n, err := strconv.ParseInt(val, base, 64)
|
||||
return n, err
|
||||
}
|
4
internal/lvgen/lv-gen.go
Normal file
4
internal/lvgen/lv-gen.go
Normal file
@ -0,0 +1,4 @@
|
||||
package lvgen
|
||||
|
||||
//go:generate goyacc sunrpc.y
|
||||
//go:generate go run gen/main.go
|
218
internal/lvgen/sunrpc.y
Normal file
218
internal/lvgen/sunrpc.y
Normal file
@ -0,0 +1,218 @@
|
||||
%{
|
||||
|
||||
package lvgen
|
||||
|
||||
import (
|
||||
//"fmt"
|
||||
)
|
||||
|
||||
%}
|
||||
|
||||
// SymType
|
||||
%union{
|
||||
val string
|
||||
}
|
||||
|
||||
// XDR tokens:
|
||||
%token BOOL CASE CONST DEFAULT DOUBLE ENUM FLOAT OPAQUE STRING STRUCT
|
||||
%token SWITCH TYPEDEF UNION UNSIGNED VOID HYPER INT SHORT CHAR
|
||||
%token IDENTIFIER CONSTANT ERROR
|
||||
// RPCL additional tokens:
|
||||
%token PROGRAM VERSION
|
||||
|
||||
%%
|
||||
|
||||
specification
|
||||
: definition_list
|
||||
;
|
||||
|
||||
value
|
||||
: IDENTIFIER
|
||||
| CONSTANT
|
||||
;
|
||||
|
||||
definition_list
|
||||
: definition ';'
|
||||
| definition ';' definition_list
|
||||
;
|
||||
|
||||
definition
|
||||
: enum_definition
|
||||
| const_definition
|
||||
| typedef_definition
|
||||
| struct_definition
|
||||
| union_definition
|
||||
| program_definition
|
||||
;
|
||||
|
||||
enum_definition
|
||||
: ENUM enum_ident '{' enum_value_list '}' { StartEnum() }
|
||||
;
|
||||
|
||||
enum_value_list
|
||||
: enum_value
|
||||
| enum_value ',' enum_value_list
|
||||
;
|
||||
|
||||
enum_value
|
||||
: enum_value_ident {
|
||||
err := AddEnumAutoVal($1.val)
|
||||
if err != nil {
|
||||
yylex.Error(err.Error())
|
||||
return 1
|
||||
}
|
||||
}
|
||||
| enum_value_ident '=' value {
|
||||
err := AddEnum($1.val, $3.val)
|
||||
if err != nil {
|
||||
yylex.Error(err.Error())
|
||||
return 1
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
enum_ident
|
||||
: IDENTIFIER
|
||||
;
|
||||
|
||||
enum_value_ident
|
||||
: IDENTIFIER
|
||||
;
|
||||
|
||||
// Ignore consts that are set to IDENTIFIERs - this isn't allowed by the spec,
|
||||
// but occurs in the file because libvirt runs the pre-processor on the protocol
|
||||
// file, and it handles replacing the identifier with it's #defined value.
|
||||
const_definition
|
||||
: CONST const_ident '=' IDENTIFIER
|
||||
| CONST const_ident '=' CONSTANT {
|
||||
err := AddConst($2.val, $4.val)
|
||||
if err != nil {
|
||||
yylex.Error(err.Error())
|
||||
return 1
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
const_ident
|
||||
: IDENTIFIER
|
||||
;
|
||||
|
||||
typedef_definition
|
||||
: TYPEDEF declaration
|
||||
;
|
||||
|
||||
declaration
|
||||
: simple_declaration
|
||||
| fixed_array_declaration
|
||||
| variable_array_declaration
|
||||
| pointer_declaration
|
||||
;
|
||||
|
||||
simple_declaration
|
||||
: type_specifier variable_ident
|
||||
;
|
||||
|
||||
type_specifier
|
||||
: int_spec
|
||||
| UNSIGNED int_spec
|
||||
| FLOAT
|
||||
| DOUBLE
|
||||
| BOOL
|
||||
| STRING
|
||||
| OPAQUE
|
||||
| enum_definition
|
||||
| struct_definition
|
||||
| union_definition
|
||||
| IDENTIFIER
|
||||
;
|
||||
|
||||
int_spec
|
||||
: HYPER
|
||||
| INT
|
||||
| SHORT
|
||||
| CHAR
|
||||
;
|
||||
|
||||
variable_ident
|
||||
: IDENTIFIER
|
||||
;
|
||||
|
||||
fixed_array_declaration
|
||||
: type_specifier variable_ident '[' value ']'
|
||||
;
|
||||
|
||||
variable_array_declaration
|
||||
: type_specifier variable_ident '<' value '>'
|
||||
| type_specifier variable_ident '<' '>'
|
||||
;
|
||||
|
||||
pointer_declaration
|
||||
: type_specifier '*' variable_ident
|
||||
;
|
||||
|
||||
struct_definition
|
||||
: STRUCT struct_ident '{' declaration_list '}'
|
||||
;
|
||||
|
||||
struct_ident
|
||||
: IDENTIFIER
|
||||
;
|
||||
|
||||
declaration_list
|
||||
: declaration ';'
|
||||
| declaration ';' declaration_list
|
||||
;
|
||||
|
||||
union_definition
|
||||
: UNION union_ident SWITCH '(' simple_declaration ')' '{' case_list '}'
|
||||
;
|
||||
|
||||
union_ident
|
||||
: IDENTIFIER
|
||||
;
|
||||
|
||||
case_list
|
||||
: case ';'
|
||||
| case ';' case_list
|
||||
;
|
||||
|
||||
case
|
||||
: CASE value ':' declaration
|
||||
| DEFAULT ':' declaration
|
||||
;
|
||||
|
||||
program_definition
|
||||
: PROGRAM program_ident '{' version_list '}' '=' value
|
||||
;
|
||||
|
||||
program_ident
|
||||
: IDENTIFIER
|
||||
;
|
||||
|
||||
version_list
|
||||
: version ';'
|
||||
| version ';' version_list
|
||||
;
|
||||
|
||||
version
|
||||
: VERSION version_ident '{' procedure_list '}' '=' value ';'
|
||||
;
|
||||
|
||||
version_ident
|
||||
: IDENTIFIER
|
||||
;
|
||||
|
||||
procedure_list
|
||||
: procedure ';'
|
||||
| procedure ';' procedure_list
|
||||
;
|
||||
|
||||
procedure
|
||||
: type_specifier procedure_ident '(' type_specifier ')' '=' value ';'
|
||||
;
|
||||
|
||||
procedure_ident
|
||||
: IDENTIFIER
|
||||
;
|
||||
|
||||
%%
|
45
libvirt.go
45
libvirt.go
@ -514,7 +514,7 @@ type DomainMemoryStat struct {
|
||||
|
||||
// Capabilities returns an XML document describing the host's capabilties.
|
||||
func (l *Libvirt) Capabilities() ([]byte, error) {
|
||||
resp, err := l.request(constants.ProcConnectGetCapabilties, constants.ProgramRemote, nil)
|
||||
resp, err := l.request(constants.ProcConnectGetCapabilities, constants.Program, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -571,7 +571,7 @@ func (l *Libvirt) Domains() ([]Domain, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp, err := l.request(constants.ProcConnectListAllDomains, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcConnectListAllDomains, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -613,7 +613,7 @@ func (l *Libvirt) DomainCreateWithFlags(dom string, flags DomainCreateFlags) err
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
resp, err := l.request(constants.ProcDomainCreateWithFlags, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcDomainCreateWithFlags, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -647,7 +647,7 @@ func (l *Libvirt) DomainMemoryStats(dom string) ([]DomainMemoryStat, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp, err := l.request(constants.ProcDomainMemoryStats, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcDomainMemoryStats, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -687,7 +687,7 @@ func (l *Libvirt) DomainState(dom string) (DomainState, error) {
|
||||
return DomainStateNoState, err
|
||||
}
|
||||
|
||||
resp, err := l.request(constants.ProcDomainGetState, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcDomainGetState, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return DomainStateNoState, err
|
||||
}
|
||||
@ -814,7 +814,8 @@ func (l *Libvirt) Migrate(dom string, dest string, flags MigrateFlags) error {
|
||||
return err
|
||||
}
|
||||
|
||||
resp, err := l.request(constants.ProcMigratePerformParams, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcDomainMigratePerform3Params,
|
||||
constants.Program, &buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -852,7 +853,7 @@ func (l *Libvirt) MigrateSetMaxSpeed(dom string, speed int64) error {
|
||||
return err
|
||||
}
|
||||
|
||||
resp, err := l.request(constants.ProcDomainMigrateSetMaxSpeed, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcDomainMigrateSetMaxSpeed, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -932,7 +933,7 @@ func (l *Libvirt) Secrets() ([]Secret, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp, err := l.request(constants.ProcConnectListAllSecrets, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcConnectListAllSecrets, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -970,7 +971,7 @@ func (l *Libvirt) StoragePool(name string) (*StoragePool, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp, err := l.request(constants.ProcStoragePoolLookupByName, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcStoragePoolLookupByName, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -1013,7 +1014,7 @@ func (l *Libvirt) StoragePoolRefresh(name string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
resp, err := l.request(constants.ProcStoragePoolRefresh, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcStoragePoolRefresh, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -1042,7 +1043,7 @@ func (l *Libvirt) StoragePools(flags StoragePoolsFlags) ([]StoragePool, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp, err := l.request(constants.ProcConnectListAllStoragePools, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcConnectListAllStoragePools, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -1089,7 +1090,7 @@ func (l *Libvirt) Undefine(dom string, flags UndefineFlags) error {
|
||||
return err
|
||||
}
|
||||
|
||||
resp, err := l.request(constants.ProcDomainUndefineFlags, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcDomainUndefineFlags, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -1125,7 +1126,7 @@ func (l *Libvirt) Destroy(dom string, flags DestroyFlags) error {
|
||||
return err
|
||||
}
|
||||
|
||||
resp, err := l.request(constants.ProcDomainDestroyFlags, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcDomainDestroyFlags, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -1159,7 +1160,7 @@ func (l *Libvirt) XML(dom string, flags DomainXMLFlags) ([]byte, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp, err := l.request(constants.ProcDomainGetXMLDesc, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcDomainGetXMLDesc, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -1194,7 +1195,7 @@ func (l *Libvirt) DefineXML(x []byte, flags DomainDefineXMLFlags) error {
|
||||
return err
|
||||
}
|
||||
|
||||
resp, err := l.request(constants.ProcDomainDefineXMLFlags, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcDomainDefineXMLFlags, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -1209,7 +1210,7 @@ func (l *Libvirt) DefineXML(x []byte, flags DomainDefineXMLFlags) error {
|
||||
|
||||
// Version returns the version of the libvirt daemon.
|
||||
func (l *Libvirt) Version() (string, error) {
|
||||
resp, err := l.request(constants.ProcConnectGetLibVersion, constants.ProgramRemote, nil)
|
||||
resp, err := l.request(constants.ProcConnectGetLibVersion, constants.Program, nil)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
@ -1263,7 +1264,7 @@ func (l *Libvirt) Shutdown(dom string, flags ShutdownFlags) error {
|
||||
return err
|
||||
}
|
||||
|
||||
resp, err := l.request(constants.ProcDomainShutdownFlags, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcDomainShutdownFlags, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -1297,7 +1298,7 @@ func (l *Libvirt) Reboot(dom string, flags RebootFlags) error {
|
||||
return err
|
||||
}
|
||||
|
||||
resp, err := l.request(constants.ProcDomainReboot, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcDomainReboot, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -1330,7 +1331,7 @@ func (l *Libvirt) Reset(dom string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
resp, err := l.request(constants.ProcDomainReset, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcDomainReset, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -1418,7 +1419,7 @@ func (l *Libvirt) SetBlockIOTune(dom string, disk string, limits ...BlockLimit)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
resp, err := l.request(constants.ProcDomainSetBlockIOTune, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcDomainSetBlockIOTune, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -1456,7 +1457,7 @@ func (l *Libvirt) GetBlockIOTune(dom string, disk string) ([]BlockLimit, error)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp, err := l.request(constants.ProcDomainGetBlockIOTune, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcDomainGetBlockIOTune, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -1525,7 +1526,7 @@ func (l *Libvirt) lookup(name string) (*Domain, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp, err := l.request(constants.ProcDomainLookupByName, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcDomainLookupByName, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -563,7 +563,7 @@ func (m *MockLibvirt) handle(conn net.Conn) {
|
||||
proc := binary.BigEndian.Uint32(buf[12:16])
|
||||
|
||||
switch prog {
|
||||
case constants.ProgramRemote:
|
||||
case constants.Program:
|
||||
m.handleRemote(proc, conn)
|
||||
case constants.ProgramQEMU:
|
||||
m.handleQEMU(proc, conn)
|
||||
@ -599,7 +599,7 @@ func (m *MockLibvirt) handleRemote(procedure uint32, conn net.Conn) {
|
||||
conn.Write(m.reply(testDomainMemoryStatsReply))
|
||||
case constants.ProcDomainMigrateSetMaxSpeed:
|
||||
conn.Write(m.reply(testSetSpeedReply))
|
||||
case constants.ProcMigratePerformParams:
|
||||
case constants.ProcDomainMigratePerform3Params:
|
||||
conn.Write(m.reply(testMigrateReply))
|
||||
case constants.ProcDomainUndefineFlags:
|
||||
conn.Write(m.reply(testUndefineReply))
|
||||
|
8
rpc.go
8
rpc.go
@ -131,7 +131,7 @@ func (l *Libvirt) connect() error {
|
||||
|
||||
// libvirt requires that we call auth-list prior to connecting,
|
||||
// event when no authentication is used.
|
||||
resp, err := l.request(constants.ProcAuthList, constants.ProgramRemote, &buf)
|
||||
resp, err := l.request(constants.ProcAuthList, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -141,7 +141,7 @@ func (l *Libvirt) connect() error {
|
||||
return decodeError(r.Payload)
|
||||
}
|
||||
|
||||
resp, err = l.request(constants.ProcConnectOpen, constants.ProgramRemote, &buf)
|
||||
resp, err = l.request(constants.ProcConnectOpen, constants.Program, &buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -155,7 +155,7 @@ func (l *Libvirt) connect() error {
|
||||
}
|
||||
|
||||
func (l *Libvirt) disconnect() error {
|
||||
resp, err := l.request(constants.ProcConnectClose, constants.ProgramRemote, nil)
|
||||
resp, err := l.request(constants.ProcConnectClose, constants.Program, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -329,7 +329,7 @@ func (l *Libvirt) request(proc uint32, program uint32, payload *bytes.Buffer) (<
|
||||
Len: uint32(size),
|
||||
Header: header{
|
||||
Program: program,
|
||||
Version: constants.ProgramVersion,
|
||||
Version: constants.ProtocolVersion,
|
||||
Procedure: proc,
|
||||
Type: Call,
|
||||
Serial: serial,
|
||||
|
@ -120,12 +120,12 @@ func TestExtractHeader(t *testing.T) {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if h.Program != constants.ProgramRemote {
|
||||
t.Errorf("expected Program %q, got %q", constants.ProgramRemote, h.Program)
|
||||
if h.Program != constants.Program {
|
||||
t.Errorf("expected Program %q, got %q", constants.Program, h.Program)
|
||||
}
|
||||
|
||||
if h.Version != constants.ProgramVersion {
|
||||
t.Errorf("expected version %q, got %q", constants.ProgramVersion, h.Version)
|
||||
if h.Version != constants.ProtocolVersion {
|
||||
t.Errorf("expected version %q, got %q", constants.ProtocolVersion, h.Version)
|
||||
}
|
||||
|
||||
if h.Procedure != constants.ProcConnectOpen {
|
||||
|
Loading…
Reference in New Issue
Block a user