1717
1818use aero_syscall:: signal:: { SigAction , SigProcMask } ;
1919use aero_syscall:: * ;
20- use alloc:: sync:: Arc ;
2120use spin:: { Mutex , Once } ;
2221
2322use crate :: acpi:: aml;
@@ -28,7 +27,7 @@ use crate::mem::paging::VirtAddr;
2827use crate :: userland:: scheduler:: { self , ExitStatus } ;
2928use crate :: userland:: signals:: SignalEntry ;
3029use crate :: userland:: task:: sessions:: SESSIONS ;
31- use crate :: userland:: task:: { Task , TaskId } ;
30+ use crate :: userland:: task:: TaskId ;
3231use crate :: utils:: sync:: IrqGuard ;
3332
3433static HOSTNAME : Once < Mutex < String > > = Once :: new ( ) ;
@@ -363,31 +362,43 @@ pub fn shutdown() -> Result<usize> {
363362 unreachable ! ( "aml: failed to shutdown (enter state S5)" )
364363}
365364
366- fn find_task_by_pid ( pid : usize ) -> Result < Arc < Task > > {
367- let current_task = scheduler:: get_scheduler ( ) . current_task ( ) ;
365+ #[ syscall]
366+ pub fn getpgid ( pid : usize ) -> Result < usize > {
367+ let current_task = scheduler:: current_thread ( ) ;
368368
369369 // If `pid` is 0, the process ID of the calling process is used.
370- if pid == 0 || pid == current_task. pid ( ) . as_usize ( ) {
371- Ok ( current_task)
370+ let task = if pid == 0 || pid == current_task. pid ( ) . as_usize ( ) {
371+ current_task
372372 } else {
373373 scheduler:: get_scheduler ( )
374374 . find_task ( TaskId :: new ( pid) )
375- . ok_or ( SyscallError :: ESRCH )
376- }
377- }
375+ . ok_or ( SyscallError :: ESRCH ) ?
376+ } ;
378377
379- #[ syscall]
380- pub fn getpgid ( pid : usize ) -> Result < usize > {
381- let task = find_task_by_pid ( pid) ?;
382378 let group = SESSIONS . find_group ( & task) . unwrap ( ) ;
383-
384379 Ok ( group. id ( ) )
385380}
386381
387382#[ syscall]
388383pub fn setpgid ( pid : usize , pgid : usize ) -> Result < usize > {
389- let current_task = scheduler:: get_scheduler ( ) . current_task ( ) ;
390- let task = find_task_by_pid ( pid) ?;
384+ let current_task = scheduler:: current_thread ( ) ;
385+ let task = if pid == 0 || pid == current_task. pid ( ) . as_usize ( ) {
386+ current_task. clone ( )
387+ } else {
388+ let task = scheduler:: get_scheduler ( )
389+ . find_task ( TaskId :: new ( pid) )
390+ . ok_or ( SyscallError :: ESRCH ) ?;
391+
392+ if let Some ( parent) = task. get_parent ( ) {
393+ if parent. tid ( ) != current_task. tid ( ) {
394+ return Err ( SyscallError :: EPERM ) ;
395+ }
396+ } else {
397+ return Err ( SyscallError :: EPERM ) ;
398+ }
399+
400+ task
401+ } ;
391402
392403 if task. is_session_leader ( )
393404 || !task. is_process_leader ( )
@@ -396,16 +407,6 @@ pub fn setpgid(pid: usize, pgid: usize) -> Result<usize> {
396407 return Err ( SyscallError :: EPERM ) ;
397408 }
398409
399- if let Some ( parent) = task. get_parent ( ) {
400- if parent. tid ( ) != current_task. tid ( ) {
401- return Err ( SyscallError :: EPERM ) ;
402- }
403- } else {
404- return Err ( SyscallError :: EPERM ) ;
405- }
406-
407- // If `pgid` is 0, the process ID of the process specified by the `pid` argument shall
408- // be used.
409410 log:: error!( "setpgid: is a stub! (pid={pid} pgid={pgid})" ) ;
410411 Ok ( 0 )
411412}
0 commit comments