diff --git a/docs/Makefile.am b/docs/Makefile.am index 2b6ccf7e78..a8024b335b 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -181,7 +181,7 @@ $(python_generated_files): $(srcdir)/apibuild.py \ $(srcdir)/../include/libvirt/*.h \ $(srcdir)/../src/libvirt.c \ $(srcdir)/../src/util/virterror.c - -srcdir=$(srcdir) $(srcdir)/apibuild.py + $(AM_V_GEN)srcdir=$(srcdir) $(srcdir)/apibuild.py check-local: all diff --git a/docs/apibuild.py b/docs/apibuild.py index f160c478aa..d9e9952e9c 100755 --- a/docs/apibuild.py +++ b/docs/apibuild.py @@ -1490,6 +1490,77 @@ class CParser: self.signature = signature return token + # this dict contains the functions that are allowed to use [unsigned] + # long for legacy reasons in their signature and return type. this list is + # fixed. new procedures and public APIs have to use [unsigned] long long + long_legacy_functions = \ + { "virGetVersion" : (False, ("libVer", "typeVer")), + "virConnectGetLibVersion" : (False, ("libVer")), + "virConnectGetVersion" : (False, ("hvVer")), + "virDomainGetMaxMemory" : (True, ()), + "virDomainMigrate" : (False, ("flags", "bandwidth")), + "virDomainMigrate2" : (False, ("flags", "bandwidth")), + "virDomainMigrateBegin3" : (False, ("flags", "bandwidth")), + "virDomainMigrateConfirm3" : (False, ("flags", "bandwidth")), + "virDomainMigrateDirect" : (False, ("flags", "bandwidth")), + "virDomainMigrateFinish" : (False, ("flags")), + "virDomainMigrateFinish2" : (False, ("flags")), + "virDomainMigrateFinish3" : (False, ("flags")), + "virDomainMigratePeer2Peer" : (False, ("flags", "bandwidth")), + "virDomainMigratePerform" : (False, ("flags", "bandwidth")), + "virDomainMigratePerform3" : (False, ("flags", "bandwidth")), + "virDomainMigratePrepare" : (False, ("flags", "bandwidth")), + "virDomainMigratePrepare2" : (False, ("flags", "bandwidth")), + "virDomainMigratePrepare3" : (False, ("flags", "bandwidth")), + "virDomainMigratePrepareTunnel" : (False, ("flags", "bandwidth")), + "virDomainMigratePrepareTunnel3" : (False, ("flags", "bandwidth")), + "virDomainMigrateToURI" : (False, ("flags", "bandwidth")), + "virDomainMigrateToURI2" : (False, ("flags", "bandwidth")), + "virDomainMigrateVersion1" : (False, ("flags", "bandwidth")), + "virDomainMigrateVersion2" : (False, ("flags", "bandwidth")), + "virDomainMigrateVersion3" : (False, ("flags", "bandwidth")), + "virDomainMigrateSetMaxSpeed" : (False, ("bandwidth")), + "virDomainSetMaxMemory" : (False, ("memory")), + "virDomainSetMemory" : (False, ("memory")), + "virDomainSetMemoryFlags" : (False, ("memory")) } + + def checkLongLegacyFunction(self, name, return_type, signature): + if "long" in return_type and "long long" not in return_type: + try: + if not CParser.long_legacy_functions[name][0]: + raise Exception() + except: + self.error(("function '%s' is not allowed to return long, " + "use long long instead") % (name)) + + for param in signature: + if "long" in param[0] and "long long" not in param[0]: + try: + if param[1] not in CParser.long_legacy_functions[name][1]: + raise Exception() + except: + self.error(("function '%s' is not allowed to take long " + "parameter '%s', use long long instead") + % (name, param[1])) + + # this dict contains the structs that are allowed to use [unsigned] + # long for legacy reasons. this list is fixed. new structs have to use + # [unsigned] long long + long_legacy_struct_fields = \ + { "_virDomainInfo" : ("maxMem", "memory"), + "_virNodeInfo" : ("memory") } + + def checkLongLegacyStruct(self, name, fields): + for field in fields: + if "long" in field[0] and "long long" not in field[0]: + try: + if field[1] not in CParser.long_legacy_struct_fields[name]: + raise Exception() + except: + self.error(("struct '%s' is not allowed to contain long " + "field '%s', use long long instead") \ + % (name, field[1])) + # # Parse a global definition, be it a type, variable or function # the extern "C" blocks are a bit nasty and require it to recurse. @@ -1572,6 +1643,7 @@ class CParser: self.comment = None token = self.token() if type == "struct": + self.checkLongLegacyStruct(self.name, self.struct_fields) self.index_add(self.name, self.filename, not self.is_header, "struct", self.struct_fields) else: @@ -1584,12 +1656,14 @@ class CParser: if token == None: return None if token[0] == "sep" and token[1] == ";": + self.checkLongLegacyFunction(self.name, type, self.signature) d = self.mergeFunctionComment(self.name, ((type, None), self.signature), 1) self.index_add(self.name, self.filename, static, "function", d) token = self.token() elif token[0] == "sep" and token[1] == "{": + self.checkLongLegacyFunction(self.name, type, self.signature) d = self.mergeFunctionComment(self.name, ((type, None), self.signature), static) self.index_add(self.name, self.filename, static,