/// <summary> /// Get rules for chain name /// </summary> /// <param name="chain">chain name</param> /// <returns></returns> public IReadOnlyCollection <Rule> GetRules(string chain) { List <Rule> rules = new List <Rule>(10); for (var rulePtr = Libiptc4.iptc_first_rule(chain, _handle); rulePtr != IntPtr.Zero; rulePtr = Libiptc4.iptc_next_rule(rulePtr, _handle)) { var iptEntry = Marshal.PtrToStructure <IptEntry>(rulePtr); int offset = Sizes.Align(Sizes.IptEntryLen); List <Match> matches = new List <Match>(); // read matches while (iptEntry.target_offset > offset) { offset += ReadMatch(rulePtr + offset, out Match match); matches.Add(match); } // read targets offset = iptEntry.target_offset; Target target = null; if (iptEntry.next_offset > offset) { offset += ReadTarget(rulePtr + offset, out target); } var rule = new RuleBuilder(iptEntry, matches, target).Build(); rules.Add(rule); } return(new ReadOnlyCollection <Rule>(rules)); }
/// <summary> /// Get chains for current Table /// </summary> /// <returns></returns> public IReadOnlyCollection <string> GetChains() { List <string> chains = new List <string>(10); for (var chainPtr = Libiptc4.iptc_first_chain(_handle); chainPtr != IntPtr.Zero; chainPtr = Libiptc4.iptc_next_chain(_handle)) { var chain = (string)Marshal.PtrToStringAnsi(chainPtr); chains.Add(chain); } return(new ReadOnlyCollection <string>(chains)); }
public IptTransaction(string tableName = Tables.FILTER) { Table = tableName; _handle = Libiptc4.iptc_init(Table); }