📄 sysirix.c
字号:
/* * Check against rlimit and stack.. */ rlim = current->rlim[RLIMIT_DATA].rlim_cur; if (rlim >= RLIM_INFINITY) rlim = ~0; if (brk - mm->end_code > rlim) { ret = -ENOMEM; goto out; } /* * Check against existing mmap mappings. */ if (find_vma_intersection(mm, oldbrk, newbrk+PAGE_SIZE)) { ret = -ENOMEM; goto out; } /* * Check if we have enough memory.. */ if (!vm_enough_memory((newbrk-oldbrk) >> PAGE_SHIFT)) { ret = -ENOMEM; goto out; } /* * Ok, looks good - let it rip. */ mm->brk = brk; do_brk(oldbrk, newbrk-oldbrk); ret = 0;out: up(&mm->mmap_sem); return ret;}asmlinkage int irix_getpid(struct pt_regs *regs){ regs->regs[3] = current->p_opptr->pid; return current->pid;}asmlinkage int irix_getuid(struct pt_regs *regs){ regs->regs[3] = current->euid; return current->uid;}asmlinkage int irix_getgid(struct pt_regs *regs){ regs->regs[3] = current->egid; return current->gid;}extern rwlock_t xtime_lock;asmlinkage int irix_stime(int value){ if (!capable(CAP_SYS_TIME)) return -EPERM; write_lock_irq(&xtime_lock); xtime.tv_sec = value; xtime.tv_usec = 0; time_maxerror = MAXPHASE; time_esterror = MAXPHASE; write_unlock_irq(&xtime_lock); return 0;}extern int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue);static inline void jiffiestotv(unsigned long jiffies, struct timeval *value){ value->tv_usec = (jiffies % HZ) * (1000000 / HZ); value->tv_sec = jiffies / HZ;}static inline void getitimer_real(struct itimerval *value){ register unsigned long val, interval; interval = current->it_real_incr; val = 0; if (del_timer(¤t->real_timer)) { unsigned long now = jiffies; val = current->real_timer.expires; add_timer(¤t->real_timer); /* look out for negative/zero itimer.. */ if (val <= now) val = now+1; val -= now; } jiffiestotv(val, &value->it_value); jiffiestotv(interval, &value->it_interval);}asmlinkage unsigned int irix_alarm(unsigned int seconds){ struct itimerval it_new, it_old; unsigned int oldalarm; if (!seconds) { getitimer_real(&it_old); del_timer(¤t->real_timer); } else { it_new.it_interval.tv_sec = it_new.it_interval.tv_usec = 0; it_new.it_value.tv_sec = seconds; it_new.it_value.tv_usec = 0; do_setitimer(ITIMER_REAL, &it_new, &it_old); } oldalarm = it_old.it_value.tv_sec; /* * ehhh.. We can't return 0 if we have an alarm pending ... * And we'd better return too much than too little anyway */ if (it_old.it_value.tv_usec) oldalarm++; return oldalarm;}asmlinkage int irix_pause(void){ current->state = TASK_INTERRUPTIBLE; schedule(); return -EINTR;}extern asmlinkage long sys_mount(char * dev_name, char * dir_name, char * type, unsigned long new_flags, void * data);/* XXX need more than this... */asmlinkage int irix_mount(char *dev_name, char *dir_name, unsigned long flags, char *type, void *data, int datalen){ printk("[%s:%d] irix_mount(%p,%p,%08lx,%p,%p,%d)\n", current->comm, current->pid, dev_name, dir_name, flags, type, data, datalen); return sys_mount(dev_name, dir_name, type, flags, data);}struct irix_statfs { short f_type; long f_bsize, f_frsize, f_blocks, f_bfree, f_files, f_ffree; char f_fname[6], f_fpack[6];};asmlinkage int irix_statfs(const char *path, struct irix_statfs *buf, int len, int fs_type){ struct nameidata nd; struct statfs kbuf; int error, i; /* We don't support this feature yet. */ if (fs_type) { error = -EINVAL; goto out; } error = verify_area(VERIFY_WRITE, buf, sizeof(struct irix_statfs)); if (error) goto out; error = user_path_walk(path, &nd); if (error) goto out; error = vfs_statfs(nd.dentry->d_inode->i_sb, &kbuf); if (error) goto dput_and_out; __put_user(kbuf.f_type, &buf->f_type); __put_user(kbuf.f_bsize, &buf->f_bsize); __put_user(kbuf.f_frsize, &buf->f_frsize); __put_user(kbuf.f_blocks, &buf->f_blocks); __put_user(kbuf.f_bfree, &buf->f_bfree); __put_user(kbuf.f_files, &buf->f_files); __put_user(kbuf.f_ffree, &buf->f_ffree); for (i = 0; i < 6; i++) { __put_user(0, &buf->f_fname[i]); __put_user(0, &buf->f_fpack[i]); } error = 0;dput_and_out: path_release(&nd);out: return error;}asmlinkage int irix_fstatfs(unsigned int fd, struct irix_statfs *buf){ struct statfs kbuf; struct file *file; int error, i; error = verify_area(VERIFY_WRITE, buf, sizeof(struct irix_statfs)); if (error) goto out; if (!(file = fget(fd))) { error = -EBADF; goto out; } error = vfs_statfs(file->f_dentry->d_inode->i_sb, &kbuf); if (error) goto out_f; __put_user(kbuf.f_type, &buf->f_type); __put_user(kbuf.f_bsize, &buf->f_bsize); __put_user(kbuf.f_frsize, &buf->f_frsize); __put_user(kbuf.f_blocks, &buf->f_blocks); __put_user(kbuf.f_bfree, &buf->f_bfree); __put_user(kbuf.f_files, &buf->f_files); __put_user(kbuf.f_ffree, &buf->f_ffree); for(i = 0; i < 6; i++) { __put_user(0, &buf->f_fname[i]); __put_user(0, &buf->f_fpack[i]); }out_f: fput(file);out: return error;}extern asmlinkage int sys_setpgid(pid_t pid, pid_t pgid);extern asmlinkage int sys_setsid(void);asmlinkage int irix_setpgrp(int flags){ int error;#ifdef DEBUG_PROCGRPS printk("[%s:%d] setpgrp(%d) ", current->comm, current->pid, flags);#endif if(!flags) error = current->pgrp; else error = sys_setsid();#ifdef DEBUG_PROCGRPS printk("returning %d\n", current->pgrp);#endif return error;}asmlinkage int irix_times(struct tms * tbuf){ int err = 0; if (tbuf) { err = verify_area(VERIFY_WRITE,tbuf,sizeof *tbuf); if (err) return err; err |= __put_user(current->times.tms_utime,&tbuf->tms_utime); err |= __put_user(current->times.tms_stime,&tbuf->tms_stime); err |= __put_user(current->times.tms_cutime,&tbuf->tms_cutime); err |= __put_user(current->times.tms_cstime,&tbuf->tms_cstime); } return err;}asmlinkage int irix_exec(struct pt_regs *regs){ int error, base = 0; char *filename; if(regs->regs[2] == 1000) base = 1; filename = getname((char *) (long)regs->regs[base + 4]); error = PTR_ERR(filename); if (IS_ERR(filename)) return error; error = do_execve(filename, (char **) (long)regs->regs[base + 5], (char **) 0, regs); putname(filename); return error;}asmlinkage int irix_exece(struct pt_regs *regs){ int error, base = 0; char *filename; if (regs->regs[2] == 1000) base = 1; filename = getname((char *) (long)regs->regs[base + 4]); error = PTR_ERR(filename); if (IS_ERR(filename)) return error; error = do_execve(filename, (char **) (long)regs->regs[base + 5], (char **) (long)regs->regs[base + 6], regs); putname(filename); return error;}asmlinkage unsigned long irix_gethostid(void){ printk("[%s:%d]: irix_gethostid() called...\n", current->comm, current->pid); return -EINVAL;}asmlinkage unsigned long irix_sethostid(unsigned long val){ printk("[%s:%d]: irix_sethostid(%08lx) called...\n", current->comm, current->pid, val); return -EINVAL;}extern asmlinkage int sys_socket(int family, int type, int protocol);asmlinkage int irix_socket(int family, int type, int protocol){ switch(type) { case 1: type = SOCK_DGRAM; break; case 2: type = SOCK_STREAM; break; case 3: type = 9; /* Invalid... */ break; case 4: type = SOCK_RAW; break; case 5: type = SOCK_RDM; break; case 6: type = SOCK_SEQPACKET; break; default: break; } return sys_socket(family, type, protocol);}asmlinkage int irix_getdomainname(char *name, int len){ int error; error = verify_area(VERIFY_WRITE, name, len); if (error) return error; down_read(&uts_sem); if(len > (__NEW_UTS_LEN - 1)) len = __NEW_UTS_LEN - 1; error = 0; if (copy_to_user(name, system_utsname.domainname, len)) error = -EFAULT; up_read(&uts_sem); return error;}asmlinkage unsigned long irix_getpagesize(void){ return PAGE_SIZE;}asmlinkage int irix_msgsys(int opcode, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4){ switch (opcode) { case 0: return sys_msgget((key_t) arg0, (int) arg1); case 1: return sys_msgctl((int) arg0, (int) arg1, (struct msqid_ds *)arg2); case 2: return sys_msgrcv((int) arg0, (struct msgbuf *) arg1, (size_t) arg2, (long) arg3, (int) arg4); case 3: return sys_msgsnd((int) arg0, (struct msgbuf *) arg1, (size_t) arg2, (int) arg3); default: return -EINVAL; }}asmlinkage int irix_shmsys(int opcode, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3){ switch (opcode) { case 0: return sys_shmat((int) arg0, (char *)arg1, (int) arg2, (unsigned long *) arg3); case 1: return sys_shmctl((int)arg0, (int)arg1, (struct shmid_ds *)arg2); case 2: return sys_shmdt((char *)arg0); case 3: return sys_shmget((key_t) arg0, (int) arg1, (int) arg2); default: return -EINVAL; }}asmlinkage int irix_semsys(int opcode, unsigned long arg0, unsigned long arg1, unsigned long arg2, int arg3){ switch (opcode) { case 0: return sys_semctl((int) arg0, (int) arg1, (int) arg2, (union semun) arg3); case 1: return sys_semget((key_t) arg0, (int) arg1, (int) arg2); case 2: return sys_semop((int) arg0, (struct sembuf *)arg1, (unsigned int) arg2); default: return -EINVAL; }}static inline loff_t llseek(struct file *file, loff_t offset, int origin){ loff_t (*fn)(struct file *, loff_t, int); loff_t retval; fn = default_llseek; if (file->f_op && file->f_op->llseek) fn = file->f_op->llseek; lock_kernel(); retval = fn(file, offset, origin); unlock_kernel(); return retval;}asmlinkage int irix_lseek64(int fd, int _unused, int offhi, int offlow, int origin){ int retval; struct file * file; loff_t offset; retval = -EBADF; file = fget(fd); if (!file) goto bad; retval = -EINVAL; if (origin > 2) goto out_putf; offset = llseek(file, ((loff_t) offhi << 32) | offlow, origin); retval = (int) offset;out_putf: fput(file);bad: return retval;}asmlinkage int irix_sginap(int ticks){ current->state = TASK_INTERRUPTIBLE; schedule_timeout(ticks); return 0;}asmlinkage int irix_sgikopt(char *istring, char *ostring, int len){ return -EINVAL;}asmlinkage int irix_gettimeofday(struct timeval *tv){ int retval; retval = copy_to_user(tv, &xtime, sizeof(*tv)) ? -EFAULT : 0; return retval;}#define IRIX_MAP_AUTOGROW 0x40asmlinkage unsigned long irix_mmap32(unsigned long addr, size_t len, int prot, int flags, int fd, off_t offset){ struct file *file = NULL; unsigned long retval; if (!(flags & MAP_ANONYMOUS)) { if (!(file = fget(fd))) return -EBADF; /* Ok, bad taste hack follows, try to think in something else * when reading this. */ if (flags & IRIX_MAP_AUTOGROW) { unsigned long old_pos; long max_size = offset + len; if (max_size > file->f_dentry->d_inode->i_size) { old_pos = sys_lseek (fd, max_size - 1, 0); sys_write (fd, "", 1); sys_lseek (fd, old_pos, 0); } } } flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); down(¤t->mm->mmap_sem); retval = do_mmap(file, addr, len, prot, flags, offset); up(¤t->mm->mmap_sem); if (file) fput(file); return retval;}asmlinkage int irix_madvise(unsigned long addr, int len, int behavior){ printk("[%s:%d] Wheee.. irix_madvise(%08lx,%d,%d)\n", current->comm, current->pid, addr, len, behavior); return -EINVAL;}asmlinkage int irix_pagelock(char *addr, int len, int op){ printk("[%s:%d] Wheee.. irix_pagelock(%p,%d,%d)\n", current->comm, current->pid, addr, len, op); return -EINVAL;}asmlinkage int irix_quotactl(struct pt_regs *regs){ printk("[%s:%d] Wheee.. irix_quotactl()\n", current->comm, current->pid); return -EINVAL;}asmlinkage int irix_BSDsetpgrp(int pid, int pgrp){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -