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
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;
|
|
} |