Example #1
0
int enum_next_share(DIR *dir)
{
	nethandle_t *hnet;
	char *tmp, *p1;
	HANDLE henum;
	DWORD count, breq,ret;
	size_t dl;

	hnet = (nethandle_t*)(dir->dd_handle);
	henum = hnet->henum;
	count = 1;
	breq = BLEN;

	ret = WNetEnumResource(henum, &count, hnet->netres, &breq);
	if (ret != NO_ERROR)
		return -1;

	tmp = ((NETRESOURCE*)hnet->netres)->lpRemoteName;
	p1 = &tmp[2];
#ifdef DSPMBYTE
	for (; *p1 != '\\'; p1 ++)
		if (Ismbyte1(*p1) && *(p1 + 1))
			p1 ++;
#else /* DSPMBYTE */
	while(*p1++ != '\\')
		;
#endif /* DSPMBYTE */

	dl = strlen(p1);
	memcpy((dir->dd_dir).d_name, p1, dl + 1);
	(dir->dd_dir).d_namlen = (unsigned short)dl;

	return 0;
}
Example #2
0
int enum_next_share(DIR *dir) {
	nethandle_t *hnet;
	char *tmp,*p1;
	HANDLE henum;
	int count, breq,ret;

	hnet = (nethandle_t*)(dir->dd_fd);
	henum = hnet->henum;
	count =  1;
	breq = 1024;

	ret = p_WNetEnumResource(henum, &count,hnet->netres,&breq);
	if (ret != NO_ERROR)
		return -1;
	
	tmp = ((NETRESOURCE*)hnet->netres)->lpRemoteName;
	p1 = &tmp[2];
#ifdef DSPMBYTE
	for (; *p1 != '\\'; p1 ++)
		if (Ismbyte1(*p1) && *(p1 + 1))
			p1 ++;
#else /* DSPMBYTE */
	while(*p1++ != '\\');
#endif /* DSPMBYTE */

	memcpy( (dir->dd_buf)->d_name, p1, lstrlen(p1)+1);

	dir->dd_size = 0;

	return 0;
}
Example #3
0
void path_slashify(char *pstr) {
	while(*pstr) {
#ifdef DSPMBYTE
		if (Ismbyte1(*pstr) && *(pstr + 1))
			pstr ++;
		else
#endif /* DSPMBYTE */
		if (*pstr == '\\') 
			*pstr = '/';
		pstr++;
	}
}
Example #4
0
/* check if name is //server. if checkifShare is set,
 * also check if //server/share
 */
int is_server(const char *name,int checkifShare) {
    const char *p1, *p2;

    if (!*name || !*(name+1))
        return 0;

    p1 = name;
    if (((p1[0] != '/') && (p1[0] != '\\') ) ||
            ((p1[1] != '/') && (p1[1] != '\\') ))
        return 0;

    p2 = p1 + 2;
    while (*p2 && *p2 != '/' && *p2 != '\\')
#ifdef DSPMBYTE
        if (Ismbyte1(*p2) && *(p2 + 1))
            p2 += 2;
        else
#endif /* DSPMBYTE */
            p2++;

    /* just check for server */
    if (!checkifShare) {
        /* null terminated unc server name */
        /* terminating '/' (//server/) is also ok */
        if (!*p2 || !*(p2+1))
            return 1;

    }
    else {
        if (!*p2 || !*(p2+1))
            return 0;
        p2++;
        while(*p2 && *p2 != '/' && *p2 != '\\')
            p2++;
        if (!*p2 || !*(p2+1))
            return 1;
    }
    return 0;

}
Example #5
0
DIR *opendir(const char *inbuf)
{
	DIR *dptr;
	char *tmp;
	char *buf;
	size_t buflen;
	WIN32_FIND_DATA fdata;
	int is_net = 0;
	int had_error = 0;

	/* zsh does not seem to call opendir(NULL), but testing is safer */
	if (!inbuf) {
		errno = EFAULT;
		return NULL;
	}

	buflen = strlen(inbuf);
	if (!buflen) {
		errno = ENOTDIR;
		return NULL;
	}

	/* allocate buf and copy const inbuf */
	/* may add "X:" at the beginning and slash+* at the end */
	buf = (char *)_alloca(buflen + 5);
	if (!buf) {
		errno = ENOMEM;
		return NULL;
	}
#if defined(W32DEBUG) && defined(__TESTING__)
	/* poison buf */
	memset(buf, 'X', buflen + 5);
#endif
	strcpy(buf, inbuf);

	if ((buflen > 2) &&
	    ((((buf[0] == '/') && (buf[1] == '/')) || ((buf[0] == '\\') && (buf[1] == '\\'))) &&
	     /* avoid //?/, it's a long UNC path, NOT a net path */
	     (buf[2] != '?'))) {
		/* open_enum will convert '/' to '\', so we skip the
		   conversion from '/' to '\' below */
		is_net = 1;
		tmp = buf + buflen;
	} else {
		/* convert '\\' to '/' only for paths */
		tmp = buf;
		while (*tmp) {
#ifdef DSPMBYTE
			if (Ismbyte1(*tmp) && *(tmp + 1))
				tmp ++;
			else
#endif
				if (*tmp == '\\')
					*tmp = '/';
			tmp++;
		}
		/* if buf lacks a terminating '/' add it now */
		if (*(tmp - 1) != '/') {
			*tmp++ = '/';
			buflen++;
		}
		/* if buf starts with '/' prepend the current drive */
		/* (avoid //?... !) */
		if ((buf[0] == '/') && (buf[1] != '/')) {
			memmove(buf + 2, buf, buflen);
			buf[0] = (char)('@' + _getdrive());
			buf[1] = ':';
			tmp += 2;
			buflen += 2;
		}
		/* terminate buf */
		*tmp = '\0';
	}

	dptr = (DIR *)xcalloc(sizeof(DIR) + buflen + 5);
	if (!dptr) {
		errno = ENOMEM;
		had_error = 1;
		goto done;
	}
	dptr->dd_handle = INVALID_HND;

	/* buf has the full string */
	if (is_net) {
		dptr->dd_handle = (intptr_t)open_enum(buf, &fdata);
		dptr->dd_stat = IS_NET;
	}
	if (dptr->dd_handle == INVALID_HND) {
		if (*(tmp - 1) != '/') {
			/* may be true only if is_net is nonzero */
			*tmp++ = '/';
			buflen++;
		}
		/* add a terminating '*' */
		*tmp++ = '*';
		*tmp = '\0';
		/* buf[] wasn't a "\\server" path */
		dptr->dd_stat = 0;
		dptr->dd_handle = (intptr_t)FindFirstFile(buf, &fdata);
	}
	if (dptr->dd_handle == INVALID_HND) {
		if (GetLastError() == ERROR_DIRECTORY)
			errno = ENOTDIR;
		else
			errno = ENOENT;
		had_error = 1;
		goto done;
	}
	memcpy(dptr->dd_name, buf, buflen);

	if (lstrcmpi(fdata.cFileName, ".")) {
		memcpy((dptr->dd_dir).d_name, ".", 2);
		(dptr->dd_dir).d_namlen = (unsigned short)1U;
		dptr->dd_stat |= IS_ROOT;
	} else {
		memcpy((dptr->dd_dir).d_name, fdata.cFileName, MAX_PATH);
		(dptr->dd_dir).d_namlen = (unsigned short)strlen((dptr->dd_dir).d_name);
	}

done:
	if (had_error) {
		xfree(dptr);
		dptr = NULL;
	}

	return dptr;
}
Example #6
0
DIR * opendir(char *buf) {

	DIR *dptr;
	WIN32_FIND_DATA fdata;
	char *tmp ;
	int is_net=0;
	

	if (!buf)
		buf = "." ;
	tmp = buf;
	while(*tmp) {
#ifdef DSPMBYTE
       if (Ismbyte1(*tmp) && *(tmp + 1))
           tmp ++;
       else
#endif DSPMBYTE
		if (*tmp == '\\')
			*tmp = '/';
		tmp++;
	}
	/*
	 * paths like / confuse NT because it looks like a UNC name
	 * when we append "\*" -amol
	 */
	if (*(tmp -1) == '/')
		*(tmp -1) = 0;
	tmp= (char *)heap_alloc(lstrlen(buf) + 4); 

	memset(tmp,0,lstrlen(buf) +4);


	if ( (buf[0] == '/') && (buf[1] != '/') ) {
		wsprintf(tmp,"%c:%s*",'A' + (_getdrive()-1),buf);
	}
	else if ( (buf[0] == '/')  &&  (buf[1] == '/')  ){
		is_net = 1;
		wsprintf(tmp,"%s",buf);
	}
	else { 
		wsprintf(tmp,"%s/*",buf);
	}
	
	dptr = (DIR *)heap_alloc(sizeof(DIR));
	dptr->dd_fd = INVALID_HANDLE_VALUE;
	if (!dptr){
		errno = ENOMEM;
		heap_free(tmp);
		return NULL;
	}
	
	if (is_net){
		dptr->dd_fd = open_enum(tmp,&fdata);
		dptr->flags = IS_NET;
	}
	if (dptr->dd_fd == INVALID_HANDLE_VALUE){
		wsprintf(tmp,"%s/*",buf);
		dptr->flags = 0;
		dptr->dd_fd = FindFirstFile(tmp,&fdata);
	}
	if (dptr->dd_fd == INVALID_HANDLE_VALUE){
		if (GetLastError() == ERROR_DIRECTORY)
			errno = ENOTDIR;
		else
			errno = ENOENT;	
		heap_free(tmp);
		heap_free(dptr);
		return NULL;
	}
	memset(dptr->orig_dir_name,0,sizeof(dptr->orig_dir_name));
	memcpy(dptr->orig_dir_name,tmp,lstrlen(tmp));
	heap_free(tmp);

	dptr->dd_loc = 0;
	dptr->dd_size = fdata.nFileSizeLow;
	dptr->dd_buf = (struct dirent *)heap_alloc(sizeof(struct dirent));
	if (!dptr->dd_buf){
		heap_free(dptr);
		errno = ENOMEM;
		return NULL;
	}
	(dptr->dd_buf)->d_ino = inode++;
	(dptr->dd_buf)->d_off = 0;
	(dptr->dd_buf)->d_reclen = 0;
	if (lstrcmpi(fdata.cFileName,".") ){
		//dptr->dd_buf->d_name[0] = '.';
		memcpy((dptr->dd_buf)->d_name,".",2);
		dptr->flags |= IS_ROOT;
	}
	else
		memcpy((dptr->dd_buf)->d_name,fdata.cFileName,MAX_PATH);
	return dptr;
}