FILE * _tmpfile_r (struct _reent *ptr) { FILE *fp; int e; char *f; char buf[L_tmpnam]; int fd; do { if ((f = _tmpnam_r (ptr, buf)) == NULL) return NULL; fd = _open_r (ptr, f, O_RDWR | O_CREAT | O_EXCL | O_BINARY, S_IRUSR | S_IWUSR); } while (fd < 0 && __errno_r(ptr) == EEXIST); if (fd < 0) return NULL; fp = _fdopen_r (ptr, fd, "wb+"); e = __errno_r(ptr); if (!fp) _close_r (ptr, fd); (void) _remove_r (ptr, f); __errno_r(ptr) = e; return fp; }
FILE *devo_fopen(const char *path, const char *mode) { int flags = (mode && *mode == 'w') ? O_CREAT : 0; int _mode = flags ? O_WRONLY : O_RDONLY; long fd = _open_r (NULL, path, flags, _mode); fd++; return (void *)fd; }
int _stat_r(struct _reent *r, const char *path, struct stat *s) { int ret, fd; /* * spiffs has no directories, simulating statting root directory; * required for mg_send_http_file. */ if ((strcmp(path, "./") == 0) || (strcmp(path, "/") == 0)) { memset(s, 0, sizeof(*s)); s->st_mode = S_IFDIR; return 0; } fd = _open_r(NULL, path, O_RDONLY, 0); if (fd == -1) return -1; ret = _fstat_r(NULL, fd, s); _close_r(NULL, fd); return ret; }
int EEPROM_Open (void) { int FileDescriptor, SCL_Freq = EEPROM_SPEED; unsigned char EEProm_Addres = EEPROM_ADDRESS; /* Search 'i2c0' device in the File Descriptor Table */ FileDescriptor = _open_r ("i2c0", 0, 0); /* If 'i2c0' device found */ if (FileDescriptor > 0) { /* Get pointer to the DEVICE structure */ ptr_i2c0 = Device_List[FileDescriptor]; /* Init i2c0 */ ptr_i2c0->init (); /* Set i2c0 SCL clock frequency */ ptr_i2c0->ioctl (I2C_SET_SPEED, &SCL_Freq); /* Set EEPROM Slave Address */ ptr_i2c0->ioctl (I2C_SET_ADDRESS, &EEProm_Addres); } return FileDescriptor; }
int open( const char *name, int flags, mode_t mode ) { return _open_r( _REENT, name, flags, 0 ); }
static int _gettemp (struct _reent *ptr, char *path, register int *doopen, int domkdir, size_t suffixlen, int flags) { register char *start, *trv; char *end; #ifdef __USE_INTERNAL_STAT64 struct stat64 sbuf; #else struct stat sbuf; #endif unsigned int pid; pid = _getpid_r (ptr); for (trv = path; *trv; ++trv) /* extra X's get set to 0's */ continue; if (trv - path < suffixlen) { ptr->_errno = EINVAL; return 0; } trv -= suffixlen; end = trv; while (path < trv && *--trv == 'X') { *trv = (pid % 10) + '0'; pid /= 10; } if (end - trv < 6) { ptr->_errno = EINVAL; return 0; } /* * Check the target directory; if you have six X's and it * doesn't exist this runs for a *very* long time. */ for (start = trv + 1;; --trv) { if (trv <= path) break; if (*trv == '/') { *trv = '\0'; #ifdef __USE_INTERNAL_STAT64 if (_stat64_r (ptr, path, &sbuf)) #else if (_stat_r (ptr, path, &sbuf)) #endif return (0); if (!(sbuf.st_mode & S_IFDIR)) { ptr->_errno = ENOTDIR; return (0); } *trv = '/'; break; } } for (;;) { #if !defined _ELIX_LEVEL || _ELIX_LEVEL >= 4 if (domkdir) { #ifdef HAVE_MKDIR if (_mkdir_r (ptr, path, 0700) == 0) return 1; if (ptr->_errno != EEXIST) return 0; #else /* !HAVE_MKDIR */ ptr->_errno = ENOSYS; return 0; #endif /* !HAVE_MKDIR */ } else #endif /* _ELIX_LEVEL */ if (doopen) { if ((*doopen = _open_r (ptr, path, O_CREAT | O_EXCL | O_RDWR | flags, 0600)) >= 0) return 1; if (ptr->_errno != EEXIST) return 0; } #ifdef __USE_INTERNAL_STAT64 else if (_stat64_r (ptr, path, &sbuf)) #else else if (_stat_r (ptr, path, &sbuf)) #endif return (ptr->_errno == ENOENT ? 1 : 0); /* tricky little algorithm for backward compatibility */ for (trv = start;;) { if (trv == end) return 0; if (*trv == 'z') *trv++ = 'a'; else { /* Safe, since it only encounters 7-bit characters. */ if (isdigit ((unsigned char) *trv)) *trv = 'a'; else ++ * trv; break; } } } /*NOTREACHED*/ }
int _creat_r (struct _reent *r, const char *path, int mode) { return _open_r (r, path, O_CREAT | O_TRUNC, mode); }