- if ((in = wfopen(fn, "r")) == NULL) {
- return -1;
- }
- if ((out = tmpfile()) == NULL) {
- perror_msg(NULL);
- return -2;
+ in = bb_xfopen(fn, "rw");
+ safe_strncpy(tempFn, fn, sizeof(tempFn));
+ c = strlen(tempFn);
+ tempFn[c] = '.';
+ while(1) {
+ /* tempFn is BUFSIZ so the last addressable spot it BUFSIZ-1.
+ * The loop increments by 2. So this must check for BUFSIZ-3. */
+ if (c >=BUFSIZ-3)
+ bb_error_msg_and_die("unique name not found");
+ /* Get some semi random stuff to try and make a
+ * random filename based (and in the same dir as)
+ * the input file... */
+ gettimeofday (&tv, NULL);
+ value += ((bb_uint64_t) tv.tv_usec << 16) ^ tv.tv_sec ^ getpid ();
+ tempFn[++c] = ((value%62) < 26)?(value%62)+97:
+ ((value%62) < 52)?(value%62)+39:
+ (value%62)-4;
+ tempFn[c+1] = '\0';
+ value /= 62;
+
+ if ((fd = open(tempFn, O_RDWR | O_CREAT | O_EXCL, 0600)) < 0 ) {
+ continue;
+ }
+ out = fdopen(fd, "w+");
+ if (!out) {
+ close(fd);
+ remove(tempFn);
+ continue;
+ }
+ break;