File: | obj-scan-build/libcons/../../libcons/dir-changed.c |
Location: | line 90, column 6 |
Description: | Branch condition evaluates to a garbage value |
1 | /* dir-changed.c - Handling dir changed notifications. | |||
2 | Copyright (C) 2002 Free Software Foundation, Inc. | |||
3 | Written by Marcus Brinkmann. | |||
4 | ||||
5 | This file is part of the GNU Hurd. | |||
6 | ||||
7 | The GNU Hurd is free software; you can redistribute it and/or | |||
8 | modify it under the terms of the GNU General Public License as | |||
9 | published by the Free Software Foundation; either version 2, or (at | |||
10 | your option) any later version. | |||
11 | ||||
12 | The GNU Hurd is distributed in the hope that it will be useful, but | |||
13 | WITHOUT ANY WARRANTY; without even the implied warranty of | |||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
15 | General Public License for more details. | |||
16 | ||||
17 | You should have received a copy of the GNU General Public License | |||
18 | along with this program; if not, write to the Free Software | |||
19 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ | |||
20 | ||||
21 | #include <errno(*__errno_location ()).h> | |||
22 | #include <dirent.h> | |||
23 | #include <assert.h> | |||
24 | #include <mach.h> | |||
25 | #include <pthread.h> | |||
26 | ||||
27 | #include "cons.h" | |||
28 | #include "fs_notify_S.h" | |||
29 | ||||
30 | ||||
31 | static error_t | |||
32 | add_one (cons_t cons, char *name) | |||
33 | { | |||
34 | unsigned long int nr; | |||
35 | char *tail; | |||
36 | ||||
37 | errno(*__errno_location ()) = 0; | |||
38 | nr = strtoul (name, &tail, 10); | |||
39 | if (!errno(*__errno_location ()) && *tail == '\0' && nr > 0) | |||
40 | { | |||
41 | vcons_list_t vcons_entry; | |||
42 | return cons_lookup (cons, nr, 1, &vcons_entry); | |||
43 | } | |||
44 | return 0; | |||
45 | } | |||
46 | ||||
47 | static error_t | |||
48 | lookup_one (cons_t cons, char *name, vcons_list_t *vcons_entry) | |||
49 | { | |||
50 | unsigned long int nr; | |||
51 | char *tail; | |||
52 | ||||
53 | errno(*__errno_location ()) = 0; | |||
54 | nr = strtoul (name, &tail, 10); | |||
55 | if (!errno(*__errno_location ()) && *tail == '\0' && nr > 0) | |||
56 | return cons_lookup (cons, nr, 0, vcons_entry); | |||
57 | return 0; | |||
58 | } | |||
59 | ||||
60 | ||||
61 | kern_return_t | |||
62 | cons_S_dir_changed (cons_notify_t notify, natural_t tickno, | |||
63 | dir_changed_type_t change, string_t name) | |||
64 | { | |||
65 | error_t err; | |||
| ||||
66 | cons_t cons; | |||
67 | ||||
68 | if (!notify || !notify->cons) | |||
69 | return EOPNOTSUPP((0x10 << 26) | ((45) & 0x3fff)); | |||
70 | cons = notify->cons; | |||
71 | ||||
72 | pthread_mutex_lock (&cons->lock); | |||
73 | ||||
74 | switch (change) | |||
75 | { | |||
76 | case DIR_CHANGED_NULL: | |||
77 | { | |||
78 | DIR *dir = cons->dir; | |||
79 | struct dirent *dent; | |||
80 | do | |||
81 | { | |||
82 | errno(*__errno_location ()) = 0; | |||
83 | dent = readdir (dir); | |||
84 | if (!dent && errno(*__errno_location ())) | |||
85 | err = errno(*__errno_location ()); | |||
86 | else if (dent) | |||
87 | err = add_one (cons, dent->d_name); | |||
88 | } | |||
89 | while (dent && !err); | |||
90 | if (err) | |||
| ||||
91 | assert ("Unexpected error")(("Unexpected error") ? (void) (0) : __assert_fail ("\"Unexpected error\"" , "../../libcons/dir-changed.c", 91, __PRETTY_FUNCTION__)); /* XXX */ | |||
92 | } | |||
93 | break; | |||
94 | case DIR_CHANGED_NEW: | |||
95 | { | |||
96 | err = add_one (cons, name); | |||
97 | if (err) | |||
98 | assert ("Unexpected error")(("Unexpected error") ? (void) (0) : __assert_fail ("\"Unexpected error\"" , "../../libcons/dir-changed.c", 98, __PRETTY_FUNCTION__)); /* XXX */ | |||
99 | } | |||
100 | break; | |||
101 | case DIR_CHANGED_UNLINK: | |||
102 | { | |||
103 | vcons_list_t vcons_entry; | |||
104 | err = lookup_one (cons, name, &vcons_entry); | |||
105 | if (!err) | |||
106 | { | |||
107 | cons_vcons_remove (cons, vcons_entry); | |||
108 | if (vcons_entry->prev) | |||
109 | vcons_entry->prev->next = vcons_entry->next; | |||
110 | else | |||
111 | cons->vcons_list = vcons_entry->next; | |||
112 | if (vcons_entry->next) | |||
113 | vcons_entry->next->prev = vcons_entry->prev; | |||
114 | else | |||
115 | cons->vcons_last = vcons_entry->prev; | |||
116 | ||||
117 | free (vcons_entry); | |||
118 | } | |||
119 | } | |||
120 | break; | |||
121 | case DIR_CHANGED_RENUMBER: | |||
122 | default: | |||
123 | assert ("Unexpected dir-changed type.")(("Unexpected dir-changed type.") ? (void) (0) : __assert_fail ("\"Unexpected dir-changed type.\"", "../../libcons/dir-changed.c" , 123, __PRETTY_FUNCTION__)); | |||
124 | pthread_mutex_unlock (&cons->lock); | |||
125 | return EINVAL((0x10 << 26) | ((22) & 0x3fff)); | |||
126 | } | |||
127 | pthread_mutex_unlock (&cons->lock); | |||
128 | return 0; | |||
129 | } |