Changeset d101368 in mainline for uspace/lib/fmgt/src
- Timestamp:
- 2025-11-14T16:41:33Z (8 weeks ago)
- Branches:
- master
- Children:
- 3a4c6d9
- Parents:
- 4b2065a6
- git-author:
- Jiri Svoboda <jiri@…> (2025-11-14 16:32:57)
- git-committer:
- Jiri Svoboda <jiri@…> (2025-11-14 16:41:33)
- Location:
- uspace/lib/fmgt/src
- Files:
-
- 1 added
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/fmgt/src/fmgt.c
r4b2065a6 rd101368 44 44 45 45 #include "fmgt.h" 46 47 #define NEWNAME_LEN 64 48 #define BUFFER_SIZE 16384 46 #include "../private/fmgt.h" 49 47 50 48 /** Create file management library instance. … … 106 104 } 107 105 108 /** Suggest file name for new file.109 *110 * @param fmgt File management object111 * @param rstr Place to store pointer to newly allocated string112 * @return EOK on success or an error code113 */114 errno_t fmgt_new_file_suggest(char **rstr)115 {116 errno_t rc;117 vfs_stat_t stat;118 unsigned u;119 char name[NEWNAME_LEN];120 121 u = 0;122 while (true) {123 snprintf(name, sizeof(name), "noname%02u.txt", u);124 rc = vfs_stat_path(name, &stat);125 if (rc != EOK)126 break;127 128 ++u;129 }130 131 *rstr = str_dup(name);132 if (*rstr == NULL)133 return ENOMEM;134 135 return EOK;136 }137 138 106 /** Get progress update report. 139 107 * … … 180 148 * @param fmgt File management object 181 149 */ 182 staticvoid fmgt_initial_progress_update(fmgt_t *fmgt)150 void fmgt_initial_progress_update(fmgt_t *fmgt) 183 151 { 184 152 if (fmgt->do_init_update) … … 192 160 * @param fmgt File management object 193 161 */ 194 staticvoid fmgt_final_progress_update(fmgt_t *fmgt)162 void fmgt_final_progress_update(fmgt_t *fmgt) 195 163 { 196 164 if (fmgt->curf_progr) … … 216 184 * @param fmgt File management object 217 185 */ 218 staticvoid fmgt_timer_start(fmgt_t *fmgt)186 void fmgt_timer_start(fmgt_t *fmgt) 219 187 { 220 188 fibril_timer_set(fmgt->timer, 500000, fmgt_timer_fun, (void *)fmgt); … … 225 193 * @param fmgt File management object 226 194 */ 227 staticvoid fmgt_timer_stop(fmgt_t *fmgt)195 void fmgt_timer_stop(fmgt_t *fmgt) 228 196 { 229 197 (void)fibril_timer_clear(fmgt->timer); … … 235 203 * @return @c true iff operation should be aborted 236 204 */ 237 staticbool fmgt_abort_query(fmgt_t *fmgt)205 bool fmgt_abort_query(fmgt_t *fmgt) 238 206 { 239 207 if (fmgt->cb != NULL && fmgt->cb->abort_query != NULL) … … 249 217 * @return What error recovery action should be taken. 250 218 */ 251 staticfmgt_error_action_t fmgt_io_error_query(fmgt_t *fmgt,219 fmgt_error_action_t fmgt_io_error_query(fmgt_t *fmgt, 252 220 fmgt_io_error_t *err) 253 221 { … … 258 226 } 259 227 260 /** Create new file.261 *262 * @param fmgt File management object263 * @param fname File name264 * @param fsize Size of new file (number of zero bytes to fill in)265 * @param flags New file flags266 * @return EOK on success or an error code267 */268 errno_t fmgt_new_file(fmgt_t *fmgt, const char *fname, uint64_t fsize,269 fmgt_nf_flags_t flags)270 {271 int fd;272 size_t nw;273 aoff64_t pos = 0;274 uint64_t now;275 char *buffer;276 fmgt_io_error_t err;277 fmgt_error_action_t action;278 errno_t rc;279 280 buffer = calloc(BUFFER_SIZE, 1);281 if (buffer == NULL)282 return ENOMEM;283 284 rc = vfs_lookup_open(fname, WALK_REGULAR | WALK_MUST_CREATE,285 MODE_WRITE, &fd);286 if (rc != EOK) {287 free(buffer);288 return rc;289 }290 291 fmgt->curf_procb = 0;292 fmgt->curf_totalb = fsize;293 fmgt->curf_progr = false;294 fmgt_timer_start(fmgt);295 296 fmgt_initial_progress_update(fmgt);297 298 /* Create sparse file? */299 if ((flags & nf_sparse) != 0) {300 fmgt->curf_procb = fsize - 1;301 pos = fsize - 1;302 }303 304 while (fmgt->curf_procb < fsize) {305 now = fsize - fmgt->curf_procb;306 if (now > BUFFER_SIZE)307 now = BUFFER_SIZE;308 309 do {310 rc = vfs_write(fd, &pos, buffer, now, &nw);311 if (rc == EOK)312 break;313 314 /* I/O error */315 err.fname = fname;316 err.optype = fmgt_io_write;317 err.rc = rc;318 fmgt_timer_stop(fmgt);319 action = fmgt_io_error_query(fmgt, &err);320 fmgt_timer_start(fmgt);321 } while (action == fmgt_er_retry);322 323 /* Not recovered? */324 if (rc != EOK) {325 free(buffer);326 vfs_put(fd);327 fmgt_final_progress_update(fmgt);328 return rc;329 }330 331 fmgt->curf_procb += nw;332 333 /* User requested abort? */334 if (fmgt_abort_query(fmgt)) {335 free(buffer);336 vfs_put(fd);337 fmgt_final_progress_update(fmgt);338 return EINTR;339 }340 }341 342 free(buffer);343 vfs_put(fd);344 fmgt_final_progress_update(fmgt);345 return EOK;346 }347 348 228 /** @} 349 229 */
Note:
See TracChangeset
for help on using the changeset viewer.
