lib/system.c

ソースコードを見る。

データ構造

struct  _popen_list
union  extattr_arg

型定義

typedef _popen_list popen_list

関数

void * sys_memalign (size_t align, size_t size)
int sys_usleep (long usecs)
ssize_t sys_read (int fd, void *buf, size_t count)
ssize_t sys_write (int fd, const void *buf, size_t count)
ssize_t sys_pread (int fd, void *buf, size_t count, SMB_OFF_T off)
ssize_t sys_pwrite (int fd, const void *buf, size_t count, SMB_OFF_T off)
ssize_t sys_send (int s, const void *msg, size_t len, int flags)
ssize_t sys_sendto (int s, const void *msg, size_t len, int flags, const struct sockaddr *to, socklen_t tolen)
ssize_t sys_recv (int fd, void *buf, size_t count, int flags)
ssize_t sys_recvfrom (int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen)
int sys_fcntl_ptr (int fd, int cmd, void *arg)
int sys_fcntl_long (int fd, int cmd, long arg)
int sys_stat (const char *fname, SMB_STRUCT_STAT *sbuf)
int sys_fstat (int fd, SMB_STRUCT_STAT *sbuf)
int sys_lstat (const char *fname, SMB_STRUCT_STAT *sbuf)
int sys_ftruncate (int fd, SMB_OFF_T offset)
SMB_OFF_T sys_lseek (int fd, SMB_OFF_T offset, int whence)
int sys_fseek (FILE *fp, SMB_OFF_T offset, int whence)
SMB_OFF_T sys_ftell (FILE *fp)
int sys_creat (const char *path, mode_t mode)
int sys_open (const char *path, int oflag, mode_t mode)
FILE * sys_fopen (const char *path, const char *type)
void kernel_flock (int fd, uint32 share_mode)
SMB_STRUCT_DIR * sys_opendir (const char *name)
SMB_STRUCT_DIRENT * sys_readdir (SMB_STRUCT_DIR *dirp)
void sys_seekdir (SMB_STRUCT_DIR *dirp, long offset)
long sys_telldir (SMB_STRUCT_DIR *dirp)
void sys_rewinddir (SMB_STRUCT_DIR *dirp)
int sys_closedir (SMB_STRUCT_DIR *dirp)
int sys_mknod (const char *path, mode_t mode, SMB_DEV_T dev)
char * sys_realpath (const char *path, char *resolved_path)
int sys_waitpid (pid_t pid, int *status, int options)
char * sys_getwd (char *s)
int sys_symlink (const char *oldpath, const char *newpath)
int sys_readlink (const char *path, char *buf, size_t bufsiz)
int sys_link (const char *oldpath, const char *newpath)
int sys_chown (const char *fname, uid_t uid, gid_t gid)
int sys_chroot (const char *dname)
hostent * sys_gethostbyname (const char *name)
static BOOL set_process_capability (enum smbd_capability capability, BOOL enable)
void set_effective_capability (enum smbd_capability capability)
void drop_effective_capability (enum smbd_capability capability)
long sys_random (void)
void sys_srandom (unsigned int seed)
int groups_max (void)
int sys_getgroups (int setlen, gid_t *gidset)
int sys_setgroups (int setlen, gid_t *gidset)
void sys_setpwent (void)
passwd * sys_getpwent (void)
void sys_endpwent (void)
passwd * sys_getpwnam (const char *name)
passwd * sys_getpwuid (uid_t uid)
void faked_create_user (const char *name)
group * sys_getgrnam (const char *name)
group * sys_getgrgid (gid_t gid)
int wsys_stat (const smb_ucs2_t *wfname, SMB_STRUCT_STAT *sbuf)
int wsys_lstat (const smb_ucs2_t *wfname, SMB_STRUCT_STAT *sbuf)
int wsys_creat (const smb_ucs2_t *wfname, mode_t mode)
int wsys_open (const smb_ucs2_t *wfname, int oflag, mode_t mode)
FILE * wsys_fopen (const smb_ucs2_t *wfname, const char *type)
SMB_STRUCT_DIR * wsys_opendir (const smb_ucs2_t *wfname)
SMB_STRUCT_WDIRENT * wsys_readdir (SMB_STRUCT_DIR *dirp)
smb_ucs2_twsys_getwd (smb_ucs2_t *s)
int wsys_chown (const smb_ucs2_t *wfname, uid_t uid, gid_t gid)
int wsys_chroot (const smb_ucs2_t *wfname)
SMB_STRUCT_WPASSWD * wsys_getpwnam (const smb_ucs2_t *wname)
SMB_STRUCT_WPASSWD * wsys_getpwuid (uid_t uid)
static char ** extract_args (const char *command)
pid_t sys_fork (void)
pid_t sys_getpid (void)
int sys_popen (const char *command)
int sys_pclose (int fd)
void * sys_dlopen (const char *name, int flags)
void * sys_dlsym (void *handle, const char *symbol)
int sys_dlclose (void *handle)
const char * sys_dlerror (void)
int sys_dup2 (int oldfd, int newfd)
void sys_adminlog (int priority, const char *format_str,...)
static int solaris_write_xattr (int attrfd, const char *value, size_t size)
static ssize_t solaris_read_xattr (int attrfd, void *value, size_t size)
static ssize_t solaris_list_xattr (int attrdirfd, char *list, size_t size)
static int solaris_unlinkat (int attrdirfd, const char *name)
static int solaris_attropen (const char *path, const char *attrpath, int oflag, mode_t mode)
static int solaris_openat (int fildes, const char *path, int oflag, mode_t mode)
ssize_t sys_getxattr (const char *path, const char *name, void *value, size_t size)
ssize_t sys_lgetxattr (const char *path, const char *name, void *value, size_t size)
ssize_t sys_fgetxattr (int filedes, const char *name, void *value, size_t size)
static ssize_t bsd_attr_list (int type, extattr_arg arg, char *list, size_t size)
static ssize_t irix_attr_list (const char *path, int filedes, char *list, size_t size, int flags)
ssize_t sys_listxattr (const char *path, char *list, size_t size)
ssize_t sys_llistxattr (const char *path, char *list, size_t size)
ssize_t sys_flistxattr (int filedes, char *list, size_t size)
int sys_removexattr (const char *path, const char *name)
int sys_lremovexattr (const char *path, const char *name)
int sys_fremovexattr (int filedes, const char *name)
int sys_setxattr (const char *path, const char *name, const void *value, size_t size, int flags)
int sys_lsetxattr (const char *path, const char *name, const void *value, size_t size, int flags)
int sys_fsetxattr (int filedes, const char *name, const void *value, size_t size, int flags)
uint32 unix_dev_major (SMB_DEV_T dev)
uint32 unix_dev_minor (SMB_DEV_T dev)
int sys_aio_read (SMB_STRUCT_AIOCB *aiocb)
int sys_aio_write (SMB_STRUCT_AIOCB *aiocb)
ssize_t sys_aio_return (SMB_STRUCT_AIOCB *aiocb)
int sys_aio_cancel (int fd, SMB_STRUCT_AIOCB *aiocb)
int sys_aio_error (const SMB_STRUCT_AIOCB *aiocb)
int sys_aio_fsync (int op, SMB_STRUCT_AIOCB *aiocb)
int sys_aio_suspend (const SMB_STRUCT_AIOCB *const cblist[], int n, const struct timespec *timeout)
int sys_getpeereid (int s, uid_t *uid)

変数

static struct passwd * fake_pwd
static int num_fake_pwd
static pid_t mypid = (pid_t)-1
static popen_listpopen_chain
struct {
   int   space
   const char *   name
   size_t   len
extattr []
static char attr_buffer [ATTR_MAX_VALUELEN]


型定義

typedef struct _popen_list popen_list


関数

void* sys_memalign ( size_t  align,
size_t  size 
)

system.c51 行で定義されています。

参照元 memalign_array().

00052 {
00053 #if defined(HAVE_POSIX_MEMALIGN)
00054         void *p = NULL;
00055         int ret = posix_memalign( &p, align, size );
00056         if ( ret == 0 )
00057                 return p;
00058                 
00059         return NULL;
00060 #elif defined(HAVE_MEMALIGN)
00061         return memalign( align, size );
00062 #else
00063         /* On *BSD systems memaligns doesn't exist, but memory will
00064          * be aligned on allocations of > pagesize. */
00065 #if defined(SYSCONF_SC_PAGESIZE)
00066         size_t pagesize = (size_t)sysconf(_SC_PAGESIZE);
00067 #elif defined(HAVE_GETPAGESIZE)
00068         size_t pagesize = (size_t)getpagesize();
00069 #else
00070         size_t pagesize = (size_t)-1;
00071 #endif
00072         if (pagesize == (size_t)-1) {
00073                 DEBUG(0,("memalign functionalaity not available on this platform!\n"));
00074                 return NULL;
00075         }
00076         if (size < pagesize) {
00077                 size = pagesize;
00078         }
00079         return SMB_MALLOC(size);
00080 #endif
00081 }

int sys_usleep ( long  usecs  ) 

system.c87 行で定義されています。

参照先 errno.

参照元 _spoolss_open_printer_ex()startsmbfilepwent()status_profile_rates()watch_service_state().

00088 {
00089 #ifndef HAVE_USLEEP
00090         struct timeval tval;
00091 #endif
00092 
00093         /*
00094          * We need this braindamage as the glibc usleep
00095          * is not SPEC1170 complient... grumble... JRA.
00096          */
00097 
00098         if(usecs < 0 || usecs > 1000000) {
00099                 errno = EINVAL;
00100                 return -1;
00101         }
00102 
00103 #if HAVE_USLEEP
00104         usleep(usecs);
00105         return 0;
00106 #else /* HAVE_USLEEP */
00107         /*
00108          * Fake it with select...
00109          */
00110         tval.tv_sec = 0;
00111         tval.tv_usec = usecs/1000;
00112         select(0,NULL,NULL,NULL,&tval);
00113         return 0;
00114 #endif /* HAVE_USLEEP */
00115 }

ssize_t sys_read ( int  fd,
void *  buf,
size_t  count 
)

system.c121 行で定義されています。

参照先 errno.

参照元 read_data()read_data_until()read_socket_with_timeout()rw_callback()transfer_file()vfswrap_read().

00122 {
00123         ssize_t ret;
00124 
00125         do {
00126                 ret = read(fd, buf, count);
00127         } while (ret == -1 && errno == EINTR);
00128         return ret;
00129 }

ssize_t sys_write ( int  fd,
const void *  buf,
size_t  count 
)

system.c135 行で定義されています。

参照先 errno.

参照元 expect()rw_callback()transfer_file()vfswrap_write()write_data().

00136 {
00137         ssize_t ret;
00138 
00139         do {
00140                 ret = write(fd, buf, count);
00141         } while (ret == -1 && errno == EINTR);
00142         return ret;
00143 }

ssize_t sys_pread ( int  fd,
void *  buf,
size_t  count,
SMB_OFF_T  off 
)

system.c150 行で定義されています。

参照先 errno.

参照元 prime_cache()vfswrap_pread().

00151 {
00152         ssize_t ret;
00153 
00154         do {
00155 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T) && defined(HAVE_PREAD64)
00156                 ret = pread64(fd, buf, count, off);
00157 #else
00158                 ret = pread(fd, buf, count, off);
00159 #endif
00160         } while (ret == -1 && errno == EINTR);
00161         return ret;
00162 }

ssize_t sys_pwrite ( int  fd,
const void *  buf,
size_t  count,
SMB_OFF_T  off 
)

system.c170 行で定義されています。

参照先 errno.

参照元 vfswrap_pwrite()write_data_at_offset().

00171 {
00172         ssize_t ret;
00173 
00174         do {
00175 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T) && defined(HAVE_PWRITE64)
00176                 ret = pwrite64(fd, buf, count, off);
00177 #else
00178                 ret = pwrite(fd, buf, count, off);
00179 #endif
00180         } while (ret == -1 && errno == EINTR);
00181         return ret;
00182 }

ssize_t sys_send ( int  s,
const void *  msg,
size_t  len,
int  flags 
)

system.c189 行で定義されています。

参照先 errno.

参照元 sys_sendfile().

00190 {
00191         ssize_t ret;
00192 
00193         do {
00194                 ret = send(s, msg, len, flags);
00195         } while (ret == -1 && errno == EINTR);
00196         return ret;
00197 }

ssize_t sys_sendto ( int  s,
const void *  msg,
size_t  len,
int  flags,
const struct sockaddr *  to,
socklen_t  tolen 
)

system.c203 行で定義されています。

参照先 errno.

00204 {
00205         ssize_t ret;
00206 
00207         do {
00208                 ret = sendto(s, msg, len, flags, to, tolen);
00209         } while (ret == -1 && errno == EINTR);
00210         return ret;
00211 }

ssize_t sys_recv ( int  fd,
void *  buf,
size_t  count,
int  flags 
)

system.c217 行で定義されています。

参照先 errno.

00218 {
00219         ssize_t ret;
00220 
00221         do {
00222                 ret = recv(fd, buf, count, flags);
00223         } while (ret == -1 && errno == EINTR);
00224         return ret;
00225 }

ssize_t sys_recvfrom ( int  s,
void *  buf,
size_t  len,
int  flags,
struct sockaddr *  from,
socklen_t fromlen 
)

system.c231 行で定義されています。

参照先 errno.

参照元 read_udp_socket().

00232 {
00233         ssize_t ret;
00234 
00235         do {
00236                 ret = recvfrom(s, buf, len, flags, from, fromlen);
00237         } while (ret == -1 && errno == EINTR);
00238         return ret;
00239 }

int sys_fcntl_ptr ( int  fd,
int  cmd,
void *  arg 
)

system.c245 行で定義されています。

参照先 errno.

参照元 fcntl_getlock()fcntl_lock()irix_oplock_receive_message().

00246 {
00247         int ret;
00248 
00249         do {
00250                 ret = fcntl(fd, cmd, arg);
00251         } while (ret == -1 && errno == EINTR);
00252         return ret;
00253 }

int sys_fcntl_long ( int  fd,
int  cmd,
long  arg 
)

system.c259 行で定義されています。

参照先 errno.

参照元 irix_oplocks_available()irix_release_kernel_oplock()irix_set_kernel_oplock()set_blocking().

00260 {
00261         int ret;
00262 
00263         do {
00264                 ret = fcntl(fd, cmd, arg);
00265         } while (ret == -1 && errno == EINTR);
00266         return ret;
00267 }

int sys_stat ( const char *  fname,
SMB_STRUCT_STAT *  sbuf 
)

system.c273 行で定義されています。

参照元 cgi_download()cmd_newer()directory_exist()disk_quotas()file_exist()file_modtime()get_file_size()get_ticket_cache()load_usershare_service()net_usershare_add()parse_usershare_file()startsmbfilepwent()sys_path_to_bdev()vfswrap_stat()writetarheader()wsys_stat().

00274 {
00275         int ret;
00276 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T) && defined(HAVE_STAT64)
00277         ret = stat64(fname, sbuf);
00278 #else
00279         ret = stat(fname, sbuf);
00280 #endif
00281         /* we always want directories to appear zero size */
00282         if (ret == 0 && S_ISDIR(sbuf->st_mode)) sbuf->st_size = 0;
00283         return ret;
00284 }

int sys_fstat ( int  fd,
SMB_STRUCT_STAT *  sbuf 
)

system.c290 行で定義されています。

参照元 check_log_size()check_magic()fd_load()info_fn()net_usershare_add()print_job_end()process_usershare_file()read_block()regf_hbin_allocate()startsmbfilepwent()vfswrap_fstat()write_block()writetarheader().

00291 {
00292         int ret;
00293 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T) && defined(HAVE_FSTAT64)
00294         ret = fstat64(fd, sbuf);
00295 #else
00296         ret = fstat(fd, sbuf);
00297 #endif
00298         /* we always want directories to appear zero size */
00299         if (ret == 0 && S_ISDIR(sbuf->st_mode)) sbuf->st_size = 0;
00300         return ret;
00301 }

int sys_lstat ( const char *  fname,
SMB_STRUCT_STAT *  sbuf 
)

system.c307 行で定義されています。

参照元 atalk_build_paths()copy_reg()count_num_usershares()get_share_list()net_usershare_add()process_usershare_file()usershare_exists()vfswrap_lstat()wsys_lstat().

00308 {
00309         int ret;
00310 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T) && defined(HAVE_LSTAT64)
00311         ret = lstat64(fname, sbuf);
00312 #else
00313         ret = lstat(fname, sbuf);
00314 #endif
00315         /* we always want directories to appear zero size */
00316         if (ret == 0 && S_ISDIR(sbuf->st_mode)) sbuf->st_size = 0;
00317         return ret;
00318 }

int sys_ftruncate ( int  fd,
SMB_OFF_T  offset 
)

system.c324 行で定義されています。

参照元 print_fsp_end()strict_allocate_ftruncate()vfswrap_ftruncate().

00325 {
00326 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T) && defined(HAVE_FTRUNCATE64)
00327         return ftruncate64(fd, offset);
00328 #else
00329         return ftruncate(fd, offset);
00330 #endif
00331 }

SMB_OFF_T sys_lseek ( int  fd,
SMB_OFF_T  offset,
int  whence 
)

system.c337 行で定義されています。

参照元 do_get()smbrun_internal()vfswrap_lseek()write_data_at_offset()x_tseek().

00338 {
00339 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T) && defined(HAVE_LSEEK64)
00340         return lseek64(fd, offset, whence);
00341 #else
00342         return lseek(fd, offset, whence);
00343 #endif
00344 }

int sys_fseek ( FILE *  fp,
SMB_OFF_T  offset,
int  whence 
)

system.c350 行で定義されています。

00351 {
00352 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(LARGE_SMB_OFF_T) && defined(HAVE_FSEEK64)
00353         return fseek64(fp, offset, whence);
00354 #elif defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(LARGE_SMB_OFF_T) && defined(HAVE_FSEEKO64)
00355         return fseeko64(fp, offset, whence);
00356 #else
00357         return fseek(fp, offset, whence);
00358 #endif
00359 }

SMB_OFF_T sys_ftell ( FILE *  fp  ) 

system.c365 行で定義されています。

00366 {
00367 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(LARGE_SMB_OFF_T) && defined(HAVE_FTELL64)
00368         return (SMB_OFF_T)ftell64(fp);
00369 #elif defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(LARGE_SMB_OFF_T) && defined(HAVE_FTELLO64)
00370         return (SMB_OFF_T)ftello64(fp);
00371 #else
00372         return (SMB_OFF_T)ftell(fp);
00373 #endif
00374 }

int sys_creat ( const char *  path,
mode_t  mode 
)

system.c380 行で定義されています。

参照先 sys_open().

参照元 writetarheader()wsys_creat().

00381 {
00382 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_CREAT64)
00383         return creat64(path, mode);
00384 #else
00385         /*
00386          * If creat64 isn't defined then ensure we call a potential open64.
00387          * JRA.
00388          */
00389         return sys_open(path, O_WRONLY | O_CREAT | O_TRUNC, mode);
00390 #endif
00391 }

int sys_open ( const char *  path,
int  oflag,
mode_t  mode 
)

system.c397 行で定義されています。

参照元 become_daemon()close_low_fds()copy_reg()disk_quotas_vxfs()do_filehash()do_get()do_reseed()dochild()findpty()get_password_file()gpo_copy_file()info_fn()irix_oplocks_available()pidfile_create()pidfile_pid()process_usershare_file()startsmbfilepwent()sys_creat()vfswrap_open()web_open()writetarheader()wsys_open()x_fopen().

00398 {
00399 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OPEN64)
00400         return open64(path, oflag, mode);
00401 #else
00402         return open(path, oflag, mode);
00403 #endif
00404 }

FILE* sys_fopen ( const char *  path,
const char *  type 
)

system.c410 行で定義されています。

参照元 read_credentials_file()save_reload()startsmbfilepwent()wsys_fopen().

00411 {
00412 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_FOPEN64)
00413         return fopen64(path, type);
00414 #else
00415         return fopen(path, type);
00416 #endif
00417 }

void kernel_flock ( int  fd,
uint32  share_mode 
)

system.c424 行で定義されています。

参照元 vfs_gpfs_kernel_flock()vfswrap_kernel_flock().

00425 {
00426 #if HAVE_KERNEL_SHARE_MODES
00427         int kernel_mode = 0;
00428         if (share_mode == FILE_SHARE_WRITE) {
00429                 kernel_mode = LOCK_MAND|LOCK_WRITE;
00430         } else if (share_mode == FILE_SHARE_READ) {
00431                 kernel_mode = LOCK_MAND|LOCK_READ;
00432         } else if (share_mode == FILE_SHARE_NONE) {
00433                 kernel_mode = LOCK_MAND;
00434         }
00435         if (kernel_mode) {
00436                 flock(fd, kernel_mode);
00437         }
00438 #endif
00439         ;
00440 }

SMB_STRUCT_DIR* sys_opendir ( const char *  name  ) 

system.c448 行で定義されています。

参照先 opendir()opendir64().

参照元 atalk_rrmdir()count_num_usershares()file_find()findpty()get_share_list()get_ticket_cache()net_usershare()parse_usershare_file()vfswrap_opendir().

00449 {
00450 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OPENDIR64)
00451         return opendir64(name);
00452 #else
00453         return opendir(name);
00454 #endif
00455 }

SMB_STRUCT_DIRENT* sys_readdir ( SMB_STRUCT_DIR *  dirp  ) 

system.c461 行で定義されています。

参照先 readdir()readdir64().

参照元 atalk_rrmdir()count_num_usershares()get_share_list()get_ticket_cache()readdirname()vfswrap_readdir()wsys_readdir().

00462 {
00463 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_READDIR64)
00464         return readdir64(dirp);
00465 #else
00466         return readdir(dirp);
00467 #endif
00468 }

void sys_seekdir ( SMB_STRUCT_DIR *  dirp,
long  offset 
)

system.c474 行で定義されています。

参照先 seekdir()seekdir64().

参照元 vfswrap_seekdir().

00475 {
00476 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_SEEKDIR64)
00477         seekdir64(dirp, offset);
00478 #else
00479         seekdir(dirp, offset);
00480 #endif
00481 }

long sys_telldir ( SMB_STRUCT_DIR *  dirp  ) 

system.c487 行で定義されています。

参照先 telldir()telldir64().

参照元 vfswrap_telldir().

00488 {
00489 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_TELLDIR64)
00490         return (long)telldir64(dirp);
00491 #else
00492         return (long)telldir(dirp);
00493 #endif
00494 }

void sys_rewinddir ( SMB_STRUCT_DIR *  dirp  ) 

system.c500 行で定義されています。

参照先 rewinddir().

参照元 vfswrap_rewinddir().

00501 {
00502 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_REWINDDIR64)
00503         rewinddir64(dirp);
00504 #else
00505         rewinddir(dirp);
00506 #endif
00507 }

int sys_closedir ( SMB_STRUCT_DIR *  dirp  ) 

system.c513 行で定義されています。

参照先 closedir().

参照元 atalk_rrmdir()count_num_usershares()file_find()findpty()get_share_list()get_ticket_cache()net_usershare()parse_usershare_file()vfswrap_closedir().

00514 {
00515 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_CLOSEDIR64)
00516         return closedir64(dirp);
00517 #else
00518         return closedir(dirp);
00519 #endif
00520 }

int sys_mknod ( const char *  path,
mode_t  mode,
SMB_DEV_T  dev 
)

system.c526 行で定義されています。

参照先 errno.

参照元 vfswrap_mknod().

00527 {
00528 #if defined(HAVE_MKNOD) || defined(HAVE_MKNOD64)
00529 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_MKNOD64) && defined(HAVE_DEV64_T)
00530         return mknod64(path, mode, dev);
00531 #else
00532         return mknod(path, mode, dev);
00533 #endif
00534 #else
00535         /* No mknod system call. */
00536         errno = ENOSYS;
00537         return -1;
00538 #endif
00539 }

char* sys_realpath ( const char *  path,
char *  resolved_path 
)

system.c545 行で定義されています。

参照先 errno.

参照元 vfswrap_realpath().

00546 {
00547 #if defined(HAVE_REALPATH)
00548         return realpath(path, resolved_path);
00549 #else
00550         /* As realpath is not a system call we can't return ENOSYS. */
00551         errno = EINVAL;
00552         return NULL;
00553 #endif
00554 }

int sys_waitpid ( pid_t  pid,
int *  status,
int  options 
)

system.c560 行で定義されています。

参照元 chat_with_program()main()open_sockets_smbd()sig_cld()smbrun_internal()smbrunsecret().

00561 {
00562 #ifdef HAVE_WAITPID
00563         return waitpid(pid,status,options);
00564 #else /* HAVE_WAITPID */
00565         return wait4(pid, status, options, NULL);
00566 #endif /* HAVE_WAITPID */
00567 }

char* sys_getwd ( char *  s  ) 

system.c573 行で定義されています。

参照元 cmd_lcd()generic_job_submit()vfswrap_getwd()wsys_getwd().

00574 {
00575         char *wd;
00576 #ifdef HAVE_GETCWD
00577         wd = (char *)getcwd(s, sizeof (pstring));
00578 #else
00579         wd = (char *)getwd(s);
00580 #endif
00581         return wd;
00582 }

int sys_symlink ( const char *  oldpath,
const char *  newpath 
)

system.c588 行で定義されています。

参照先 errno.

参照元 vfswrap_symlink().

00589 {
00590 #ifndef HAVE_SYMLINK
00591         errno = ENOSYS;
00592         return -1;
00593 #else
00594         return symlink(oldpath, newpath);
00595 #endif
00596 }

int sys_readlink ( const char *  path,
char *  buf,
size_t  bufsiz 
)

system.c602 行で定義されています。

参照先 errno.

参照元 vfswrap_readlink().

00603 {
00604 #ifndef HAVE_READLINK
00605         errno = ENOSYS;
00606         return -1;
00607 #else
00608         return readlink(path, buf, bufsiz);
00609 #endif
00610 }

int sys_link ( const char *  oldpath,
const char *  newpath 
)

system.c616 行で定義されています。

参照先 errno.

参照元 vfswrap_link().

00617 {
00618 #ifndef HAVE_LINK
00619         errno = ENOSYS;
00620         return -1;
00621 #else
00622         return link(oldpath, newpath);
00623 #endif
00624 }

int sys_chown ( const char *  fname,
uid_t  uid,
gid_t  gid 
)

system.c630 行で定義されています。

参照先 errno.

参照元 dump_core_setup()vfswrap_chown().

00631 {
00632 #ifndef HAVE_CHOWN
00633         static int done;
00634         if (!done) {
00635                 DEBUG(1,("WARNING: no chown!\n"));
00636                 done=1;
00637         }
00638         errno = ENOSYS;
00639         return -1;
00640 #else
00641         return(chown(fname,uid,gid));
00642 #endif
00643 }

int sys_chroot ( const char *  dname  ) 

system.c648 行で定義されています。

参照先 errno.

参照元 main().

00649 {
00650 #ifndef HAVE_CHROOT
00651         static int done;
00652         if (!done) {
00653                 DEBUG(1,("WARNING: no chroot!\n"));
00654                 done=1;
00655         }
00656         errno = ENOSYS;
00657         return -1;
00658 #else
00659         return(chroot(dname));
00660 #endif
00661 }

struct hostent* sys_gethostbyname ( const char *  name  ) 

system.c669 行で定義されています。

参照先 strchr_m().

参照元 get_mydnsfullname()interpret_addr()is_myname_or_ipaddr()matchname()name_to_fqdn()resolve_hosts().

00670 {
00671 #ifdef REDUCE_ROOT_DNS_LOOKUPS
00672         char query[256], hostname[256];
00673         char *domain;
00674 
00675         /* Does this name have any dots in it? If so, make no change */
00676 
00677         if (strchr_m(name, '.'))
00678                 return(gethostbyname(name));
00679 
00680         /* Get my hostname, which should have domain name 
00681                 attached. If not, just do the gethostname on the
00682                 original string. 
00683         */
00684 
00685         gethostname(hostname, sizeof(hostname) - 1);
00686         hostname[sizeof(hostname) - 1] = 0;
00687         if ((domain = strchr_m(hostname, '.')) == NULL)
00688                 return(gethostbyname(name));
00689 
00690         /* Attach domain name to query and do modified query.
00691                 If names too large, just do gethostname on the
00692                 original string.
00693         */
00694 
00695         if((strlen(name) + strlen(domain)) >= sizeof(query))
00696                 return(gethostbyname(name));
00697 
00698         slprintf(query, sizeof(query)-1, "%s%s", name, domain);
00699         return(gethostbyname(query));
00700 #else /* REDUCE_ROOT_DNS_LOOKUPS */
00701         return(gethostbyname(name));
00702 #endif /* REDUCE_ROOT_DNS_LOOKUPS */
00703 }

static BOOL set_process_capability ( enum smbd_capability  capability,
BOOL  enable 
) [static]

system.c735 行で定義されています。

参照先 DMAPI_ACCESS_CAPABILITYerrnoKERNEL_OPLOCK_CAPABILITYLEASE_CAPABILITYstrerror().

参照元 drop_effective_capability()set_effective_capability().

00737 {
00738         cap_value_t cap_vals[2] = {0};
00739         int num_cap_vals = 0;
00740 
00741         cap_t cap;
00742 
00743 #if defined(HAVE_PRCTL) && defined(PR_GET_KEEPCAPS) && defined(PR_SET_KEEPCAPS)
00744         /* On Linux, make sure that any capabilities we grab are sticky
00745          * across UID changes. We expect that this would allow us to keep both
00746          * the effective and permitted capability sets, but as of circa 2.6.16,
00747          * only the permitted set is kept. It is a bug (which we work around)
00748          * that the effective set is lost, but we still require the effective
00749          * set to be kept.
00750          */
00751         if (!prctl(PR_GET_KEEPCAPS)) {
00752                 prctl(PR_SET_KEEPCAPS, 1);
00753         }
00754 #endif
00755 
00756         cap = cap_get_proc();
00757         if (cap == NULL) {
00758                 DEBUG(0,("set_process_capability: cap_get_proc failed: %s\n",
00759                         strerror(errno)));
00760                 return False;
00761         }
00762 
00763         switch (capability) {
00764                 case KERNEL_OPLOCK_CAPABILITY:
00765 #ifdef CAP_NETWORK_MGT
00766                         /* IRIX has CAP_NETWORK_MGT for oplocks. */
00767                         cap_vals[num_cap_vals++] = CAP_NETWORK_MGT;
00768 #endif
00769                         break;
00770                 case DMAPI_ACCESS_CAPABILITY:
00771 #ifdef CAP_DEVICE_MGT
00772                         /* IRIX has CAP_DEVICE_MGT for DMAPI access. */
00773                         cap_vals[num_cap_vals++] = CAP_DEVICE_MGT;
00774 #elif CAP_MKNOD
00775                         /* Linux has CAP_MKNOD for DMAPI access. */
00776                         cap_vals[num_cap_vals++] = CAP_MKNOD;
00777 #endif
00778                         break;
00779                 case LEASE_CAPABILITY:
00780 #ifdef CAP_LEASE
00781                         cap_vals[num_cap_vals++] = CAP_LEASE;
00782 #endif
00783                         break;
00784         }
00785 
00786         SMB_ASSERT(num_cap_vals <= ARRAY_SIZE(cap_vals));
00787 
00788         if (num_cap_vals == 0) {
00789                 cap_free(cap);
00790                 return True;
00791         }
00792 
00793         cap_set_flag(cap, CAP_EFFECTIVE, num_cap_vals, cap_vals,
00794                 enable ? CAP_SET : CAP_CLEAR);
00795 
00796         /* We never want to pass capabilities down to our children, so make
00797          * sure they are not inherited.
00798          */
00799         cap_set_flag(cap, CAP_INHERITABLE, num_cap_vals, cap_vals, CAP_CLEAR);
00800 
00801         if (cap_set_proc(cap) == -1) {
00802                 DEBUG(0, ("set_process_capability: cap_set_proc failed: %s\n",
00803                         strerror(errno)));
00804                 cap_free(cap);
00805                 return False;
00806         }
00807 
00808         cap_free(cap);
00809         return True;
00810 }

void set_effective_capability ( enum smbd_capability  capability  ) 

system.c818 行で定義されています。

参照先 set_process_capability().

参照元 irix_oplocks_available()linux_setlease()reattach_dmapi_session().

00819 {
00820 #if defined(HAVE_POSIX_CAPABILITIES)
00821         set_process_capability(capability, True);
00822 #endif /* HAVE_POSIX_CAPABILITIES */
00823 }

void drop_effective_capability ( enum smbd_capability  capability  ) 

system.c825 行で定義されています。

参照先 set_process_capability().

参照元 chat_with_program()smbrun_internal()smbrunsecret().

00826 {
00827 #if defined(HAVE_POSIX_CAPABILITIES)
00828         set_process_capability(capability, False);
00829 #endif /* HAVE_POSIX_CAPABILITIES */
00830 }

long sys_random ( void   ) 

system.c836 行で定義されています。

参照元 generate_trn_id()rand_buf()run_randomipc()rw_torture()rw_torture2()rw_torture3()sync_all_dmbs().

00837 {
00838 #if defined(HAVE_RANDOM)
00839         return (long)random();
00840 #elif defined(HAVE_RAND)
00841         return (long)rand();
00842 #else
00843         DEBUG(0,("Error - no random function available !\n"));
00844         exit(1);
00845 #endif
00846 }

void sys_srandom ( unsigned int  seed  ) 

system.c852 行で定義されています。

参照元 create_procs()generate_trn_id()main().

00853 {
00854 #if defined(HAVE_SRANDOM)
00855         srandom(seed);
00856 #elif defined(HAVE_SRAND)
00857         srand(seed);
00858 #else
00859         DEBUG(0,("Error - no srandom function available !\n"));
00860         exit(1);
00861 #endif
00862 }

int groups_max ( void   ) 

system.c868 行で定義されています。

参照元 getgroups_unix_user()sys_getgroups()sys_setgroups().

00869 {
00870 #if defined(SYSCONF_SC_NGROUPS_MAX)
00871         int ret = sysconf(_SC_NGROUPS_MAX);
00872         return (ret == -1) ? NGROUPS_MAX : ret;
00873 #else
00874         return NGROUPS_MAX;
00875 #endif
00876 }

int sys_getgroups ( int  setlen,
gid_t *  gidset 
)

system.c882 行で定義されています。

参照先 errnogroups_max().

参照元 get_current_groups()push_sec_ctx().

00883 {
00884 #if !defined(HAVE_BROKEN_GETGROUPS)
00885         return getgroups(setlen, gidset);
00886 #else
00887 
00888         GID_T gid;
00889         GID_T *group_list;
00890         int i, ngroups;
00891 
00892         if(setlen == 0) {
00893                 return getgroups(setlen, &gid);
00894         }
00895 
00896         /*
00897          * Broken case. We need to allocate a
00898          * GID_T array of size setlen.
00899          */
00900 
00901         if(setlen < 0) {
00902                 errno = EINVAL; 
00903                 return -1;
00904         } 
00905 
00906         if (setlen == 0)
00907                 setlen = groups_max();
00908 
00909         if((group_list = (GID_T *)malloc(setlen * sizeof(GID_T))) == NULL) {
00910                 DEBUG(0,("sys_getgroups: Malloc fail.\n"));
00911                 return -1;
00912         }
00913 
00914         if((ngroups = getgroups(setlen, group_list)) < 0) {
00915                 int saved_errno = errno;
00916                 SAFE_FREE(group_list);
00917                 errno = saved_errno;
00918                 return -1;
00919         }
00920 
00921         for(i = 0; i < ngroups; i++)
00922                 gidset[i] = (gid_t)group_list[i];
00923 
00924         SAFE_FREE(group_list);
00925         return ngroups;
00926 #endif /* HAVE_BROKEN_GETGROUPS */
00927 }

int sys_setgroups ( int  setlen,
gid_t *  gidset 
)

system.c935 行で定義されています。

参照先 errnogroups_max().

参照元 getgrouplist_internals()pop_sec_ctx()set_sec_ctx().

00936 {
00937 #if !defined(HAVE_SETGROUPS)
00938         errno = ENOSYS;
00939         return -1;
00940 #endif /* HAVE_SETGROUPS */
00941 
00942 #if !defined(HAVE_BROKEN_GETGROUPS)
00943         return setgroups(setlen, gidset);
00944 #else
00945 
00946         GID_T *group_list;
00947         int i ; 
00948 
00949         if (setlen == 0)
00950                 return 0 ;
00951 
00952         if (setlen < 0 || setlen > groups_max()) {
00953                 errno = EINVAL; 
00954                 return -1;   
00955         }
00956 
00957         /*
00958          * Broken case. We need to allocate a
00959          * GID_T array of size setlen.
00960          */
00961 
00962         if((group_list = (GID_T *)malloc(setlen * sizeof(GID_T))) == NULL) {
00963                 DEBUG(0,("sys_setgroups: Malloc fail.\n"));
00964                 return -1;    
00965         }
00966  
00967         for(i = 0; i < setlen; i++) 
00968                 group_list[i] = (GID_T) gidset[i]; 
00969 
00970         if(setgroups(setlen, group_list) != 0) {
00971                 int saved_errno = errno;
00972                 SAFE_FREE(group_list);
00973                 errno = saved_errno;
00974                 return -1;
00975         }
00976  
00977         SAFE_FREE(group_list);
00978         return 0 ;
00979 #endif /* HAVE_BROKEN_GETGROUPS */
00980 }

void sys_setpwent ( void   ) 

system.c986 行で定義されています。

参照元 vfs_get_user_ntquota_list().

00987 {
00988         setpwent();
00989 }

struct passwd* sys_getpwent ( void   ) 

system.c991 行で定義されています。

参照元 vfs_get_user_ntquota_list().

00992 {
00993         return getpwent();
00994 }

void sys_endpwent ( void   ) 

system.c996 行で定義されています。

参照元 vfs_get_user_ntquota_list().

00997 {
00998         endpwent();
00999 }

struct passwd * sys_getpwnam ( const char *  name  ) 

system.c1016 行で定義されています。

参照先 fake_pwdnum_fake_pwd.

参照元 get_root_nt_token()getpwnam_alloc()init_srv_sess_info_1()smb_complete_connection()wsys_getpwnam().

01017 {
01018         int i;
01019 
01020         for (i=0; i<num_fake_pwd; i++) {
01021                 if (strcmp(fake_pwd[i].pw_name, name) == 0) {
01022                         DEBUG(10, ("Returning fake user %s\n", name));
01023                         return &fake_pwd[i];
01024                 }
01025         }
01026 
01027         return getpwnam(name);
01028 }

struct passwd * sys_getpwuid ( uid_t  uid  ) 

system.c1030 行で定義されています。

参照先 fake_pwdnum_fake_pwd.

参照元 cmd_fstat()cmd_lstat()cmd_stat()getpwuid_alloc()pdb_default_uid_to_sid()wsys_getpwuid().

01031 {
01032         int i;
01033 
01034         for (i=0; i<num_fake_pwd; i++) {
01035                 if (fake_pwd[i].pw_uid == uid) {
01036                         DEBUG(10, ("Returning fake user %s\n",
01037                                    fake_pwd[i].pw_name));
01038                         return &fake_pwd[i];
01039                 }
01040         }
01041 
01042         return getpwuid(uid);
01043 }

void faked_create_user ( const char *  name  ) 

system.c1045 行で定義されています。

参照先 fake_pwdgenerate_random_buffer()num_fake_pwd.

参照元 pdb_default_create_user().

01046 {
01047         int i;
01048         uid_t uid;
01049         struct passwd new_pwd;
01050 
01051         for (i=0; i<10; i++) {
01052                 generate_random_buffer((unsigned char *)&uid,
01053                                        sizeof(uid));
01054                 if (getpwuid(uid) == NULL) {
01055                         break;
01056                 }
01057         }
01058 
01059         if (i==10) {
01060                 /* Weird. No free uid found... */
01061                 return;
01062         }
01063 
01064         new_pwd.pw_name = SMB_STRDUP(name);
01065         new_pwd.pw_passwd = SMB_STRDUP("x");
01066         new_pwd.pw_uid = uid;
01067         new_pwd.pw_gid = 100;
01068         new_pwd.pw_gecos = SMB_STRDUP("faked user");
01069         new_pwd.pw_dir = SMB_STRDUP("/nodir");
01070         new_pwd.pw_shell = SMB_STRDUP("/bin/false");
01071 
01072         ADD_TO_ARRAY(NULL, struct passwd, new_pwd, &fake_pwd,
01073                      &num_fake_pwd);
01074 
01075         DEBUG(10, ("Added fake user %s, have %d fake users\n",
01076                    name, num_fake_pwd));
01077 }

struct group* sys_getgrnam ( const char *  name  ) 

system.c1093 行で定義されています。

参照元 nametogid().

01094 {
01095         return getgrnam(name);
01096 }

struct group* sys_getgrgid ( gid_t  gid  ) 

system.c1098 行で定義されています。

参照元 cmd_fstat()cmd_lstat()cmd_stat().

01099 {
01100         return getgrgid(gid);
01101 }

int wsys_stat ( const smb_ucs2_t wfname,
SMB_STRUCT_STAT *  sbuf 
)

system.c1115 行で定義されています。

参照先 sys_stat().

01116 {
01117         pstring fname;
01118         return sys_stat(unicode_to_unix(fname,wfname,sizeof(fname)), sbuf);
01119 }

int wsys_lstat ( const smb_ucs2_t wfname,
SMB_STRUCT_STAT *  sbuf 
)

system.c1125 行で定義されています。

参照先 sys_lstat().

01126 {
01127         pstring fname;
01128         return sys_lstat(unicode_to_unix(fname,wfname,sizeof(fname)), sbuf);
01129 }

int wsys_creat ( const smb_ucs2_t wfname,
mode_t  mode 
)

system.c1135 行で定義されています。

参照先 sys_creat().

01136 {
01137         pstring fname;
01138         return sys_creat(unicode_to_unix(fname,wfname,sizeof(fname)), mode);
01139 }

int wsys_open ( const smb_ucs2_t wfname,
int  oflag,
mode_t  mode 
)

system.c1145 行で定義されています。

参照先 sys_open().

01146 {
01147         pstring fname;
01148         return sys_open(unicode_to_unix(fname,wfname,sizeof(fname)), oflag, mode);
01149 }

FILE* wsys_fopen ( const smb_ucs2_t wfname,
const char *  type 
)

system.c1155 行で定義されています。

参照先 sys_fopen().

01156 {
01157         pstring fname;
01158         return sys_fopen(unicode_to_unix(fname,wfname,sizeof(fname)), type);
01159 }

SMB_STRUCT_DIR* wsys_opendir ( const smb_ucs2_t wfname  ) 

system.c1165 行で定義されています。

参照先 opendir().

01166 {
01167         pstring fname;
01168         return opendir(unicode_to_unix(fname,wfname,sizeof(fname)));
01169 }

SMB_STRUCT_WDIRENT* wsys_readdir ( SMB_STRUCT_DIR *  dirp  ) 

system.c1175 行で定義されています。

参照先 sys_readdir().

01176 {
01177         static SMB_STRUCT_WDIRENT retval;
01178         SMB_STRUCT_DIRENT *dirval = sys_readdir(dirp);
01179 
01180         if(!dirval)
01181                 return NULL;
01182 
01183         /*
01184          * The only POSIX defined member of this struct is d_name.
01185          */
01186 
01187         unix_to_unicode(retval.d_name,dirval->d_name,sizeof(retval.d_name));
01188 
01189         return &retval;
01190 }

smb_ucs2_t* wsys_getwd ( smb_ucs2_t s  ) 

system.c1196 行で定義されています。

参照先 sys_getwd().

01197 {
01198         pstring fname;
01199         char *p = sys_getwd(fname);
01200 
01201         if(!p)
01202                 return NULL;
01203 
01204         return unix_to_unicode(s, p, sizeof(wpstring));
01205 }

int wsys_chown ( const smb_ucs2_t wfname,
uid_t  uid,
gid_t  gid 
)

system.c1211 行で定義されています。

01212 {
01213         pstring fname;
01214         return chown(unicode_to_unix(fname,wfname,sizeof(fname)), uid, gid);
01215 }

int wsys_chroot ( const smb_ucs2_t wfname  ) 

system.c1221 行で定義されています。

01222 {
01223         pstring fname;
01224         return chroot(unicode_to_unix(fname,wfname,sizeof(fname)));
01225 }

SMB_STRUCT_WPASSWD* wsys_getpwnam ( const smb_ucs2_t wname  ) 

system.c1231 行で定義されています。

参照先 namesys_getpwnam().

01232 {
01233         static SMB_STRUCT_WPASSWD retval;
01234         fstring name;
01235         struct passwd *pwret = sys_getpwnam(unicode_to_unix(name,wname,sizeof(name)));
01236 
01237         if(!pwret)
01238                 return NULL;
01239 
01240         unix_to_unicode(retval.pw_name, pwret->pw_name, sizeof(retval.pw_name));
01241         retval.pw_passwd = pwret->pw_passwd;
01242         retval.pw_uid = pwret->pw_uid;
01243         retval.pw_gid = pwret->pw_gid;
01244         unix_to_unicode(retval.pw_gecos, pwret->pw_gecos, sizeof(retval.pw_gecos));
01245         unix_to_unicode(retval.pw_dir, pwret->pw_dir, sizeof(retval.pw_dir));
01246         unix_to_unicode(retval.pw_shell, pwret->pw_shell, sizeof(retval.pw_shell));
01247 
01248         return &retval;
01249 }

SMB_STRUCT_WPASSWD* wsys_getpwuid ( uid_t  uid  ) 

system.c1255 行で定義されています。

参照先 sys_getpwuid().

01256 {
01257         static SMB_STRUCT_WPASSWD retval;
01258         struct passwd *pwret = sys_getpwuid(uid);
01259 
01260         if(!pwret)
01261                 return NULL;
01262 
01263         unix_to_unicode(retval.pw_name, pwret->pw_name, sizeof(retval.pw_name));
01264         retval.pw_passwd = pwret->pw_passwd;
01265         retval.pw_uid = pwret->pw_uid;
01266         retval.pw_gid = pwret->pw_gid;
01267         unix_to_unicode(retval.pw_gecos, pwret->pw_gecos, sizeof(retval.pw_gecos));
01268         unix_to_unicode(retval.pw_dir, pwret->pw_dir, sizeof(retval.pw_dir));
01269         unix_to_unicode(retval.pw_shell, pwret->pw_shell, sizeof(retval.pw_shell));
01270 
01271         return &retval;
01272 }

static char** extract_args ( const char *  command  )  [static]

system.c1280 行で定義されています。

参照先 errno.

参照元 sys_popen().

01281 {
01282         static pstring trunc_cmd;
01283         char *ptr;
01284         int argcl;
01285         char **argl = NULL;
01286         int i;
01287 
01288         pstrcpy(trunc_cmd, command);
01289 
01290         if(!(ptr = strtok(trunc_cmd, " \t"))) {
01291                 errno = EINVAL;
01292                 return NULL;
01293         }
01294 
01295         /*
01296          * Count the args.
01297          */
01298 
01299         for( argcl = 1; ptr; ptr = strtok(NULL, " \t"))
01300                 argcl++;
01301 
01302         if((argl = (char **)SMB_MALLOC((argcl + 1) * sizeof(char *))) == NULL)
01303                 return NULL;
01304 
01305         /*
01306          * Now do the extraction.
01307          */
01308 
01309         pstrcpy(trunc_cmd, command);
01310 
01311         ptr = strtok(trunc_cmd, " \t");
01312         i = 0;
01313         argl[i++] = ptr;
01314 
01315         while((ptr = strtok(NULL, " \t")) != NULL)
01316                 argl[i++] = ptr;
01317 
01318         argl[i++] = NULL;
01319         return argl;
01320 }

pid_t sys_fork ( void   ) 

system.c1329 行で定義されています。

参照先 mypid.

参照元 become_daemon()chat_with_program()daemonize()fork_child_dc_connect()fork_domain_child()init_mount()open_sockets_smbd()smbrun_internal()smbrunsecret()start_async_dns()start_background_queue()sync_browse_lists()sys_popen()wins_write_database().

01330 {
01331         pid_t forkret = fork();
01332 
01333         if (forkret == (pid_t)0) /* Child - reset mypid so sys_getpid does a system call. */
01334                 mypid = (pid_t) -1;
01335 
01336         return forkret;
01337 }

pid_t sys_getpid ( void   ) 

system.c1343 行で定義されています。

参照先 mypid.

参照元 _Insure_trap_error()_svcctl_query_service_status_ex()alloc_sub_basic()another_ldap_try()cli_initialise()cli_send_mailslot()cmd_print()count_current_connections()create_policy_hnd()dbghdr()dfs_auth()dfs_unlogin()do_connection()do_reseed()do_winbind_onlinestatus()fam_open_connection()fault_report()file_new()fill_pipe_open_rec()fork_child_dc_connect()fork_domain_child()generate_name_trn_id()generate_trn_id()get_printer_notify_pid_list()get_rand_seed()init_dmapi_service()irix_oplocks_available()main()message_dispatch()msg_inject_fault()open_rpc_pipe_p()parse_dest()pidfile_create()print_job_end()print_job_endpage()print_job_fd()print_job_fname()print_job_set_name()print_job_start()print_job_write()print_notify_deregister_pid()print_notify_register_pid()process_kernel_oplocks()process_oplock_async_level2_break_message()process_oplock_break_message()procid_is_me()procid_self()reply_lanman1()reply_lanman2()reply_nt1()retrieve_all_messages()send_fs_socket()session_claim()set_updating_pid()shutdown_other_smbds()smb_panic()smb_umount()smbc_init_context()smbldap_open()srv_spoolss_drv_upgrade_printer()srv_spoolss_reset_printerdata()switch_message()sys_select()sys_utmp_fill()wins_write_database().

01344 {
01345         if (mypid == (pid_t)-1)
01346                 mypid = getpid();
01347 
01348         return mypid;
01349 }

int sys_popen ( const char *  command  ) 

system.c1366 行で定義されています。

参照先 _popen_list::child_piderrnoextract_args()_popen_list::fd_popen_list::nextpopen_chainsys_fork().

参照元 file_pload().

01367 {
01368         int parent_end, child_end;
01369         int pipe_fds[2];
01370         popen_list *entry = NULL;
01371         char **argl = NULL;
01372 
01373         if (pipe(pipe_fds) < 0)
01374                 return -1;
01375 
01376         parent_end = pipe_fds[0];
01377         child_end = pipe_fds[1];
01378 
01379         if (!*command) {
01380                 errno = EINVAL;
01381                 goto err_exit;
01382         }
01383 
01384         if((entry = SMB_MALLOC_P(popen_list)) == NULL)
01385                 goto err_exit;
01386 
01387         ZERO_STRUCTP(entry);
01388 
01389         /*
01390          * Extract the command and args into a NULL terminated array.
01391          */
01392 
01393         if(!(argl = extract_args(command)))
01394                 goto err_exit;
01395 
01396         entry->child_pid = sys_fork();
01397 
01398         if (entry->child_pid == -1) {
01399                 goto err_exit;
01400         }
01401 
01402         if (entry->child_pid == 0) {
01403 
01404                 /*
01405                  * Child !
01406                  */
01407 
01408                 int child_std_end = STDOUT_FILENO;
01409                 popen_list *p;
01410 
01411                 close(parent_end);
01412                 if (child_end != child_std_end) {
01413                         dup2 (child_end, child_std_end);
01414                         close (child_end);
01415                 }
01416 
01417                 /*
01418                  * POSIX.2:  "popen() shall ensure that any streams from previous
01419                  * popen() calls that remain open in the parent process are closed
01420                  * in the new child process."
01421                  */
01422 
01423                 for (p = popen_chain; p; p = p->next)
01424                         close(p->fd);
01425 
01426                 execv(argl[0], argl);
01427                 _exit (127);
01428         }
01429 
01430         /*
01431          * Parent.
01432          */
01433 
01434         close (child_end);
01435         SAFE_FREE(argl);
01436 
01437         /* Link into popen_chain. */
01438         entry->next = popen_chain;
01439         popen_chain = entry;
01440         entry->fd = parent_end;
01441 
01442         return entry->fd;
01443 
01444 err_exit:
01445 
01446         SAFE_FREE(entry);
01447         SAFE_FREE(argl);
01448         close(pipe_fds[0]);
01449         close(pipe_fds[1]);
01450         return -1;
01451 }

int sys_pclose ( int  fd  ) 

system.c1457 行で定義されています。

参照先 _popen_list::nextpopen_chainstatus.

参照元 file_pload().

01458 {
01459         int wstatus;
01460         popen_list **ptr = &popen_chain;
01461         popen_list *entry = NULL;
01462         pid_t wait_pid;
01463         int status = -1;
01464 
01465         /* Unlink from popen_chain. */
01466         for ( ; *ptr != NULL; ptr = &(*ptr)->next) {
01467                 if ((*ptr)->fd == fd) {
01468                         entry = *ptr;
01469                         *ptr = (*ptr)->next;
01470                         status = 0;
01471                         break;
01472                 }
01473         }
01474 
01475         if (status < 0 || close(entry->fd) < 0)
01476                 return -1;
01477 
01478         /*
01479          * As Samba is catching and eating child process
01480          * exits we don't really care about the child exit
01481          * code, a -1 with errno = ECHILD will do fine for us.
01482          */
01483 
01484         do {
01485                 wait_pid = sys_waitpid (entry->child_pid, &wstatus, 0);
01486         } while (wait_pid == -1 && errno == EINTR);
01487 
01488         SAFE_FREE(entry);
01489 
01490         if (wait_pid == -1)
01491                 return -1;
01492         return wstatus;
01493 }

void* sys_dlopen ( const char *  name,
int  flags 
)

system.c1499 行で定義されています。

参照元 do_smb_load_module()find_fn()init_gpfs().

01500 {
01501 #if defined(HAVE_DLOPEN)
01502         return dlopen(name, flags);
01503 #else
01504         return NULL;
01505 #endif
01506 }

void* sys_dlsym ( void *  handle,
const char *  symbol 
)

system.c1508 行で定義されています。

参照元 do_smb_load_module()find_fn()init_gpfs().

01509 {
01510 #if defined(HAVE_DLSYM)
01511     return dlsym(handle, symbol);
01512 #else
01513     return NULL;
01514 #endif
01515 }

int sys_dlclose ( void *  handle  ) 

system.c1517 行で定義されています。

参照元 init_gpfs().

01518 {
01519 #if defined(HAVE_DLCLOSE)
01520         return dlclose(handle);
01521 #else
01522         return 0;
01523 #endif
01524 }

const char* sys_dlerror ( void   ) 

system.c1526 行で定義されています。

参照元 do_smb_load_module().

01527 {
01528 #if defined(HAVE_DLERROR)
01529         return dlerror();
01530 #else
01531         return NULL;
01532 #endif
01533 }

int sys_dup2 ( int  oldfd,
int  newfd 
)

system.c1535 行で定義されています。

参照先 errno.

参照元 dochild()reopen_logs()smbrun_internal()smbrunsecret().

01536 {
01537 #if defined(HAVE_DUP2)
01538         return dup2(oldfd, newfd);
01539 #else
01540         errno = ENOSYS;
01541         return -1;
01542 #endif
01543 }

void sys_adminlog ( int  priority,
const char *  format_str,
  ... 
)

system.c1549 行で定義されています。

参照先 msgbufvasprintf().

参照元 print_job_delete()print_job_pause()print_job_resume().

01550 {
01551         va_list ap;
01552         int ret;
01553         char *msgbuf = NULL;
01554 
01555         va_start( ap, format_str );
01556         ret = vasprintf( &msgbuf, format_str, ap );
01557         va_end( ap );
01558 
01559         if (ret == -1)
01560                 return;
01561 
01562 #if defined(HAVE_SYSLOG)
01563         syslog( priority, "%s", msgbuf );
01564 #else
01565         DEBUG(0,("%s", msgbuf ));
01566 #endif
01567         SAFE_FREE(msgbuf);
01568 }

static int solaris_write_xattr ( int  attrfd,
const char *  value,
size_t  size 
) [static]

system.c2426 行で定義されています。

参照元 sys_fsetxattr()sys_lsetxattr()sys_setxattr().

02427 {
02428         if ((ftruncate(attrfd, 0) == 0) && (write(attrfd, value, size) == size)) {
02429                 return 0;
02430         } else {
02431                 DEBUG(10,("solaris_write_xattr FAILED!\n"));
02432                 return -1;
02433         }
02434 }

static ssize_t solaris_read_xattr ( int  attrfd,
void *  value,
size_t  size 
) [static]

system.c2317 行で定義されています。

参照先 errno.

参照元 sys_fgetxattr()sys_getxattr()sys_lgetxattr().

02318 {
02319         struct stat sbuf;
02320 
02321         if (fstat(attrfd, &sbuf) == -1) {
02322                 errno = ENOATTR;
02323                 return -1;
02324         }
02325 
02326         /* This is to return the current size of the named extended attribute */
02327         if (size == 0) {
02328                 return sbuf.st_size;
02329         }
02330 
02331         /* check size and read xattr */
02332         if (sbuf.st_size > size) {
02333                 errno = ERANGE;
02334                 return -1;
02335         }
02336 
02337         return read(attrfd, value, sbuf.st_size);
02338 }

static ssize_t solaris_list_xattr ( int  attrdirfd,
char *  list,
size_t  size 
) [static]

system.c2340 行で定義されています。

参照先 closedir()errnolenreaddir()strerror().

参照元 sys_flistxattr()sys_listxattr()sys_llistxattr().

02341 {
02342         ssize_t len = 0;
02343         int stop = 0;
02344         DIR *dirp;
02345         struct dirent *de;
02346         int newfd = dup(attrdirfd);
02347         /* CAUTION: The originating file descriptor should not be
02348                     used again following the call to fdopendir().
02349                     For that reason we dup() the file descriptor
02350                     here to make things more clear. */
02351         dirp = fdopendir(newfd);
02352 
02353         while ((de = readdir(dirp))) {
02354                 size_t listlen = strlen(de->d_name);
02355                 if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) {
02356                         /* we don't want "." and ".." here: */
02357                         DEBUG(10,("skipped EA %s\n",de->d_name));
02358                         continue;
02359                 }
02360 
02361                 if (size == 0) {
02362                         /* return the current size of the list of extended attribute names*/
02363                         len += listlen + 1;
02365                         /* check size and copy entrie02364                 } else {