src/server/safs/pathcheck.c

changeset 131
70010b94bda5
parent 100
e9bb8449df02
child 141
ff311b63c3af
equal deleted inserted replaced
130:198ad9d8cec1 131:70010b94bda5
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 }

mercurial