You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
2.5 KiB

#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#define BUF_MAX 4096
#define CWD_BUF_SIZE 512
int my_strlen(const char* Src){
int len = 0;
int i = 0;
for(; Src[i]; ++i){
++len;
}
return len;
}
void my_strcat(char* src, const char* dst){
int len = my_strlen(src);
int i;
for(i = len; dst[i - len]; ++i){
src[i] = dst[i - len];
}
src[i] = '\0';
}
int get_subentry(const char* dir, char* cwdbuf, char** subentry){
int i, num_file = 0, read_num;
int fd = open(dir, O_RDONLY);
if(fd == -1){
return -1;
}
for(i = 0; i < CWD_BUF_SIZE; ++i){
cwdbuf[i] = '\0';
}
read_num = read(fd, cwdbuf, CWD_BUF_SIZE);
if(read_num == -1){
return -1;
}
close(fd);
for(i = 0; i < CWD_BUF_SIZE; ){
if((cwdbuf[i] == '.') || (cwdbuf[i] >= 'a' && cwdbuf[i] <= 'z') || (cwdbuf[i] >= 'A' && cwdbuf[i] <= 'Z')){
subentry[num_file++] = cwdbuf + i;
while(i<CWD_BUF_SIZE && cwdbuf[i]){
++i;
}
}else{
cwdbuf[i] = '\0';
++i;
}
}
subentry[num_file] = NULL;
return read_num;
}
int find(char* cur_path, char* wd){
int i;
int is_find = 1;
int read_num;
int path_len;
char curdir[CWD_BUF_SIZE+1];
char* cur_subentry[1000];
read_num = get_subentry(cur_path, curdir, cur_subentry);
if(read_num == -1){
return 0;
}
if(cur_subentry[0]==NULL || cur_subentry[1] == NULL || cur_subentry[0][0] != '.' || cur_subentry[1][0] != '.' || cur_subentry[1][1]!='.'){
return 0;
}
for(i = 0; i < read_num; ++i){
if(curdir[i] != wd[i]){
is_find = 0;
break;
}
}
if(is_find){
return 1;
}
if(cur_path[1]=='d' && cur_path[2]=='e' && cur_path[3]=='v'){
return 0;
}
path_len = my_strlen(cur_path);
for(i = 2; cur_subentry[i]; ++i){
if(cur_subentry[i][0]=='.'){
continue;
}
if(path_len != 1){
cur_path[path_len] = '/';
cur_path[path_len+1]='\0';
}
my_strcat(cur_path, cur_subentry[i]);
if(find(cur_path, wd)){
return 1;
}else{
cur_path[path_len] = '\0';
}
}
return 0;
}
char* my_getcwd(char *cur_path, size_t size){
char cwd[CWD_BUF_SIZE+1];
char* cwd_entry[100];
get_subentry(".", cwd, cwd_entry);
cur_path[0] = '/';
cur_path[1] = '\0';
find(cur_path, cwd);
if(cur_path[0] != '/'){
return NULL;
}
return cur_path;
}
int main(void){
char buf[100];
my_getcwd(buf, 128);
printf("%s\n", buf);
return 0;
}