+<a name="l00878"></a>00878 new_len = _strcat(base, path, name);
+<a name="l00879"></a>00879 <span class="keywordflow">if</span> (new_len < 0)
+<a name="l00880"></a>00880 <span class="keywordflow">return</span> -1;
+<a name="l00881"></a>00881 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (new_len + 1 >= <a class="code" href="lightmediascanner__private_8h.html#e78bf7e06bbba1c42b740fef55cf20f8">PATH_SIZE</a>) {
+<a name="l00882"></a>00882 fprintf(stderr, <span class="stringliteral">"ERROR: path too long\n"</span>);
+<a name="l00883"></a>00883 <span class="keywordflow">return</span> 2;
+<a name="l00884"></a>00884 }
+<a name="l00885"></a>00885
+<a name="l00886"></a>00886 dir = opendir(path);
+<a name="l00887"></a>00887 <span class="keywordflow">if</span> (dir == NULL) {
+<a name="l00888"></a>00888 perror(<span class="stringliteral">"opendir"</span>);
+<a name="l00889"></a>00889 <span class="keywordflow">return</span> 3;
+<a name="l00890"></a>00890 }
+<a name="l00891"></a>00891
+<a name="l00892"></a>00892 path[new_len] = <span class="charliteral">'/'</span>;
+<a name="l00893"></a>00893 new_len++;
+<a name="l00894"></a>00894
+<a name="l00895"></a>00895 r = 0;
+<a name="l00896"></a>00896 <span class="keywordflow">while</span> ((de = readdir(dir)) != NULL && !lms-><a class="code" href="structlms.html#d028e3681568215f6facd7d477c74461">stop_processing</a>) {
+<a name="l00897"></a>00897 <span class="keywordflow">if</span> (de->d_name[0] == <span class="charliteral">'.'</span>)
+<a name="l00898"></a>00898 <span class="keywordflow">continue</span>;
+<a name="l00899"></a>00899 <span class="keywordflow">if</span> (de->d_type == DT_REG) {
+<a name="l00900"></a>00900 <span class="keywordflow">if</span> (process_file(info, new_len, path, de->d_name) < 0) {
+<a name="l00901"></a>00901 fprintf(stderr,
+<a name="l00902"></a>00902 <span class="stringliteral">"ERROR: unrecoverable error parsing file, "</span>
+<a name="l00903"></a>00903 <span class="stringliteral">"exit \"%s\".\n"</span>, path);
+<a name="l00904"></a>00904 path[new_len - 1] = <span class="charliteral">'\0'</span>;
+<a name="l00905"></a>00905 r = -4;
+<a name="l00906"></a>00906 <span class="keywordflow">goto</span> end;
+<a name="l00907"></a>00907 }
+<a name="l00908"></a>00908 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (de->d_type == DT_DIR) {
+<a name="l00909"></a>00909 <span class="keywordflow">if</span> (_process_dir(
+<a name="l00910"></a>00910 info, new_len, path, de->d_name, process_file) < 0) {
+<a name="l00911"></a>00911 fprintf(stderr,
+<a name="l00912"></a>00912 <span class="stringliteral">"ERROR: unrecoverable error parsing dir, "</span>
+<a name="l00913"></a>00913 <span class="stringliteral">"exit \"%s\".\n"</span>, path);
+<a name="l00914"></a>00914 path[new_len - 1] = <span class="charliteral">'\0'</span>;
+<a name="l00915"></a>00915 r = -5;
+<a name="l00916"></a>00916 <span class="keywordflow">goto</span> end;
+<a name="l00917"></a>00917 }
+<a name="l00918"></a>00918 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (de->d_type == DT_UNKNOWN) {
+<a name="l00919"></a>00919 <span class="keywordflow">if</span> (_process_unknown(
+<a name="l00920"></a>00920 info, new_len, path, de->d_name, process_file) < 0) {
+<a name="l00921"></a>00921 fprintf(stderr,
+<a name="l00922"></a>00922 <span class="stringliteral">"ERROR: unrecoverable error parsing DT_UNKNOWN, "</span>
+<a name="l00923"></a>00923 <span class="stringliteral">"exit \"%s\".\n"</span>, path);
+<a name="l00924"></a>00924 path[new_len - 1] = <span class="charliteral">'\0'</span>;
+<a name="l00925"></a>00925 r = -6;
+<a name="l00926"></a>00926 <span class="keywordflow">goto</span> end;
+<a name="l00927"></a>00927 }
+<a name="l00928"></a>00928 }
+<a name="l00929"></a>00929 }
+<a name="l00930"></a>00930
+<a name="l00931"></a>00931 end:
+<a name="l00932"></a>00932 closedir(dir);
+<a name="l00933"></a>00933 <span class="keywordflow">return</span> r;
+<a name="l00934"></a>00934 }
+<a name="l00935"></a>00935
+<a name="l00936"></a>00936 <span class="keyword">static</span> <span class="keywordtype">int</span>
+<a name="l00937"></a>00937 _lms_process_check_valid(<a class="code" href="structlms.html">lms_t</a> *lms, <span class="keyword">const</span> <span class="keywordtype">char</span> *path)
+<a name="l00938"></a>00938 {
+<a name="l00939"></a>00939 <span class="keywordflow">if</span> (!lms)
+<a name="l00940"></a>00940 <span class="keywordflow">return</span> -1;
+<a name="l00941"></a>00941
+<a name="l00942"></a>00942 <span class="keywordflow">if</span> (!path)
+<a name="l00943"></a>00943 <span class="keywordflow">return</span> -2;
+<a name="l00944"></a>00944
+<a name="l00945"></a>00945 <span class="keywordflow">if</span> (lms-><a class="code" href="structlms.html#bb03533445b77299e964b2ec02bca039">is_processing</a>) {
+<a name="l00946"></a>00946 fprintf(stderr, <span class="stringliteral">"ERROR: is already processing.\n"</span>);
+<a name="l00947"></a>00947 <span class="keywordflow">return</span> -3;
+<a name="l00948"></a>00948 }
+<a name="l00949"></a>00949
+<a name="l00950"></a>00950 <span class="keywordflow">if</span> (!lms-><a class="code" href="structlms.html#52883423c9a1276420ba2bb9b50a138c">parsers</a>) {
+<a name="l00951"></a>00951 fprintf(stderr, <span class="stringliteral">"ERROR: no plugins registered.\n"</span>);
+<a name="l00952"></a>00952 <span class="keywordflow">return</span> -4;
+<a name="l00953"></a>00953 }
+<a name="l00954"></a>00954
+<a name="l00955"></a>00955 <span class="keywordflow">return</span> 0;
+<a name="l00956"></a>00956 }
+<a name="l00957"></a>00957
+<a name="l00958"></a>00958 <span class="keyword">static</span> <span class="keywordtype">int</span>
+<a name="l00959"></a>00959 _process_trigger(<span class="keyword">struct</span> <a class="code" href="structcinfo.html">cinfo</a> *info, <span class="keyword">const</span> <span class="keywordtype">char</span> *top_path, <a class="code" href="lightmediascanner__private_8h.html#ca9b2668fa08b18c630e16d1f7f702a7">process_file_callback_t</a> process_file)
+<a name="l00960"></a>00960 {
+<a name="l00961"></a>00961 <span class="keywordtype">char</span> path[<a class="code" href="lightmediascanner__private_8h.html#e78bf7e06bbba1c42b740fef55cf20f8">PATH_SIZE</a>], *bname;
+<a name="l00962"></a>00962 <a class="code" href="structlms.html">lms_t</a> *lms = info-><a class="code" href="structcinfo.html#eff7e00325ac7d8674f42f4bfc198b5a">lms</a>;
+<a name="l00963"></a>00963 <span class="keywordtype">int</span> len;
+<a name="l00964"></a>00964 <span class="keywordtype">int</span> r;
+<a name="l00965"></a>00965
+<a name="l00966"></a>00966 <span class="keywordflow">if</span> (realpath(top_path, path) == NULL) {
+<a name="l00967"></a>00967 perror(<span class="stringliteral">"realpath"</span>);
+<a name="l00968"></a>00968 <span class="keywordflow">return</span> -1;
+<a name="l00969"></a>00969 }
+<a name="l00970"></a>00970
+<a name="l00971"></a>00971 <span class="comment">/* search '/' backwards, split dirname and basename, note realpath usage */</span>
+<a name="l00972"></a>00972 len = strlen(path);
+<a name="l00973"></a>00973 <span class="keywordflow">for</span> (; len >= 0 && path[len] != <span class="charliteral">'/'</span>; len--);
+<a name="l00974"></a>00974 len++;
+<a name="l00975"></a>00975 bname = strdup(path + len);
+<a name="l00976"></a>00976 <span class="keywordflow">if</span> (bname == NULL) {
+<a name="l00977"></a>00977 perror(<span class="stringliteral">"strdup"</span>);
+<a name="l00978"></a>00978 <span class="keywordflow">return</span> -2;
+<a name="l00979"></a>00979 }
+<a name="l00980"></a>00980
+<a name="l00981"></a>00981 lms-><a class="code" href="structlms.html#bb03533445b77299e964b2ec02bca039">is_processing</a> = 1;
+<a name="l00982"></a>00982 lms-><a class="code" href="structlms.html#d028e3681568215f6facd7d477c74461">stop_processing</a> = 0;
+<a name="l00983"></a>00983 r = _process_dir(info, len, path, bname, process_file);
+<a name="l00984"></a>00984 lms-><a class="code" href="structlms.html#bb03533445b77299e964b2ec02bca039">is_processing</a> = 0;
+<a name="l00985"></a>00985 lms-><a class="code" href="structlms.html#d028e3681568215f6facd7d477c74461">stop_processing</a> = 0;
+<a name="l00986"></a>00986 free(bname);
+<a name="l00987"></a>00987
+<a name="l00988"></a>00988 <span class="keywordflow">return</span> r;
+<a name="l00989"></a>00989 }
+<a name="l00990"></a>00990
+<a name="l01001"></a>01001 <span class="keywordtype">int</span>
+<a name="l01002"></a><a class="code" href="lightmediascanner__process_8c.html#c2f07fb73717514237862c98dbf023b2">01002</a> <a class="code" href="lightmediascanner_8h.html#7d2b81cfe07a8cce4c2bef705e7529f4">lms_process</a>(<a class="code" href="structlms.html">lms_t</a> *lms, <span class="keyword">const</span> <span class="keywordtype">char</span> *top_path)
+<a name="l01003"></a>01003 {
+<a name="l01004"></a>01004 <span class="keyword">struct </span>pinfo pinfo;
+<a name="l01005"></a>01005 <span class="keywordtype">int</span> r;
+<a name="l01006"></a>01006
+<a name="l01007"></a>01007 r = _lms_process_check_valid(lms, top_path);
+<a name="l01008"></a>01008 <span class="keywordflow">if</span> (r < 0)
+<a name="l01009"></a>01009 <span class="keywordflow">return</span> r;
+<a name="l01010"></a>01010
+<a name="l01011"></a>01011 pinfo.<a class="code" href="structpinfo.html#46a4fc606bd47def48714760afcbc18b">common</a>.<a class="code" href="structcinfo.html#eff7e00325ac7d8674f42f4bfc198b5a">lms</a> = lms;
+<a name="l01012"></a>01012
+<a name="l01013"></a>01013 <span class="keywordflow">if</span> (<a class="code" href="lightmediascanner__private_8h.html#a5952b7aae2fa795396a5a286c2ee4a4">lms_create_pipes</a>(&pinfo) != 0) {
+<a name="l01014"></a>01014 r = -1;
+<a name="l01015"></a>01015 <span class="keywordflow">goto</span> end;
+<a name="l01016"></a>01016 }
+<a name="l01017"></a>01017
+<a name="l01018"></a>01018 <span class="keywordflow">if</span> (<a class="code" href="lightmediascanner__private_8h.html#439b3c62e96d472bdb2125a0a04d4fa6">lms_create_slave</a>(&pinfo, _slave_work) != 0) {
+<a name="l01019"></a>01019 r = -2;
+<a name="l01020"></a>01020 <span class="keywordflow">goto</span> close_pipes;
+<a name="l01021"></a>01021 }
+<a name="l01022"></a>01022
+<a name="l01023"></a>01023 r = _process_trigger((<span class="keyword">struct</span> <a class="code" href="structcinfo.html">cinfo</a> *)&pinfo, top_path, _process_file);
+<a name="l01024"></a>01024
+<a name="l01025"></a>01025 <a class="code" href="lightmediascanner__private_8h.html#dd3853bb333e8bee167477933a058ae5">lms_finish_slave</a>(&pinfo, _master_send_finish);
+<a name="l01026"></a>01026 close_pipes:
+<a name="l01027"></a>01027 <a class="code" href="lightmediascanner__private_8h.html#8c1aa0a9d9bb796db279caeb97e04eed">lms_close_pipes</a>(&pinfo);
+<a name="l01028"></a>01028 end:
+<a name="l01029"></a>01029 <span class="keywordflow">return</span> r;
+<a name="l01030"></a>01030 }
+<a name="l01031"></a>01031
+<a name="l01043"></a>01043 <span class="keywordtype">int</span>
+<a name="l01044"></a><a class="code" href="lightmediascanner__process_8c.html#5db83cefb7a50bbecea9de26a6ef1c2c">01044</a> <a class="code" href="lightmediascanner_8h.html#c5eda23c23b2ea76f001ac994c2ba9e2">lms_process_single_process</a>(<a class="code" href="structlms.html">lms_t</a> *lms, <span class="keyword">const</span> <span class="keywordtype">char</span> *top_path)
+<a name="l01045"></a>01045 {
+<a name="l01046"></a>01046 <span class="keyword">struct </span>sinfo sinfo;
+<a name="l01047"></a>01047 <span class="keywordtype">int</span> r;
+<a name="l01048"></a>01048
+<a name="l01049"></a>01049 r = _lms_process_check_valid(lms, top_path);
+<a name="l01050"></a>01050 <span class="keywordflow">if</span> (r < 0)
+<a name="l01051"></a>01051 <span class="keywordflow">return</span> r;
+<a name="l01052"></a>01052
+<a name="l01053"></a>01053 sinfo.<a class="code" href="structsinfo.html#aa9d846b49c394348027d31e49c535be">common</a>.<a class="code" href="structcinfo.html#eff7e00325ac7d8674f42f4bfc198b5a">lms</a> = lms;
+<a name="l01054"></a>01054 sinfo.<a class="code" href="structsinfo.html#4dc79e3c97d069939b8ba2d65d85fa1f">commit_counter</a> = 0;
+<a name="l01055"></a>01055
+<a name="l01056"></a>01056 r = _db_and_parsers_setup(sinfo.<a class="code" href="structsinfo.html#aa9d846b49c394348027d31e49c535be">common</a>.<a class="code" href="structcinfo.html#eff7e00325ac7d8674f42f4bfc198b5a">lms</a>, &sinfo.<a class="code" href="structsinfo.html#e15c5adc74f2f712a8becebff37a06d4">db</a>, &sinfo.<a class="code" href="structsinfo.html#453d67e0467608c10700c7217cfe19fd">parser_match</a>);
+<a name="l01057"></a>01057 <span class="keywordflow">if</span> (r < 0) {
+<a name="l01058"></a>01058 <span class="keywordflow">if</span> (r == -1)
+<a name="l01059"></a>01059 <span class="keywordflow">return</span> r;
+<a name="l01060"></a>01060 <span class="keywordflow">else</span>
+<a name="l01061"></a>01061 <span class="keywordflow">goto</span> finish;
+<a name="l01062"></a>01062 }
+<a name="l01063"></a>01063
+<a name="l01064"></a>01064 <a class="code" href="lightmediascanner__db__common_8c.html#5ff807216285c93325ffaf33361dd6fc">lms_db_begin_transaction</a>(sinfo.<a class="code" href="structsinfo.html#e15c5adc74f2f712a8becebff37a06d4">db</a>->transaction_begin);
+<a name="l01065"></a>01065
+<a name="l01066"></a>01066 r = _process_trigger(
+<a name="l01067"></a>01067 (<span class="keyword">struct</span> <a class="code" href="structcinfo.html">cinfo</a> *)&sinfo, top_path, _process_file_single_process);
+<a name="l01068"></a>01068
+<a name="l01069"></a>01069 free(sinfo.parser_match);
+<a name="l01070"></a>01070 <a class="code" href="lightmediascanner__db__common_8c.html#ffa877e4fa751f090e7af8c2025d245c">lms_db_end_transaction</a>(sinfo.db->transaction_commit);
+<a name="l01071"></a>01071
+<a name="l01072"></a>01072 finish:
+<a name="l01073"></a>01073 <a class="code" href="lightmediascanner__private_8h.html#74adcb264b3092f3ae9249de93f9130f">lms_parsers_finish</a>(lms, sinfo.db->handle);
+<a name="l01074"></a>01074 _db_close(sinfo.db);
+<a name="l01075"></a>01075 <span class="keywordflow">return</span> r;
+<a name="l01076"></a>01076 }
+<a name="l01077"></a>01077
+<a name="l01078"></a>01078 <span class="keywordtype">void</span>
+<a name="l01079"></a><a class="code" href="lightmediascanner__process_8c.html#36d624baae0531c20e716c88a82e0aaf">01079</a> <a class="code" href="lightmediascanner_8h.html#30aa1e83907fc1049d2adccb28eef489">lms_stop_processing</a>(<a class="code" href="structlms.html">lms_t</a> *lms)
+<a name="l01080"></a>01080 {
+<a name="l01081"></a>01081 <span class="keywordflow">if</span> (!lms)
+<a name="l01082"></a>01082 <span class="keywordflow">return</span>;
+<a name="l01083"></a>01083 <span class="keywordflow">if</span> (!lms-><a class="code" href="structlms.html#bb03533445b77299e964b2ec02bca039">is_processing</a>)
+<a name="l01084"></a>01084 <span class="keywordflow">return</span>;
+<a name="l01085"></a>01085
+<a name="l01086"></a>01086 lms-><a class="code" href="structlms.html#d028e3681568215f6facd7d477c74461">stop_processing</a> = 1;
+<a name="l01087"></a>01087 }
+</pre></div></div>
+<hr size="1"><address style="text-align: right;"><small>Generated on Sun Oct 5 12:24:53 2008 for Light Media Scanner by