|  | @@ -544,35 +544,143 @@ int scsiDiskGetNextImageName(image_config_t &img, char *buf, size_t buflen)
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  |      int target_idx = img.scsiId & 7;
 |  |      int target_idx = img.scsiId & 7;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    img.image_index++;
 |  | 
 | 
											
												
													
														|  | -    if (img.image_index > IMAGE_INDEX_MAX)
 |  | 
 | 
											
												
													
														|  | -    {
 |  | 
 | 
											
												
													
														|  | -        img.image_index = 0;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  |      char section[6] = "SCSI0";
 |  |      char section[6] = "SCSI0";
 | 
											
												
													
														|  |      section[4] = '0' + target_idx;
 |  |      section[4] = '0' + target_idx;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    char key[5] = "IMG0";
 |  | 
 | 
											
												
													
														|  | -    key[3] = '0' + img.image_index;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    int ret = ini_gets(section, key, "", buf, buflen, CONFIGFILE);
 |  | 
 | 
											
												
													
														|  | -    if (buf[0] != '\0')
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // sanity check: is provided buffer is long enough to store a filename?
 | 
											
												
													
														|  | 
 |  | +    if (buflen < MAX_FILE_PATH)
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  | -        return ret;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        panic("scsiDiskGetNextImageName called with illegal buflen");
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -    else if (img.image_index > 0)
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    if (img.image_directory)
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  | -        // there may be more than one image but we've ran out of new ones
 |  | 
 | 
											
												
													
														|  | -        // wrap back to the first image
 |  | 
 | 
											
												
													
														|  | -        img.image_index = IMAGE_INDEX_MAX;
 |  | 
 | 
											
												
													
														|  | -        return scsiDiskGetNextImageName(img, buf, buflen);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        // is this needed to prevent an inadvertent callback during all these opens?
 | 
											
												
													
														|  | 
 |  | +        platform_set_sd_callback(NULL, NULL);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        // image directory was found during startup
 | 
											
												
													
														|  | 
 |  | +        FsFile dir;
 | 
											
												
													
														|  | 
 |  | +        char key[] = "ImgDir";
 | 
											
												
													
														|  | 
 |  | +        ini_gets(section, key, "", buf, buflen, CONFIGFILE);
 | 
											
												
													
														|  | 
 |  | +        if (buf[0] != '\0')
 | 
											
												
													
														|  | 
 |  | +        {
 | 
											
												
													
														|  | 
 |  | +            if (!dir.open(buf))
 | 
											
												
													
														|  | 
 |  | +            {
 | 
											
												
													
														|  | 
 |  | +                log("ImgDir '", buf, "' couldn't be opened.");
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            if (!dir.isDir())
 | 
											
												
													
														|  | 
 |  | +            {
 | 
											
												
													
														|  | 
 |  | +                log("ImgDir '", buf, "' is not a directory.");
 | 
											
												
													
														|  | 
 |  | +                dir.close();
 | 
											
												
													
														|  | 
 |  | +                return false;
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        else
 | 
											
												
													
														|  | 
 |  | +        {
 | 
											
												
													
														|  | 
 |  | +            // If image_directory set but ImageDir is not, could be used to
 | 
											
												
													
														|  | 
 |  | +            // indicate an image directory configured via folder structure.
 | 
											
												
													
														|  | 
 |  | +            // Not implemented, so treat this as equivalent to missing ImageDir
 | 
											
												
													
														|  | 
 |  | +            return false;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        // Find the filename with the lowest lexical order _after_ the
 | 
											
												
													
														|  | 
 |  | +        // currently selected file. If there is none, or if there is no
 | 
											
												
													
														|  | 
 |  | +        // current file, use the lowest filename encountered.
 | 
											
												
													
														|  | 
 |  | +        char first_name[MAX_FILE_PATH] = {'\0'};
 | 
											
												
													
														|  | 
 |  | +        char candidate_name[MAX_FILE_PATH] = {'\0'};
 | 
											
												
													
														|  | 
 |  | +        FsFile file;
 | 
											
												
													
														|  | 
 |  | +        while (file.openNext(&dir, O_RDONLY))
 | 
											
												
													
														|  | 
 |  | +        {
 | 
											
												
													
														|  | 
 |  | +            if (file.isDir()) continue;
 | 
											
												
													
														|  | 
 |  | +            if (!file.getName(buf, MAX_FILE_PATH))
 | 
											
												
													
														|  | 
 |  | +            {
 | 
											
												
													
														|  | 
 |  | +                log("Image directory had invalid file for ID", target_idx);
 | 
											
												
													
														|  | 
 |  | +                continue;
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            if (!scsiDiskFilenameValid(buf)) continue;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +            // keep track of the first item to allow wrapping
 | 
											
												
													
														|  | 
 |  | +            // without having to iterate again
 | 
											
												
													
														|  | 
 |  | +            if (first_name[0] == '\0' || strcmp(buf, first_name) < 0)
 | 
											
												
													
														|  | 
 |  | +            {
 | 
											
												
													
														|  | 
 |  | +                strncpy(first_name, buf, sizeof(first_name));
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +            // discard if no selected name, or if candidate is before (or is) selected
 | 
											
												
													
														|  | 
 |  | +            if (img.current_image[0] == '\0' || strcmp(buf, img.current_image) <= 0) continue;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +            // if we got this far and the candidate is either 1) not set, or 2) is a
 | 
											
												
													
														|  | 
 |  | +            // lower item than what has been encountered thus far, it is the best choice
 | 
											
												
													
														|  | 
 |  | +            if (candidate_name[0] == '\0' || strcmp(buf, candidate_name) < 0)
 | 
											
												
													
														|  | 
 |  | +            {
 | 
											
												
													
														|  | 
 |  | +                strncpy(candidate_name, buf, sizeof(candidate_name));
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        // create base path for the result
 | 
											
												
													
														|  | 
 |  | +        // *TODO* this needs handling for leading and trailing slashes
 | 
											
												
													
														|  | 
 |  | +        int dirlen = dir.getName(buf, buflen);
 | 
											
												
													
														|  | 
 |  | +        dir.close(); // done with this
 | 
											
												
													
														|  | 
 |  | +        if (dirlen > 0 && dirlen - 1 < buflen)
 | 
											
												
													
														|  | 
 |  | +        {
 | 
											
												
													
														|  | 
 |  | +            buf[dirlen] = '/';
 | 
											
												
													
														|  | 
 |  | +            dirlen++;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        else
 | 
											
												
													
														|  | 
 |  | +        {
 | 
											
												
													
														|  | 
 |  | +            log("Image directory name invalid for ID", target_idx);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        // append the filename
 | 
											
												
													
														|  | 
 |  | +        if (candidate_name[0] != '\0')
 | 
											
												
													
														|  | 
 |  | +        {
 | 
											
												
													
														|  | 
 |  | +            strncpy(img.current_image, candidate_name, sizeof(img.current_image));
 | 
											
												
													
														|  | 
 |  | +            strncpy(buf + dirlen, candidate_name, buflen - dirlen);
 | 
											
												
													
														|  | 
 |  | +            img.image_index++;
 | 
											
												
													
														|  | 
 |  | +            return dirlen + strlen(candidate_name);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        else if (first_name[0] != '\0')
 | 
											
												
													
														|  | 
 |  | +        {
 | 
											
												
													
														|  | 
 |  | +            strncpy(img.current_image, first_name, sizeof(img.current_image));
 | 
											
												
													
														|  | 
 |  | +            strncpy(buf + dirlen, first_name, buflen - dirlen);
 | 
											
												
													
														|  | 
 |  | +            img.image_index = 0;
 | 
											
												
													
														|  | 
 |  | +            return dirlen + strlen(first_name);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        else
 | 
											
												
													
														|  | 
 |  | +        {
 | 
											
												
													
														|  | 
 |  | +            log("Image directory was empty for ID", target_idx);
 | 
											
												
													
														|  | 
 |  | +            return 0;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |      else
 |  |      else
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  | -        // images are not defined in config
 |  | 
 | 
											
												
													
														|  | -        img.image_index = IMAGE_INDEX_MAX;
 |  | 
 | 
											
												
													
														|  | -        return 0;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        img.image_index++;
 | 
											
												
													
														|  | 
 |  | +        if (img.image_index > IMAGE_INDEX_MAX)
 | 
											
												
													
														|  | 
 |  | +        {
 | 
											
												
													
														|  | 
 |  | +            img.image_index = 0;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        char key[5] = "IMG0";
 | 
											
												
													
														|  | 
 |  | +        key[3] = '0' + img.image_index;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        int ret = ini_gets(section, key, "", buf, buflen, CONFIGFILE);
 | 
											
												
													
														|  | 
 |  | +        if (buf[0] != '\0')
 | 
											
												
													
														|  | 
 |  | +        {
 | 
											
												
													
														|  | 
 |  | +            return ret;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        else if (img.image_index > 0)
 | 
											
												
													
														|  | 
 |  | +        {
 | 
											
												
													
														|  | 
 |  | +            // there may be more than one image but we've ran out of new ones
 | 
											
												
													
														|  | 
 |  | +            // wrap back to the first image
 | 
											
												
													
														|  | 
 |  | +            img.image_index = IMAGE_INDEX_MAX;
 | 
											
												
													
														|  | 
 |  | +            return scsiDiskGetNextImageName(img, buf, buflen);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        else
 | 
											
												
													
														|  | 
 |  | +        {
 | 
											
												
													
														|  | 
 |  | +            // images are not defined in config
 | 
											
												
													
														|  | 
 |  | +            img.image_index = IMAGE_INDEX_MAX;
 | 
											
												
													
														|  | 
 |  | +            return 0;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 |