Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

[6830] Implement custom exit codes on server shutdown/restart

Added the possibility to use custom process return values
instead of hardcoded 0 (shutdown) or 2 (restart) to allow using them
for various custom external features / better handling.

This can be used through 4 commands in ".server" family:
 - shutdown
 - restart
 - idleshutdown
 - idlerestart

Those have from now on 2 arguments, where the second (return value)
is optional:

.server <command> <time> [return_value]

If return_value is not specified, default value (0 or 2) is used.

Signed-off-by: freghar <compmancz@gmail.com>

Set restart exist code for SIGINT singnal case.
Some code simplifications for original patch.
Related code cleanups.

Signed-off-by: VladimirMangos <vladimir@getmangos.com>
  • Loading branch information...
commit 1b056e9b63cc789a0b7757f395a44d94ef7a82e9 1 parent 93519a3
Jiri comps authored VladimirMangos committed
104 src/game/Level3.cpp
@@ -4583,13 +4583,33 @@ bool ChatHandler::HandleShutDownCommand(const char* args)
4583 4583 }
4584 4584 else
4585 4585 {
4586   - int32 time = atoi(args);
  4586 + char* time_str = strtok ((char*) args, " ");
  4587 + char* exitcode_str = strtok (NULL, "");
  4588 +
  4589 + int32 time = atoi (time_str);
4587 4590
4588 4591 ///- Prevent interpret wrong arg value as 0 secs shutdown time
4589   - if(time == 0 && (args[0]!='0' || args[1]!='\0') || time < 0)
  4592 + if(time == 0 && (time_str[0]!='0' || time_str[1]!='\0') || time < 0)
4590 4593 return false;
4591 4594
4592   - sWorld.ShutdownServ(time);
  4595 + if (exitcode_str)
  4596 + {
  4597 + int32 exitcode = atoi (exitcode_str);
  4598 +
  4599 + // Handle atoi() errors
  4600 + if (exitcode == 0 && (exitcode_str[0] != '0' || exitcode_str[1] != '\0'))
  4601 + return false;
  4602 +
  4603 + // Exit code should be in range of 0-125, 126-255 is used
  4604 + // in many shells for their own return codes and code > 255
  4605 + // is not supported in many others
  4606 + if (exitcode < 0 || exitcode > 125)
  4607 + return false;
  4608 +
  4609 + sWorld.ShutdownServ (time, 0, exitcode);
  4610 + }
  4611 + else
  4612 + sWorld.ShutdownServ(time,0,SHUTDOWN_EXIT_CODE);
4593 4613 }
4594 4614 return true;
4595 4615 }
@@ -4605,13 +4625,33 @@ bool ChatHandler::HandleRestartCommand(const char* args)
4605 4625 }
4606 4626 else
4607 4627 {
4608   - int32 time = atoi(args);
  4628 + char* time_str = strtok ((char*) args, " ");
  4629 + char* exitcode_str = strtok (NULL, "");
  4630 +
  4631 + int32 time = atoi (time_str);
4609 4632
4610 4633 ///- Prevent interpret wrong arg value as 0 secs shutdown time
4611   - if(time == 0 && (args[0]!='0' || args[1]!='\0') || time < 0)
  4634 + if(time == 0 && (time_str[0]!='0' || time_str[1]!='\0') || time < 0)
4612 4635 return false;
4613 4636
4614   - sWorld.ShutdownServ(time, SHUTDOWN_MASK_RESTART);
  4637 + if (exitcode_str)
  4638 + {
  4639 + int32 exitcode = atoi (exitcode_str);
  4640 +
  4641 + // Handle atoi() errors
  4642 + if (exitcode == 0 && (exitcode_str[0] != '0' || exitcode_str[1] != '\0'))
  4643 + return false;
  4644 +
  4645 + // Exit code should be in range of 0-125, 126-255 is used
  4646 + // in many shells for their own return codes and code > 255
  4647 + // is not supported in many others
  4648 + if (exitcode < 0 || exitcode > 125)
  4649 + return false;
  4650 +
  4651 + sWorld.ShutdownServ (time, SHUTDOWN_MASK_RESTART, exitcode);
  4652 + }
  4653 + else
  4654 + sWorld.ShutdownServ(time, SHUTDOWN_MASK_RESTART, RESTART_EXIT_CODE);
4615 4655 }
4616 4656 return true;
4617 4657 }
@@ -4627,13 +4667,33 @@ bool ChatHandler::HandleIdleRestartCommand(const char* args)
4627 4667 }
4628 4668 else
4629 4669 {
4630   - int32 time = atoi(args);
  4670 + char* time_str = strtok ((char*) args, " ");
  4671 + char* exitcode_str = strtok (NULL, "");
  4672 +
  4673 + int32 time = atoi (time_str);
4631 4674
4632 4675 ///- Prevent interpret wrong arg value as 0 secs shutdown time
4633   - if(time == 0 && (args[0]!='0' || args[1]!='\0') || time < 0)
  4676 + if(time == 0 && (time_str[0]!='0' || time_str[1]!='\0') || time < 0)
4634 4677 return false;
4635 4678
4636   - sWorld.ShutdownServ(time,SHUTDOWN_MASK_RESTART+SHUTDOWN_MASK_IDLE);
  4679 + if (exitcode_str)
  4680 + {
  4681 + int32 exitcode = atoi (exitcode_str);
  4682 +
  4683 + // Handle atoi() errors
  4684 + if (exitcode == 0 && (exitcode_str[0] != '0' || exitcode_str[1] != '\0'))
  4685 + return false;
  4686 +
  4687 + // Exit code should be in range of 0-125, 126-255 is used
  4688 + // in many shells for their own return codes and code > 255
  4689 + // is not supported in many others
  4690 + if (exitcode < 0 || exitcode > 125)
  4691 + return false;
  4692 +
  4693 + sWorld.ShutdownServ (time, SHUTDOWN_MASK_RESTART|SHUTDOWN_MASK_IDLE, exitcode);
  4694 + }
  4695 + else
  4696 + sWorld.ShutdownServ(time,SHUTDOWN_MASK_RESTART|SHUTDOWN_MASK_IDLE,RESTART_EXIT_CODE);
4637 4697 }
4638 4698 return true;
4639 4699 }
@@ -4649,13 +4709,33 @@ bool ChatHandler::HandleIdleShutDownCommand(const char* args)
4649 4709 }
4650 4710 else
4651 4711 {
4652   - int32 time = atoi(args);
  4712 + char* time_str = strtok ((char*) args, " ");
  4713 + char* exitcode_str = strtok (NULL, "");
  4714 +
  4715 + int32 time = atoi (time_str);
4653 4716
4654 4717 ///- Prevent interpret wrong arg value as 0 secs shutdown time
4655   - if(time == 0 && (args[0]!='0' || args[1]!='\0') || time < 0)
  4718 + if(time == 0 && (time_str[0]!='0' || time_str[1]!='\0') || time < 0)
4656 4719 return false;
4657 4720
4658   - sWorld.ShutdownServ(time,SHUTDOWN_MASK_IDLE);
  4721 + if (exitcode_str)
  4722 + {
  4723 + int32 exitcode = atoi (exitcode_str);
  4724 +
  4725 + // Handle atoi() errors
  4726 + if (exitcode == 0 && (exitcode_str[0] != '0' || exitcode_str[1] != '\0'))
  4727 + return false;
  4728 +
  4729 + // Exit code should be in range of 0-125, 126-255 is used
  4730 + // in many shells for their own return codes and code > 255
  4731 + // is not supported in many others
  4732 + if (exitcode < 0 || exitcode > 125)
  4733 + return false;
  4734 +
  4735 + sWorld.ShutdownServ (time, SHUTDOWN_MASK_IDLE, exitcode);
  4736 + }
  4737 + else
  4738 + sWorld.ShutdownServ(time,SHUTDOWN_MASK_IDLE,SHUTDOWN_EXIT_CODE);
4659 4739 }
4660 4740 return true;
4661 4741 }
24 src/game/ObjectMgr.cpp
@@ -5179,7 +5179,7 @@ uint32 ObjectMgr::GenerateArenaTeamId()
5179 5179 if(m_arenaTeamId>=0xFFFFFFFF)
5180 5180 {
5181 5181 sLog.outError("Arena team ids overflow!! Can't continue, shutting down server. ");
5182   - sWorld.m_stopEvent = true;
  5182 + World::StopNow(ERROR_EXIT_CODE);
5183 5183 }
5184 5184 return m_arenaTeamId;
5185 5185 }
@@ -5190,7 +5190,7 @@ uint32 ObjectMgr::GenerateGuildId()
5190 5190 if(m_guildId>=0xFFFFFFFF)
5191 5191 {
5192 5192 sLog.outError("Guild ids overflow!! Can't continue, shutting down server. ");
5193   - sWorld.m_stopEvent = true;
  5193 + World::StopNow(ERROR_EXIT_CODE);
5194 5194 }
5195 5195 return m_guildId;
5196 5196 }
@@ -5201,7 +5201,7 @@ uint32 ObjectMgr::GenerateAuctionID()
5201 5201 if(m_auctionid>=0xFFFFFFFF)
5202 5202 {
5203 5203 sLog.outError("Auctions ids overflow!! Can't continue, shutting down server. ");
5204   - sWorld.m_stopEvent = true;
  5204 + World::StopNow(ERROR_EXIT_CODE);
5205 5205 }
5206 5206 return m_auctionid;
5207 5207 }
@@ -5212,7 +5212,7 @@ uint32 ObjectMgr::GenerateMailID()
5212 5212 if(m_mailid>=0xFFFFFFFF)
5213 5213 {
5214 5214 sLog.outError("Mail ids overflow!! Can't continue, shutting down server. ");
5215   - sWorld.m_stopEvent = true;
  5215 + World::StopNow(ERROR_EXIT_CODE);
5216 5216 }
5217 5217 return m_mailid;
5218 5218 }
@@ -5223,7 +5223,7 @@ uint32 ObjectMgr::GenerateItemTextID()
5223 5223 if(m_ItemTextId>=0xFFFFFFFF)
5224 5224 {
5225 5225 sLog.outError("Item text ids overflow!! Can't continue, shutting down server. ");
5226   - sWorld.m_stopEvent = true;
  5226 + World::StopNow(ERROR_EXIT_CODE);
5227 5227 }
5228 5228 return m_ItemTextId;
5229 5229 }
@@ -5251,7 +5251,7 @@ uint32 ObjectMgr::GenerateLowGuid(HighGuid guidhigh)
5251 5251 if(m_hiItemGuid>=0xFFFFFFFF)
5252 5252 {
5253 5253 sLog.outError("Item guid overflow!! Can't continue, shutting down server. ");
5254   - sWorld.m_stopEvent = true;
  5254 + World::StopNow(ERROR_EXIT_CODE);
5255 5255 }
5256 5256 return m_hiItemGuid;
5257 5257 case HIGHGUID_UNIT:
@@ -5259,7 +5259,7 @@ uint32 ObjectMgr::GenerateLowGuid(HighGuid guidhigh)
5259 5259 if(m_hiCreatureGuid>=0x00FFFFFF)
5260 5260 {
5261 5261 sLog.outError("Creature guid overflow!! Can't continue, shutting down server. ");
5262   - sWorld.m_stopEvent = true;
  5262 + World::StopNow(ERROR_EXIT_CODE);
5263 5263 }
5264 5264 return m_hiCreatureGuid;
5265 5265 case HIGHGUID_PET:
@@ -5267,7 +5267,7 @@ uint32 ObjectMgr::GenerateLowGuid(HighGuid guidhigh)
5267 5267 if(m_hiPetGuid>=0x00FFFFFF)
5268 5268 {
5269 5269 sLog.outError("Pet guid overflow!! Can't continue, shutting down server. ");
5270   - sWorld.m_stopEvent = true;
  5270 + World::StopNow(ERROR_EXIT_CODE);
5271 5271 }
5272 5272 return m_hiPetGuid;
5273 5273 case HIGHGUID_PLAYER:
@@ -5275,7 +5275,7 @@ uint32 ObjectMgr::GenerateLowGuid(HighGuid guidhigh)
5275 5275 if(m_hiCharGuid>=0xFFFFFFFF)
5276 5276 {
5277 5277 sLog.outError("Players guid overflow!! Can't continue, shutting down server. ");
5278   - sWorld.m_stopEvent = true;
  5278 + World::StopNow(ERROR_EXIT_CODE);
5279 5279 }
5280 5280 return m_hiCharGuid;
5281 5281 case HIGHGUID_GAMEOBJECT:
@@ -5283,7 +5283,7 @@ uint32 ObjectMgr::GenerateLowGuid(HighGuid guidhigh)
5283 5283 if(m_hiGoGuid>=0x00FFFFFF)
5284 5284 {
5285 5285 sLog.outError("Gameobject guid overflow!! Can't continue, shutting down server. ");
5286   - sWorld.m_stopEvent = true;
  5286 + World::StopNow(ERROR_EXIT_CODE);
5287 5287 }
5288 5288 return m_hiGoGuid;
5289 5289 case HIGHGUID_CORPSE:
@@ -5291,7 +5291,7 @@ uint32 ObjectMgr::GenerateLowGuid(HighGuid guidhigh)
5291 5291 if(m_hiCorpseGuid>=0xFFFFFFFF)
5292 5292 {
5293 5293 sLog.outError("Corpse guid overflow!! Can't continue, shutting down server. ");
5294   - sWorld.m_stopEvent = true;
  5294 + World::StopNow(ERROR_EXIT_CODE);
5295 5295 }
5296 5296 return m_hiCorpseGuid;
5297 5297 case HIGHGUID_DYNAMICOBJECT:
@@ -5299,7 +5299,7 @@ uint32 ObjectMgr::GenerateLowGuid(HighGuid guidhigh)
5299 5299 if(m_hiDoGuid>=0xFFFFFFFF)
5300 5300 {
5301 5301 sLog.outError("DynamicObject guid overflow!! Can't continue, shutting down server. ");
5302   - sWorld.m_stopEvent = true;
  5302 + World::StopNow(ERROR_EXIT_CODE);
5303 5303 }
5304 5304 return m_hiDoGuid;
5305 5305 default:
18 src/game/World.cpp
@@ -62,6 +62,7 @@
62 62 INSTANTIATE_SINGLETON_1( World );
63 63
64 64 volatile bool World::m_stopEvent = false;
  65 +uint8 World::m_ExitCode = SHUTDOWN_EXIT_CODE;
65 66 volatile uint32 World::m_worldLoopCounter = 0;
66 67
67 68 float World::m_MaxVisibleDistanceForCreature = DEFAULT_VISIBILITY_DISTANCE;
@@ -2315,13 +2316,13 @@ void World::_UpdateGameTime()
2315 2316 m_gameTime = thisTime;
2316 2317
2317 2318 ///- if there is a shutdown timer
2318   - if(m_ShutdownTimer > 0 && elapsed > 0)
  2319 + if(!m_stopEvent && m_ShutdownTimer > 0 && elapsed > 0)
2319 2320 {
2320 2321 ///- ... and it is overdue, stop the world (set m_stopEvent)
2321 2322 if( m_ShutdownTimer <= elapsed )
2322 2323 {
2323 2324 if(!(m_ShutdownMask & SHUTDOWN_MASK_IDLE) || GetActiveAndQueuedSessionCount()==0)
2324   - m_stopEvent = true;
  2325 + m_stopEvent = true; // exist code already set
2325 2326 else
2326 2327 m_ShutdownTimer = 1; // minimum timer value to wait idle state
2327 2328 }
@@ -2336,15 +2337,20 @@ void World::_UpdateGameTime()
2336 2337 }
2337 2338
2338 2339 /// Shutdown the server
2339   -void World::ShutdownServ(uint32 time, uint32 options)
  2340 +void World::ShutdownServ(uint32 time, uint32 options, uint8 exitcode)
2340 2341 {
  2342 + // ignore if server shutdown at next tick
  2343 + if(m_stopEvent)
  2344 + return;
  2345 +
2341 2346 m_ShutdownMask = options;
  2347 + m_ExitCode = exitcode;
2342 2348
2343 2349 ///- If the shutdown time is 0, set m_stopEvent (except if shutdown is 'idle' with remaining sessions)
2344 2350 if(time==0)
2345 2351 {
2346 2352 if(!(options & SHUTDOWN_MASK_IDLE) || GetActiveAndQueuedSessionCount()==0)
2347   - m_stopEvent = true;
  2353 + m_stopEvent = true; // exist code already set
2348 2354 else
2349 2355 m_ShutdownTimer = 1; //So that the session count is re-evaluated at next world tick
2350 2356 }
@@ -2389,13 +2395,15 @@ void World::ShutdownMsg(bool show, Player* player)
2389 2395 /// Cancel a planned server shutdown
2390 2396 void World::ShutdownCancel()
2391 2397 {
2392   - if(!m_ShutdownTimer)
  2398 + // nothing cancel or too later
  2399 + if(!m_ShutdownTimer || m_stopEvent)
2393 2400 return;
2394 2401
2395 2402 uint32 msgid = (m_ShutdownMask & SHUTDOWN_MASK_RESTART) ? SERVER_MSG_RESTART_CANCELLED : SERVER_MSG_SHUTDOWN_CANCELLED;
2396 2403
2397 2404 m_ShutdownMask = 0;
2398 2405 m_ShutdownTimer = 0;
  2406 + m_ExitCode = SHUTDOWN_EXIT_CODE; // to default value
2399 2407 SendServerMessage(msgid);
2400 2408
2401 2409 DEBUG_LOG("Server %s cancelled.",(m_ShutdownMask & SHUTDOWN_MASK_RESTART ? "restart" : "shuttingdown"));
22 src/game/World.h
@@ -49,6 +49,13 @@ enum ShutdownMask
49 49 SHUTDOWN_MASK_IDLE = 2,
50 50 };
51 51
  52 +enum ShutdownExitCode
  53 +{
  54 + SHUTDOWN_EXIT_CODE = 0,
  55 + ERROR_EXIT_CODE = 1,
  56 + RESTART_EXIT_CODE = 2,
  57 +};
  58 +
52 59 /// Timers for different object refresh rates
53 60 enum WorldTimers
54 61 {
@@ -310,7 +317,6 @@ struct CliCommandHolder
310 317 class World
311 318 {
312 319 public:
313   - static volatile bool m_stopEvent;
314 320 static volatile uint32 m_worldLoopCounter;
315 321
316 322 World();
@@ -387,11 +393,13 @@ class World
387 393 void SendServerMessage(uint32 type, const char *text = "", Player* player = NULL);
388 394
389 395 /// Are we in the middle of a shutdown?
390   - uint32 GetShutdownMask() const { return m_ShutdownMask; }
391 396 bool IsShutdowning() const { return m_ShutdownTimer > 0; }
392   - void ShutdownServ(uint32 time, uint32 options = 0);
  397 + void ShutdownServ(uint32 time, uint32 options, uint8 exitcode);
393 398 void ShutdownCancel();
394 399 void ShutdownMsg(bool show = false, Player* player = NULL);
  400 + static uint8 GetExitCode() { return m_ExitCode; }
  401 + static void StopNow(uint8 exitcode) { m_stopEvent = true; m_ExitCode = exitcode; }
  402 + static bool IsStopped() { return m_stopEvent; }
395 403
396 404 void Update(time_t diff);
397 405
@@ -467,6 +475,11 @@ class World
467 475 void InitDailyQuestResetTime();
468 476 void ResetDailyQuests();
469 477 private:
  478 + static volatile bool m_stopEvent;
  479 + static uint8 m_ExitCode;
  480 + uint32 m_ShutdownTimer;
  481 + uint32 m_ShutdownMask;
  482 +
470 483 time_t m_startTime;
471 484 time_t m_gameTime;
472 485 IntervalTimer m_timers[WUPDATE_COUNT];
@@ -493,9 +506,6 @@ class World
493 506 std::string m_motd;
494 507 std::string m_dataPath;
495 508
496   - uint32 m_ShutdownTimer;
497   - uint32 m_ShutdownMask;
498   -
499 509 // for max speed access
500 510 static float m_MaxVisibleDistanceForCreature;
501 511 static float m_MaxVisibleDistanceForPlayer;
10 src/mangosd/CliRunnable.cpp
@@ -165,7 +165,7 @@ bool ChatHandler::HandleCharacterDeleteCommand(const char* args)
165 165 bool ChatHandler::HandleServerExitCommand(const char* args)
166 166 {
167 167 SendSysMessage(LANG_COMMAND_EXIT);
168   - World::m_stopEvent = true;
  168 + World::StopNow(SHUTDOWN_EXIT_CODE);
169 169 return true;
170 170 }
171 171
@@ -306,14 +306,14 @@ void CliRunnable::run()
306 306 printf("mangos>");
307 307
308 308 ///- As long as the World is running (no World::m_stopEvent), get the command line and handle it
309   - while (!World::m_stopEvent)
  309 + while (!World::IsStopped())
310 310 {
311 311 fflush(stdout);
312 312 #ifdef linux
313   - while (!kb_hit_return() && !World::m_stopEvent)
  313 + while (!kb_hit_return() && !World::IsStopped())
314 314 // With this, we limit CLI to 10commands/second
315 315 usleep(100);
316   - if (World::m_stopEvent)
  316 + if (World::IsStopped())
317 317 break;
318 318 #endif
319 319 char *command_str = fgets(commandbuf,sizeof(commandbuf),stdin);
@@ -344,7 +344,7 @@ void CliRunnable::run()
344 344 }
345 345 else if (feof(stdin))
346 346 {
347   - World::m_stopEvent = true;
  347 + World::StopNow(SHUTDOWN_EXIT_CODE);
348 348 }
349 349 }
350 350
16 src/mangosd/Master.cpp
@@ -75,7 +75,7 @@ class FreezeDetectorRunnable : public ZThread::Runnable
75 75 w_loops = 0;
76 76 m_lastchange = 0;
77 77 w_lastchange = 0;
78   - while(!World::m_stopEvent)
  78 + while(!World::IsStopped())
79 79 {
80 80 ZThread::Thread::sleep(1000);
81 81 uint32 curtime = getMSTime();
@@ -170,13 +170,13 @@ class RARunnable : public ZThread::Runnable
170 170
171 171 // if use ra spend time waiting for io, if not use ra ,just sleep
172 172 if (usera)
173   - while (!World::m_stopEvent)
  173 + while (!World::IsStopped())
174 174 {
175 175 h.Select (0, socketSelecttime);
176 176 checkping ();
177 177 }
178 178 else
179   - while (!World::m_stopEvent)
  179 + while (!World::IsStopped())
180 180 {
181 181 ZThread::Thread::sleep (static_cast<unsigned long> (socketSelecttime / 1000));
182 182 checkping ();
@@ -308,7 +308,7 @@ int Master::Run()
308 308 if (sWorldSocketMgr->StartNetwork (wsport, bind_ip.c_str ()) == -1)
309 309 {
310 310 sLog.outError ("Failed to start network");
311   - World::m_stopEvent = true;
  311 + World::StopNow(ERROR_EXIT_CODE);
312 312 // go down and shutdown the server
313 313 }
314 314
@@ -379,7 +379,8 @@ int Master::Run()
379 379 // fixes a memory leak related to detaching threads from the module
380 380 UnloadScriptingModule();
381 381
382   - return sWorld.GetShutdownMask() & SHUTDOWN_MASK_RESTART ? 2 : 0;
  382 + // Exit the process with specified return value
  383 + return World::GetExitCode();
383 384 }
384 385
385 386 /// Initialize connection to the databases
@@ -462,17 +463,18 @@ void Master::clearOnlineAccounts()
462 463 }
463 464
464 465 /// Handle termination signals
465   -/** Put the World::m_stopEvent to 'true' if a termination signal is caught **/
466 466 void Master::_OnSignal(int s)
467 467 {
468 468 switch (s)
469 469 {
470 470 case SIGINT:
  471 + World::StopNow(RESTART_EXIT_CODE);
  472 + break;
471 473 case SIGTERM:
472 474 #ifdef _WIN32
473 475 case SIGBREAK:
474 476 #endif
475   - World::m_stopEvent = true;
  477 + World::StopNow(SHUTDOWN_EXIT_CODE);
476 478 break;
477 479 }
478 480
2  src/mangosd/WorldRunnable.cpp
@@ -49,7 +49,7 @@ void WorldRunnable::run()
49 49 uint32 prevSleepTime = 0; // used for balanced full tick time length near WORLD_SLEEP_CONST
50 50
51 51 ///- While we have not World::m_stopEvent, update the world
52   - while (!World::m_stopEvent)
  52 + while (!World::IsStopped())
53 53 {
54 54 ++World::m_worldLoopCounter;
55 55 realCurrTime = getMSTime();
2  src/shared/revision_nr.h
... ... @@ -1,4 +1,4 @@
1 1 #ifndef __REVISION_NR_H__
2 2 #define __REVISION_NR_H__
3   - #define REVISION_NR "6829"
  3 + #define REVISION_NR "6830"
4 4 #endif // __REVISION_NR_H__

0 comments on commit 1b056e9

Please sign in to comment.
Something went wrong with that request. Please try again.