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; }
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; }
void path_slashify(char *pstr) { while(*pstr) { #ifdef DSPMBYTE if (Ismbyte1(*pstr) && *(pstr + 1)) pstr ++; else #endif /* DSPMBYTE */ if (*pstr == '\\') *pstr = '/'; pstr++; } }
/* 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; }
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; }
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; }