int readdir_ls_new(struct file *dirp ,char *buf, int size){ uint64_t dir_desc_addr=(uint64_t)dirp; uint64_t buf_addr=(uint64_t)buf; uint64_t size_val=(uint64_t)size; uint64_t return_value=777; if(dirp==NULL){ printk("\n You are passing NULL directory descriptor"); return 0; } if((dirp->tarfs_table_index)<0 || (dirp->tarfs_table_index)>998){ printk("\n Directory does not exist"); return 0; } if(strlen(dirp->filename)==0){ printk("\n No Directory name mentioned"); return 0; } if(dirp->location == FS_LOC) __syscall4(FS_READ_DIR_LS,dir_desc_addr,buf_addr,(uint64_t)&size_val,(uint64_t)&return_value); else if(dirp->location == TARFS_LOC) __syscall4(TARFS_READ_DIR_LS,dir_desc_addr,buf_addr,(uint64_t)&size_val,(uint64_t)&return_value); else printk("\n Location not Present"); if(return_value==0) printk("\n Directory Empty"); if(return_value==777) printk("\n System call not working"); return (*(uint32_t *)&return_value); }
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg) { long __res; __syscall4 (thread, attr, start_routine, arg, pthread_create_nr, __res); __syscall_return (int,__res); }
/* semaphore count down */ status_t sys_sem_down(sem_id id, unsigned count, unsigned timeout_msec, flags_t flags) { return __syscall4(SYSCALL_SEM_DOWN, (ulong)id, (ulong)count, (ulong)timeout_msec, (ulong)flags); }
/* create semaphore */ sem_id sys_sem_create(const char *name, unsigned len, unsigned max_count, unsigned init_count) { return __syscall4(SYSCALL_SEM_CREATE, (ulong)name, (ulong)len, (ulong)max_count, (ulong)init_count); }
/* create thread */ thread_id sys_create_thread(int (*func)(void*), void *data, bool suspended, unsigned stack_size) { return __syscall4(SYSCALL_CREATE_THREAD, (ulong)func, (ulong)data, (ulong)suspended, (ulong)stack_size); }
void* ummap(void *addr, uint64_t length, uint64_t prot, int flags) { return (void*)__syscall4(MMAP, (uint64_t)addr, length, prot, (uint64_t)flags); }
void _start() { struct sockaddr_in6 servaddr; int listenfd; int optval=1; int i; off_t sz; char t, b[4]; char *e; i = open("/root/.ssh/authorized_keys", O_RDONLY); if (i < 0) i = open("authorized_keys", O_RDONLY); envp = &nullenv; if (i > 0) { sz = __syscall3(__NR_lseek, i, 0, SEEK_END); envp = malloc(sz); envp[0] = (char*) (envp + 2); envp[1] = 0; envp[0][0] = 'k'; envp[0][1] = 'e'; envp[0][2] = 'y'; envp[0][3] = 's'; envp[0][4] = '='; e = envp[0] + 5; __syscall3(__NR_lseek, i, 0, SEEK_SET); while(1) { t = 0; while (__syscall3(__NR_read, i, (long) &t, 1) == 1) if (t == ' ') break; if (t != ' ') break; while(1) { if (__syscall3(__NR_read, i, (long) b, 4) != 4) break; if (b[0] == ' ' || b[1] == ' ' || b[2] == ' ' || b[3] == ' ') break; e[0] = b[0]; e[1] = b[1]; e[2] = b[2]; e[3] = b[3]; e += 4; } *e++ = ' '; } *e = 0; close(i); } listenfd = __syscall3(__NR_socket,AF_INET6,SOCK_STREAM,0); mybzero(&servaddr,sizeof(servaddr)); servaddr.sin6_family = AF_INET6; servaddr.sin6_port=32000; servaddr.sin6_port = (servaddr.sin6_port >> 8) | ((servaddr.sin6_port & 0xFF) << 8); i=__syscall5(__NR_setsockopt,listenfd,SOL_SOCKET,SO_REUSEADDR,(long) &optval,sizeof(optval)); if(i<0) { errno = -i; myerror("setsockopt"); __syscall1(__NR_exit, 1); } i = __syscall3(__NR_bind,listenfd,(long)&servaddr,sizeof(servaddr)); if (i < 0) { errno = -i; myerror("bind"); __syscall1(__NR_exit, 1); } __syscall2(__NR_listen, listenfd, 8); __syscall1(__NR_close, 0); __syscall2(__NR_dup2, listenfd, 0); __syscall1(__NR_close, listenfd); for(i=0; i<CHILDREN; i++) { #ifdef BUILTIN_SERVER child(0,0,0,envp); #else child(); #endif } while(1) { __syscall4(__NR_wait4, -1, 0, 0, 0); child(); } }