1
1
/*-
2
- * Copyright (c) 2006-2007 Pawel Jakub Dawidek <[email protected] >
2
+ * Copyright (c) 2006-2010 Pawel Jakub Dawidek <[email protected] >
3
3
* All rights reserved.
4
4
*
5
5
* Redistribution and use in source and binary forms, with or without
41
41
#include <errno.h>
42
42
#include <assert.h>
43
43
#include <sys/types.h>
44
+ #include <sys/socket.h>
45
+ #include <sys/un.h>
44
46
#include <utime.h>
45
47
#ifdef HAS_ACL
46
48
#include <sys/acl.h>
@@ -84,6 +86,9 @@ enum action {
84
86
ACTION_STAT ,
85
87
ACTION_LSTAT ,
86
88
ACTION_UTIME ,
89
+ ACTION_BIND ,
90
+ ACTION_MKNOD ,
91
+ ACTION_MKNODAT ,
87
92
#ifdef HAS_ACL
88
93
ACTION_GETFACL ,
89
94
ACTION_SETFACL ,
@@ -93,6 +98,7 @@ enum action {
93
98
#define TYPE_NONE 0x0000
94
99
#define TYPE_STRING 0x0001
95
100
#define TYPE_NUMBER 0x0002
101
+ #define TYPE_DESCRIPTOR 0x0003
96
102
97
103
#define TYPE_OPTIONAL 0x0100
98
104
@@ -114,6 +120,9 @@ static struct syscall_desc syscalls[] = {
114
120
{ "symlink" , ACTION_SYMLINK , { TYPE_STRING , TYPE_STRING , TYPE_NONE } },
115
121
{ "rename" , ACTION_RENAME , { TYPE_STRING , TYPE_STRING , TYPE_NONE } },
116
122
{ "mkfifo" , ACTION_MKFIFO , { TYPE_STRING , TYPE_NUMBER , TYPE_NONE } },
123
+ { "bind" , ACTION_BIND , { TYPE_STRING , TYPE_NONE } },
124
+ { "mknod" , ACTION_MKNOD , { TYPE_STRING , TYPE_STRING , TYPE_NUMBER , TYPE_NUMBER , TYPE_NUMBER , TYPE_NONE } },
125
+ { "mknodat" , ACTION_MKNODAT , { TYPE_DESCRIPTOR , TYPE_STRING , TYPE_STRING , TYPE_NUMBER , TYPE_NUMBER , TYPE_NUMBER , TYPE_NONE } },
117
126
{ "chmod" , ACTION_CHMOD , { TYPE_STRING , TYPE_NUMBER , TYPE_NONE } },
118
127
#ifdef HAS_LCHMOD
119
128
{ "lchmod" , ACTION_LCHMOD , { TYPE_STRING , TYPE_NUMBER , TYPE_NONE } },
@@ -320,6 +329,10 @@ show_stat(struct stat64 *sp, const char *what)
320
329
printf ("%lld" , (long long )sp -> st_mtime );
321
330
else if (strcmp (what , "ctime" ) == 0 )
322
331
printf ("%lld" , (long long )sp -> st_ctime );
332
+ else if (strcmp (what , "major" ) == 0 )
333
+ printf ("%u" , (unsigned int )major (sp -> st_rdev ));
334
+ else if (strcmp (what , "minor" ) == 0 )
335
+ printf ("%u" , (unsigned int )minor (sp -> st_rdev ));
323
336
#ifdef HAS_CHFLAGS
324
337
else if (strcmp (what , "flags ") == 0 )
325
338
printf ("%s" , flags2str (chflags_flags , sp -> st_flags ));
@@ -670,6 +683,64 @@ call_syscall(struct syscall_desc *scall, char *argv[])
670
683
exit (1 );
671
684
}
672
685
break ;
686
+ case ACTION_BIND :
687
+ {
688
+ struct sockaddr_un sunx ;
689
+
690
+ sunx .sun_family = AF_UNIX ;
691
+ strncpy (sunx .sun_path , STR (0 ), sizeof (sunx .sun_path ) - 1 );
692
+ sunx .sun_path [sizeof (sunx .sun_path ) - 1 ] = '\0' ;
693
+ rval = socket (AF_UNIX , SOCK_STREAM , 0 );
694
+ if (rval < 0 )
695
+ break ;
696
+ rval = bind (rval , (struct sockaddr * )& sunx , sizeof (sunx ));
697
+ break ;
698
+ }
699
+ case ACTION_MKNOD :
700
+ case ACTION_MKNODAT :
701
+ {
702
+ mode_t ntype ;
703
+ dev_t dev ;
704
+ int fa ;
705
+
706
+ switch (scall -> sd_action ) {
707
+ case ACTION_MKNOD :
708
+ fa = 0 ;
709
+ break ;
710
+ case ACTION_MKNODAT :
711
+ fa = 1 ;
712
+ break ;
713
+ default :
714
+ abort ();
715
+ }
716
+
717
+ dev = makedev (NUM (fa + 3 ), NUM (fa + 4 ));
718
+ if (strcmp (STR (fa + 1 ), "c" ) == 0 ) /* character device */
719
+ ntype = S_IFCHR ;
720
+ else if (strcmp (STR (fa + 1 ), "b" ) == 0 ) /* block device */
721
+ ntype = S_IFBLK ;
722
+ else if (strcmp (STR (fa + 1 ), "f" ) == 0 ) /* fifo special */
723
+ ntype = S_IFIFO ;
724
+ else if (strcmp (STR (fa + 1 ), "d" ) == 0 ) /* directory */
725
+ ntype = S_IFDIR ;
726
+ else if (strcmp (STR (fa + 1 ), "o" ) == 0 ) /* regular file */
727
+ ntype = S_IFREG ;
728
+ else {
729
+ fprintf (stderr , "wrong argument 1\n" );
730
+ exit (1 );
731
+ }
732
+ switch (scall -> sd_action ) {
733
+ case ACTION_MKNOD :
734
+ rval = mknod (STR (0 ), ntype | NUM (2 ), dev );
735
+ break ;
736
+ case ACTION_MKNODAT :
737
+ rval = mknodat (NUM (0 ), STR (1 ), ntype | NUM (3 ), dev );
738
+ break ;
739
+ default :
740
+ abort ();
741
+ }
742
+ break ;
743
+ }
673
744
#ifdef HAS_ACL
674
745
case ACTION_GETFACL :
675
746
rval = do_getfacl (STR (0 ), STR (1 ));
0 commit comments