{
BlockDriver *drv1;
char protocol[128];
- int len = qemu_strnlen(filename, 127) + 1;
+ int len;
const char *p;
#ifdef _WIN32
is_windows_drive_prefix(filename))
return bdrv_find_format("raw");
#endif
- p = fill_token(protocol, len, filename, ':');
- if (*p != ':')
+ p = strchr(filename, ':');
+ if (!p)
return bdrv_find_format("raw");
+ len = p - filename;
+ if (len > sizeof(protocol) - 1)
+ len = sizeof(protocol) - 1;
+ memcpy(protocol, filename, len);
+ protocol[len] = '\0';
for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) {
if (drv1->protocol_name &&
!strcmp(drv1->protocol_name, protocol))
open_flags = BDRV_O_RDWR | (flags & BDRV_O_CACHE_MASK);
else
open_flags = flags & ~(BDRV_O_FILE | BDRV_O_SNAPSHOT);
- ret = bdrv_open3(bs, filename, open_flags, drv);
+ ret = drv->bdrv_open(bs, filename, open_flags);
if ((ret == -EACCES || ret == -EPERM) && !(flags & BDRV_O_FILE)) {
- ret = bdrv_open3(bs, filename, open_flags & ~BDRV_O_RDWR, drv);
+ ret = drv->bdrv_open(bs, filename, open_flags & ~BDRV_O_RDWR);
bs->read_only = 1;
}
if (ret < 0) {
return 0;
}
-int bdrv_open3(BlockDriverState *bs, const char *filename, int flags, BlockDriver *drv)
-{
- char myfile[PATH_MAX];
- const char *f;
-
- if (!strstart(filename, "file:", &f)) {
- fill_token(myfile, PATH_MAX, filename, '\0');
- return drv->bdrv_open(bs,myfile,flags);
- }
- return drv->bdrv_open(bs,f,flags);
-}
-
void bdrv_close(BlockDriverState *bs)
{
if (bs->drv) {
int bdrv_open(BlockDriverState *bs, const char *filename, int flags);
int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
BlockDriver *drv);
-int bdrv_open3(BlockDriverState *bs, const char *filename, int flags,
- BlockDriver *drv);
void bdrv_close(BlockDriverState *bs);
int bdrv_check(BlockDriverState *bs);
int bdrv_read(BlockDriverState *bs, int64_t sector_num,
#include "qemu-common.h"
#include "host-utils.h"
-/*
- * fill first 'len' characters of 'buff' with pruned
- * contents of 'str' delimited by the character 'c'.
- * Escape character '\' is pruned off.
- * Return pointer to the delimiting character.
- */
-const char *fill_token(char *buf, const int len, const char *str, const char c)
-{
- const char *p=str;
- char *q=buf;
-
- while (p < str+len-1) {
- if (*p == c)
- break;
- if (*p == '\\') {
- p++;
- if (*p == '\0')
- break;
- }
- *q++ = *p++;
- }
- *q='\0';
- return p;
-}
-
-
void pstrcpy(char *buf, int buf_size, const char *str)
{
int c;
int qemu_timedate_diff(struct tm *tm);
/* cutils.c */
-const char *fill_token(char *buf, int buf_size, const char *str, char);
void pstrcpy(char *buf, int buf_size, const char *str);
char *pstrcat(char *buf, int buf_size, const char *s);
int strstart(const char *str, const char *val, const char **ptr);