1\babel@toc {english}{} 2\contentsline {chapter}{\numberline {1}Bacula{} Developer Notes}{1}{chapter.1}% 3\contentsline {section}{\numberline {1.1}Contributions}{1}{section.1.1}% 4\contentsline {section}{\numberline {1.2}Patches}{1}{section.1.2}% 5\contentsline {section}{\numberline {1.3}Copyrights}{2}{section.1.3}% 6\contentsline {section}{\numberline {1.4}Copyright Assignment -- Fiduciary License Agreement}{2}{section.1.4}% 7\contentsline {section}{\numberline {1.5}The Development Cycle}{3}{section.1.5}% 8\contentsline {subsection}{\numberline {1.5.1}Feature Requests}{3}{subsection.1.5.1}% 9\contentsline {subsubsection}{Implementation of Feature Requests}{4}{section*.5}% 10\contentsline {subsubsection}{How Feature Requests are accepted}{4}{section*.6}% 11\contentsline {subsubsection}{How Feature Requests are prioritized}{4}{section*.7}% 12\contentsline {section}{\numberline {1.6}Bacula{} Code Submissions and Projects}{5}{section.1.6}% 13\contentsline {section}{\numberline {1.7}Patches for Released Versions}{5}{section.1.7}% 14\contentsline {section}{\numberline {1.8}Developing Bacula{}}{6}{section.1.8}% 15\contentsline {section}{\numberline {1.9}Debugging}{7}{section.1.9}% 16\contentsline {section}{\numberline {1.10}Using a Debugger}{7}{section.1.10}% 17\contentsline {section}{\numberline {1.11}Memory Leaks}{7}{section.1.11}% 18\contentsline {section}{\numberline {1.12}Special Files}{8}{section.1.12}% 19\contentsline {section}{\numberline {1.13}When Implementing Incomplete Code}{8}{section.1.13}% 20\contentsline {subsection}{\numberline {1.13.1}Bacula{} Source File Structure}{8}{subsection.1.13.1}% 21\contentsline {section}{\numberline {1.14}Header Files}{9}{section.1.14}% 22\contentsline {section}{\numberline {1.15}Programming Standards}{9}{section.1.15}% 23\contentsline {section}{\numberline {1.16}Do Not Use}{10}{section.1.16}% 24\contentsline {section}{\numberline {1.17}Avoid if Possible}{10}{section.1.17}% 25\contentsline {section}{\numberline {1.18}Do Use Whenever Possible}{10}{section.1.18}% 26\contentsline {section}{\numberline {1.19}Indenting Standards}{11}{section.1.19}% 27\contentsline {section}{\numberline {1.20}Naming Convention}{12}{section.1.20}% 28\contentsline {section}{\numberline {1.21}Locks and Threads}{13}{section.1.21}% 29\contentsline {section}{\numberline {1.22}Tabbing}{14}{section.1.22}% 30\contentsline {section}{\numberline {1.23}Don'ts}{14}{section.1.23}% 31\contentsline {paragraph}{Note}{15}{section*.8}% 32\contentsline {section}{\numberline {1.24}Message Classes}{15}{section.1.24}% 33\contentsline {section}{\numberline {1.25}Debug Messages}{15}{section.1.25}% 34\contentsline {subsection}{\numberline {1.25.1}Debug Tags}{16}{subsection.1.25.1}% 35\contentsline {section}{\numberline {1.26}Error Messages}{16}{section.1.26}% 36\contentsline {section}{\numberline {1.27}Job Messages}{17}{section.1.27}% 37\contentsline {section}{\numberline {1.28}Queued Job Messages}{17}{section.1.28}% 38\contentsline {section}{\numberline {1.29}Memory Messages}{17}{section.1.29}% 39\contentsline {section}{\numberline {1.30}Bugs Database}{18}{section.1.30}% 40\contentsline {chapter}{\numberline {2}Bacula Git Usage}{19}{chapter.2}% 41\contentsline {section}{\numberline {2.1}Bacula Git repositories}{19}{section.2.1}% 42\contentsline {section}{\numberline {2.2}Git Usage}{19}{section.2.2}% 43\contentsline {subsection}{\numberline {2.2.1}Learning Git}{20}{subsection.2.2.1}% 44\contentsline {section}{\numberline {2.3}Step by Step Modifying Bacula Code}{21}{section.2.3}% 45\contentsline {subsection}{\numberline {2.3.1}More Details}{23}{subsection.2.3.1}% 46\contentsline {section}{\numberline {2.4}Forcing Changes}{24}{section.2.4}% 47\contentsline {chapter}{\numberline {3}Bacula FD Plugin API}{27}{chapter.3}% 48\contentsline {section}{\numberline {3.1}Normal vs Command vs Options Plugins}{27}{section.3.1}% 49\contentsline {section}{\numberline {3.2}Loading Plugins}{28}{section.3.2}% 50\contentsline {section}{\numberline {3.3}loadPlugin}{29}{section.3.3}% 51\contentsline {section}{\numberline {3.4}Plugin Entry Points}{31}{section.3.4}% 52\contentsline {subsection}{\numberline {3.4.1}newPlugin(bpContext *ctx)}{31}{subsection.3.4.1}% 53\contentsline {subsection}{\numberline {3.4.2}freePlugin(bpContext *ctx)}{31}{subsection.3.4.2}% 54\contentsline {subsection}{\numberline {3.4.3}getPluginValue(bpContext *ctx, pVariable var, void *value)}{32}{subsection.3.4.3}% 55\contentsline {subsection}{\numberline {3.4.4}setPluginValue(bpContext *ctx, pVariable var, void *value)}{32}{subsection.3.4.4}% 56\contentsline {subsection}{\numberline {3.4.5}handlePluginEvent(bpContext *ctx, bEvent *event, void *value)}{32}{subsection.3.4.5}% 57\contentsline {subsection}{\numberline {3.4.6}startBackupFile(bpContext *ctx, struct save\_pkt *sp)}{34}{subsection.3.4.6}% 58\contentsline {subsection}{\numberline {3.4.7}endBackupFile(bpContext *ctx)}{35}{subsection.3.4.7}% 59\contentsline {subsection}{\numberline {3.4.8}startRestoreFile(bpContext *ctx, const char *cmd)}{35}{subsection.3.4.8}% 60\contentsline {subsection}{\numberline {3.4.9}createFile(bpContext *ctx, struct restore\_pkt *rp)}{35}{subsection.3.4.9}% 61\contentsline {subsection}{\numberline {3.4.10}setFileAttributes(bpContext *ctx, struct restore\_pkt *rp)}{36}{subsection.3.4.10}% 62\contentsline {subsection}{\numberline {3.4.11}endRestoreFile(bpContext *ctx)}{37}{subsection.3.4.11}% 63\contentsline {subsection}{\numberline {3.4.12}pluginIO(bpContext *ctx, struct io\_pkt *io)}{37}{subsection.3.4.12}% 64\contentsline {subsection}{\numberline {3.4.13}bool checkFile(bpContext *ctx, char *fname)}{38}{subsection.3.4.13}% 65\contentsline {section}{\numberline {3.5}Bacula Plugin Entrypoints}{38}{section.3.5}% 66\contentsline {subsection}{\numberline {3.5.1}bRC registerBaculaEvents(bpContext *ctx, ...)}{38}{subsection.3.5.1}% 67\contentsline {subsection}{\numberline {3.5.2}bRC getBaculaValue(bpContext *ctx, bVariable var, void *value)}{38}{subsection.3.5.2}% 68\contentsline {subsection}{\numberline {3.5.3}bRC setBaculaValue(bpContext *ctx, bVariable var, void *value)}{39}{subsection.3.5.3}% 69\contentsline {subsection}{\numberline {3.5.4}bRC JobMessage(bpContext *ctx, const char *file, int line, int type, utime\_t mtime, const char *fmt, ...)}{39}{subsection.3.5.4}% 70\contentsline {subsection}{\numberline {3.5.5}bRC DebugMessage(bpContext *ctx, const char *file, int line, int level, const char *fmt, ...)}{39}{subsection.3.5.5}% 71\contentsline {subsection}{\numberline {3.5.6}void baculaMalloc(bpContext *ctx, const char *file, int line, size\_t size)}{39}{subsection.3.5.6}% 72\contentsline {subsection}{\numberline {3.5.7}void baculaFree(bpContext *ctx, const char *file, int line, void *mem)}{39}{subsection.3.5.7}% 73\contentsline {section}{\numberline {3.6}Building Bacula Plugins}{39}{section.3.6}% 74\contentsline {section}{\numberline {3.7}Advanced Restore Options}{40}{section.3.7}% 75\contentsline {section}{\numberline {3.8}Bacula Auth Plugin Documentation}{41}{section.3.8}% 76\contentsline {subsection}{\numberline {3.8.1}Overview}{41}{subsection.3.8.1}% 77\contentsline {subsection}{\numberline {3.8.2}Dictionary}{41}{subsection.3.8.2}% 78\contentsline {subsection}{\numberline {3.8.3}Bacula DIR Plugin API}{41}{subsection.3.8.3}% 79\contentsline {subsubsection}{Loading Plugins}{41}{section*.10}% 80\contentsline {subsubsection}{Plugin Entry Points}{44}{section*.13}% 81\contentsline {subsection}{\numberline {3.8.4}Bacula Pluggable Authentication Modules API Framework \textbf {BPAM}]}{46}{subsection.3.8.4}% 82\contentsline {subsubsection}{BPAM Plugin registration}{47}{section*.19}% 83\contentsline {chapter}{\numberline {4}Platform Support}{53}{chapter.4}% 84\contentsline {section}{\numberline {4.1}General}{53}{section.4.1}% 85\contentsline {section}{\numberline {4.2}Requirements to become a Supported Platform}{53}{section.4.2}% 86\contentsline {chapter}{\numberline {5}Daemon Protocol}{55}{chapter.5}% 87\contentsline {section}{\numberline {5.1}General}{55}{section.5.1}% 88\contentsline {section}{\numberline {5.2}Low Level Network Protocol}{55}{section.5.2}% 89\contentsline {section}{\numberline {5.3}General Daemon Protocol}{55}{section.5.3}% 90\contentsline {section}{\numberline {5.4}The Protocol Used Between the Director and the Storage Daemon}{56}{section.5.4}% 91\contentsline {section}{\numberline {5.5}The Protocol Used Between the Director and the File Daemon}{56}{section.5.5}% 92\contentsline {section}{\numberline {5.6}The Save Protocol Between the File Daemon and the Storage Daemon}{57}{section.5.6}% 93\contentsline {subsection}{\numberline {5.6.1}Command and Control Information}{57}{subsection.5.6.1}% 94\contentsline {subsection}{\numberline {5.6.2}Data Information}{57}{subsection.5.6.2}% 95\contentsline {chapter}{\numberline {6}Director Services Daemon}{59}{chapter.6}% 96\contentsline {chapter}{\numberline {7}File Services Daemon}{61}{chapter.7}% 97\contentsline {section}{\numberline {7.1}Commands Received from the Director for a Backup}{61}{section.7.1}% 98\contentsline {section}{\numberline {7.2}Commands Received from the Director for a Restore}{62}{section.7.2}% 99\contentsline {chapter}{\numberline {8}Storage Daemon Design}{63}{chapter.8}% 100\contentsline {section}{\numberline {8.1}SD Design Introduction}{63}{section.8.1}% 101\contentsline {section}{\numberline {8.2}SD Development Outline}{63}{section.8.2}% 102\contentsline {section}{\numberline {8.3}SD Connections and Sessions}{64}{section.8.3}% 103\contentsline {subsection}{\numberline {8.3.1}SD Append Requests}{64}{subsection.8.3.1}% 104\contentsline {subsection}{\numberline {8.3.2}SD Read Requests}{65}{subsection.8.3.2}% 105\contentsline {section}{\numberline {8.4}SD Data Structures}{65}{section.8.4}% 106\contentsline {chapter}{\numberline {9}Catalog Services}{67}{chapter.9}% 107\contentsline {section}{\numberline {9.1}General}{67}{section.9.1}% 108\contentsline {subsection}{\numberline {9.1.1}Filenames and Maximum Filename Length}{67}{subsection.9.1.1}% 109\contentsline {subsection}{\numberline {9.1.2}Installing and Configuring \texttt {MySQL}{}}{68}{subsection.9.1.2}% 110\contentsline {subsection}{\numberline {9.1.3}Installing and Configuring \texttt {PostgreSQL}{}}{68}{subsection.9.1.3}% 111\contentsline {subsection}{\numberline {9.1.4}Internal Bacula{} Catalog}{68}{subsection.9.1.4}% 112\contentsline {subsection}{\numberline {9.1.5}Database Table Design}{68}{subsection.9.1.5}% 113\contentsline {section}{\numberline {9.2}Sequence of Creation of Records for a Save Job}{68}{section.9.2}% 114\contentsline {section}{\numberline {9.3}Database Tables}{69}{section.9.3}% 115\contentsline {chapter}{\numberline {10}Storage Media Output Format}{81}{chapter.10}% 116\contentsline {section}{\numberline {10.1}General}{81}{section.10.1}% 117\contentsline {section}{\numberline {10.2}Definitions}{81}{section.10.2}% 118\contentsline {section}{\numberline {10.3}Storage Daemon File Output Format}{83}{section.10.3}% 119\contentsline {section}{\numberline {10.4}Overall Format}{83}{section.10.4}% 120\contentsline {section}{\numberline {10.5}Serialization}{83}{section.10.5}% 121\contentsline {section}{\numberline {10.6}Block Header}{83}{section.10.6}% 122\contentsline {section}{\numberline {10.7}Record Header}{84}{section.10.7}% 123\contentsline {section}{\numberline {10.8}Version BB02 Block Header}{85}{section.10.8}% 124\contentsline {section}{\numberline {10.9}Version 2 Record Header}{85}{section.10.9}% 125\contentsline {section}{\numberline {10.10}Volume Label Format}{85}{section.10.10}% 126\contentsline {section}{\numberline {10.11}Session Label}{86}{section.10.11}% 127\contentsline {section}{\numberline {10.12}Overall Storage Format}{87}{section.10.12}% 128\contentsline {section}{\numberline {10.13}Unix File Attributes}{90}{section.10.13}% 129\contentsline {section}{\numberline {10.14}Old Depreciated Tape Format}{91}{section.10.14}% 130\contentsline {chapter}{\numberline {11}Bacula Porting Notes}{97}{chapter.11}% 131\contentsline {section}{\numberline {11.1}Porting Requirements}{97}{section.11.1}% 132\contentsline {section}{\numberline {11.2}Steps to Take for Porting}{98}{section.11.2}% 133\contentsline {section}{\numberline {11.1}General}{101}{section.11.1}% 134\contentsline {subsection}{\numberline {11.1.1}Minimal Code in Console Program}{101}{subsection.11.1.1}% 135\contentsline {subsection}{\numberline {11.1.2}\acs {GUI} Interface is Difficult}{101}{subsection.11.1.2}% 136\contentsline {section}{\numberline {11.2}Bvfs API}{102}{section.11.2}% 137\contentsline {chapter}{\numberline {12}TLS}{107}{chapter.12}% 138\contentsline {section}{\numberline {12.1}Introduction to TLS}{107}{section.12.1}% 139\contentsline {section}{\numberline {12.2}New Configuration Directives}{107}{section.12.2}% 140\contentsline {section}{\numberline {12.3}TLS API Implementation}{108}{section.12.3}% 141\contentsline {subsection}{\numberline {12.3.1}Library Initialization and Cleanup}{108}{subsection.12.3.1}% 142\contentsline {subsection}{\numberline {12.3.2}Manipulating TLS Contexts}{108}{subsection.12.3.2}% 143\contentsline {subsection}{\numberline {12.3.3}Performing Post-Connection Verification}{109}{subsection.12.3.3}% 144\contentsline {subsection}{\numberline {12.3.4}Manipulating TLS Connections}{109}{subsection.12.3.4}% 145\contentsline {section}{\numberline {12.4}Bnet API Changes}{110}{section.12.4}% 146\contentsline {subsection}{\numberline {12.4.1}Negotiating a TLS Connection}{110}{subsection.12.4.1}% 147\contentsline {subsection}{\numberline {12.4.2}Manipulating Socket Blocking State}{110}{subsection.12.4.2}% 148\contentsline {section}{\numberline {12.5}Authentication Negotiation}{111}{section.12.5}% 149\contentsline {chapter}{\numberline {13}Bacula{} Regression Testing}{113}{chapter.13}% 150\contentsline {section}{\numberline {13.1}Setting up Regession Testing}{113}{section.13.1}% 151\contentsline {section}{\numberline {13.2}Running the Regression Script}{113}{section.13.2}% 152\contentsline {subsection}{\numberline {13.2.1}Setting the Configuration Parameters}{114}{subsection.13.2.1}% 153\contentsline {subsection}{\numberline {13.2.2}Building the Test Bacula{}}{115}{subsection.13.2.2}% 154\contentsline {subsection}{\numberline {13.2.3}Setting up your SQL engine}{115}{subsection.13.2.3}% 155\contentsline {subsection}{\numberline {13.2.4}Running the Disk Only Regression}{115}{subsection.13.2.4}% 156\contentsline {subsection}{\numberline {13.2.5}Other Tests}{117}{subsection.13.2.5}% 157\contentsline {subsection}{\numberline {13.2.6}If a Test Fails}{117}{subsection.13.2.6}% 158\contentsline {section}{\numberline {13.3}Testing a Binary Installation}{117}{section.13.3}% 159\contentsline {section}{\numberline {13.4}Running a Single Test}{118}{section.13.4}% 160\contentsline {section}{\numberline {13.5}Writing a Regression Test}{118}{section.13.5}% 161\contentsline {subsection}{\numberline {13.5.1}Running the Tests by Hand}{118}{subsection.13.5.1}% 162\contentsline {subsection}{\numberline {13.5.2}Directory Structure}{118}{subsection.13.5.2}% 163\contentsline {subsection}{\numberline {13.5.3}Adding a New Test}{118}{subsection.13.5.3}% 164\contentsline {subsection}{\numberline {13.5.4}Running a Test Under The Debugger}{119}{subsection.13.5.4}% 165\contentsline {chapter}{\numberline {14}Bacula MD5 Algorithm}{121}{chapter.14}% 166\contentsline {section}{\numberline {14.1}Command Line Message Digest Utility }{121}{section.14.1}% 167\contentsline {subsection}{\numberline {14.1.1}Name}{121}{subsection.14.1.1}% 168\contentsline {subsection}{\numberline {14.1.2}Synopsis}{121}{subsection.14.1.2}% 169\contentsline {subsection}{\numberline {14.1.3}Description}{121}{subsection.14.1.3}% 170\contentsline {subsection}{\numberline {14.1.4}Options}{122}{subsection.14.1.4}% 171\contentsline {subsection}{\numberline {14.1.5}Files}{122}{subsection.14.1.5}% 172\contentsline {subsection}{\numberline {14.1.6}Bugs}{122}{subsection.14.1.6}% 173\contentsline {section}{\numberline {14.2}Download md5.zip (Zipped archive)}{122}{section.14.2}% 174\contentsline {subsection}{\numberline {14.2.1}See Also}{122}{subsection.14.2.1}% 175\contentsline {subsection}{\numberline {14.2.2}Exit Status}{122}{subsection.14.2.2}% 176\contentsline {subsection}{\numberline {14.2.3}Copying}{122}{subsection.14.2.3}% 177\contentsline {subsection}{\numberline {14.2.4}Acknowledgements}{122}{subsection.14.2.4}% 178\contentsline {chapter}{\numberline {15}Bacula Memory Management}{123}{chapter.15}% 179\contentsline {section}{\numberline {15.1}General}{123}{section.15.1}% 180\contentsline {subsection}{\numberline {15.1.1}Statically Allocated Memory}{123}{subsection.15.1.1}% 181\contentsline {subsection}{\numberline {15.1.2}Dynamically Allocated Memory}{123}{subsection.15.1.2}% 182\contentsline {subsection}{\numberline {15.1.3}Pooled and Non-pooled Memory}{124}{subsection.15.1.3}% 183\contentsline {chapter}{\numberline {16}TCP/IP Network Protocol}{127}{chapter.16}% 184\contentsline {section}{\numberline {16.1}General}{127}{section.16.1}% 185\contentsline {section}{\numberline {16.2}bnet and Threads}{127}{section.16.2}% 186\contentsline {section}{\numberline {16.3}bnet\_open}{127}{section.16.3}% 187\contentsline {section}{\numberline {16.4}bnet\_send}{128}{section.16.4}% 188\contentsline {section}{\numberline {16.5}bnet\_fsend}{128}{section.16.5}% 189\contentsline {section}{\numberline {16.6}Additional Error information}{128}{section.16.6}% 190\contentsline {section}{\numberline {16.7}bnet\_recv}{128}{section.16.7}% 191\contentsline {section}{\numberline {16.8}bnet\_sig}{128}{section.16.8}% 192\contentsline {section}{\numberline {16.9}bnet\_strerror}{129}{section.16.9}% 193\contentsline {section}{\numberline {16.10}bnet\_close}{129}{section.16.10}% 194\contentsline {section}{\numberline {16.11}Becoming a Server}{129}{section.16.11}% 195\contentsline {section}{\numberline {16.12}Higher Level Conventions}{129}{section.16.12}% 196\contentsline {chapter}{\numberline {17}Smart Memory Allocation}{131}{chapter.17}% 197\contentsline {subsection}{\numberline {17.0.1} Installing SMARTALLOC}{131}{subsection.17.0.1}% 198\contentsline {subsection}{\numberline {17.0.2} Squelching a SMARTALLOC}{132}{subsection.17.0.2}% 199\contentsline {subsection}{\numberline {17.0.3} Living with Libraries}{133}{subsection.17.0.3}% 200\contentsline {subsection}{\numberline {17.0.4} SMARTALLOC Details}{134}{subsection.17.0.4}% 201\contentsline {subsection}{\numberline {17.0.5} When SMARTALLOC is Disabled}{135}{subsection.17.0.5}% 202\contentsline {subsection}{\numberline {17.0.6} The {\tt alloc()} Function}{135}{subsection.17.0.6}% 203\contentsline {subsection}{\numberline {17.0.7} Overlays and Underhandedness}{135}{subsection.17.0.7}% 204\contentsline {subsection}{\numberline {17.0.8} Test and Demonstration Program}{136}{subsection.17.0.8}% 205\contentsline {subsection}{\numberline {17.0.9} Invitation to the Hack}{136}{subsection.17.0.9}% 206\contentsline {section}{\numberline {17.1}Download smartall.zip (Zipped archive)}{136}{section.17.1}% 207\contentsline {subsection}{\numberline {17.1.1} Copying}{136}{subsection.17.1.1}% 208\contentsline {chapter}{Appendices}{137}{section*.44}% 209\contentsline {chapter}{\numberline {A}Acronyms}{139}{Appendix.1.A}% 210\contentsline {subsection}{Index}{140}{section*.45}% 211