106 return REQ_ABORTED; |
106 return REQ_ABORTED; |
107 } |
107 } |
108 |
108 |
109 return REQ_PROCEED; |
109 return REQ_PROCEED; |
110 } |
110 } |
|
111 |
|
112 int find_index(pblock *pb, Session *sn, Request *rq) { |
|
113 char *inames = pblock_findval("index-names", pb); |
|
114 if(!inames) { |
|
115 log_ereport( |
|
116 LOG_MISCONFIG, |
|
117 "find-index: index-names parameter missing"); |
|
118 return REQ_ABORTED; |
|
119 } |
|
120 |
|
121 ssize_t ni = 0; |
|
122 sstr_t *names = sstrsplit(sstr(inames), S(","), &ni); |
|
123 if(ni <= 0) { |
|
124 log_ereport( |
|
125 LOG_MISCONFIG, |
|
126 "find-index: no files specified in index-names parameter"); |
|
127 return REQ_ABORTED; |
|
128 } |
|
129 |
|
130 int ret = REQ_NOACTION; |
|
131 |
|
132 char *path = pblock_findkeyval(pb_key_path, rq->vars); |
|
133 size_t pathlen = strlen(path); |
|
134 sstr_t p = sstrn(path, pathlen); |
|
135 if(path[pathlen-1] == '/') { |
|
136 for(int i=0;i<ni;i++) { |
|
137 sstr_t newpath = sstrcat(2, p, sstrtrim(names[i])); |
|
138 struct stat s; |
|
139 if(!stat(newpath.ptr, &s)) { |
|
140 pblock_kvinsert( |
|
141 pb_key_path, |
|
142 newpath.ptr, |
|
143 newpath.length, |
|
144 rq->vars); |
|
145 free(newpath.ptr); |
|
146 ret = REQ_PROCEED; |
|
147 } else { |
|
148 free(newpath.ptr); |
|
149 } |
|
150 } |
|
151 } |
|
152 |
|
153 for(int i=0;i<ni;i++) { |
|
154 free(names[i].ptr); |
|
155 } |
|
156 free(names); |
|
157 |
|
158 return ret; |
|
159 } |